From d58be34fe59b0c93e0e1ed1167b5ea1e5d2cbfd3 Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 10 Jun 2025 14:07:40 +0200 Subject: [PATCH] fixed some type errors --- eslint.config.js | 16 +- package-lock.json | 36 +++ package.json | 1 + src/hooks.server.ts | 8 +- src/lib/helper/caseNumberOccupied.ts | 4 +- src/lib/helper/shortenFileSize.ts | 2 +- src/lib/helper/timeElapsed.ts | 2 +- src/routes/(angemeldet)/+layout.server.ts | 6 +- src/routes/(angemeldet)/list/+page.svelte | 77 +++--- .../(angemeldet)/list/[vorgang]/+page.svelte | 240 +++++++++--------- .../(angemeldet)/list/[vorgang]/+server.ts | 16 +- .../list/[vorgang]/[tatort]/+server.ts | 15 +- .../(angemeldet)/tatorte/+page.server.ts | 4 +- .../(angemeldet)/upload/+page.server.ts | 14 +- src/routes/(angemeldet)/upload/+page.svelte | 9 +- src/routes/(angemeldet)/view/+page.server.ts | 4 +- .../view/[vorgang]/[tatort]/+page.server.ts | 3 +- .../view/[vorgang]/[tatort]/+page.svelte | 9 +- src/routes/anmeldung/+page.server.ts | 7 +- src/routes/api/list/[[vorgang]]/+server.ts | 2 +- src/routes/api/tatort/+server.ts | 3 +- src/routes/api/upload/+server.ts | 4 +- 22 files changed, 266 insertions(+), 216 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index 9b34ef5..f1748e2 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -20,7 +20,21 @@ export default ts.config( languageOptions: { globals: { ...globals.browser, ...globals.node } }, - rules: { 'no-undef': 'off' } + rules: { + 'no-undef': 'off', + '@typescript-eslint/no-unused-vars': [ + 'error', + { + args: 'all', + argsIgnorePattern: '^_', + caughtErrors: 'all', + caughtErrorsIgnorePattern: '^_', + destructuredArrayIgnorePattern: '^_', + varsIgnorePattern: '^_', + ignoreRestSiblings: true + } + ] + } }, { files: ['**/*.svelte', '**/*.svelte.ts', '**/*.svelte.js'], diff --git a/package-lock.json b/package-lock.json index d212252..e719474 100644 --- a/package-lock.json +++ b/package-lock.json @@ -26,6 +26,7 @@ "@testing-library/jest-dom": "^6.6.3", "@testing-library/svelte": "^5.2.8", "@tsconfig/svelte": "^5.0.4", + "@types/jsonwebtoken": "^9.0.9", "eslint": "^9.28.0", "eslint-config-prettier": "^10.1.5", "eslint-plugin-svelte": "^3.9.2", @@ -1659,6 +1660,34 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/jsonwebtoken": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.9.tgz", + "integrity": "sha512-uoe+GxEuHbvy12OUQct2X9JenKM3qAscquYymuQN4fMWG9DBQtykrQEFcAbVACF7qaLw9BePSodUL0kquqBJpQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/ms": "*", + "@types/node": "*" + } + }, + "node_modules/@types/ms": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", + "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", + "dev": true, + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "24.0.0", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.0.tgz", + "integrity": "sha512-yZQa2zm87aRVcqDyH5+4Hv9KYgSdgwX1rFnGvpbzMaC7YAljmhBET93TPiTd3ObwTL+gSpIzPKg5BqVxdCvxKg==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "undici-types": "~7.8.0" + } + }, "node_modules/@types/resolve": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.20.2.tgz", @@ -6085,6 +6114,13 @@ "typescript": ">=4.8.4 <5.9.0" } }, + "node_modules/undici-types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.8.0.tgz", + "integrity": "sha512-9UJ2xGDvQ43tYyVMpuHlsgApydB8ZKfVYTsLDhXkFL/6gfkp+U8xTGdh8pMJv1SpZna0zxG1DwsKZsreLbXBxw==", + "devOptional": true, + "license": "MIT" + }, "node_modules/update-browserslist-db": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", diff --git a/package.json b/package.json index 333f4f1..105e951 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "@testing-library/jest-dom": "^6.6.3", "@testing-library/svelte": "^5.2.8", "@tsconfig/svelte": "^5.0.4", + "@types/jsonwebtoken": "^9.0.9", "eslint": "^9.28.0", "eslint-config-prettier": "^10.1.5", "eslint-plugin-svelte": "^3.9.2", diff --git a/src/hooks.server.ts b/src/hooks.server.ts index 19b1bcc..4f82972 100644 --- a/src/hooks.server.ts +++ b/src/hooks.server.ts @@ -1,15 +1,15 @@ import { decryptToken } from '$lib/auth'; +import type { Handle } from '@sveltejs/kit'; -/** @type {import('@sveltejs/kit').Handle} */ -export async function handle({ event, resolve }) { +export const handle: Handle = ({ event, resolve }) => { const jwt = event.cookies.get('session'); try { if (jwt) { event.locals.user = decryptToken(jwt); return resolve(event); } - } catch (err) { - await event.cookies.delete('session'); + } catch (_) { + event.cookies.delete('session', {path: '/'}); event.locals.user = null; } return resolve(event); diff --git a/src/lib/helper/caseNumberOccupied.ts b/src/lib/helper/caseNumberOccupied.ts index 50062e8..6fdd4bc 100644 --- a/src/lib/helper/caseNumberOccupied.ts +++ b/src/lib/helper/caseNumberOccupied.ts @@ -5,10 +5,10 @@ import { client } from '$lib/minio'; * @param {string} caseNumber * @returns {Promise { - let stream = client.listObjectsV2('tatort', prefix, false, ''); + const stream = client.listObjectsV2('tatort', prefix, false, ''); stream.on('data', () => { stream.destroy(); resolve(true); diff --git a/src/lib/helper/shortenFileSize.ts b/src/lib/helper/shortenFileSize.ts index 1525dfb..9628b34 100644 --- a/src/lib/helper/shortenFileSize.ts +++ b/src/lib/helper/shortenFileSize.ts @@ -7,7 +7,7 @@ const GIGA = MEGA * KILO; * @param {number} size * @returns{string} */ -export default function shortenFileSize(size) { +export default function shortenFileSize(size: number) { 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 b2f8a73..f9186d9 100644 --- a/src/lib/helper/timeElapsed.ts +++ b/src/lib/helper/timeElapsed.ts @@ -9,7 +9,7 @@ const MONTH = YEAR / 12; * @param {Date} date * @returns string */ -export default function timeElapsed(date) { +export default function timeElapsed(date: Date) { const now = new Date(); const age = Math.floor((now.getTime() - date.getTime()) / 1000); diff --git a/src/routes/(angemeldet)/+layout.server.ts b/src/routes/(angemeldet)/+layout.server.ts index c54cfba..0454232 100644 --- a/src/routes/(angemeldet)/+layout.server.ts +++ b/src/routes/(angemeldet)/+layout.server.ts @@ -1,7 +1,7 @@ -import { redirect } from '@sveltejs/kit'; +import { redirect, type ServerLoadEvent } from '@sveltejs/kit'; +import type { PageServerLoad } from './view/[vorgang]/[tatort]/$types'; -/** @type {import('./$types').PageServerLoad} */ -export function load(event) { +export const load: PageServerLoad = (event: ServerLoadEvent) => { if (!event.locals.user && event.url.pathname !== '/anmeldung') throw redirect(303, '/anmeldung'); return { user: event.locals.user diff --git a/src/routes/(angemeldet)/list/+page.svelte b/src/routes/(angemeldet)/list/+page.svelte index e742613..c51a113 100644 --- a/src/routes/(angemeldet)/list/+page.svelte +++ b/src/routes/(angemeldet)/list/+page.svelte @@ -1,9 +1,3 @@ - - @@ -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); }