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 @@
diff --git a/src/routes/(angemeldet)/list/[vorgang]/+page.svelte b/src/routes/(angemeldet)/list/[vorgang]/+page.svelte
index 484ff43..aa1e20f 100644
--- a/src/routes/(angemeldet)/list/[vorgang]/+page.svelte
+++ b/src/routes/(angemeldet)/list/[vorgang]/+page.svelte
@@ -5,11 +5,19 @@
@@ -48,7 +158,7 @@
- {#each list as item}
+ {#each list as item, i}
-
-
{item.name}
+
{
+ defocus_element(i);
+ }}
+ on:keydown|stopPropagation={
+ // event needed to identify ID
+ // TO-DO: check if event is needed or if index is sufficient
+ async (ev) => {handle_input(ev, i)}
+ }
+
+ >{item.name}
+
+
+ {#if item.show_button}
+
+ {/if}
+
+
{shortenFileSize(item.size)}
@@ -89,4 +273,17 @@
{/each}
+
+Umbenennen
+ {#if inProgress}
+ Vorgang läuft...
+ {/if}
+ {#if err}
+ Fehler beim Umbenennen
+ {/if}
+
+
+
+
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 });
+};