diff --git a/src/routes/(angemeldet)/list/+page.svelte b/src/routes/(angemeldet)/list/+page.svelte index fff40ab..d2fdc0b 100644 --- a/src/routes/(angemeldet)/list/+page.svelte +++ b/src/routes/(angemeldet)/list/+page.svelte @@ -6,6 +6,7 @@
@@ -61,7 +89,16 @@ />
-

{item.name}

+ {item.name} + +
diff --git a/src/routes/(angemeldet)/list/[vorgang]/+server.js b/src/routes/(angemeldet)/list/[vorgang]/+server.js new file mode 100644 index 0000000..d090407 --- /dev/null +++ b/src/routes/(angemeldet)/list/[vorgang]/+server.js @@ -0,0 +1,36 @@ +import { client } from '$lib/minio'; +import { json } from '@sveltejs/kit'; + + +// rename operation +export async function PUT({ request }) { + const data = await request.json(); + + console.log(`--- ${request.url.split('/').at(-1)} +++ ${JSON.stringify(data)}`); + + // Vorgang + let vorgang = request.url.split('/').at(-1) + + // prepare copy, incl. check if new name exists already + let old_name = data["old_name"] + let src_full_path = `/tatort/${vorgang}/${old_name}` + let new_name = `${vorgang}/${data["new_name"]}` + + try { + let file_stats = await client.statObject('tatort', new_name) + return json({ msg: 'Die Datei existiert bereits.' }, { status: 400 }) + } catch (error) { + // continue operation + console.log('continue operation') + } + + // 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 }); +}; diff --git a/src/routes/(angemeldet)/list/[vorgang]/[tatort]/+server.js b/src/routes/(angemeldet)/list/[vorgang]/[tatort]/+server.js new file mode 100644 index 0000000..76dd05d --- /dev/null +++ b/src/routes/(angemeldet)/list/[vorgang]/[tatort]/+server.js @@ -0,0 +1,13 @@ +import { client } from '$lib/minio'; +import { json } from '@sveltejs/kit'; + +export async function DELETE({ request }) { + + let url_fragments = request.url.split('/') + let item = url_fragments.at(-1); + let vorgang = url_fragments.at(-2); + + await client.removeObject('tatort', `${vorgang}/${item}`) + + return new Response(null, { status: 204 }); +}; diff --git a/src/routes/(angemeldet)/upload/+page.svelte b/src/routes/(angemeldet)/upload/+page.svelte index 6ada8b3..fb6104e 100644 --- a/src/routes/(angemeldet)/upload/+page.svelte +++ b/src/routes/(angemeldet)/upload/+page.svelte @@ -47,6 +47,11 @@ success = false; } + if (!(await check_valid_glb_file())) { + formErrors = { file: 'Keine gültige .GLD-Datei', ...formErrors }; + success = false; + } + return success; } @@ -97,6 +102,47 @@ name = ''; files = null; } + + // `val` is hex string + function swap_endian(val) { + // from https://www.geeksforgeeks.org/bit-manipulation-swap-endianness-of-a-number/ + + let leftmost_byte = (val & eval(0x000000FF)) >> 0; + let left_middle_byte = (val & eval(0x0000FF00)) >> 8; + let right_middle_byte = (val & eval(0x00FF0000)) >> 16; + let rightmost_byte = (val & eval(0xFF000000)) >> 24; + + leftmost_byte <<= 24; + left_middle_byte <<= 16; + right_middle_byte <<= 8; + rightmost_byte <<= 0; + + let res = (leftmost_byte | left_middle_byte | right_middle_byte | rightmost_byte) + + return res + } + + + async function check_valid_glb_file() { + // GLD Header, magic value 0x46546C67, identifies data as binary glTF, 4 bytes + // little endian! + const GLD_MAGIC = 0x46546C67; + + // big endian! + let file = files[0]; + let file_header = file.slice(0, 4) + let header_bytes = await file_header.bytes() + let file_header_hex = '0x' + header_bytes.toHex().toString(); + + + if (GLD_MAGIC == swap_endian(file_header_hex)) { + return true; + } else { + return false; + } + + } +
diff --git a/src/routes/api/list/[[vorgang]]/+server.js b/src/routes/api/list/[[vorgang]]/+server.js index 9115150..c1729fa 100644 --- a/src/routes/api/list/[[vorgang]]/+server.js +++ b/src/routes/api/list/[[vorgang]]/+server.js @@ -33,3 +33,31 @@ export async function GET({ params }) { } }); } + + +export async function DELETE({ params }) { + const vorgang = params.vorgang + + const object_list = await new Promise((resolve, reject) => { + + const res = [] + const items_str = client.listObjects('tatort', vorgang, true) + + items_str.on('data', (obj) => { + res.push(obj.name) + }) + + items_str.on('error', reject) + + items_str.on('end', async () => { + resolve(res) + }) + + console.log(`+++ ${vorgang}`) + + }) + + await client.removeObjects('tatort', object_list) + + return new Response(null, { status: 204 }); +};