From 9519b0fdd1e854b162a8efee53fa8653f442828e Mon Sep 17 00:00:00 2001 From: mina Date: Wed, 14 May 2025 17:08:30 +0200 Subject: [PATCH 01/49] update des Tages CameraSteuerung --- .../(angemeldet)/view/[vorgang]/[tatort]/+page.svelte | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte b/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte index 9cb348c..e254045 100644 --- a/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte +++ b/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte @@ -33,7 +33,7 @@ let progress = 0; let hideProgressScreen = false; - let cameraOrbit = '0deg 0deg 0m'; + let cameraOrbit = '0deg 0deg 0%'; let cameraTarget ="0m 0m 0m"; let fieldOfView = '0deg'; @@ -64,8 +64,7 @@ function onResetView() { - cameraOrbit = '0deg 0deg 0m'; - cameraTarget ="0m 0m 0m" + console.log("show cameraOrbit:", modelViewer.getCameraOrbit(), modelViewer.cameraOrbit, modelViewer.getDimensions()) console.log("Camera-orbit: ",modelViewer.getAttribute('camera-orbit'), "camera-target: ",modelViewer.getAttribute('camera-target'), "object-rotation: ", modelViewer.getAttribute('rotation')) @@ -73,7 +72,7 @@ modelViewer.cameraOrbit = cameraOrbit; modelViewer.cameraTarget = cameraTarget; xRotation = yRotation = zRotation = 0; - cameraOrbit = '0deg 0deg 0%'; + cameraOrbit = '0deg 0deg 0m'; cameraTarget ="0m 0m 0m"; fieldOfView = '0deg'; From f56eeeee2ca429256d8f53ec02aeda4b448f83df Mon Sep 17 00:00:00 2001 From: mina Date: Thu, 15 May 2025 11:58:10 +0200 Subject: [PATCH 02/49] update kleine Anpassungen --- .../view/[vorgang]/[tatort]/+page.svelte | 309 ++++++++---------- 1 file changed, 140 insertions(+), 169 deletions(-) diff --git a/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte b/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte index e254045..dbee528 100644 --- a/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte +++ b/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte @@ -1,58 +1,43 @@ - - - - -
- - - +
- -
-
+ +
+
-
+
- + -
- + -
- - - - +
+ + +
+ +
+ +
- -
- - - -
-
- - +
+ +
-
- -
- -
- - - -
-
- - - -
-
- - - -
- + +
+ Modell rotieren lassen: +
+ Modell auf dem Kopf? -> y auf 270° +
+ +
+
+ + +
+
+ + +
+
+

Loading {progress}%

-
+
+ + From 23123c62912eb522e32f4bf1823288dc2b667860 Mon Sep 17 00:00:00 2001 From: mina Date: Thu, 15 May 2025 12:01:46 +0200 Subject: [PATCH 03/49] warnings korrigiert --- .../view/[vorgang]/[tatort]/+page.svelte | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte b/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte index dbee528..64f4459 100644 --- a/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte +++ b/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte @@ -149,8 +149,8 @@
- - + +
@@ -205,17 +205,17 @@ width: 100%; } - .vertical-slider { - writing-mode: bt-lr; /* Schreibt von unten nach oben (Vertikale Darstellung) */ - transform: rotate(270deg); /* Slider um 270° drehen */ + /* .vertical-slider { + writing-mode: bt-lr; /* Schreibt von unten nach oben (Vertikale Darstellung) + transform: rotate(270deg); /* Slider um 270° drehen height: 200px; - } + } */ .model { height: calc(100%-84px); } - .active-border { + /* .active-border { border: 2px blue solid; - } + } */ From 8bc7fad1466698ffef01947b51767f6cf53a13b6 Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Fri, 16 May 2025 10:40:50 +0200 Subject: [PATCH 04/49] fix two style element --- .../view/[vorgang]/[tatort]/+page.svelte | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte b/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte index 06ccec9..64f4459 100644 --- a/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte +++ b/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte @@ -1,16 +1,3 @@ - -
@@ -178,6 +201,7 @@ id="vorgang" autocomplete={vorgang} class="block flex-1 border-0 bg-transparent py-1.5 pl-1 text-gray-900 placeholder:text-gray-400 focus:ring-0 sm:text-sm sm:leading-6" + on:input={() => case_exists(vorgang)} />
@@ -216,7 +240,9 @@
@@ -232,8 +258,8 @@ />
- {#if formErrors?.vorgang} -

{formErrors.vorgang}

+ {#if formErrors?.code} +

{formErrors.code}

{/if}
diff --git a/src/routes/(angemeldet)/view/+page.server.js b/src/routes/(angemeldet)/view/+page.server.js index 337f6e4..3adaae8 100644 --- a/src/routes/(angemeldet)/view/+page.server.js +++ b/src/routes/(angemeldet)/view/+page.server.js @@ -5,9 +5,11 @@ import { fail, redirect } from '@sveltejs/kit'; export const actions = { default: async ({ request }) => { const data = await request.formData(); + console.log(`--- ${Object.keys(data)}`) const caseNumber = data.get('caseNumber'); if (!caseNumber) { + console.log('^^^ here') return fail(400, { success: false, caseNumber, @@ -15,13 +17,20 @@ export const actions = { }); } + let res = (await caseNumberOccupied(caseNumber)) + console.log(`gibt es? ${res} + ${caseNumber}`) if (!(await caseNumberOccupied(caseNumber))) { + console.log('^^^ there') return fail(400, { success: false, caseNumber, error: { caseNumber: 'Die Vorgangsnummer existiert in dieser Anwendung nicht.' } }); } - throw redirect(303, `/list/${caseNumber}`); + else { + throw redirect(303, `/list/${caseNumber}`); + console.log(`---blabla ${caseNumber}`) + } + } }; From bebd226c80d88b7746ea008d7ec00d81badd1c04 Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Thu, 22 May 2025 14:16:44 +0200 Subject: [PATCH 08/49] fixed fluechtigkeitsfehler --- src/lib/helper/caseNumberOccupied.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/helper/caseNumberOccupied.js b/src/lib/helper/caseNumberOccupied.js index 9f8a96c..50062e8 100644 --- a/src/lib/helper/caseNumberOccupied.js +++ b/src/lib/helper/caseNumberOccupied.js @@ -1,4 +1,4 @@ -limport { client } from '$lib/minio'; +import { client } from '$lib/minio'; /** * Check if caseNumber is used From 99a27fc079560e7f13e6fac3f51d81a4708a0434 Mon Sep 17 00:00:00 2001 From: mina Date: Thu, 22 May 2025 17:25:33 +0200 Subject: [PATCH 09/49] update frontend --- src/lib/helper/caseNumberOccupied.js | 2 +- .../(angemeldet)/list/[vorgang]/+page.svelte | 269 ++++++++++-------- .../view/[vorgang]/[tatort]/+page.svelte | 14 + 3 files changed, 163 insertions(+), 122 deletions(-) diff --git a/src/lib/helper/caseNumberOccupied.js b/src/lib/helper/caseNumberOccupied.js index 50062e8..a5f3934 100644 --- a/src/lib/helper/caseNumberOccupied.js +++ b/src/lib/helper/caseNumberOccupied.js @@ -3,7 +3,7 @@ import { client } from '$lib/minio'; /** * Check if caseNumber is used * @param {string} caseNumber - * @returns {Promise} */ export default async function caseNumberOccupied(caseNumber) { const prefix = `${caseNumber}/config.json`; diff --git a/src/routes/(angemeldet)/list/[vorgang]/+page.svelte b/src/routes/(angemeldet)/list/[vorgang]/+page.svelte index 20008e9..51df692 100644 --- a/src/routes/(angemeldet)/list/[vorgang]/+page.svelte +++ b/src/routes/(angemeldet)/list/[vorgang]/+page.svelte @@ -1,9 +1,3 @@ - -
@@ -191,94 +187,120 @@ />
- { - 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 data.user.admin} + - {#if item.show_button} - + { + handle_input(ev, i); + }} + disabled={item.show_button} + bind:value={item.name} + id="label__{item.name}" + /> + + + {#if item.show_button} + + {/if} + + {:else} + {item.name} {/if} -

{shortenFileSize(item.size)}

@@ -298,7 +320,7 @@
-Umbenennen {#if inProgress}

Vorgang läuft...

@@ -309,5 +331,10 @@
-
+ + diff --git a/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte b/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte index 64f4459..3ccbbd1 100644 --- a/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte +++ b/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte @@ -89,7 +89,10 @@
+ + + +
AR-Prompt
+ +
+ +
diff --git a/src/routes/(angemeldet)/view/+page.server.js b/src/routes/(angemeldet)/view/+page.server.js index 3adaae8..6d9df2d 100644 --- a/src/routes/(angemeldet)/view/+page.server.js +++ b/src/routes/(angemeldet)/view/+page.server.js @@ -5,11 +5,9 @@ import { fail, redirect } from '@sveltejs/kit'; export const actions = { default: async ({ request }) => { const data = await request.formData(); - console.log(`--- ${Object.keys(data)}`) const caseNumber = data.get('caseNumber'); if (!caseNumber) { - console.log('^^^ here') return fail(400, { success: false, caseNumber, @@ -17,20 +15,13 @@ export const actions = { }); } - let res = (await caseNumberOccupied(caseNumber)) - console.log(`gibt es? ${res} + ${caseNumber}`) if (!(await caseNumberOccupied(caseNumber))) { - console.log('^^^ there') return fail(400, { success: false, caseNumber, error: { caseNumber: 'Die Vorgangsnummer existiert in dieser Anwendung nicht.' } }); } - else { - throw redirect(303, `/list/${caseNumber}`); - console.log(`---blabla ${caseNumber}`) - } - + redirect(303, `/list/${caseNumber}`); } }; From b966d19792e75655ada0dc28e6870917de3b72da Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Mon, 26 May 2025 13:55:19 +0200 Subject: [PATCH 14/49] Ende des Tages 26.05. --- src/routes/(angemeldet)/upload/+page.server.js | 6 ++++++ src/routes/(angemeldet)/upload/+page.svelte | 16 ++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/routes/(angemeldet)/upload/+page.server.js b/src/routes/(angemeldet)/upload/+page.server.js index 73bedd5..dffbea1 100644 --- a/src/routes/(angemeldet)/upload/+page.server.js +++ b/src/routes/(angemeldet)/upload/+page.server.js @@ -22,6 +22,7 @@ export const actions = { const vorgang = data.get('vorgang'); const name = data.get('name'); const type = data.get('type'); + const code = data.get('zugangscode'); const fileName = data.get('fileName'); let objectName = `${vorgang}/${name}`; @@ -35,6 +36,8 @@ export const actions = { const url = await client.presignedPutObject('tatort', objectName); + // enter code + return { url }; }, validate: async ({ request }) => { @@ -106,5 +109,8 @@ export const actions = { return { etag, error }; //await writeFile(filePath, Buffer.from(await data.file.arrayBuffer())); + }, + get_code: async ({ request }) => { + console.log('TO-DO'); } }; diff --git a/src/routes/(angemeldet)/upload/+page.svelte b/src/routes/(angemeldet)/upload/+page.svelte index aebb703..edd6a2d 100644 --- a/src/routes/(angemeldet)/upload/+page.svelte +++ b/src/routes/(angemeldet)/upload/+page.svelte @@ -15,7 +15,12 @@ let inProgress = false; let vorgang = ''; const code_len = 8; - let zugangscode = Math.random().toString(36).slice(2, 2+code_len); + let zugangscode = '' + let zugangscode_prev = ''; + + $: zugangscode = Math.random().toString(36).slice(2, 2+code_len); + + let case_existing = undefined; $: case_existing = false; @@ -65,6 +70,7 @@ let data = new FormData(); data.append('vorgang', vorgang); data.append('name', name); + data.append('zugangscode', zugangscode) if (files?.length === 1) { data.append('type', files[0].type); data.append('fileName', files[0].name); @@ -164,8 +170,10 @@ const res_json = await response.json(); const status = res_json.status; - + // aktualisiere Zugangscode mit if (status == 303) { + // TO-DO: check existing code + console.log(`+ existiert`) case_existing = true; return; @@ -215,9 +223,9 @@ {#if formErrors?.vorgang}

{formErrors.vorgang}

{/if} - {#if case_existing} + {#if case_existing && (vorgang.length > 0) } Datei wird zum existierenden Vorgang hinzugefügt. - {:else} + {:else if (vorgang.length > 0) } Neuer Vorgang wird angelegt. {/if}
From 0557d4220749729d9e22c0618c628734bfe38913 Mon Sep 17 00:00:00 2001 From: mina Date: Mon, 26 May 2025 14:11:01 +0200 Subject: [PATCH 15/49] temp Commit Mina --- config.json | 2 +- src/error.html | 4 + src/hooks.server.js | 2 +- src/lib/icons/Add-Process.svelte | 19 ++ src/lib/icons/Cube.svelte | 14 + src/lib/icons/Edit.svelte | 7 + src/lib/icons/File-rect.svelte | 35 +++ src/lib/icons/Folder.svelte | 14 + src/lib/icons/List-icon.svelte | 19 ++ src/lib/icons/Profile.svelte | 14 + src/routes/(angemeldet)/+layout.svelte | 18 +- src/routes/(angemeldet)/+page.svelte | 55 +--- src/routes/(angemeldet)/list/+page.svelte | 89 +++---- .../(angemeldet)/list/[vorgang]/+page.svelte | 252 ++++++++---------- src/routes/(angemeldet)/upload/+page.svelte | 50 ++-- static/1.svg | 14 + 16 files changed, 328 insertions(+), 280 deletions(-) create mode 100644 src/error.html create mode 100644 src/lib/icons/Add-Process.svelte create mode 100644 src/lib/icons/Cube.svelte create mode 100644 src/lib/icons/Edit.svelte create mode 100644 src/lib/icons/File-rect.svelte create mode 100644 src/lib/icons/Folder.svelte create mode 100644 src/lib/icons/List-icon.svelte create mode 100644 src/lib/icons/Profile.svelte create mode 100644 static/1.svg diff --git a/config.json b/config.json index 970af4c..8490de6 100644 --- a/config.json +++ b/config.json @@ -8,7 +8,7 @@ }, "jwt": { "secret": "@S2!q@@wXz$dCQ8JoVsHLpzaJ6JCfB", - "expiresIn": 3600 + "expiresIn": 36000 }, "auth": { "admin": { "password": "A-InnoHUB_2025!", "admin": true }, diff --git a/src/error.html b/src/error.html new file mode 100644 index 0000000..73d0c64 --- /dev/null +++ b/src/error.html @@ -0,0 +1,4 @@ +

Du wurdest automatisch ausgeloggt

+

Lösche deine Cookies aus dem Browser und logge dich neu ein

+

Code %sveltekit.status%

+

%sveltekit.error.message%

diff --git a/src/hooks.server.js b/src/hooks.server.js index 19b1bcc..5ef1fb4 100644 --- a/src/hooks.server.js +++ b/src/hooks.server.js @@ -12,5 +12,5 @@ export async function handle({ event, resolve }) { await event.cookies.delete('session'); event.locals.user = null; } - return resolve(event); + return await resolve(event); } diff --git a/src/lib/icons/Add-Process.svelte b/src/lib/icons/Add-Process.svelte new file mode 100644 index 0000000..4a5cebc --- /dev/null +++ b/src/lib/icons/Add-Process.svelte @@ -0,0 +1,19 @@ + + + diff --git a/src/lib/icons/Cube.svelte b/src/lib/icons/Cube.svelte new file mode 100644 index 0000000..4992960 --- /dev/null +++ b/src/lib/icons/Cube.svelte @@ -0,0 +1,14 @@ + + + diff --git a/src/lib/icons/Edit.svelte b/src/lib/icons/Edit.svelte new file mode 100644 index 0000000..10f6ddc --- /dev/null +++ b/src/lib/icons/Edit.svelte @@ -0,0 +1,7 @@ + diff --git a/src/lib/icons/File-rect.svelte b/src/lib/icons/File-rect.svelte new file mode 100644 index 0000000..f31a268 --- /dev/null +++ b/src/lib/icons/File-rect.svelte @@ -0,0 +1,35 @@ + + +{#if outline} + + + +{:else} + +{/if} diff --git a/src/lib/icons/Folder.svelte b/src/lib/icons/Folder.svelte new file mode 100644 index 0000000..6d20ec4 --- /dev/null +++ b/src/lib/icons/Folder.svelte @@ -0,0 +1,14 @@ + + + diff --git a/src/lib/icons/List-icon.svelte b/src/lib/icons/List-icon.svelte new file mode 100644 index 0000000..c851e89 --- /dev/null +++ b/src/lib/icons/List-icon.svelte @@ -0,0 +1,19 @@ + + + + + diff --git a/src/lib/icons/Profile.svelte b/src/lib/icons/Profile.svelte new file mode 100644 index 0000000..b3b6762 --- /dev/null +++ b/src/lib/icons/Profile.svelte @@ -0,0 +1,14 @@ + + + diff --git a/src/routes/(angemeldet)/+layout.svelte b/src/routes/(angemeldet)/+layout.svelte index a2c875c..c42aa61 100644 --- a/src/routes/(angemeldet)/+layout.svelte +++ b/src/routes/(angemeldet)/+layout.svelte @@ -1,6 +1,7 @@ @@ -59,20 +60,9 @@ href="/" class="px-4 py-1 -mr-4 flex items-center justify-center gap-x-2.5 text-sm font-semibold leading-6 text-gray-500 hover:bg-gray-200 hover:text-gray-700" > - - - + + + {data.user.id}
diff --git a/src/routes/(angemeldet)/+page.svelte b/src/routes/(angemeldet)/+page.svelte index 7693617..b9a4519 100644 --- a/src/routes/(angemeldet)/+page.svelte +++ b/src/routes/(angemeldet)/+page.svelte @@ -1,10 +1,11 @@ - -
- - - +
Liste @@ -72,20 +60,7 @@
- +
Hinzufügen @@ -98,20 +73,7 @@
- - - +
Ansicht @@ -121,3 +83,6 @@
+ + diff --git a/src/routes/(angemeldet)/list/+page.svelte b/src/routes/(angemeldet)/list/+page.svelte index 3f56b0b..a6dec78 100644 --- a/src/routes/(angemeldet)/list/+page.svelte +++ b/src/routes/(angemeldet)/list/+page.svelte @@ -1,12 +1,8 @@ - - @@ -80,32 +74,19 @@
  • - - - + +
    {item.name} + style="padding: 2px" + id="del__{item.name}" + on:click|preventDefault={delete_item} + aria-label="Vorgang {item.name} löschen" + > + +
  • + + diff --git a/src/routes/(angemeldet)/list/[vorgang]/+page.svelte b/src/routes/(angemeldet)/list/[vorgang]/+page.svelte index 51df692..0d3ef3a 100644 --- a/src/routes/(angemeldet)/list/[vorgang]/+page.svelte +++ b/src/routes/(angemeldet)/list/[vorgang]/+page.svelte @@ -11,6 +11,9 @@ import ModalTitle from '$lib/components/ui/Modal/ModalTitle.svelte'; import ModalContent from '$lib/components/ui/Modal/ModalContent.svelte'; import ModalFooter from '$lib/components/ui/Modal/ModalFooter.svelte'; + import Cube from '$lib/icons/Cube.svelte'; + import Edit from '$lib/icons/Edit.svelte'; + import Trash from '$lib/icons/Trash.svelte'; /** @type {import('./$types').PageData} */ export let data; @@ -167,154 +170,129 @@ diff --git a/src/routes/(angemeldet)/upload/+page.svelte b/src/routes/(angemeldet)/upload/+page.svelte index 2ffab96..e0d05e3 100644 --- a/src/routes/(angemeldet)/upload/+page.svelte +++ b/src/routes/(angemeldet)/upload/+page.svelte @@ -8,6 +8,7 @@ import ModalFooter from '$lib/components/ui/Modal/ModalFooter.svelte'; import shortenFileSize from '$lib/helper/shortenFileSize.js'; import Exclamation from '$lib/icons/Exclamation.svelte'; + import FileRect from '$lib/icons/File-rect.svelte'; export let form; @@ -15,7 +16,9 @@ let inProgress = false; let vorgang = ''; const code_len = 8; - let zugangscode = Math.random().toString(36).slice(2, 2+code_len); + let zugangscode = Math.random() + .toString(36) + .slice(2, 2 + code_len); let case_existing = undefined; let name = ''; /** @type {?string}*/ @@ -32,7 +35,7 @@ let data = new FormData(); data.append('vorgang', vorgang); data.append('name', name); - data.append('zugangscode', zugangscode) + data.append('zugangscode', zugangscode); const response = await fetch('?/validate', { method: 'POST', body: data }); /** @type {import('@sveltejs/kit').ActionResult} */ const result = deserialize(await response.text()); @@ -111,54 +114,51 @@ 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; + 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) + let res = leftmost_byte | left_middle_byte | right_middle_byte | rightmost_byte; - return res + 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; + 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 = 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; } - } // return true or false async function case_exists(case_no) { - console.log('--- fired') + console.log('--- fired'); // ping `/(angemeldet)/view` with caseNumber in POST body - let url = '/view' + let url = '/view'; let data = new FormData(); data.append('caseNumber', case_no); - const response = await fetch(url, { method: 'POST', body: data }) + const response = await fetch(url, { method: 'POST', body: data }); const code = response.status; - console.log(`+++ ${response.redirected}`) + console.log(`+++ ${response.redirected}`); if (code == 303) { return true; @@ -166,7 +166,6 @@ return false; } -
    @@ -275,18 +274,7 @@ class="mt-2 flex justify-center rounded-lg border border-dashed border-gray-900/25 px-6 py-10" >
    - +
    From db90bae19fd6b7ca0088fe86adbe52d880f6dcf6 Mon Sep 17 00:00:00 2001 From: mina Date: Mon, 2 Jun 2025 17:23:01 +0200 Subject: [PATCH 24/49] fix debug --- src/routes/(angemeldet)/view/+page.server.js | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/routes/(angemeldet)/view/+page.server.js b/src/routes/(angemeldet)/view/+page.server.js index d4e5129..a8bd2aa 100644 --- a/src/routes/(angemeldet)/view/+page.server.js +++ b/src/routes/(angemeldet)/view/+page.server.js @@ -32,7 +32,9 @@ export const actions = { // Jetzt prüfen, ob Code vorhanden ist und // dem eingegebenen Code entspricht - const token = await codex(caseNumber); +//Nur Abfrage,wenn user_token nicht false ist + if(user_token){ + const token = await codex(caseNumber); console.log(`xxx ${token}, ${user_token}`); if (token && token != user_token) { @@ -43,6 +45,7 @@ export const actions = { error: { token: 'Der Token ist falsch.' } }); } + } // if (token != -1 && user_token != token) { // console.log('ooo Fehler'); From 5ef5476d92bf2160f5259ea322efbb7d7dd6a1db Mon Sep 17 00:00:00 2001 From: mina Date: Mon, 2 Jun 2025 17:24:34 +0200 Subject: [PATCH 25/49] delete token --- src/routes/(angemeldet)/view/+page.svelte | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/src/routes/(angemeldet)/view/+page.svelte b/src/routes/(angemeldet)/view/+page.svelte index 50145bd..ea3b786 100644 --- a/src/routes/(angemeldet)/view/+page.svelte +++ b/src/routes/(angemeldet)/view/+page.svelte @@ -8,7 +8,6 @@ import Exclamation from '$lib/icons/Exclamation.svelte'; export let form; - let token = 'TOKEN-$$$';
    @@ -54,10 +53,7 @@
    Zugangscode
    {form.error.token}

    {/if}
    - -
    From c991e3d7789c789349dc75a373920fad4d9f0e33 Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Thu, 5 Jun 2025 08:26:53 +0200 Subject: [PATCH 26/49] add token back --- src/routes/(angemeldet)/view/+page.svelte | 1 - 1 file changed, 1 deletion(-) diff --git a/src/routes/(angemeldet)/view/+page.svelte b/src/routes/(angemeldet)/view/+page.svelte index ea3b786..17a121a 100644 --- a/src/routes/(angemeldet)/view/+page.svelte +++ b/src/routes/(angemeldet)/view/+page.svelte @@ -60,7 +60,6 @@ class="flex w-full rounded-md shadow-sm ring-1 ring-inset ring-gray-300 focus-within:ring-2 focus-within:ring-inset focus-within:ring-indigo-600" > Date: Fri, 6 Jun 2025 08:27:32 +0200 Subject: [PATCH 27/49] insert token to overwrite entered code --- src/routes/(angemeldet)/view/+page.svelte | 1 + 1 file changed, 1 insertion(+) diff --git a/src/routes/(angemeldet)/view/+page.svelte b/src/routes/(angemeldet)/view/+page.svelte index 17a121a..4ef2cc7 100644 --- a/src/routes/(angemeldet)/view/+page.svelte +++ b/src/routes/(angemeldet)/view/+page.svelte @@ -60,6 +60,7 @@ class="flex w-full rounded-md shadow-sm ring-1 ring-inset ring-gray-300 focus-within:ring-2 focus-within:ring-inset focus-within:ring-indigo-600" > Date: Fri, 6 Jun 2025 11:42:37 +0200 Subject: [PATCH 28/49] fix permission code check --- src/routes/(angemeldet)/upload/+page.svelte | 39 +++++++++----------- src/routes/(angemeldet)/view/+page.server.js | 19 +--------- 2 files changed, 19 insertions(+), 39 deletions(-) diff --git a/src/routes/(angemeldet)/upload/+page.svelte b/src/routes/(angemeldet)/upload/+page.svelte index b639246..b898c10 100644 --- a/src/routes/(angemeldet)/upload/+page.svelte +++ b/src/routes/(angemeldet)/upload/+page.svelte @@ -158,42 +158,37 @@ } } - ///(angemeldet)/view return true or false + // `/(angemeldet)/view` return true or false async function case_exists(case_no) { - // ping `` with caseNumber in POST body + + if (case_no == '') { + zuganscode = zugangscode_old; + } + + // ping `/view` with caseNumber in POST body let url = '/view'; + let data = new FormData(); data.append('caseNumber', case_no); - console.log('--- case exist_func', case_no) - // fetch code in parallel - const code = get_code(case_no); + const code = await get_code(case_no); + if (code != -1) { + zugangscode = code; + case_existing = true; + return true + } const response = await fetch(url, { method: 'POST', body: data }); const res_json = await response.json(); - console.log(`+++ ${res_json.data}`) const status = res_json.status; - // aktualisiere Zugangscode mit - if (status == 303) { - case_existing = true; - - const res = await code; - - - if (res != -1) { - // Code vorhanden - zugangscode = res; - } - - return true; + if (status != 303) { + case_existing = false; + zugangscode = zugangscode_old; } - case_existing = false; - zugangscode = zugangscode_old; - return false; } diff --git a/src/routes/(angemeldet)/view/+page.server.js b/src/routes/(angemeldet)/view/+page.server.js index a8bd2aa..04579b1 100644 --- a/src/routes/(angemeldet)/view/+page.server.js +++ b/src/routes/(angemeldet)/view/+page.server.js @@ -32,11 +32,10 @@ export const actions = { // Jetzt prüfen, ob Code vorhanden ist und // dem eingegebenen Code entspricht -//Nur Abfrage,wenn user_token nicht false ist - if(user_token){ - const token = await codex(caseNumber); + const token = await codex(caseNumber); console.log(`xxx ${token}, ${user_token}`); + // token vorhanden, check ob gleich sind if (token && token != user_token) { console.log(`ooo token check`); return fail(400, { @@ -45,20 +44,6 @@ export const actions = { error: { token: 'Der Token ist falsch.' } }); } - } - - // if (token != -1 && user_token != token) { - // console.log('ooo Fehler'); - // redirect(303, `/view`); - // } - // if (token != -1 && user_token != token) { - // console.log('ooo Fehler'); - // return fail(400, { - // success: false, - // caseNumber, - // error: { token: 'Der Zugangscode ist falsch.' } - // }); - // } redirect(303, `/list/${caseNumber}`); } From d5b39575c74a182b17c5c3f44f4505d8d86fa003 Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Fri, 6 Jun 2025 11:44:59 +0200 Subject: [PATCH 29/49] fix typo --- src/routes/(angemeldet)/upload/+page.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/(angemeldet)/upload/+page.svelte b/src/routes/(angemeldet)/upload/+page.svelte index b898c10..22b2bd3 100644 --- a/src/routes/(angemeldet)/upload/+page.svelte +++ b/src/routes/(angemeldet)/upload/+page.svelte @@ -162,7 +162,7 @@ async function case_exists(case_no) { if (case_no == '') { - zuganscode = zugangscode_old; + zugangscode = zugangscode_old; } // ping `/view` with caseNumber in POST body From 20c273407f52cdfab7bd2e5138b65be105ed1593 Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Tue, 10 Jun 2025 07:58:35 +0200 Subject: [PATCH 30/49] remove config check --- src/lib/helper/caseNumberOccupied.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/helper/caseNumberOccupied.js b/src/lib/helper/caseNumberOccupied.js index a5f3934..e727abf 100644 --- a/src/lib/helper/caseNumberOccupied.js +++ b/src/lib/helper/caseNumberOccupied.js @@ -6,7 +6,7 @@ import { client } from '$lib/minio'; * @returns {Promise} */ export default async function caseNumberOccupied(caseNumber) { - const prefix = `${caseNumber}/config.json`; + const prefix = `${caseNumber}`; const promise = new Promise((resolve) => { let stream = client.listObjectsV2('tatort', prefix, false, ''); stream.on('data', () => { From c1958e848a438f43bb092fe2c179210bf501160c Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Tue, 10 Jun 2025 08:08:11 +0200 Subject: [PATCH 31/49] refactoring: rename code retrieval function --- src/routes/(angemeldet)/view/+page.server.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/(angemeldet)/view/+page.server.js b/src/routes/(angemeldet)/view/+page.server.js index 04579b1..323b0ac 100644 --- a/src/routes/(angemeldet)/view/+page.server.js +++ b/src/routes/(angemeldet)/view/+page.server.js @@ -32,7 +32,7 @@ export const actions = { // Jetzt prüfen, ob Code vorhanden ist und // dem eingegebenen Code entspricht - const token = await codex(caseNumber); + const token = await get_code_or_null(caseNumber); console.log(`xxx ${token}, ${user_token}`); // token vorhanden, check ob gleich sind @@ -51,7 +51,7 @@ export const actions = { // returns `code` oder `null` -async function codex(vorg) { +async function get_code_or_null(vorg) { const code_name = '__perm__'; const obj_path = `${vorg}/${code_name}`; From acef68dc2673be9b7cf9b0dcdd473321ab51ea60 Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 10 Jun 2025 11:05:23 +0200 Subject: [PATCH 32/49] add typescript support in svelte files, .js to .ts --- package-lock.json | 75 +++++++++++++++++-- package.json | 6 +- src/{hooks.server.js => hooks.server.ts} | 0 src/lib/{auth.js => auth.ts} | 0 src/lib/components/ui/Alert.svelte | 2 +- src/lib/components/ui/Button.svelte | 2 +- src/lib/components/ui/DeleteIconButton.svelte | 2 +- src/lib/components/ui/Modal/Modal.svelte | 2 +- .../components/ui/Modal/ModalContent.svelte | 2 +- src/lib/components/ui/Notification.svelte | 2 +- src/lib/components/ui/Panel.svelte | 2 +- src/lib/components/ui/Select.svelte | 2 +- src/lib/{config.js => config.ts} | 0 ...umberOccupied.js => caseNumberOccupied.ts} | 0 ...{shortenFileSize.js => shortenFileSize.ts} | 0 .../helper/{timeElapsed.js => timeElapsed.ts} | 0 src/lib/{minio.js => minio.ts} | 0 .../{+layout.server.js => +layout.server.ts} | 0 src/routes/(angemeldet)/+layout.svelte | 2 +- src/routes/(angemeldet)/+page.svelte | 2 +- .../list/[vorgang]/{+server.js => +server.ts} | 0 .../[tatort]/{+server.js => +server.ts} | 0 .../{+page.server.js => +page.server.ts} | 0 src/routes/(angemeldet)/tatorte/+page.svelte | 2 +- .../{+page.server.js => +page.server.ts} | 0 src/routes/(angemeldet)/upload/+page.svelte | 2 +- .../view/{+page.server.js => +page.server.ts} | 0 src/routes/(angemeldet)/view/+page.svelte | 2 +- .../{+page.server.js => +page.server.ts} | 0 .../view/[vorgang]/[tatort]/+page.svelte | 2 +- src/routes/+layout.svelte | 2 +- .../{+page.server.js => +page.server.ts} | 0 src/routes/anmeldung/+page.svelte | 2 +- .../[[vorgang]]/{+server.js => +server.ts} | 0 .../api/tatort/{+server.js => +server.ts} | 0 .../api/upload/{+server.js => +server.ts} | 0 tsconfig.json | 4 +- 37 files changed, 93 insertions(+), 24 deletions(-) rename src/{hooks.server.js => hooks.server.ts} (100%) rename src/lib/{auth.js => auth.ts} (100%) rename src/lib/{config.js => config.ts} (100%) rename src/lib/helper/{caseNumberOccupied.js => caseNumberOccupied.ts} (100%) rename src/lib/helper/{shortenFileSize.js => shortenFileSize.ts} (100%) rename src/lib/helper/{timeElapsed.js => timeElapsed.ts} (100%) rename src/lib/{minio.js => minio.ts} (100%) rename src/routes/(angemeldet)/{+layout.server.js => +layout.server.ts} (100%) rename src/routes/(angemeldet)/list/[vorgang]/{+server.js => +server.ts} (100%) rename src/routes/(angemeldet)/list/[vorgang]/[tatort]/{+server.js => +server.ts} (100%) rename src/routes/(angemeldet)/tatorte/{+page.server.js => +page.server.ts} (100%) rename src/routes/(angemeldet)/upload/{+page.server.js => +page.server.ts} (100%) rename src/routes/(angemeldet)/view/{+page.server.js => +page.server.ts} (100%) rename src/routes/(angemeldet)/view/[vorgang]/[tatort]/{+page.server.js => +page.server.ts} (100%) rename src/routes/anmeldung/{+page.server.js => +page.server.ts} (100%) rename src/routes/api/list/[[vorgang]]/{+server.js => +server.ts} (100%) rename src/routes/api/tatort/{+server.js => +server.ts} (100%) rename src/routes/api/upload/{+server.js => +server.ts} (100%) diff --git a/package-lock.json b/package-lock.json index dc9cd61..3e5b8a3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -27,6 +27,7 @@ "@sveltejs/vite-plugin-svelte": "^5.0.0", "@testing-library/jest-dom": "^6.6.3", "@testing-library/svelte": "^5.2.4", + "@tsconfig/svelte": "^5.0.4", "eslint": "^9.18.0", "eslint-config-prettier": "^10.0.1", "eslint-plugin-svelte": "^3.0.0", @@ -35,8 +36,9 @@ "prettier": "^3.4.2", "prettier-plugin-svelte": "^3.3.3", "svelte": "^5.0.0", - "svelte-check": "^4.0.0", - "typescript": "^5.0.0", + "svelte-check": "^4.2.1", + "svelte-preprocess": "^6.0.3", + "typescript": "^5.8.3", "typescript-eslint": "^8.20.0", "vite": "^6.2.5", "vitest": "^3.0.0" @@ -1633,6 +1635,13 @@ } } }, + "node_modules/@tsconfig/svelte": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/@tsconfig/svelte/-/svelte-5.0.4.tgz", + "integrity": "sha512-BV9NplVgLmSi4mwKzD8BD/NQ8erOY/nUE/GpgWe2ckx+wIQF5RyRirn/QsSSCPeulVpc3RA/iJt6DpfTIZps0Q==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/aria-query": { "version": "5.0.4", "resolved": "https://registry.npmjs.org/@types/aria-query/-/aria-query-5.0.4.tgz", @@ -5672,9 +5681,9 @@ } }, "node_modules/svelte-check": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.1.5.tgz", - "integrity": "sha512-Gb0T2IqBNe1tLB9EB1Qh+LOe+JB8wt2/rNBDGvkxQVvk8vNeAoG+vZgFB/3P5+zC7RWlyBlzm9dVjZFph/maIg==", + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-4.2.1.tgz", + "integrity": "sha512-e49SU1RStvQhoipkQ/aonDhHnG3qxHSBtNfBRb9pxVXoa+N7qybAo32KgA9wEb2PCYFNaDg7bZCdhLD1vHpdYA==", "dev": true, "license": "MIT", "dependencies": { @@ -5734,6 +5743,62 @@ } } }, + "node_modules/svelte-preprocess": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-6.0.3.tgz", + "integrity": "sha512-PLG2k05qHdhmRG7zR/dyo5qKvakhm8IJ+hD2eFRQmMLHp7X3eJnjeupUtvuRpbNiF31RjVw45W+abDwHEmP5OA==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "engines": { + "node": ">= 18.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.10.2", + "coffeescript": "^2.5.1", + "less": "^3.11.3 || ^4.0.0", + "postcss": "^7 || ^8", + "postcss-load-config": ">=3", + "pug": "^3.0.0", + "sass": "^1.26.8", + "stylus": ">=0.55", + "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "svelte": "^4.0.0 || ^5.0.0-next.100 || ^5.0.0", + "typescript": "^5.0.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "coffeescript": { + "optional": true + }, + "less": { + "optional": true + }, + "postcss": { + "optional": true + }, + "postcss-load-config": { + "optional": true + }, + "pug": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, "node_modules/svelte/node_modules/is-reference": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.3.tgz", diff --git a/package.json b/package.json index a2f7e26..0c38498 100644 --- a/package.json +++ b/package.json @@ -25,6 +25,7 @@ "@sveltejs/vite-plugin-svelte": "^5.0.0", "@testing-library/jest-dom": "^6.6.3", "@testing-library/svelte": "^5.2.4", + "@tsconfig/svelte": "^5.0.4", "eslint": "^9.18.0", "eslint-config-prettier": "^10.0.1", "eslint-plugin-svelte": "^3.0.0", @@ -33,8 +34,9 @@ "prettier": "^3.4.2", "prettier-plugin-svelte": "^3.3.3", "svelte": "^5.0.0", - "svelte-check": "^4.0.0", - "typescript": "^5.0.0", + "svelte-check": "^4.2.1", + "svelte-preprocess": "^6.0.3", + "typescript": "^5.8.3", "typescript-eslint": "^8.20.0", "vite": "^6.2.5", "vitest": "^3.0.0" diff --git a/src/hooks.server.js b/src/hooks.server.ts similarity index 100% rename from src/hooks.server.js rename to src/hooks.server.ts diff --git a/src/lib/auth.js b/src/lib/auth.ts similarity index 100% rename from src/lib/auth.js rename to src/lib/auth.ts diff --git a/src/lib/components/ui/Alert.svelte b/src/lib/components/ui/Alert.svelte index d461847..67d8238 100644 --- a/src/lib/components/ui/Alert.svelte +++ b/src/lib/components/ui/Alert.svelte @@ -46,7 +46,7 @@ } - diff --git a/src/routes/anmeldung/+page.server.js b/src/routes/anmeldung/+page.server.ts similarity index 100% rename from src/routes/anmeldung/+page.server.js rename to src/routes/anmeldung/+page.server.ts diff --git a/src/routes/anmeldung/+page.svelte b/src/routes/anmeldung/+page.svelte index d953f3b..3823376 100644 --- a/src/routes/anmeldung/+page.svelte +++ b/src/routes/anmeldung/+page.svelte @@ -1,4 +1,4 @@ - diff --git a/src/routes/(angemeldet)/+page.svelte b/src/routes/(angemeldet)/+page.svelte index 6148a0b..b0c9d8b 100644 --- a/src/routes/(angemeldet)/+page.svelte +++ b/src/routes/(angemeldet)/+page.svelte @@ -2,7 +2,6 @@ diff --git a/src/routes/(angemeldet)/list/+page.svelte b/src/routes/(angemeldet)/list/+page.svelte index 3f56b0b..e742613 100644 --- a/src/routes/(angemeldet)/list/+page.svelte +++ b/src/routes/(angemeldet)/list/+page.svelte @@ -6,7 +6,6 @@ @@ -97,14 +89,19 @@ {item.name} + style="padding: 2px" + id="del__{item.name}" + on:click|preventDefault={delete_item} + aria-label="Vorgang {item.name} löschen" + > + +
    + + diff --git a/src/routes/(angemeldet)/list/[vorgang]/+page.svelte b/src/routes/(angemeldet)/list/[vorgang]/+page.svelte index 5b532bf..0ba8e6a 100644 --- a/src/routes/(angemeldet)/list/[vorgang]/+page.svelte +++ b/src/routes/(angemeldet)/list/[vorgang]/+page.svelte @@ -1,9 +1,3 @@ - -
    @@ -190,93 +185,99 @@
    { - 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} + style="display: inline-block; min-width: 5px;" + id="label__{item.name}" + class="text-sm font-semibold leading-6 text-gray-900" + contenteditable={!item.show_button} + role="textbox" + tabindex="0" + aria-label="Dateiname bearbeiten" + on:focusout={() => { + 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} + style="padding: 2px" + id="del__{item.name}" + on:click|preventDefault={async (ev) => { + let delete_item = window.confirm('Bist du sicher?'); + + if (delete_item) { + // bucket: tatort, name: /item-name + let vorgang = $page.params.vorgang; + let filename = ''; + if (ev && ev.currentTarget && (ev.currentTarget as HTMLElement).id) { + filename = (ev.currentTarget as HTMLElement).id.split('del__')[1]; + } + + // delete request + // -------------- + + let url = new URL($page.url); + url.pathname += `/${filename}`; + + console.log(`--- ${vorgang} + ${filename} + ${url}`); + try { + const response = await fetch(url, { method: 'DELETE' }); + if (response.status == 204) { + setTimeout(() => { + window.location.reload(); + }, 500); + } + } catch (error) { + if (error instanceof Error) { + console.log(error.message); + } else { + console.log(error); + } + } + } + }} + aria-label="Datei löschen" + > + +

    {shortenFileSize(item.size)}

    @@ -296,7 +297,7 @@
    -Umbenennen {#if inProgress}

    Vorgang läuft...

    @@ -307,5 +308,10 @@
    -
    + + diff --git a/src/routes/(angemeldet)/list/[vorgang]/+server.ts b/src/routes/(angemeldet)/list/[vorgang]/+server.ts index d090407..d62c632 100644 --- a/src/routes/(angemeldet)/list/[vorgang]/+server.ts +++ b/src/routes/(angemeldet)/list/[vorgang]/+server.ts @@ -3,25 +3,25 @@ import { json } from '@sveltejs/kit'; // rename operation -export async function PUT({ request }) { +export async function PUT({ request }: {request: Request}) { const data = await request.json(); console.log(`--- ${request.url.split('/').at(-1)} +++ ${JSON.stringify(data)}`); // Vorgang - let vorgang = request.url.split('/').at(-1) + const 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"]}` + const old_name = data["old_name"]; + const src_full_path = `/tatort/${vorgang}/${old_name}`; + const 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 }) + await client.statObject('tatort', new_name); + return json({ msg: 'Die Datei existiert bereits.' }, { status: 400 }); } catch (error) { // continue operation - console.log('continue operation') + console.log(error, 'continue operation'); } // actual copy operation diff --git a/src/routes/(angemeldet)/list/[vorgang]/[tatort]/+server.ts b/src/routes/(angemeldet)/list/[vorgang]/[tatort]/+server.ts index 03a0989..9861268 100644 --- a/src/routes/(angemeldet)/list/[vorgang]/[tatort]/+server.ts +++ b/src/routes/(angemeldet)/list/[vorgang]/[tatort]/+server.ts @@ -1,12 +1,11 @@ import { client } from '$lib/minio'; -export async function DELETE({ request }) { +export async function DELETE({ request }: { request: Request }) { + const url_fragments = request.url.split('/'); + const item = url_fragments.at(-1); + const vorgang = url_fragments.at(-2); - let url_fragments = request.url.split('/') - let item = url_fragments.at(-1); - let vorgang = url_fragments.at(-2); + await client.removeObject('tatort', `${vorgang}/${item}`); - await client.removeObject('tatort', `${vorgang}/${item}`) - - return new Response(null, { status: 204 }); -}; + return new Response(null, { status: 204 }); +} diff --git a/src/routes/(angemeldet)/tatorte/+page.server.ts b/src/routes/(angemeldet)/tatorte/+page.server.ts index 48f197d..5004d69 100644 --- a/src/routes/(angemeldet)/tatorte/+page.server.ts +++ b/src/routes/(angemeldet)/tatorte/+page.server.ts @@ -5,7 +5,7 @@ import caseNumberOccupied from '$lib/helper/caseNumberOccupied'; /** @type {import('./$types').Actions} */ export const actions = { - default: async ({ request }) => { + default: async ({ request }: {request: Request}) => { const data = await request.formData(); const caseNumber = data.get('caseNumber'); const description = data.get('description'); @@ -28,7 +28,7 @@ export const actions = { const config = `${JSON.stringify({ caseNumber, description, version: 1 })}\n`; - await client.putObject('tatort', `${caseNumber}/config.json`, config, { + await client.putObject('tatort', `${caseNumber}/config.json`, config, undefined, { 'Content-Type': 'application/json' }); diff --git a/src/routes/(angemeldet)/upload/+page.server.ts b/src/routes/(angemeldet)/upload/+page.server.ts index aecc9b6..ceb3ecb 100644 --- a/src/routes/(angemeldet)/upload/+page.server.ts +++ b/src/routes/(angemeldet)/upload/+page.server.ts @@ -2,7 +2,7 @@ import { Readable } from 'stream'; import { client } from '$lib/minio'; import { fail } from '@sveltejs/kit'; -function isRequiredFieldValid(value) { +const isRequiredFieldValid = (value: unknown) => { if (value == null) return false; if (typeof value === 'string' || value instanceof String) return value.trim() !== ''; @@ -12,7 +12,7 @@ function isRequiredFieldValid(value) { /** @type {import('./$types').Actions} */ export const actions = { - url: async ({ request }) => { + url: async ({ request }: {request: Request}) => { const data = await request.formData(); const vorgang = data.get('vorgang'); const name = data.get('name'); @@ -25,20 +25,20 @@ export const actions = { if (!objectName.endsWith('.png')) objectName += '.png'; break; case '': - if (fileName.endsWith('.glb') && !objectName.endsWith('.glb')) objectName += '.glb'; + if (fileName?.toString().endsWith('.glb') && !objectName.endsWith('.glb')) objectName += '.glb'; } const url = await client.presignedPutObject('tatort', objectName); return { url }; }, - validate: async ({ request }) => { + validate: async ({ request }: {request: Request}) => { const requestData = await request.formData(); const data = Object.fromEntries(requestData); const vorgang = data.vorgang; const name = data.name; let success = true; - let err = {}; + const err = {}; if (isRequiredFieldValid(vorgang)) err.vorgang = null; else { @@ -57,7 +57,7 @@ export const actions = { return fail(400, err); }, - upload: async ({ request }) => { + upload: async ({ request }: {request: Request}) => { const requestData = await request.formData(); const data = Object.fromEntries(requestData); const vorgang = data.vorgang; @@ -69,7 +69,7 @@ export const actions = { console.log('O:', url); return { url }; }, - upload3: async ({ request }) => { + upload3: async ({ request }: {request: Request}) => { const requestData = await request.formData(); const data = Object.fromEntries(requestData); const name = data.name; diff --git a/src/routes/(angemeldet)/upload/+page.svelte b/src/routes/(angemeldet)/upload/+page.svelte index 9e08cc1..1475803 100644 --- a/src/routes/(angemeldet)/upload/+page.svelte +++ b/src/routes/(angemeldet)/upload/+page.svelte @@ -15,10 +15,8 @@ let inProgress = false; let vorgang = ''; let name = ''; - /** @type {?string}*/ - let etag = null; - /** @type {?FileList} */ - let files = null; + let etag: string | null = null; + let files: FileList | null = null; $: inProgress = form === null; @@ -71,8 +69,7 @@ return null; } - /** @param {MouseEvent} event*/ - async function buttonClick(event) { + async function buttonClick(event: MouseEvent) { if (!(await validateForm())) { event.preventDefault(); return; diff --git a/src/routes/(angemeldet)/view/+page.server.ts b/src/routes/(angemeldet)/view/+page.server.ts index 337f6e4..8a6f20d 100644 --- a/src/routes/(angemeldet)/view/+page.server.ts +++ b/src/routes/(angemeldet)/view/+page.server.ts @@ -3,7 +3,7 @@ import { fail, redirect } from '@sveltejs/kit'; /** @type {import('./$types').Actions} */ export const actions = { - default: async ({ request }) => { + default: async ({ request }: {request: Request}) => { const data = await request.formData(); const caseNumber = data.get('caseNumber'); @@ -15,7 +15,7 @@ export const actions = { }); } - if (!(await caseNumberOccupied(caseNumber))) { + if (typeof caseNumber === 'string' && !(await caseNumberOccupied(caseNumber))) { return fail(400, { success: false, caseNumber, diff --git a/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.server.ts b/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.server.ts index 131154f..0d616c4 100644 --- a/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.server.ts +++ b/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.server.ts @@ -1,7 +1,8 @@ import { client } from '$lib/minio'; +import type { PageServerLoad } from './$types'; /** @type {import('./$types').PageServerLoad} */ -export async function load({ params }) { +export const load: PageServerLoad = async ({ params }) => { const { vorgang, tatort } = params; const url = await client.presignedUrl('GET', 'tatort', `${vorgang}/${tatort}`); return { url }; diff --git a/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte b/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte index 1551de8..dc2d254 100644 --- a/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte +++ b/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte @@ -19,18 +19,11 @@ let cameraAzimuth = 0; let cameraPolar = 0; - let frontView = cameraAzimuth === 0 && cameraPolar === 0 ? true : false; - - let topView = cameraAzimuth === 0 && cameraPolar === 90 ? true : false; - let cameraZoom = 100; let xRotation = 0; let yRotation = 0; let zRotation = 0; - /** - * @type {any} - */ let modelViewer; $: style = `width: ${progress}%`; @@ -38,7 +31,7 @@ /** * @param {any} detail */ - function onProgress({ detail }) { + const onProgress = ({ detail }) => { progress = Math.ceil(detail.totalProgress * 100.0); if (progress == 100) { setTimeout(() => { diff --git a/src/routes/anmeldung/+page.server.ts b/src/routes/anmeldung/+page.server.ts index feb85c2..52a9248 100644 --- a/src/routes/anmeldung/+page.server.ts +++ b/src/routes/anmeldung/+page.server.ts @@ -1,12 +1,13 @@ import { dev } from '$app/environment'; -import { fail, redirect } from '@sveltejs/kit'; +import { fail, redirect, type Cookies } from '@sveltejs/kit'; import { authenticate } from '$lib/auth'; +import type { RequestEvent } from '../(angemeldet)/$types'; const COOKIE_NAME = 'session'; /** @type {import('./$types').Actions} */ export const actions = { - login: async ({ request, cookies }) => { + login: async ({ request, cookies }: {request: Request, cookies: Cookies}) => { const data = await request.formData(); const user = data.get('user'); const password = data.get('password'); @@ -23,7 +24,7 @@ export const actions = { }); throw redirect(303, '/'); }, - logout: async (event) => { + logout: async (event: RequestEvent) => { event.cookies.delete(COOKIE_NAME, {path: '/'}); event.locals.user = null; return { success: true }; diff --git a/src/routes/api/list/[[vorgang]]/+server.ts b/src/routes/api/list/[[vorgang]]/+server.ts index c1729fa..89ce787 100644 --- a/src/routes/api/list/[[vorgang]]/+server.ts +++ b/src/routes/api/list/[[vorgang]]/+server.ts @@ -3,7 +3,7 @@ import { client } from '$lib/minio'; /** @type {import('./$types').RequestHandler} */ export async function GET({ params }) { const prefix = params.vorgang ? `${params.vorgang}/` : ''; - let stream = client.listObjectsV2('tatort', prefix, false, ''); + const stream = client.listObjectsV2('tatort', prefix, false, ''); const result = new ReadableStream({ start(controller) { stream.on('data', (data) => { diff --git a/src/routes/api/tatort/+server.ts b/src/routes/api/tatort/+server.ts index dbc89c7..1aac3b2 100644 --- a/src/routes/api/tatort/+server.ts +++ b/src/routes/api/tatort/+server.ts @@ -1,8 +1,7 @@ import { client } from '$lib/minio'; -/** @type {import('./$types').RequestHandler} */ export async function GET() { - var stream = client.listObjectsV2('tatort', '', true); + const stream = client.listObjectsV2('tatort', '', true); const result = new ReadableStream({ start(controller) { stream.on('data', (data) => { diff --git a/src/routes/api/upload/+server.ts b/src/routes/api/upload/+server.ts index d008865..1c1ae66 100644 --- a/src/routes/api/upload/+server.ts +++ b/src/routes/api/upload/+server.ts @@ -1,5 +1,5 @@ +import type { RequestHandler } from "@sveltejs/kit"; -/** @type {import('./$types').RequestHandler} */ -export async function GET(params) { +export async function GET(params: RequestHandler) { console.log('GET', params); } From e4d74e4331ae0af9243eea81ecfed4549152ad55 Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 10 Jun 2025 14:10:48 +0200 Subject: [PATCH 38/49] deleted unnecessary console.log statements --- src/routes/(angemeldet)/list/+page.svelte | 1 - src/routes/(angemeldet)/list/[vorgang]/+page.svelte | 1 - 2 files changed, 2 deletions(-) diff --git a/src/routes/(angemeldet)/list/+page.svelte b/src/routes/(angemeldet)/list/+page.svelte index c51a113..90e15ac 100644 --- a/src/routes/(angemeldet)/list/+page.svelte +++ b/src/routes/(angemeldet)/list/+page.svelte @@ -24,7 +24,6 @@ .filter((i) => i.length > 0) .map((i) => JSON.parse(i)); - console.log(objs); list = list.concat(objs); } }); diff --git a/src/routes/(angemeldet)/list/[vorgang]/+page.svelte b/src/routes/(angemeldet)/list/[vorgang]/+page.svelte index 0ba8e6a..4a5ab8e 100644 --- a/src/routes/(angemeldet)/list/[vorgang]/+page.svelte +++ b/src/routes/(angemeldet)/list/[vorgang]/+page.svelte @@ -52,7 +52,6 @@ .filter((i) => i.length > 0) .map((i) => JSON.parse(i)); - console.log(objs); list = list.concat(objs); list = list.map((item) => { From 07247486ab9804a6c4b7cb0f4c25fe1b04a24274 Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 10 Jun 2025 14:33:40 +0200 Subject: [PATCH 39/49] fix further type problems --- src/lib/auth.ts | 2 +- src/lib/config.ts | 2 +- src/lib/helper/caseNumberOccupied.ts | 9 ++----- src/lib/helper/shortenFileSize.ts | 7 +----- src/lib/helper/timeElapsed.ts | 7 +----- src/routes/(angemeldet)/tatorte/+page.svelte | 8 +++--- .../(angemeldet)/upload/+page.server.ts | 5 ---- src/routes/(angemeldet)/upload/+page.svelte | 7 +----- .../view/[vorgang]/[tatort]/+page.svelte | 25 +------------------ src/routes/anmeldung/+page.svelte | 6 ++--- 10 files changed, 15 insertions(+), 63 deletions(-) diff --git a/src/lib/auth.ts b/src/lib/auth.ts index 19d290a..958bc6e 100644 --- a/src/lib/auth.ts +++ b/src/lib/auth.ts @@ -11,7 +11,7 @@ export function createToken(userData) { return jwt.sign(userData, SECRET, { expiresIn: EXPIRES_IN }); } -export function decryptToken(token) { +export function decryptToken(token: string) { return jwt.verify(token, SECRET); } diff --git a/src/lib/config.ts b/src/lib/config.ts index 5c34af3..0775514 100644 --- a/src/lib/config.ts +++ b/src/lib/config.ts @@ -1,3 +1,3 @@ import { readFileSync } from 'fs'; -export default JSON.parse(readFileSync('./config.json')); +export default JSON.parse(readFileSync('./config.json').toString()); diff --git a/src/lib/helper/caseNumberOccupied.ts b/src/lib/helper/caseNumberOccupied.ts index 6fdd4bc..0d95f73 100644 --- a/src/lib/helper/caseNumberOccupied.ts +++ b/src/lib/helper/caseNumberOccupied.ts @@ -1,13 +1,8 @@ import { client } from '$lib/minio'; -/** - * Check if caseNumber is used - * @param {string} caseNumber - * @returns {Promise { const prefix = `${caseNumber}/config.json`; - const promise = new Promise((resolve) => { + const promise: Promise = new Promise((resolve) => { const stream = client.listObjectsV2('tatort', prefix, false, ''); stream.on('data', () => { stream.destroy(); diff --git a/src/lib/helper/shortenFileSize.ts b/src/lib/helper/shortenFileSize.ts index 9628b34..0785886 100644 --- a/src/lib/helper/shortenFileSize.ts +++ b/src/lib/helper/shortenFileSize.ts @@ -2,12 +2,7 @@ const KILO = 1024; const MEGA = KILO * KILO; const GIGA = MEGA * KILO; -/** - * Shortens the size in bytes - * @param {number} size - * @returns{string} - */ -export default function shortenFileSize(size: number) { +export default function shortenFileSize(size: number): string { const giga = Math.floor(size / GIGA); let remainder = size % GIGA; const mega = Math.floor(remainder / MEGA); diff --git a/src/lib/helper/timeElapsed.ts b/src/lib/helper/timeElapsed.ts index f9186d9..2628ea7 100644 --- a/src/lib/helper/timeElapsed.ts +++ b/src/lib/helper/timeElapsed.ts @@ -4,12 +4,7 @@ const DAY = 24 * HOUR; const YEAR = 365 * DAY; const MONTH = YEAR / 12; -/** - * get readable string of time elapsed since date - * @param {Date} date - * @returns string - */ -export default function timeElapsed(date: Date) { +export default function timeElapsed(date: Date): string { const now = new Date(); const age = Math.floor((now.getTime() - date.getTime()) / 1000); diff --git a/src/routes/(angemeldet)/tatorte/+page.svelte b/src/routes/(angemeldet)/tatorte/+page.svelte index 2920917..0564923 100644 --- a/src/routes/(angemeldet)/tatorte/+page.svelte +++ b/src/routes/(angemeldet)/tatorte/+page.svelte @@ -55,22 +55,22 @@
    - {#if form?.error?.description} -

    {form.error.description}

    + {#if form?.error} +

    {form.description}

    {/if}
    diff --git a/src/routes/(angemeldet)/upload/+page.server.ts b/src/routes/(angemeldet)/upload/+page.server.ts index ceb3ecb..27cc6c9 100644 --- a/src/routes/(angemeldet)/upload/+page.server.ts +++ b/src/routes/(angemeldet)/upload/+page.server.ts @@ -10,7 +10,6 @@ const isRequiredFieldValid = (value: unknown) => { return true; } -/** @type {import('./$types').Actions} */ export const actions = { url: async ({ request }: {request: Request}) => { const data = await request.formData(); @@ -62,11 +61,9 @@ export const actions = { const data = Object.fromEntries(requestData); const vorgang = data.vorgang; const name = data.name; - console.log('I:', vorgang, name); const url = await client.presignedPutObject('tatort', `${vorgang}/${name}`, 60); - console.log('O:', url); return { url }; }, upload3: async ({ request }: {request: Request}) => { @@ -74,7 +71,6 @@ export const actions = { const data = Object.fromEntries(requestData); const name = data.name; const stream = data.file.stream(); - console.log('Data:', stream); const metaData = { 'Content-Type': 'model-gtlf-binary', 'X-VorgangsNr': '4711' }; const result = new Promise((resolve, reject) => { client.putObject('tatort', name, Readable.from(stream), metaData, function (err, etag) { @@ -86,7 +82,6 @@ export const actions = { let error = null; try { etag = await result; - console.log(etag); } catch (err) { error = err; console.log('Error:', err); diff --git a/src/routes/(angemeldet)/upload/+page.svelte b/src/routes/(angemeldet)/upload/+page.svelte index 1475803..5f7b5c2 100644 --- a/src/routes/(angemeldet)/upload/+page.svelte +++ b/src/routes/(angemeldet)/upload/+page.svelte @@ -20,8 +20,7 @@ $: inProgress = form === null; - /** @type {?Record}*/ - let formErrors; + let formErrors: Record | null; async function validateForm() { let data = new FormData(); @@ -39,7 +38,6 @@ success = false; } - console.log('File', files); if (!files?.length) { formErrors = { file: 'Sie haben keine Datei ausgewählt.', ...formErrors }; success = false; @@ -75,7 +73,6 @@ return; } const url = await getUrl(); - console.log('URL', url); open = true; inProgress = true; @@ -83,7 +80,6 @@ .then((response) => { inProgress = false; etag = '123'; - console.log('SUCCESS', response); }) .catch((err) => { inProgress = false; @@ -93,7 +89,6 @@ } function uploadSuccessful() { - console.log('reset'); open = false; vorgang = ''; name = ''; diff --git a/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte b/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte index dc2d254..d95184e 100644 --- a/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte +++ b/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte @@ -28,9 +28,6 @@ $: style = `width: ${progress}%`; - /** - * @param {any} detail - */ const onProgress = ({ detail }) => { progress = Math.ceil(detail.totalProgress * 100.0); if (progress == 100) { @@ -41,21 +38,6 @@ } function onResetView() { - console.log( - 'show cameraOrbit:', - modelViewer.getCameraOrbit(), - modelViewer.cameraOrbit, - modelViewer.getDimensions() - ); - console.log( - 'Camera-orbit: ', - modelViewer.getAttribute('camera-orbit'), - 'camera-target: ', - modelViewer.getAttribute('camera-target'), - 'object-rotation: ', - modelViewer.getAttribute('rotation') - ); - cameraAzimuth = 0; cameraPolar = 0; cameraZoom = 100; @@ -69,12 +51,7 @@ fieldOfView = '10deg'; } - /** - * @param {number} azimuth - * @param {number} polar - * @param {number} zoom - */ - function updateCameraOrbit(azimuth, polar, zoom) { + function updateCameraOrbit(azimuth: number, polar: number, zoom: number) { cameraAzimuth = azimuth; cameraPolar = polar; cameraZoom = zoom; diff --git a/src/routes/anmeldung/+page.svelte b/src/routes/anmeldung/+page.svelte index 43e4d86..be512ee 100644 --- a/src/routes/anmeldung/+page.svelte +++ b/src/routes/anmeldung/+page.svelte @@ -1,10 +1,10 @@ From 5ce5c78698887c13fd9d3d15b731eee7e1cc5e5b Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Wed, 11 Jun 2025 09:25:33 +0200 Subject: [PATCH 42/49] fix layout by reordering anker element --- src/routes/(angemeldet)/list/[vorgang]/+page.svelte | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/routes/(angemeldet)/list/[vorgang]/+page.svelte b/src/routes/(angemeldet)/list/[vorgang]/+page.svelte index fbe5362..5a489ee 100644 --- a/src/routes/(angemeldet)/list/[vorgang]/+page.svelte +++ b/src/routes/(angemeldet)/list/[vorgang]/+page.svelte @@ -168,14 +168,15 @@
      {#each list as item, i}
    • -
      +
      + - +
      {#if data.user.admin}

      +
    • {/each}
    From fd8298906a89c36e9884aa5c7a9b3049a7f3f9d7 Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Wed, 11 Jun 2025 09:55:00 +0200 Subject: [PATCH 43/49] formatting --- .../(angemeldet)/list/[vorgang]/+page.svelte | 199 +++++++++--------- 1 file changed, 99 insertions(+), 100 deletions(-) diff --git a/src/routes/(angemeldet)/list/[vorgang]/+page.svelte b/src/routes/(angemeldet)/list/[vorgang]/+page.svelte index 5a489ee..ec6be17 100644 --- a/src/routes/(angemeldet)/list/[vorgang]/+page.svelte +++ b/src/routes/(angemeldet)/list/[vorgang]/+page.svelte @@ -168,35 +168,34 @@ From fd0572939e96d1b07149c88d086a71ebd71754d0 Mon Sep 17 00:00:00 2001 From: Jared Date: Thu, 12 Jun 2025 10:57:25 +0200 Subject: [PATCH 44/49] change login page frontend --- src/routes/anmeldung/+page.svelte | 128 +++++++++++++++++++----------- 1 file changed, 83 insertions(+), 45 deletions(-) diff --git a/src/routes/anmeldung/+page.svelte b/src/routes/anmeldung/+page.svelte index be512ee..0e27aa9 100644 --- a/src/routes/anmeldung/+page.svelte +++ b/src/routes/anmeldung/+page.svelte @@ -1,20 +1,21 @@ -
    Landeswappen Niedersachsen @@ -27,44 +28,81 @@
    - -
    - -
    -
    - -
    -
    - -
    -
    - -
    -
    - -
    - {#if form?.error?.caseNumber} + + {/if} Vorgangs-Nr. +
    +
    + +
    +
    + {#if form?.error?.caseNumber} +

    {form.error.caseNumber}

    + {/if}
    +
    + +
    + + + Anmelden + +
    +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    +
    +
    +
    + +
    From 03a304f6fe720cea3d313e4eec35452425441ae1 Mon Sep 17 00:00:00 2001 From: Jared Date: Thu, 12 Jun 2025 13:02:23 +0200 Subject: [PATCH 45/49] fixed some error from merge request --- src/hooks.server.ts | 2 +- src/routes/(angemeldet)/+layout.svelte | 1 + src/routes/(angemeldet)/+page.svelte | 36 +++---------------- src/routes/(angemeldet)/list/+page.svelte | 15 +------- .../code/{+server.js => +server.ts} | 3 -- 5 files changed, 8 insertions(+), 49 deletions(-) rename src/routes/api/list/[[vorgang]]/code/{+server.js => +server.ts} (83%) diff --git a/src/hooks.server.ts b/src/hooks.server.ts index ee11e72..db05fa8 100644 --- a/src/hooks.server.ts +++ b/src/hooks.server.ts @@ -1,7 +1,7 @@ import { decryptToken } from '$lib/auth'; import type { Handle } from '@sveltejs/kit'; -export const handle: Handle = ({ event, resolve }) => { +export const handle: Handle = async ({ event, resolve }) => { const jwt = event.cookies.get('session'); try { if (jwt) { diff --git a/src/routes/(angemeldet)/+layout.svelte b/src/routes/(angemeldet)/+layout.svelte index 7e8ee15..00beb40 100644 --- a/src/routes/(angemeldet)/+layout.svelte +++ b/src/routes/(angemeldet)/+layout.svelte @@ -1,5 +1,6 @@ diff --git a/src/routes/(angemeldet)/+page.svelte b/src/routes/(angemeldet)/+page.svelte index 54d2c70..89dd1fa 100644 --- a/src/routes/(angemeldet)/+page.svelte +++ b/src/routes/(angemeldet)/+page.svelte @@ -1,7 +1,8 @@ - - + +
    + +
    +
    + +
    +
    + {#if error} +

    {error}

    + {/if} +
    diff --git a/src/lib/components/ui/Button.svelte b/src/lib/components/Button.svelte similarity index 100% rename from src/lib/components/ui/Button.svelte rename to src/lib/components/Button.svelte diff --git a/src/lib/components/ui/DeleteIconButton.svelte b/src/lib/components/DeleteIconButton.svelte similarity index 92% rename from src/lib/components/ui/DeleteIconButton.svelte rename to src/lib/components/DeleteIconButton.svelte index f0d329f..9efab9e 100644 --- a/src/lib/components/ui/DeleteIconButton.svelte +++ b/src/lib/components/DeleteIconButton.svelte @@ -14,8 +14,8 @@ + + \ No newline at end of file diff --git a/src/lib/components/Header.svelte b/src/lib/components/Header.svelte new file mode 100644 index 0000000..4e13909 --- /dev/null +++ b/src/lib/components/Header.svelte @@ -0,0 +1,36 @@ + + +
    +
    + +
    +
    diff --git a/src/lib/components/ui/Modal/Modal.svelte b/src/lib/components/Modal/Modal.svelte similarity index 100% rename from src/lib/components/ui/Modal/Modal.svelte rename to src/lib/components/Modal/Modal.svelte diff --git a/src/lib/components/ui/Modal/ModalContent.svelte b/src/lib/components/Modal/ModalContent.svelte similarity index 100% rename from src/lib/components/ui/Modal/ModalContent.svelte rename to src/lib/components/Modal/ModalContent.svelte diff --git a/src/lib/components/ui/Modal/ModalFooter.svelte b/src/lib/components/Modal/ModalFooter.svelte similarity index 100% rename from src/lib/components/ui/Modal/ModalFooter.svelte rename to src/lib/components/Modal/ModalFooter.svelte diff --git a/src/lib/components/ui/Modal/ModalTitle.svelte b/src/lib/components/Modal/ModalTitle.svelte similarity index 100% rename from src/lib/components/ui/Modal/ModalTitle.svelte rename to src/lib/components/Modal/ModalTitle.svelte diff --git a/src/lib/components/ui/Notification.svelte b/src/lib/components/Notification.svelte similarity index 100% rename from src/lib/components/ui/Notification.svelte rename to src/lib/components/Notification.svelte diff --git a/src/lib/components/ui/Panel.svelte b/src/lib/components/Panel.svelte similarity index 100% rename from src/lib/components/ui/Panel.svelte rename to src/lib/components/Panel.svelte diff --git a/src/lib/components/ui/Select.svelte b/src/lib/components/Select.svelte similarity index 100% rename from src/lib/components/ui/Select.svelte rename to src/lib/components/Select.svelte diff --git a/src/lib/helper/caseNumberOccupied.js b/src/lib/helper/caseNumberOccupied.js deleted file mode 100644 index e727abf..0000000 --- a/src/lib/helper/caseNumberOccupied.js +++ /dev/null @@ -1,22 +0,0 @@ -import { client } from '$lib/minio'; - -/** - * Check if caseNumber is used - * @param {string} caseNumber - * @returns {Promise} - */ -export default async function caseNumberOccupied(caseNumber) { - const prefix = `${caseNumber}`; - const promise = new Promise((resolve) => { - let stream = client.listObjectsV2('tatort', prefix, false, ''); - stream.on('data', () => { - stream.destroy(); - resolve(true); - }); - stream.on('end', () => { - resolve(false); - }); - }); - - return promise; -} diff --git a/src/lib/helper/caseNumberOccupied.ts b/src/lib/helper/caseNumberOccupied.ts index 0d95f73..3c6b08d 100644 --- a/src/lib/helper/caseNumberOccupied.ts +++ b/src/lib/helper/caseNumberOccupied.ts @@ -1,7 +1,7 @@ import { client } from '$lib/minio'; export default async function caseNumberOccupied (caseNumber: string): Promise { - const prefix = `${caseNumber}/config.json`; + const prefix = `${caseNumber}`; const promise: Promise = new Promise((resolve) => { const stream = client.listObjectsV2('tatort', prefix, false, ''); stream.on('data', () => { diff --git a/src/lib/helper/getCode.js b/src/lib/helper/getCode.ts similarity index 100% rename from src/lib/helper/getCode.js rename to src/lib/helper/getCode.ts diff --git a/src/lib/server/authService.ts b/src/lib/server/authService.ts new file mode 100644 index 0000000..98155c8 --- /dev/null +++ b/src/lib/server/authService.ts @@ -0,0 +1,29 @@ +import { dev } from '$app/environment'; +import { fail, redirect, type Cookies, type RequestEvent } from '@sveltejs/kit'; +import { authenticate } from '$lib/auth'; + +const COOKIE_NAME = 'session'; + +export const loginUser = async ({ request, cookies }: { request: Request; cookies: Cookies }) => { + const data = await request.formData(); + const user = data.get('user'); + const password = data.get('password'); + + const token = authenticate(user, password); + + if (!token) return fail(400, { user, incorrect: true }); + + cookies.set(COOKIE_NAME, token, { + path: '/', + httpOnly: true, + sameSite: 'strict', + secure: !dev + }); + return redirect(303, '/'); +}; + +export const logoutUser = async (event: RequestEvent) => { + event.cookies.delete(COOKIE_NAME, { path: '/' }); + event.locals.user = null; + return { success: true }; +}; diff --git a/src/lib/server/s3ClientService.ts b/src/lib/server/s3ClientService.ts new file mode 100644 index 0000000..beb1411 --- /dev/null +++ b/src/lib/server/s3ClientService.ts @@ -0,0 +1,58 @@ +import { client } from '$lib/minio'; + +const BUCKET = 'tatort'; + +export const getVorgang = ({ params }) => { + const prefix = params.vorgang ? `${params.vorgang}/` : ''; + const stream = client.listObjectsV2('tatort', prefix, false, ''); + const result = new ReadableStream({ + start(controller) { + stream.on('data', (data) => { + if (prefix === '') { + if (data.prefix) + controller.enqueue(`${JSON.stringify({ ...data, name: data.prefix.slice(0, -1) })}\n`); + return; + } + + const name = data.name.slice(prefix.length); + if (name === 'config.json') return; + // zugangscode datei + if (name === '__perm__') return; + + controller.enqueue(`${JSON.stringify({ ...data, name, prefix })}\n`); + }); + stream.on('end', () => { + controller.close(); + }); + }, + cancel() { + stream.destroy(); + } + }); + + return new Response(result, { + headers: { + 'content-type': 'text/event-stream' + } + }); +}; + + +export const checkIfExactDirectoryExists = (dir: string): Promise => { + return new Promise((resolve, reject) => { + const prefix = dir.endsWith('/') ? dir : `${dir}/`; + + const stream = client.listObjectsV2(BUCKET, prefix, false, ''); + + stream.on('data', (obj) => { + if (obj.prefix === undefined && obj.name.startsWith(prefix)) { + stream.destroy(); + resolve(true); + } + }); + + stream.on('error', (err) => reject(err)); + + stream.on('end', () => resolve(false)); + }); +} diff --git a/src/lib/server/vorgangService.ts b/src/lib/server/vorgangService.ts new file mode 100644 index 0000000..cb0dda7 --- /dev/null +++ b/src/lib/server/vorgangService.ts @@ -0,0 +1,68 @@ +import { fail, redirect } from '@sveltejs/kit'; +import { client } from '$lib/minio'; +import { checkIfExactDirectoryExists } from './s3ClientService'; + +/** + * + * @param request + * @returns + */ +export const getVorgangByCaseNumber = async ( request: Request) => { + const data = await request.formData(); + const caseNumber = data.get('caseNumber'); + const user_token = data.get('token'); + + if (!caseNumber) { + return fail(400, { + success: false, + caseNumber, + error: { message: 'Die Vorgangsnummer darf nicht leer sein.' } + }); + } + + if (typeof caseNumber === 'string' && !(await checkIfExactDirectoryExists(caseNumber))) { + return fail(400, { + success: false, + caseNumber, + error: { message: 'Die Vorgangsnummer existiert in dieser Anwendung nicht.' } + }); + } + + + const token = await getTokenOrNull(caseNumber); + + if (token && token != user_token) { + return fail(400, { + success: false, + caseNumber, + error: { message: 'Der Token ist falsch.' } + }); + } + + redirect(303, `/list/${caseNumber}`); + } + + +const getTokenOrNull = async (vorgang) => { + const code_name = '__perm__'; + const obj_path = `${vorgang}/${code_name}`; + + let resp = null; + let code_saved = ''; + + try { + resp = await client.getObject('tatort', obj_path); + + code_saved = await new Response(resp).text(); + } catch (error) { + if (error.name == 'S3Error') { + resp = null; + } + } + + if (resp != null) { + return code_saved; + } else { + return null; + } +} diff --git a/src/routes/(angemeldet)/+layout.server.ts b/src/routes/(angemeldet)/+layout.server.ts index 0454232..5251779 100644 --- a/src/routes/(angemeldet)/+layout.server.ts +++ b/src/routes/(angemeldet)/+layout.server.ts @@ -1,5 +1,5 @@ import { redirect, type ServerLoadEvent } from '@sveltejs/kit'; -import type { PageServerLoad } from './view/[vorgang]/[tatort]/$types'; +import type { PageServerLoad } from '../anmeldung/$types'; export const load: PageServerLoad = (event: ServerLoadEvent) => { if (!event.locals.user && event.url.pathname !== '/anmeldung') throw redirect(303, '/anmeldung'); diff --git a/src/routes/(angemeldet)/+layout.svelte b/src/routes/(angemeldet)/+layout.svelte index 00beb40..a3a4cd5 100644 --- a/src/routes/(angemeldet)/+layout.svelte +++ b/src/routes/(angemeldet)/+layout.svelte @@ -1,73 +1,18 @@
    -
    - -
    +
    +
    -
    diff --git a/src/routes/(angemeldet)/tatorte/+page.svelte b/src/routes/(angemeldet)/tatorte/+page.svelte index 6798fe5..44acb50 100644 --- a/src/routes/(angemeldet)/tatorte/+page.svelte +++ b/src/routes/(angemeldet)/tatorte/+page.svelte @@ -1,10 +1,10 @@ + +
    +
    + +
    + +
    + +
    +
    diff --git a/src/routes/(angemeldet)/list/+page.svelte b/src/routes/(token-based)/list/+page.svelte similarity index 100% rename from src/routes/(angemeldet)/list/+page.svelte rename to src/routes/(token-based)/list/+page.svelte diff --git a/src/routes/(angemeldet)/list/[vorgang]/+page.svelte b/src/routes/(token-based)/list/[vorgang]/+page.svelte similarity index 94% rename from src/routes/(angemeldet)/list/[vorgang]/+page.svelte rename to src/routes/(token-based)/list/[vorgang]/+page.svelte index 8b18f66..695d7c9 100644 --- a/src/routes/(angemeldet)/list/[vorgang]/+page.svelte +++ b/src/routes/(token-based)/list/[vorgang]/+page.svelte @@ -5,12 +5,12 @@ import timeElapsed from '$lib/helper/timeElapsed'; - import Alert from '$lib/components/ui/Alert.svelte'; - import Button from '$lib/components/ui/Button.svelte'; - import Modal from '$lib/components/ui/Modal/Modal.svelte'; - import ModalTitle from '$lib/components/ui/Modal/ModalTitle.svelte'; - import ModalContent from '$lib/components/ui/Modal/ModalContent.svelte'; - import ModalFooter from '$lib/components/ui/Modal/ModalFooter.svelte'; + import Alert from '$lib/components/Alert.svelte'; + import Button from '$lib/components/Button.svelte'; + import Modal from '$lib/components/Modal/Modal.svelte'; + import ModalTitle from '$lib/components/Modal/ModalTitle.svelte'; + import ModalContent from '$lib/components/Modal/ModalContent.svelte'; + import ModalFooter from '$lib/components/Modal/ModalFooter.svelte'; import Cube from '$lib/icons/Cube.svelte'; import Edit from '$lib/icons/Edit.svelte'; import Trash from '$lib/icons/Trash.svelte'; @@ -92,7 +92,6 @@ let text_field = document.getElementById(text_field_id); if (text_field) { - text_field.setAttribute('contenteditable', 'false'); text_field.setAttribute('contenteditable', 'false'); text_field.textContent = item.name; } @@ -173,9 +172,9 @@ >
    - +
    - {#if data.user.admin} + {#if data?.user?.admin} getVorgangByCaseNumber(request) +} \ No newline at end of file diff --git a/src/routes/(angemeldet)/view/+page.svelte b/src/routes/(token-based)/view/+page.svelte similarity index 98% rename from src/routes/(angemeldet)/view/+page.svelte rename to src/routes/(token-based)/view/+page.svelte index 041414d..cd8c641 100644 --- a/src/routes/(angemeldet)/view/+page.svelte +++ b/src/routes/(token-based)/view/+page.svelte @@ -1,5 +1,5 @@
    @@ -21,88 +18,75 @@ Landeswappen Niedersachsen

    - Anmeldung zum 3D Tatort + Willkommen beim 3D Tatort

    - -
    -
    -
    - -
    -
    - -
    -
    - {#if form?.error?.caseNumber} -

    {form.error.caseNumber}

    - {/if} -
    -
    -
    - -
    -
    - - - Anmelden - -
    -
    -
    - -
    - -
    -
    - -
    - -
    - -
    -
    - -
    - +
    +
    +
    + + +
    +
    - - - + +
    +
    + +
    +
    + + Anmelden + +
    +
    + +
    + +
    +
    + +
    + +
    + +
    +
    + +
    + +
    +
    +
    + +
    From 3dbaf7a01b299c1ec7cc74dd8b24dcda48425d6e Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 18 Jun 2025 08:48:53 +0200 Subject: [PATCH 48/49] added token validation with input fields --- src/lib/minio.ts | 2 + src/lib/server/s3ClientService.ts | 39 +---- src/lib/server/vorgangService.ts | 133 +++++++++++------- src/routes/(angemeldet)/upload/+page.svelte | 1 + .../(token-based)/list/[vorgang]/+page.svelte | 1 - .../list/[vorgang]/[tatort]/+server.ts | 4 +- src/routes/(token-based)/view/+page.server.ts | 4 +- src/routes/(token-based)/view/+page.svelte | 92 ++++-------- src/routes/anmeldung/+page.server.ts | 4 +- src/routes/anmeldung/+page.svelte | 30 ++-- 10 files changed, 133 insertions(+), 177 deletions(-) diff --git a/src/lib/minio.ts b/src/lib/minio.ts index 07a763b..6824b78 100644 --- a/src/lib/minio.ts +++ b/src/lib/minio.ts @@ -6,3 +6,5 @@ import config from '$lib/config'; /** export const client = new Minio.Client(config.minio); */ export const client = new Client(config.minio); + +export const BUCKET = 'tatort'; diff --git a/src/lib/server/s3ClientService.ts b/src/lib/server/s3ClientService.ts index beb1411..2a46c87 100644 --- a/src/lib/server/s3ClientService.ts +++ b/src/lib/server/s3ClientService.ts @@ -1,41 +1,4 @@ -import { client } from '$lib/minio'; - -const BUCKET = 'tatort'; - -export const getVorgang = ({ params }) => { - const prefix = params.vorgang ? `${params.vorgang}/` : ''; - const stream = client.listObjectsV2('tatort', prefix, false, ''); - const result = new ReadableStream({ - start(controller) { - stream.on('data', (data) => { - if (prefix === '') { - if (data.prefix) - controller.enqueue(`${JSON.stringify({ ...data, name: data.prefix.slice(0, -1) })}\n`); - return; - } - - const name = data.name.slice(prefix.length); - if (name === 'config.json') return; - // zugangscode datei - if (name === '__perm__') return; - - controller.enqueue(`${JSON.stringify({ ...data, name, prefix })}\n`); - }); - stream.on('end', () => { - controller.close(); - }); - }, - cancel() { - stream.destroy(); - } - }); - - return new Response(result, { - headers: { - 'content-type': 'text/event-stream' - } - }); -}; +import { BUCKET, client } from '$lib/minio'; export const checkIfExactDirectoryExists = (dir: string): Promise => { diff --git a/src/lib/server/vorgangService.ts b/src/lib/server/vorgangService.ts index cb0dda7..4374e90 100644 --- a/src/lib/server/vorgangService.ts +++ b/src/lib/server/vorgangService.ts @@ -1,68 +1,97 @@ import { fail, redirect } from '@sveltejs/kit'; -import { client } from '$lib/minio'; +import { BUCKET, client } from '$lib/minio'; import { checkIfExactDirectoryExists } from './s3ClientService'; /** - * - * @param request - * @returns + * + * @param request + * @returns */ -export const getVorgangByCaseNumber = async ( request: Request) => { - const data = await request.formData(); - const caseNumber = data.get('caseNumber'); - const user_token = data.get('token'); +export const redirectIfVorgangExists = async (request: Request) => { + const data = await request.formData(); + const caseId = data.get('case-id'); + const caseToken = data.get('case-token'); - if (!caseNumber) { - return fail(400, { - success: false, - caseNumber, - error: { message: 'Die Vorgangsnummer darf nicht leer sein.' } - }); - } + if (!caseId) { + return fail(400, { + success: false, + caseId, + error: { message: 'Die Vorgangsnummer darf nicht leer sein.' } + }); + } - if (typeof caseNumber === 'string' && !(await checkIfExactDirectoryExists(caseNumber))) { - return fail(400, { - success: false, - caseNumber, - error: { message: 'Die Vorgangsnummer existiert in dieser Anwendung nicht.' } - }); - } + if (typeof caseId === 'string' && !(await checkIfExactDirectoryExists(caseId))) { + return fail(400, { + success: false, + caseId, + error: { message: 'Die Vorgangsnummer existiert in dieser Anwendung nicht.' } + }); + } + const isTokenValid = await hasValidToken(caseId, caseToken); - const token = await getTokenOrNull(caseNumber); + if (!isTokenValid) { + return fail(400, { + success: false, + caseId, + error: { message: 'Der Token ist ungültig.' } + }); + } - if (token && token != user_token) { - return fail(400, { - success: false, - caseNumber, - error: { message: 'Der Token ist falsch.' } - }); - } + redirect(303, `/list/${caseId}`); +}; - redirect(303, `/list/${caseNumber}`); - } +export const getVorgangByCaseId = ({ params }) => { + const prefix = params.vorgang ? `${params.vorgang}/` : ''; + const stream = client.listObjectsV2(BUCKET, prefix, false, ''); + const result = new ReadableStream({ + start(controller) { + stream.on('data', (data) => { + if (prefix === '') { + if (data.prefix) + controller.enqueue(`${JSON.stringify({ ...data, name: data.prefix.slice(0, -1) })}\n`); + return; + } + const name = data.name.slice(prefix.length); + if (name === 'config.json') return; + // zugangscode datei + if (name === '__perm__') return; -const getTokenOrNull = async (vorgang) => { - const code_name = '__perm__'; - const obj_path = `${vorgang}/${code_name}`; + controller.enqueue(`${JSON.stringify({ ...data, name, prefix })}\n`); + }); + stream.on('end', () => { + controller.close(); + }); + }, + cancel() { + stream.destroy(); + } + }); - let resp = null; - let code_saved = ''; + return new Response(result, { + headers: { + 'content-type': 'text/event-stream' + } + }); +}; - try { - resp = await client.getObject('tatort', obj_path); - - code_saved = await new Response(resp).text(); - } catch (error) { - if (error.name == 'S3Error') { - resp = null; - } - } +const hasValidToken = async (caseId: string, caseToken: string) => { + const tokenFileName = '__perm__'; + const objPath = `${caseId}/${tokenFileName}`; - if (resp != null) { - return code_saved; - } else { - return null; - } -} + try { + if (!caseToken) return false; + + const res = await client.getObject('tatort', objPath); + + const savedToken = await new Response(res).text(); + + return savedToken === caseToken ? true : false; + } catch (error) { + if (error.name == 'S3Error') { + console.log(error); + return false; + } + } +}; diff --git a/src/routes/(angemeldet)/upload/+page.svelte b/src/routes/(angemeldet)/upload/+page.svelte index f7f53ac..0d93a8c 100644 --- a/src/routes/(angemeldet)/upload/+page.svelte +++ b/src/routes/(angemeldet)/upload/+page.svelte @@ -148,6 +148,7 @@ } else { return false; } + return true; } // `/(angemeldet)/view` return true or false diff --git a/src/routes/(token-based)/list/[vorgang]/+page.svelte b/src/routes/(token-based)/list/[vorgang]/+page.svelte index 695d7c9..3e96884 100644 --- a/src/routes/(token-based)/list/[vorgang]/+page.svelte +++ b/src/routes/(token-based)/list/[vorgang]/+page.svelte @@ -172,7 +172,6 @@ >
    -
    {#if data?.user?.admin} getVorgangByCaseNumber(request) + default: async ({request}: {request: Request}) => redirectIfVorgangExists(request) } \ No newline at end of file diff --git a/src/routes/(token-based)/view/+page.svelte b/src/routes/(token-based)/view/+page.svelte index cd8c641..f2a6c49 100644 --- a/src/routes/(token-based)/view/+page.svelte +++ b/src/routes/(token-based)/view/+page.svelte @@ -1,5 +1,7 @@