überarbeitung edit tatort funktioniert, edit vorgang bis api auch, aber dann hakt es
This commit is contained in:
@@ -1,4 +1,15 @@
|
||||
|
||||
|
||||
|
||||
<!DOCTYPE html>
|
||||
<html lang="de">
|
||||
<head>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<h1>Du wurdest automatisch ausgeloggt</h1>
|
||||
<p>Lösche deine Cookies aus dem Browser und logge dich neu ein</p>
|
||||
<p>Code %sveltekit.status%</p>
|
||||
<p>%sveltekit.error.message%</p>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -1,10 +0,0 @@
|
||||
import { getListOfVorgänge } from '$lib/server/vorgangService';
|
||||
import type { PageServerLoad } from '../../(token-based)/view/$types';
|
||||
|
||||
export const load: PageServerLoad = async () => {
|
||||
const caseList = await getListOfVorgänge();
|
||||
|
||||
return {
|
||||
caseList
|
||||
};
|
||||
};
|
||||
@@ -11,11 +11,12 @@
|
||||
|
||||
let { data } = $props();
|
||||
|
||||
const caseList: ListItem[] = data.caseList;
|
||||
const caseList: ListItem[] = $state(data.caseList);
|
||||
|
||||
//Variabeln für EditableItem
|
||||
let names: string[] = $state(caseList.map((l) => l.name));
|
||||
let editedName: string = $state('');
|
||||
let currentName: string = $state('');
|
||||
|
||||
async function delete_item(ev: Event) {
|
||||
let delete_item = window.confirm('Bist du sicher?');
|
||||
@@ -47,7 +48,7 @@
|
||||
}
|
||||
}
|
||||
|
||||
async function handleSave(newName: string, oldName: string) {
|
||||
async function handleUpdateCase(newName: string, oldName: string) {
|
||||
console.log('Eltern, speichern erfolgreich', newName, oldName);
|
||||
try {
|
||||
const res = await fetch(`/api/list/${oldName}`, {
|
||||
@@ -60,9 +61,11 @@
|
||||
|
||||
if (!res.ok) {
|
||||
const msg = await res.text();
|
||||
console.error('❌ Fehler beim Speichern:', msg);
|
||||
console.error('❌ Fehler beim Speichern Update:', msg);
|
||||
} else {
|
||||
console.log('✅ Erfolgreich gespeichert:', newName);
|
||||
await invalidate('');
|
||||
currentName = newName;
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('⚠️ Netzwerkfehler:', err);
|
||||
@@ -84,13 +87,7 @@
|
||||
const msg = await res.text();
|
||||
console.error('❌ Fehler beim Löschen:', msg);
|
||||
} else {
|
||||
setTimeout(() => {
|
||||
window.location.reload();
|
||||
}, 500);
|
||||
//await invalidate('/api/list');
|
||||
|
||||
console.log('🗑️ Erfolgreich gelöscht:', vorgang);
|
||||
await invalidate('/api/list'); // funktioniert nicht vernünftig
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('⚠️ Netzwerkfehler beim Löschen:', err);
|
||||
@@ -109,24 +106,26 @@
|
||||
<div class="flex gap-x-4">
|
||||
<!-- Ordner -->
|
||||
<a
|
||||
href="/list/{item.name}?token={item.token}"
|
||||
class="bg-red-500 flex justify-between gap-x-6 py-5"
|
||||
href="/list/{currentName}?token={item.token}"
|
||||
class=" flex justify-between gap-x-6 py-5"
|
||||
>
|
||||
<Folder />
|
||||
</a>
|
||||
|
||||
{#if data.user.admin}
|
||||
<div class="min-w-0 flex-auto">
|
||||
<EditableItem
|
||||
list={caseList}
|
||||
bind:editedName={names[i]}
|
||||
currentName={item.name}
|
||||
onSave={handleSave}
|
||||
onSave={handleUpdateCase}
|
||||
onDelete={handleDelete}
|
||||
></EditableItem>
|
||||
</div>
|
||||
{:else}
|
||||
<div class="hidden sm:flex sm:flex-col sm:items-end">
|
||||
<p class="text-sm leading-6 text-gray-900">Vorgang</p>
|
||||
</div>
|
||||
{/if}
|
||||
</div>
|
||||
</li>
|
||||
{/each}
|
||||
|
||||
24
src/routes/(angemeldet)/list/+page.ts
Normal file
24
src/routes/(angemeldet)/list/+page.ts
Normal file
@@ -0,0 +1,24 @@
|
||||
|
||||
export async function load({ fetch, url }) {
|
||||
|
||||
//const caseToken = url.searchParams.get('token');
|
||||
const adminRes = await fetch(`/api/user`)
|
||||
const user = await adminRes.json()
|
||||
|
||||
console.log("load Vorgang; ", user);
|
||||
const res = await fetch(`/api/list`, {
|
||||
/* headers: {
|
||||
Authorization: `Bearer ${caseToken}`
|
||||
} */
|
||||
});
|
||||
|
||||
const data = await res.json();
|
||||
|
||||
const caseList = data.caseList
|
||||
console.log("load Vorgang; ", caseList, user);
|
||||
|
||||
return {
|
||||
caseList,
|
||||
user
|
||||
};
|
||||
};
|
||||
@@ -1,15 +0,0 @@
|
||||
import { getVorgangByCaseId } from '$lib/server/vorgangService';
|
||||
import type { PageServerLoad } from './$types';
|
||||
|
||||
export const load: PageServerLoad = async ({ params, url }) => {
|
||||
const caseId = params.vorgang;
|
||||
const caseToken = url.searchParams.get('token');
|
||||
|
||||
const crimesList = await getVorgangByCaseId(caseId);
|
||||
|
||||
return {
|
||||
caseId,
|
||||
crimesList,
|
||||
caseToken
|
||||
};
|
||||
};
|
||||
@@ -1,5 +1,4 @@
|
||||
<script lang="ts">
|
||||
import { page } from '$app/stores';
|
||||
import Alert from '$lib/components/Alert.svelte';
|
||||
import Button from '$lib/components/Button.svelte';
|
||||
import Modal from '$lib/components/Modal/Modal.svelte';
|
||||
@@ -10,9 +9,14 @@
|
||||
import Cube from '$lib/icons/Cube.svelte';
|
||||
import shortenFileSize from '$lib/helper/shortenFileSize.js';
|
||||
import timeElapsed from '$lib/helper/timeElapsed.js';
|
||||
import { invalidate } from '$app/navigation';
|
||||
import { page } from '$app/stores';
|
||||
|
||||
//Seite für die Tatort-Liste
|
||||
let { data } = $props();
|
||||
|
||||
console.log('tatorte: debug ', data);
|
||||
|
||||
interface ListItem {
|
||||
name: string;
|
||||
size?: number;
|
||||
@@ -21,15 +25,15 @@
|
||||
// add other properties as needed
|
||||
}
|
||||
|
||||
const crimesList: ListItem[] = data.crimesList;
|
||||
const token: string = data.caseToken;
|
||||
const crimesList: ListItem[] = $state(data.crimesList);
|
||||
const token: string | null = data.caseToken;
|
||||
let vorgang = data.caseId;
|
||||
/* export let vorgang = $page.params.vorgang; */
|
||||
|
||||
//Variabeln für EditableItem
|
||||
let names: string[] = $state(crimesList.map((l) => l.name));
|
||||
let editedName: string = $state('');
|
||||
|
||||
let currentName: string = $state('');
|
||||
let open = $state(false);
|
||||
let inProgress = $state(false);
|
||||
let err = $state(false);
|
||||
@@ -128,14 +132,22 @@
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
},
|
||||
body: JSON.stringify({ oldName, newName })
|
||||
body: JSON.stringify({ vorgang, oldName, newName })
|
||||
});
|
||||
const clone = res.clone();
|
||||
const data = await res.json();
|
||||
let message = data.message;
|
||||
let error = !data.success;
|
||||
|
||||
console.log('Tatort Update: ', message);
|
||||
|
||||
if (!res.ok) {
|
||||
const msg = await res.text();
|
||||
const msg = await clone.text();
|
||||
console.error('❌ Fehler beim Speichern:', msg);
|
||||
} else {
|
||||
console.log('✅ Erfolgreich gespeichert:', newName);
|
||||
await invalidate('');
|
||||
currentName = newName;
|
||||
}
|
||||
} catch (err) {
|
||||
console.error('⚠️ Netzwerkfehler:', err);
|
||||
@@ -143,15 +155,6 @@
|
||||
}
|
||||
|
||||
async function handleDelete(tatort: string) {
|
||||
// delete request
|
||||
// --------------
|
||||
|
||||
/* let url = new URL($page.url);
|
||||
url.pathname += `/${filename}`;
|
||||
|
||||
try {
|
||||
const response = await fetch(`/api${url.pathname}`, { method: 'DELETE' }); */
|
||||
|
||||
let url = new URL($page.url);
|
||||
url.pathname += `/${tatort}`;
|
||||
console.log('Delete tatort: ', `/api${url.pathname}`, url.pathname);
|
||||
@@ -164,7 +167,6 @@
|
||||
},
|
||||
body: JSON.stringify({ vorgang, tatort })
|
||||
});
|
||||
console.log('res delete', res);
|
||||
|
||||
if (!res.ok) {
|
||||
const msg = await res.text();
|
||||
@@ -188,7 +190,7 @@
|
||||
<li>
|
||||
<div class=" flex gap-x-4">
|
||||
<a
|
||||
href="/view/{$page.params.vorgang}/{item.name}?token={token}"
|
||||
href="/view/{$page.params.vorgang}/{currentName}?token={token}"
|
||||
class=" flex justify-between gap-x-6 py-5"
|
||||
aria-label="zum 3D-modell"
|
||||
>
|
||||
@@ -214,7 +216,6 @@
|
||||
</p>
|
||||
{/if}
|
||||
</div>
|
||||
<div>{item.name}</div>
|
||||
</div>
|
||||
<div class="hidden sm:flex sm:flex-col sm:items-end">
|
||||
<p class="text-sm leading-6 text-gray-900">3D Tatort</p>
|
||||
|
||||
34
src/routes/(token-based)/list/[vorgang]/+page.ts
Normal file
34
src/routes/(token-based)/list/[vorgang]/+page.ts
Normal file
@@ -0,0 +1,34 @@
|
||||
// load für die Tatort-Liste
|
||||
export async function load({ fetch, params, url }) {
|
||||
|
||||
const caseId = params.vorgang;
|
||||
const caseToken = url.searchParams.get('token');
|
||||
|
||||
const adminRes = await fetch(`/api/user`)
|
||||
const user = await adminRes.json()
|
||||
|
||||
const res = await fetch(`/api/list/${caseId}`, {
|
||||
headers: {
|
||||
Authorization: `Bearer ${caseToken}`
|
||||
}
|
||||
});
|
||||
|
||||
const data = await res.json();
|
||||
|
||||
|
||||
const crimesList = data.crimesList
|
||||
|
||||
|
||||
|
||||
return {
|
||||
caseId,
|
||||
crimesList,
|
||||
caseToken,
|
||||
user
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
import { client } from '$lib/minio';
|
||||
/* import { client } from '$lib/minio';
|
||||
import { json } from '@sveltejs/kit';
|
||||
|
||||
|
||||
@@ -33,3 +33,4 @@ export async function PUT({ request }: {request: Request}) {
|
||||
|
||||
return json({ success: 'success' }, { status: 200 });
|
||||
};
|
||||
*/
|
||||
|
||||
27
src/routes/api/list/+server.ts
Normal file
27
src/routes/api/list/+server.ts
Normal file
@@ -0,0 +1,27 @@
|
||||
import { getListOfVorgänge } from "$lib/server/vorgangService";
|
||||
import { json } from "@sveltejs/kit";
|
||||
|
||||
|
||||
//Get für die Vorgangsliste mit token, daher authorized Abfrage
|
||||
export async function GET({locals, url, request}) {
|
||||
/* if(!locals.user?.admin){
|
||||
return new Response('Unauthorized',{status: 401})
|
||||
}
|
||||
|
||||
const urlToken = url.searchParams.get('token');
|
||||
const caseToken = request.headers.get('Authorization')?.replace('Bearer ', '');
|
||||
|
||||
if(!(urlToken || caseToken)) return new Response('Unauthorized', { status: 401 });
|
||||
*/
|
||||
let caseList;
|
||||
|
||||
try {
|
||||
|
||||
caseList = await getListOfVorgänge();
|
||||
} catch (err) {
|
||||
console.error('Fehler beim Laden der Liste:', err);
|
||||
}
|
||||
if(!caseList) return new Response(`Keine Liste vorhanden ${caseList}`, {status: 404})
|
||||
const data = {caseList}
|
||||
return json(data)
|
||||
}
|
||||
@@ -1,71 +1,99 @@
|
||||
import { client } from '$lib/minio';
|
||||
import { BUCKET, client } from '$lib/minio';
|
||||
import { getVorgangByCaseId } from '$lib/server/vorgangService';
|
||||
import type { RequestHandler } from '@sveltejs/kit';
|
||||
import { json } from '@sveltejs/kit';
|
||||
|
||||
// Seite für die Vorgangs-Liste
|
||||
|
||||
//Get für die Tatortliste mit token, daher authorized Abfrage
|
||||
export async function GET({locals,request, params, url}) {
|
||||
if(!locals.user?.admin){
|
||||
return new Response('Unauthorized',{status: 401})
|
||||
}
|
||||
|
||||
const caseId = params.vorgang;
|
||||
const urlToken = url.searchParams.get('token');
|
||||
const caseToken = request.headers.get('Authorization')?.replace('Bearer ', '');
|
||||
|
||||
|
||||
if(!(urlToken || caseToken)) return new Response('Unauthorized', { status: 401 });
|
||||
|
||||
|
||||
|
||||
|
||||
const crimesList = await getVorgangByCaseId(caseId);
|
||||
const data = {
|
||||
caseId,
|
||||
crimesList,
|
||||
caseToken
|
||||
}
|
||||
return json(data)
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
// rename operation
|
||||
export async function PUT({ request }: {request: Request}) {
|
||||
const data = await request.json();
|
||||
|
||||
|
||||
// Vorgang
|
||||
const vorgang = request.url.split('/').at(-1);
|
||||
|
||||
// prepare copy, incl. check if new name exists already
|
||||
const old_name = data["old_name"];
|
||||
const src_full_path = `/tatort/${vorgang}/${old_name}`;
|
||||
const new_name = `${vorgang}/${data["new_name"]}`;
|
||||
|
||||
try {
|
||||
await client.statObject('tatort', new_name);
|
||||
return json({ msg: 'Die Datei existiert bereits.' }, { status: 400 });
|
||||
} catch (error) {
|
||||
// continue operation
|
||||
console.log(error, 'continue operation');
|
||||
export const PUT: RequestHandler= async ({request, locals}) => {
|
||||
if(!locals.user?.admin){
|
||||
return new Response('Forbidden', { status: 403 });
|
||||
}
|
||||
|
||||
// actual copy operation
|
||||
await client.copyObject('tatort', new_name, src_full_path)
|
||||
|
||||
// delete
|
||||
await client.removeObject('tatort', `${vorgang}/${old_name}`)
|
||||
|
||||
// return success or failure
|
||||
|
||||
return json({ success: 'success' }, { status: 200 });
|
||||
};
|
||||
|
||||
/* export const PUT: RequestHandler = async ({ request, params }) => {
|
||||
const { filename } = params;
|
||||
const { oldName, newName } = await request.json();
|
||||
const { oldName, newName} = await request.json();
|
||||
|
||||
if (!newName || !newName.trim()) {
|
||||
return new Response('Ungültiger Name', { status: 400 });
|
||||
}
|
||||
|
||||
const index = mockList.findIndex((name) => name === oldName);
|
||||
if (index === -1) {
|
||||
return new Response('Name nicht gefunden', { status: 404 });
|
||||
|
||||
|
||||
try {
|
||||
const stat = await client.statObject(BUCKET, newName).catch(()=> null)
|
||||
if(stat){
|
||||
return json({ error: 'Datei mit dem neuen Namen existiert bereits.' }, { status: 409 });
|
||||
}
|
||||
// 2. Kopieren
|
||||
const Object_list:string[] = await new Promise((resolve, reject) => {
|
||||
const res: string[] = [];
|
||||
const items_str = client.listObjects(BUCKET, oldName, true);
|
||||
|
||||
|
||||
|
||||
items_str.on('data', (obj) => {
|
||||
if (obj.name) res.push(obj.name);
|
||||
});
|
||||
|
||||
items_str.on('error', reject);
|
||||
|
||||
items_str.on('end', async () => {
|
||||
try {
|
||||
for (const oldKey of res) {
|
||||
|
||||
const oldPath = `${oldName}/`;
|
||||
const newPath = `${newName}/`;
|
||||
const newKey = oldKey.replace(oldPath, newPath);
|
||||
await client.copyObject(BUCKET, newKey, `/${BUCKET}/${oldKey}`);
|
||||
}
|
||||
resolve(res);
|
||||
} catch (err) {
|
||||
reject(err);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
|
||||
//3. Löschen
|
||||
await client.removeObjects(BUCKET, Object_list)
|
||||
const data = { success: true, message: 'Datei erfolgreich umbenannt.' }
|
||||
|
||||
return json(data, { status: 200 });
|
||||
} catch (err) {
|
||||
console.error('Fehler beim Umbenennen', err)
|
||||
return json({error: `Fehler beim Umbenennen der Datei ${oldName} zu ${newName}`}, {status: 500})
|
||||
}
|
||||
|
||||
if (mockList.includes(newName)) {
|
||||
return new Response('Name existiert bereits', { status: 409 });
|
||||
}
|
||||
|
||||
|
||||
console.log('📥 PUT-Request empfangen:', mockList);
|
||||
mockList[index] = newName;
|
||||
console.log('📄 Datei:', filename);
|
||||
console.log('🔁 Umbenennen:', oldName, '→', newName, mockList);
|
||||
|
||||
// return new Response(JSON.stringify({ success: true }), { status: 200 });
|
||||
|
||||
return json({ success: true, updated: newName });
|
||||
};
|
||||
*/
|
||||
|
||||
export const DELETE: RequestHandler = async ({ request })=> { //body: {request}, keine params // params= de?param1=value¶ms2
|
||||
// const vorgang = params.vorgang;
|
||||
@@ -73,7 +101,7 @@ export const DELETE: RequestHandler = async ({ request })=> { //body: {request},
|
||||
|
||||
const object_list:string[] = await new Promise((resolve, reject) => {
|
||||
const res: string[] = [];
|
||||
const items_str = client.listObjects('tatort', vorgang, true);
|
||||
const items_str = client.listObjects(BUCKET, vorgang, true);
|
||||
|
||||
items_str.on('data', (obj) => {
|
||||
if(obj.name) res.push(obj.name);
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
import { BUCKET, client } from '$lib/minio';
|
||||
import type { RequestHandler } from '@sveltejs/kit';
|
||||
import { json } from '@sveltejs/kit';
|
||||
|
||||
|
||||
// Seite für die Tatorte-Liste
|
||||
export async function GET() {
|
||||
const stream = client.listObjectsV2(BUCKET, '', true);
|
||||
const result = new ReadableStream({
|
||||
@@ -22,6 +25,42 @@ export async function GET() {
|
||||
'content-type': 'text/event-stream'
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
export const PUT: RequestHandler= async ({request, locals}) => {
|
||||
|
||||
if(!locals.user?.admin){
|
||||
return new Response('Forbidden', { status: 403 });
|
||||
}
|
||||
const {vorgang, oldName, newName} = await request.json();
|
||||
|
||||
if (!newName || !newName.trim()) {
|
||||
return new Response('Ungültiger Name', { status: 400 });
|
||||
}
|
||||
|
||||
|
||||
const oldKey = `${vorgang}/${oldName}`;
|
||||
const newKey = `${vorgang}/${newName}`;
|
||||
console.log("PUT Tatorte-Liste: ", vorgang, oldKey, newKey);
|
||||
try {
|
||||
const stat = await client.statObject(BUCKET, newKey).catch(()=> null)
|
||||
if(stat){
|
||||
return json({ error: 'Datei mit dem neuen Namen existiert bereits.' }, { status: 409 });
|
||||
}
|
||||
|
||||
// 2. Kopieren
|
||||
await client.copyObject(BUCKET, newKey, `/${BUCKET}/${oldKey}`);
|
||||
//3. Löschen
|
||||
await client.removeObject(BUCKET, oldKey)
|
||||
const data = { success: true, message: 'Datei erfolgreich umbenannt.' }
|
||||
return json(data);
|
||||
} catch (err) {
|
||||
console.error('Fehler beim Umbenennen', err)
|
||||
return json({error: 'Fehler beim Umbenennen der Datei'}, {status: 500})
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
export const DELETE: RequestHandler = async ({ request })=> { //body: {request}, keine params // params= de?param1=value¶ms2
|
||||
|
||||
10
src/routes/api/user/+server.ts
Normal file
10
src/routes/api/user/+server.ts
Normal file
@@ -0,0 +1,10 @@
|
||||
//Rollenabfrage ob Benutzer admin ist
|
||||
|
||||
import { json } from "@sveltejs/kit";
|
||||
|
||||
export async function GET({locals}) {
|
||||
const isAdmin = locals.user?.admin === true;
|
||||
const data = {admin: isAdmin}
|
||||
return json(data)
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user