From 5a5ae9901a706335875767db3e452b61a723a8b1 Mon Sep 17 00:00:00 2001 From: mina Date: Fri, 23 May 2025 11:05:04 +0200 Subject: [PATCH 001/343] testing --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b5b2950..2a355b7 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ # sv +Test test Mina Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli). ## Creating a project From 527c2b438dc518bad6f56faf0603526021b5ec06 Mon Sep 17 00:00:00 2001 From: mina Date: Fri, 23 May 2025 11:20:17 +0200 Subject: [PATCH 002/343] verbindungsprobleme test --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 2a355b7..b5b2950 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,5 @@ # sv -Test test Mina Everything you need to build a Svelte project, powered by [`sv`](https://github.com/sveltejs/cli). ## Creating a project From 28e93fe9435451471acefc6e61f054dee5f2c05c Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 18 Jun 2025 16:33:35 +0200 Subject: [PATCH 003/343] vorgang accessible via url --- src/lib/minio.ts | 1 + src/lib/server/vorgangService.ts | 11 +++++------ .../list/[vorgang]/+page.server.ts | 18 ++++++++++++++++++ 3 files changed, 24 insertions(+), 6 deletions(-) create mode 100644 src/routes/(token-based)/list/[vorgang]/+page.server.ts diff --git a/src/lib/minio.ts b/src/lib/minio.ts index 6824b78..f2ac969 100644 --- a/src/lib/minio.ts +++ b/src/lib/minio.ts @@ -8,3 +8,4 @@ import config from '$lib/config'; export const client = new Client(config.minio); export const BUCKET = 'tatort'; +export const TOKENFILENAME = '__perm__'; diff --git a/src/lib/server/vorgangService.ts b/src/lib/server/vorgangService.ts index c24a37c..c4439bd 100644 --- a/src/lib/server/vorgangService.ts +++ b/src/lib/server/vorgangService.ts @@ -1,5 +1,5 @@ import { fail, redirect } from '@sveltejs/kit'; -import { BUCKET, client } from '$lib/minio'; +import { BUCKET, client, TOKENFILENAME } from '$lib/minio'; import { checkIfExactDirectoryExists } from './s3ClientService'; /** @@ -38,7 +38,7 @@ export const redirectIfVorgangExists = async (request: Request) => { }); } - redirect(303, `/list/${caseId}`); + redirect(303, `/list/${caseId}?token=${caseToken}`); }; export const getVorgangByCaseId = ({ params }) => { @@ -76,14 +76,13 @@ export const getVorgangByCaseId = ({ params }) => { }); }; -const hasValidToken = async (caseId: string, caseToken: string) => { - const tokenFileName = '__perm__'; - const objPath = `${caseId}/${tokenFileName}`; +export const hasValidToken = async (caseId: string, caseToken: string) => { + const objPath = `${caseId}/${TOKENFILENAME}`; try { if (!caseToken) return false; - const res = await client.getObject('tatort', objPath); + const res = await client.getObject(BUCKET, objPath); const savedToken = await new Response(res).text(); diff --git a/src/routes/(token-based)/list/[vorgang]/+page.server.ts b/src/routes/(token-based)/list/[vorgang]/+page.server.ts new file mode 100644 index 0000000..f4fe251 --- /dev/null +++ b/src/routes/(token-based)/list/[vorgang]/+page.server.ts @@ -0,0 +1,18 @@ +import { hasValidToken } from '$lib/server/vorgangService'; +import { redirect } from '@sveltejs/kit'; +import type { PageServerLoad } from '../../view/$types'; + +export const load: PageServerLoad = ({params, url}) => { + const caseID = params.vorgang; + const token = url.searchParams.get('token'); + + let isTokenValid + + if (typeof token === 'string' && caseID) { + isTokenValid = hasValidToken(caseID, token); + } + + if(!isTokenValid) { + redirect(303, '/anmeldung'); + } +}; From a2ac88af50a290510f5810c4758ab97c36d9fc2c Mon Sep 17 00:00:00 2001 From: Jared Date: Thu, 19 Jun 2025 10:31:31 +0200 Subject: [PATCH 004/343] revised backend service getObjects --- src/lib/server/vorgangService.ts | 137 ++++++++++++++++----------- src/routes/anmeldung/+page.server.ts | 14 ++- src/routes/anmeldung/+page.svelte | 2 +- 3 files changed, 95 insertions(+), 58 deletions(-) diff --git a/src/lib/server/vorgangService.ts b/src/lib/server/vorgangService.ts index c4439bd..a4dcad4 100644 --- a/src/lib/server/vorgangService.ts +++ b/src/lib/server/vorgangService.ts @@ -1,17 +1,73 @@ -import { fail, redirect } from '@sveltejs/kit'; +import { fail } from '@sveltejs/kit'; import { BUCKET, client, TOKENFILENAME } from '$lib/minio'; import { checkIfExactDirectoryExists } from './s3ClientService'; +export const getVorgangByCaseId = async (caseId: string, token: string) => { + const isValidCase = await checkIfVorgangExists(caseId); + const isValidToken = await hasValidToken(caseId, token); + + // const prefix = params.vorgang ? `${params.vorgang}/` : ''; + + // const stream = client.listObjectsV2(BUCKET, caseId, false, ''); + // let files: any[] = []; + + return new Promise((resolve, reject) => { + const stream = client.listObjectsV2(BUCKET, caseId, false, ''); + const result = []; + + stream.on('data', (item) => { + result.push(item); + }); + + stream.on('end', () => { + resolve(result); + }); + + stream.on('error', (err) => { + reject(err); + }); + }); + + // const readableStream = new ReadableStream({ + // start(controller) { + // stream.on('data', (data) => { + // if (caseId === '') { + // if (data.prefix) + // controller.enqueue(`${JSON.stringify({ ...data, name: data.prefix.slice(0, -1) })}\n`); + // return; + // } + + // const name = data?.name?.slice(caseId.length); + // if (name === 'config.json') return; + // // zugangscode datei + // if (name === '__perm__') return; + + // controller.enqueue(`${JSON.stringify({ ...data, name, caseId })}\n`); + // }); + // stream.on('end', () => { + // controller.close(); + // }); + // }, + // cancel() { + // stream.destroy(); + // } + // }); + + // return files; + + // return new Response(result, { + // headers: { + // 'content-type': 'text/event-stream' + // } + // }); +}; + /** * Checks if Vorgang exists and token is valid. * @param request * @returns redirect to /list/caseId or error */ -export const redirectIfVorgangExists = async (request: Request) => { - const data = await request.formData(); - const caseId = data.get('case-id'); - const caseToken = data.get('case-token'); - +const checkIfVorgangExists = async (caseId) => { if (!caseId) { return fail(400, { success: false, @@ -28,55 +84,22 @@ export const redirectIfVorgangExists = async (request: Request) => { }); } - const isTokenValid = await hasValidToken(caseId, caseToken); + return true; - if (!isTokenValid) { - return fail(400, { - success: false, - caseId, - error: { message: 'Der Token ist ungültig.' } - }); - } + // const isTokenValid = await hasValidToken(caseId, caseToken); - redirect(303, `/list/${caseId}?token=${caseToken}`); + // if (!isTokenValid) { + // return fail(400, { + // success: false, + // caseId, + // error: { message: 'Der Token ist ungültig.' } + // }); + // } + + // redirect(303, `/list/${caseId}?token=${caseToken}`); }; -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; - - 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 hasValidToken = async (caseId: string, caseToken: string) => { +const hasValidToken = async (caseId: string, caseToken: string) => { const objPath = `${caseId}/${TOKENFILENAME}`; try { @@ -84,9 +107,17 @@ export const hasValidToken = async (caseId: string, caseToken: string) => { const res = await client.getObject(BUCKET, objPath); - const savedToken = await new Response(res).text(); + const token = await new Response(res).text(); - return savedToken === caseToken ? true : false; + if (!token) { + return fail(400, { + success: false, + caseId, + error: { message: 'Der Token ist ungültig.' } + }); + } + + return token === caseToken ? true : false; } catch (error) { if (error.name == 'S3Error') { console.log(error); diff --git a/src/routes/anmeldung/+page.server.ts b/src/routes/anmeldung/+page.server.ts index be19d11..362a0ca 100644 --- a/src/routes/anmeldung/+page.server.ts +++ b/src/routes/anmeldung/+page.server.ts @@ -1,9 +1,15 @@ import { loginUser, logoutUser } from '$lib/server/authService'; -import { redirectIfVorgangExists } from '$lib/server/vorgangService.js'; - +import { getVorgangByCaseId } from '$lib/server/vorgangService.js'; export const actions = { - login: ({ request, cookies }) => loginUser({request, cookies}), + login: ({ request, cookies }) => loginUser({ request, cookies }), logout: (event) => logoutUser(event), - redirectToVorgang: ({request}) => redirectIfVorgangExists(request) + getVorgangById: async ({ request }) => { + const data = await request.formData(); + const caseId = data.get('case-id'); + const caseToken = data.get('case-token'); + const result = await getVorgangByCaseId(caseId, caseToken); + + console.log(result); + } } as const; diff --git a/src/routes/anmeldung/+page.svelte b/src/routes/anmeldung/+page.svelte index f68f9ea..f937a51 100644 --- a/src/routes/anmeldung/+page.svelte +++ b/src/routes/anmeldung/+page.svelte @@ -24,7 +24,7 @@
-
+ Date: Thu, 19 Jun 2025 16:01:07 +0200 Subject: [PATCH 005/343] change case loading in server side mode, made case list functional --- src/lib/minio.ts | 1 + src/lib/server/s3ClientService.ts | 10 +- src/lib/server/vorgangService.ts | 122 +++++++----------- src/routes/(angemeldet)/list/+page.server.ts | 10 ++ .../list/+page.svelte | 33 +---- .../list/[vorgang]/+page.server.ts | 32 +++-- .../(token-based)/list/[vorgang]/+page.svelte | 58 ++------- src/routes/anmeldung/+page.server.ts | 12 +- 8 files changed, 110 insertions(+), 168 deletions(-) create mode 100644 src/routes/(angemeldet)/list/+page.server.ts rename src/routes/{(token-based) => (angemeldet)}/list/+page.svelte (73%) diff --git a/src/lib/minio.ts b/src/lib/minio.ts index f2ac969..49ef470 100644 --- a/src/lib/minio.ts +++ b/src/lib/minio.ts @@ -9,3 +9,4 @@ export const client = new Client(config.minio); export const BUCKET = 'tatort'; export const TOKENFILENAME = '__perm__'; +export const CONFIGFILENAME = 'config.json'; diff --git a/src/lib/server/s3ClientService.ts b/src/lib/server/s3ClientService.ts index 2a46c87..dc497b1 100644 --- a/src/lib/server/s3ClientService.ts +++ b/src/lib/server/s3ClientService.ts @@ -1,6 +1,5 @@ import { BUCKET, client } from '$lib/minio'; - export const checkIfExactDirectoryExists = (dir: string): Promise => { return new Promise((resolve, reject) => { const prefix = dir.endsWith('/') ? dir : `${dir}/`; @@ -18,4 +17,11 @@ export const checkIfExactDirectoryExists = (dir: string): Promise => { stream.on('end', () => resolve(false)); }); -} +}; + +export const getContentofTextObject = async (bucket: string, objPath: string) => { + const res = await client.getObject(bucket, objPath); + + const text = await new Response(res).text(); + return text; +}; diff --git a/src/lib/server/vorgangService.ts b/src/lib/server/vorgangService.ts index a4dcad4..65ae4fc 100644 --- a/src/lib/server/vorgangService.ts +++ b/src/lib/server/vorgangService.ts @@ -1,73 +1,49 @@ import { fail } from '@sveltejs/kit'; -import { BUCKET, client, TOKENFILENAME } from '$lib/minio'; -import { checkIfExactDirectoryExists } from './s3ClientService'; +import { BUCKET, client, CONFIGFILENAME, TOKENFILENAME } from '$lib/minio'; +import { checkIfExactDirectoryExists, getContentofTextObject } from './s3ClientService'; -export const getVorgangByCaseId = async (caseId: string, token: string) => { - const isValidCase = await checkIfVorgangExists(caseId); - const isValidToken = await hasValidToken(caseId, token); +/** + * Get Vorgang and list of tatorte + * @param caseId + * @returns + */ +export const getVorgangByCaseId = async (caseId: string) => { + const prefix = `${caseId}/`; - // const prefix = params.vorgang ? `${params.vorgang}/` : ''; + const stream = client.listObjectsV2(BUCKET, prefix, false, ''); - // const stream = client.listObjectsV2(BUCKET, caseId, false, ''); - // let files: any[] = []; + const list = []; + for await (const chunk of stream) { + const splittedNameParts = chunk.name.split('/'); + const prefix = splittedNameParts[0]; + const name = splittedNameParts[1]; + if (name === CONFIGFILENAME || name === TOKENFILENAME) continue; + list.push({ ...chunk, name: name, prefix: prefix, show_button: true }); + } + return list; +}; - return new Promise((resolve, reject) => { - const stream = client.listObjectsV2(BUCKET, caseId, false, ''); - const result = []; +export const getListOfVorgänge = async () => { + const stream = client.listObjectsV2(BUCKET, '', false, ''); + + const list = []; + for await (const chunk of stream) { + const objPath = `${chunk.prefix}${TOKENFILENAME}`; - stream.on('data', (item) => { - result.push(item); - }); + const token = await getContentofTextObject(BUCKET, objPath); - stream.on('end', () => { - resolve(result); - }); - - stream.on('error', (err) => { - reject(err); - }); - }); - - // const readableStream = new ReadableStream({ - // start(controller) { - // stream.on('data', (data) => { - // if (caseId === '') { - // if (data.prefix) - // controller.enqueue(`${JSON.stringify({ ...data, name: data.prefix.slice(0, -1) })}\n`); - // return; - // } - - // const name = data?.name?.slice(caseId.length); - // if (name === 'config.json') return; - // // zugangscode datei - // if (name === '__perm__') return; - - // controller.enqueue(`${JSON.stringify({ ...data, name, caseId })}\n`); - // }); - // stream.on('end', () => { - // controller.close(); - // }); - // }, - // cancel() { - // stream.destroy(); - // } - // }); - - // return files; - - // return new Response(result, { - // headers: { - // 'content-type': 'text/event-stream' - // } - // }); + const cleanedChunkPrefix = chunk.prefix.replace(/\/$/, ''); + list.push({ name: cleanedChunkPrefix, token: token }); + } + return list; }; /** - * Checks if Vorgang exists and token is valid. + * Checks if Vorgang exists * @param request - * @returns redirect to /list/caseId or error + * @returns fail or true */ -const checkIfVorgangExists = async (caseId) => { +export const checkIfVorgangExists = async (caseId: string) => { if (!caseId) { return fail(400, { success: false, @@ -85,31 +61,23 @@ const checkIfVorgangExists = async (caseId) => { } return true; - - // const isTokenValid = await hasValidToken(caseId, caseToken); - - // if (!isTokenValid) { - // return fail(400, { - // success: false, - // caseId, - // error: { message: 'Der Token ist ungültig.' } - // }); - // } - - // redirect(303, `/list/${caseId}?token=${caseToken}`); }; -const hasValidToken = async (caseId: string, caseToken: string) => { +export const hasValidToken = async (caseId: string, caseToken: string) => { const objPath = `${caseId}/${TOKENFILENAME}`; try { - if (!caseToken) return false; + if (!caseToken) { + return fail(400, { + success: false, + caseId, + error: { message: 'Bitte Zugangscode eingeben!' } + }); + } - const res = await client.getObject(BUCKET, objPath); + const token = await getContentofTextObject(BUCKET, objPath); - const token = await new Response(res).text(); - - if (!token) { + if (!token || token !== caseToken) { return fail(400, { success: false, caseId, @@ -117,7 +85,7 @@ const hasValidToken = async (caseId: string, caseToken: string) => { }); } - return token === caseToken ? true : false; + return true; } catch (error) { if (error.name == 'S3Error') { console.log(error); diff --git a/src/routes/(angemeldet)/list/+page.server.ts b/src/routes/(angemeldet)/list/+page.server.ts new file mode 100644 index 0000000..4d78120 --- /dev/null +++ b/src/routes/(angemeldet)/list/+page.server.ts @@ -0,0 +1,10 @@ +import { getListOfVorgänge } from '$lib/server/vorgangService'; +import type { PageServerLoad } from '../../(token-based)/view/$types'; + +export const load: PageServerLoad = async () => { + const caseList = await getListOfVorgänge(); + + return { + caseList + }; +}; diff --git a/src/routes/(token-based)/list/+page.svelte b/src/routes/(angemeldet)/list/+page.svelte similarity index 73% rename from src/routes/(token-based)/list/+page.svelte rename to src/routes/(angemeldet)/list/+page.svelte index 323bc3e..b730a95 100644 --- a/src/routes/(token-based)/list/+page.svelte +++ b/src/routes/(angemeldet)/list/+page.svelte @@ -1,34 +1,11 @@ diff --git a/src/routes/anmeldung/+page.server.ts b/src/routes/anmeldung/+page.server.ts index 210da49..167b8ef 100644 --- a/src/routes/anmeldung/+page.server.ts +++ b/src/routes/anmeldung/+page.server.ts @@ -15,7 +15,6 @@ export const actions = { const isTokenValid = await hasValidToken(caseId, caseToken); if ( isTokenValid !== true) return isTokenValid; - throw redirect(303, `/list/${caseId}?token=${caseToken}`); } } as const; From bb98c3656e6e88ea9e19e5a42bd43515a8eaa6f1 Mon Sep 17 00:00:00 2001 From: Jared Date: Mon, 23 Jun 2025 14:46:09 +0200 Subject: [PATCH 009/343] tatorte only available via token --- src/lib/server/s3ClientService.ts | 2 +- src/lib/server/vorgangService.ts | 27 +++++++++---------- src/routes/(token-based)/+layout.server.ts | 22 +++++++++------ .../list/[vorgang]/+page.server.ts | 20 +++----------- .../(token-based)/list/[vorgang]/+page.svelte | 12 +++------ .../list/[vorgang]/[tatort]/+server.ts | 11 -------- src/routes/(token-based)/view/+page.server.ts | 1 - .../view/[vorgang]/[tatort]/+page.server.ts | 1 - src/routes/anmeldung/+page.server.ts | 4 +-- src/routes/api/tatort/+server.ts | 15 +++++++++-- 10 files changed, 48 insertions(+), 67 deletions(-) delete mode 100644 src/routes/(token-based)/list/[vorgang]/[tatort]/+server.ts diff --git a/src/lib/server/s3ClientService.ts b/src/lib/server/s3ClientService.ts index dc497b1..c54c95c 100644 --- a/src/lib/server/s3ClientService.ts +++ b/src/lib/server/s3ClientService.ts @@ -19,7 +19,7 @@ export const checkIfExactDirectoryExists = (dir: string): Promise => { }); }; -export const getContentofTextObject = async (bucket: string, objPath: string) => { +export const getContentOfTextObject = async (bucket: string, objPath: string) => { const res = await client.getObject(bucket, objPath); const text = await new Response(res).text(); diff --git a/src/lib/server/vorgangService.ts b/src/lib/server/vorgangService.ts index 0bf8469..06a9a5e 100644 --- a/src/lib/server/vorgangService.ts +++ b/src/lib/server/vorgangService.ts @@ -1,6 +1,6 @@ import { fail } from '@sveltejs/kit'; import { BUCKET, client, CONFIGFILENAME, TOKENFILENAME } from '$lib/minio'; -import { checkIfExactDirectoryExists, getContentofTextObject } from './s3ClientService'; +import { checkIfExactDirectoryExists, getContentOfTextObject } from './s3ClientService'; /** * Get Vorgang and corresponend list of tatorte @@ -17,12 +17,18 @@ export const getVorgangByCaseId = async (caseId: string) => { const splittedNameParts = chunk.name.split('/'); const prefix = splittedNameParts[0]; const name = splittedNameParts[1]; + if (name === CONFIGFILENAME || name === TOKENFILENAME) continue; list.push({ ...chunk, name: name, prefix: prefix, show_button: true }); } return list; }; + +/** + * Fetches list of vorgänge from s3 bucket + * @returns list of available cases + */ export const getListOfVorgänge = async () => { const stream = client.listObjectsV2(BUCKET, '', false, ''); @@ -30,7 +36,7 @@ export const getListOfVorgänge = async () => { for await (const chunk of stream) { const objPath = `${chunk.prefix}${TOKENFILENAME}`; - const token = await getContentofTextObject(BUCKET, objPath); + const token = await getContentOfTextObject(BUCKET, objPath); const cleanedChunkPrefix = chunk.prefix.replace(/\/$/, ''); list.push({ name: cleanedChunkPrefix, token: token }); @@ -43,7 +49,7 @@ export const getListOfVorgänge = async () => { * @param request * @returns fail or true */ -export const checkIfVorgangExists = async (caseId: string) => { +export const checkIfVorgangExists = async (caseId: string | null) => { if (!caseId) { return fail(400, { success: false, @@ -68,21 +74,12 @@ export const hasValidToken = async (caseId: string, caseToken: string) => { try { if (!caseToken) { - return fail(400, { - success: false, - caseId, - error: { message: 'Bitte Zugangscode eingeben!' } - }); + return false; } - const token = await getContentofTextObject(BUCKET, objPath); - + const token = await getContentOfTextObject(BUCKET, objPath); if (!token || token !== caseToken) { - return fail(400, { - success: false, - caseId, - error: { message: 'Der Token ist ungültig.' } - }); + return false; } return true; diff --git a/src/routes/(token-based)/+layout.server.ts b/src/routes/(token-based)/+layout.server.ts index e7a1878..6797d53 100644 --- a/src/routes/(token-based)/+layout.server.ts +++ b/src/routes/(token-based)/+layout.server.ts @@ -1,10 +1,16 @@ -import { type ServerLoadEvent } from '@sveltejs/kit'; -import type { PageServerLoad } from '../anmeldung/$types'; +import { checkIfVorgangExists, hasValidToken } from '$lib/server/vorgangService'; +import { redirect } from '@sveltejs/kit'; +import type { PageServerLoad } from './list/[vorgang]/$types'; + +export const load: PageServerLoad = async ({params, url}) => { + + const caseId = params.vorgang; + const caseToken = url.searchParams.get('token'); + + const isVorgangValid = await checkIfVorgangExists(caseId); + const isTokenValid = await hasValidToken(caseId, caseToken); + + if(!isVorgangValid || !isTokenValid) throw redirect(303, `/anmeldung`); + -export const load: PageServerLoad = (event: ServerLoadEvent) => { - if (event.locals.user) { - return { - user: event.locals.user - }; - } }; diff --git a/src/routes/(token-based)/list/[vorgang]/+page.server.ts b/src/routes/(token-based)/list/[vorgang]/+page.server.ts index 88a6d16..ed80765 100644 --- a/src/routes/(token-based)/list/[vorgang]/+page.server.ts +++ b/src/routes/(token-based)/list/[vorgang]/+page.server.ts @@ -1,28 +1,14 @@ -import { checkIfVorgangExists } from '$lib/server/vorgangService'; -import { hasValidToken } from '$lib/server/vorgangService'; import { getVorgangByCaseId } from '$lib/server/vorgangService'; -import type { PageServerLoad } from '../../view/$types'; +import type { PageServerLoad } from './$types'; export const load: PageServerLoad = async ({ params, url }) => { const caseId = params.vorgang; const caseToken = url.searchParams.get('token'); - const isVorgangValid = await checkIfVorgangExists(caseId); - if (isVorgangValid !== true) { - return { - error: 'Vorgang wurde nicht gefunden.' - }; - } - const isTokenValid = await hasValidToken(caseId, caseToken); - if (isTokenValid !== true) { - return { - error: 'Zugriffscode ist ungültig.' - }; - } - const crimesList = await getVorgangByCaseId(caseId); return { - crimesList + crimesList, + caseToken }; }; diff --git a/src/routes/(token-based)/list/[vorgang]/+page.svelte b/src/routes/(token-based)/list/[vorgang]/+page.svelte index 73eed7d..4b3cde4 100644 --- a/src/routes/(token-based)/list/[vorgang]/+page.svelte +++ b/src/routes/(token-based)/list/[vorgang]/+page.svelte @@ -27,6 +27,7 @@ } const crimesList: ListItem[] = data.crimesList; + const token: string = data.caseToken; let open = false; $: open; @@ -138,7 +139,7 @@ {#each crimesList as item, i}
  • @@ -206,9 +207,8 @@ let url = new URL($page.url); url.pathname += `/${filename}`; - console.log(`--- ${vorgang} + ${filename} + ${url}`); try { - const response = await fetch(url, { method: 'DELETE' }); + const response = await fetch(`api/${url}`, { method: 'DELETE' }); if (response.status == 204) { setTimeout(() => { window.location.reload(); @@ -264,12 +264,6 @@
  • -{#if data.error} -
    - Fehler: - {data.error} -
    -{/if} From ded024bc67e154a26d7213981d0d698047cdf057 Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 24 Jun 2025 16:53:03 +0200 Subject: [PATCH 011/343] removed duplicate validation of vorgang and token --- src/routes/anmeldung/+page.server.ts | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/src/routes/anmeldung/+page.server.ts b/src/routes/anmeldung/+page.server.ts index d656c57..d592bd9 100644 --- a/src/routes/anmeldung/+page.server.ts +++ b/src/routes/anmeldung/+page.server.ts @@ -1,5 +1,4 @@ import { loginUser, logoutUser } from '$lib/server/authService'; -import { checkIfVorgangExists, hasValidToken } from '$lib/server/vorgangService.js'; import { redirect } from '@sveltejs/kit'; export const actions = { @@ -9,12 +8,9 @@ export const actions = { const data = await request.formData(); const caseId = data.get('case-id'); const caseToken = data.get('case-token'); - - const isVorgangValid = await checkIfVorgangExists(caseId); - if (!isVorgangValid) return isVorgangValid; - const isTokenValid = await hasValidToken(caseId, caseToken); - if (!isTokenValid) return isTokenValid; + + if (!caseId || !caseToken) return; throw redirect(303, `/list/${caseId}?token=${caseToken}`); } -} as const; +} as const; \ No newline at end of file From ee6b9fcec11587e8c78eb9646616ba4a55d57d93 Mon Sep 17 00:00:00 2001 From: mina Date: Tue, 24 Jun 2025 18:06:59 +0200 Subject: [PATCH 012/343] fixed Comments of Jared --- .../view/[vorgang]/[tatort]/+page.svelte | 26 +++---------------- 1 file changed, 3 insertions(+), 23 deletions(-) diff --git a/src/routes/(token-based)/view/[vorgang]/[tatort]/+page.svelte b/src/routes/(token-based)/view/[vorgang]/[tatort]/+page.svelte index ee46fe2..4823311 100644 --- a/src/routes/(token-based)/view/[vorgang]/[tatort]/+page.svelte +++ b/src/routes/(token-based)/view/[vorgang]/[tatort]/+page.svelte @@ -2,6 +2,7 @@ import Panel from '$lib/components/Panel.svelte'; import { onMount } from 'svelte'; import Button from '$lib/components/Button.svelte'; + import type { ModelViewerElement } from '@google/model-viewer'; export let data; @@ -24,13 +25,11 @@ let yRotation = 0; let zRotation = 0; - import type { ModelViewerElement } from '@google/model-viewer'; - let modelViewer: ModelViewerElement | null = null; $: style = `width: ${progress}%`; - const onProgress = ({ detail }: { detail: { totalProgress: number } }) => { + const updateModelProgress = ({ detail }: { detail: { totalProgress: number } }) => { progress = Math.ceil(detail.totalProgress * 100.0); if (progress == 100) { setTimeout(() => { @@ -65,7 +64,6 @@
    - - -
    From 41a98d3d1de60a7d7304ab0c28db70104ef88dd3 Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 09:52:46 +0200 Subject: [PATCH 013/343] added first Jenkins ci --- Jenkinsfile | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 Jenkinsfile diff --git a/Jenkinsfile b/Jenkinsfile new file mode 100644 index 0000000..be13e81 --- /dev/null +++ b/Jenkinsfile @@ -0,0 +1,37 @@ + +pipeline { + agent { label 'nodejs-builder' } + + stages { + stage('Install Dependencies') { + steps { + sh 'npm ci' + } + } + + stage('Test & Security Audit') { + echo 'Start checking security vulnerabilities in npm packages' + steps { + sh 'npm audit' + } + } + + stage('Build') { + when { + branch 'development' + } + steps { + sh 'npm run build' + } + } + } + + post { + success { + echo 'Pipeline erfolgreich!' + } + failure { + echo 'Pipeline fehlgeschlagen!' + } + } +} From 533d94c6a52f10f7912508d9e5888fbf8d8d8efd Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 09:56:29 +0200 Subject: [PATCH 014/343] fixed echo statement --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index be13e81..9082116 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -10,8 +10,8 @@ pipeline { } stage('Test & Security Audit') { - echo 'Start checking security vulnerabilities in npm packages' steps { + echo 'Start checking security vulnerabilities in npm packages' sh 'npm audit' } } From d6baaef992bdf856d44200ed954adfea61395fc3 Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 10:04:59 +0200 Subject: [PATCH 015/343] fixed node agent --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 9082116..b3c8a3d 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,6 +1,6 @@ pipeline { - agent { label 'nodejs-builder' } + agent { label 'NodeJS-24.2.0r' } stages { stage('Install Dependencies') { From 7d15e0369dc2d6ea664277078e816432fe5b5bb8 Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 10:07:31 +0200 Subject: [PATCH 016/343] fixed node agent --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index b3c8a3d..efea01a 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,6 +1,6 @@ pipeline { - agent { label 'NodeJS-24.2.0r' } + agent { label 'NodeJS-24.2.0' } stages { stage('Install Dependencies') { From 355e4f32874c6628a58b1210309d36f86ce3abe4 Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 10:13:21 +0200 Subject: [PATCH 017/343] fixed node agent --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index efea01a..c915ea0 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,6 +1,6 @@ pipeline { - agent { label 'NodeJS-24.2.0' } + agent { label 'master' } stages { stage('Install Dependencies') { From d5a7058f2dbefbfbbf2c0d5f2623889797caf9d0 Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 10:41:00 +0200 Subject: [PATCH 018/343] fixed node agent --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index c915ea0..41e2490 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,6 +1,6 @@ pipeline { - agent { label 'master' } + agent any stages { stage('Install Dependencies') { From b2e00eb0309f9e40abcf479c793ba4aa5f5abbe0 Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 10:50:26 +0200 Subject: [PATCH 019/343] added nodeJS as tool --- Jenkinsfile | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Jenkinsfile b/Jenkinsfile index 41e2490..52d1f4f 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -2,6 +2,10 @@ pipeline { agent any + tools { + nodejs 'NodeJS-24.2.0' + } + stages { stage('Install Dependencies') { steps { From 56cfd79687a277ad678add654f9dd602fa4d47e8 Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 11:49:58 +0200 Subject: [PATCH 020/343] added docker --- Jenkinsfile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Jenkinsfile b/Jenkinsfile index 52d1f4f..9eb5bcf 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -28,6 +28,12 @@ pipeline { sh 'npm run build' } } + + stage('Containerize') { + steps { + sh 'docker -h' + } + } } post { From 8b276f9828c44580b01217e85e2ce06fbb18d3df Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 11:50:13 +0200 Subject: [PATCH 021/343] added docker --- Jenkinsfile | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 9eb5bcf..fcaa6bb 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -7,27 +7,27 @@ pipeline { } stages { - stage('Install Dependencies') { - steps { - sh 'npm ci' - } - } + // stage('Install Dependencies') { + // steps { + // sh 'npm ci' + // } + // } - stage('Test & Security Audit') { - steps { - echo 'Start checking security vulnerabilities in npm packages' - sh 'npm audit' - } - } + // stage('Test & Security Audit') { + // steps { + // echo 'Start checking security vulnerabilities in npm packages' + // sh 'npm audit' + // } + // } - stage('Build') { - when { - branch 'development' - } - steps { - sh 'npm run build' - } - } + // stage('Build') { + // when { + // branch 'development' + // } + // steps { + // sh 'npm run build' + // } + // } stage('Containerize') { steps { From 72169c4e64495b10229adc088dba1770a69810f1 Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 13:05:09 +0200 Subject: [PATCH 022/343] fixed get user infos for token based routes --- src/routes/(token-based)/+layout.server.ts | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/src/routes/(token-based)/+layout.server.ts b/src/routes/(token-based)/+layout.server.ts index 6797d53..99517b3 100644 --- a/src/routes/(token-based)/+layout.server.ts +++ b/src/routes/(token-based)/+layout.server.ts @@ -2,15 +2,18 @@ import { checkIfVorgangExists, hasValidToken } from '$lib/server/vorgangService' import { redirect } from '@sveltejs/kit'; import type { PageServerLoad } from './list/[vorgang]/$types'; -export const load: PageServerLoad = async ({params, url}) => { - - const caseId = params.vorgang; - const caseToken = url.searchParams.get('token'); - - const isVorgangValid = await checkIfVorgangExists(caseId); - const isTokenValid = await hasValidToken(caseId, caseToken); +export const load: PageServerLoad = async ({ params, url, locals }) => { + if (locals.user) { + return { + user: locals.user + }; + } - if(!isVorgangValid || !isTokenValid) throw redirect(303, `/anmeldung`); - + const caseId = params.vorgang; + const caseToken = url.searchParams.get('token'); + const isVorgangValid = await checkIfVorgangExists(caseId); + const isTokenValid = await hasValidToken(caseId, caseToken); + + if (!isVorgangValid || !isTokenValid) throw redirect(303, `/anmeldung`); }; From ea9b61fe79e5a7e9023f1f8e9f9897181a1500d0 Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 13:20:46 +0200 Subject: [PATCH 023/343] added docker job --- Jenkinsfile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index fcaa6bb..a347dc9 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -29,9 +29,11 @@ pipeline { // } // } - stage('Containerize') { + stage('Manuelles Containerisieren') { steps { - sh 'docker -h' + input message: 'Jetzt manuell freigeben für Deployment?' + sh 'docker build -t tatort-app .' + sh 'docker iamge ls' } } } From 0b4df7b714dc7849acad4fd5d76301c40bfa1d2a Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 13:25:29 +0200 Subject: [PATCH 024/343] added admin as submitter --- Jenkinsfile | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index a347dc9..2d28c39 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -31,11 +31,13 @@ pipeline { stage('Manuelles Containerisieren') { steps { - input message: 'Jetzt manuell freigeben für Deployment?' + input message: 'Jetzt manuell freigeben für Deployment?', submitter: 'admin' sh 'docker build -t tatort-app .' sh 'docker iamge ls' } } + + } post { From 2effdb12c14f8e39ef137f3980eac56a4c54eb65 Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 13:44:37 +0200 Subject: [PATCH 025/343] fixed typo --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 2d28c39..3e30367 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -33,7 +33,7 @@ pipeline { steps { input message: 'Jetzt manuell freigeben für Deployment?', submitter: 'admin' sh 'docker build -t tatort-app .' - sh 'docker iamge ls' + sh 'docker image ls' } } From 38f9f61e8a3e79788484c7090cde0ec8a87ffc77 Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 14:06:31 +0200 Subject: [PATCH 026/343] added push to gitea job --- Jenkinsfile | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 3e30367..5f71de4 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -6,6 +6,13 @@ pipeline { nodejs 'NodeJS-24.2.0' } + environment { + REGISTRY = 'https://gitea.innovation-hub-niedersachsen.de//innohub/-' + IMAGE = 'tatort-app' + USER = 'jared' + TOKEN = credentials('74a7c9bb-c80f-4699-ab0e-f98fb2f9a8e6') + } + stages { // stage('Install Dependencies') { // steps { @@ -37,7 +44,10 @@ pipeline { } } - + stage('Push image in gitea registry') { + docker push ${REGISTRY}/${USER}/${IMAGE}:latest + docker logout ${REGISTRY} + } } post { From d0c6feee33df4231b4edd84fc6909b0db1f5b358 Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 14:09:05 +0200 Subject: [PATCH 027/343] fixed push image job --- Jenkinsfile | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 5f71de4..9b57f80 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -45,8 +45,10 @@ pipeline { } stage('Push image in gitea registry') { - docker push ${REGISTRY}/${USER}/${IMAGE}:latest - docker logout ${REGISTRY} + steps { + docker push ${REGISTRY}/${USER}/${IMAGE}:latest + docker logout ${REGISTRY} + } } } From b46852e3853734b36993202fe9b626e44ed0e931 Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 14:11:19 +0200 Subject: [PATCH 028/343] fixed push image job --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 9b57f80..1e27379 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -46,8 +46,8 @@ pipeline { stage('Push image in gitea registry') { steps { - docker push ${REGISTRY}/${USER}/${IMAGE}:latest - docker logout ${REGISTRY} + docker push "${REGISTRY}/${USER}/${IMAGE}:latest" + docker logout "${REGISTRY}" } } } From 66794ef0f68fff961f494eb1dd5942840f1b5d7b Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 14:12:09 +0200 Subject: [PATCH 029/343] fixed push image job --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 1e27379..bf202cd 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -46,8 +46,8 @@ pipeline { stage('Push image in gitea registry') { steps { - docker push "${REGISTRY}/${USER}/${IMAGE}:latest" - docker logout "${REGISTRY}" + sh "docker push ${REGISTRY}/${USER}/${IMAGE}:latest" + sh "docker logout ${REGISTRY}" } } } From b991904921f64f2e08557598e0ff19d95f7a4952 Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 14:21:47 +0200 Subject: [PATCH 030/343] fixed push image job --- Jenkinsfile | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index bf202cd..7db9b6a 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -7,7 +7,7 @@ pipeline { } environment { - REGISTRY = 'https://gitea.innovation-hub-niedersachsen.de//innohub/-' + REGISTRY = 'https://gitea.innovation-hub-niedersachsen.de/' IMAGE = 'tatort-app' USER = 'jared' TOKEN = credentials('74a7c9bb-c80f-4699-ab0e-f98fb2f9a8e6') @@ -46,7 +46,8 @@ pipeline { stage('Push image in gitea registry') { steps { - sh "docker push ${REGISTRY}/${USER}/${IMAGE}:latest" + sh "docker login ${REGISTRY}/access_token=${TOKEN}" + sh "docker push ${REGISTRY}/-/${IMAGE}:latest" sh "docker logout ${REGISTRY}" } } From b432554ccaa1c2edd98e4a03939b50e2d028c360 Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 14:25:28 +0200 Subject: [PATCH 031/343] fixed push image job --- Jenkinsfile | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 7db9b6a..28a81fe 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -46,9 +46,11 @@ pipeline { stage('Push image in gitea registry') { steps { - sh "docker login ${REGISTRY}/access_token=${TOKEN}" - sh "docker push ${REGISTRY}/-/${IMAGE}:latest" - sh "docker logout ${REGISTRY}" + sh """ + echo "${TOKEN}" | docker login ${REGISTRY} -u "${USER}" --password-stdin + docker push ${REGISTRY}/-/${IMAGE}:latest + docker logout ${REGISTRY} + """ } } } From 15529541ed54a81936114f2df1783d8ba20abda1 Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 14:58:09 +0200 Subject: [PATCH 032/343] fixed push image job --- Jenkinsfile | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 28a81fe..a412524 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -10,7 +10,7 @@ pipeline { REGISTRY = 'https://gitea.innovation-hub-niedersachsen.de/' IMAGE = 'tatort-app' USER = 'jared' - TOKEN = credentials('74a7c9bb-c80f-4699-ab0e-f98fb2f9a8e6') + TOKEN = credentials('c661e484bb4f032f8a0a5b02cda6f3344ca584b5') } stages { @@ -36,24 +36,22 @@ pipeline { // } // } - stage('Manuelles Containerisieren') { - steps { - input message: 'Jetzt manuell freigeben für Deployment?', submitter: 'admin' - sh 'docker build -t tatort-app .' - sh 'docker image ls' - } - } + // stage('Manuelles Containerisieren') { + // steps { + // input message: 'Jetzt manuell freigeben für Deployment?', submitter: 'admin' + // sh 'docker build -t tatort-app .' + // sh 'docker image ls' + // } + // } stage('Push image in gitea registry') { steps { - sh """ - echo "${TOKEN}" | docker login ${REGISTRY} -u "${USER}" --password-stdin - docker push ${REGISTRY}/-/${IMAGE}:latest - docker logout ${REGISTRY} - """ + docker.withRegistry(${ REGISTRY }, 'docker-login') { + docker.build(${ IMAGE }).push('latest') } } } +} post { success { From 62bca0262515e1923a4315b183a5027b8878810f Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 14:59:31 +0200 Subject: [PATCH 033/343] fixed push image job --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index a412524..889a835 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -46,8 +46,8 @@ pipeline { stage('Push image in gitea registry') { steps { - docker.withRegistry(${ REGISTRY }, 'docker-login') { - docker.build(${ IMAGE }).push('latest') + docker.withRegistry("${ REGISTRY }", 'docker-login') { + docker.build("${ IMAGE }").push('latest') } } } From be61814b58e1718fa9d3019d6888c2103db70dab Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 15:03:20 +0200 Subject: [PATCH 034/343] fixed push image job --- Jenkinsfile | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 889a835..af8004d 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -46,12 +46,14 @@ pipeline { stage('Push image in gitea registry') { steps { - docker.withRegistry("${ REGISTRY }", 'docker-login') { - docker.build("${ IMAGE }").push('latest') + script { + docker.withRegistry("${ REGISTRY }", 'docker-login') { + docker.build("${ IMAGE }").push('latest') + } + } } } } -} post { success { From f2dd50c16e630e686d1a06e67a53fa3480f3755e Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 15:05:31 +0200 Subject: [PATCH 035/343] fixed push image job --- Jenkinsfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Jenkinsfile b/Jenkinsfile index af8004d..0b2a1c1 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -45,6 +45,7 @@ pipeline { // } stage('Push image in gitea registry') { + echo 'Start Pushing' steps { script { docker.withRegistry("${ REGISTRY }", 'docker-login') { From 1de66b11b3efd34c18ace770b46a780181d10a75 Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 15:06:17 +0200 Subject: [PATCH 036/343] fixed push image job --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 0b2a1c1..3431356 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -45,8 +45,8 @@ pipeline { // } stage('Push image in gitea registry') { - echo 'Start Pushing' steps { + echo 'Start Pushing' script { docker.withRegistry("${ REGISTRY }", 'docker-login') { docker.build("${ IMAGE }").push('latest') From 0181fb288b7ffb9b4e0c8a566b4d7b934c4124b4 Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 15:08:01 +0200 Subject: [PATCH 037/343] fixed push image job --- Jenkinsfile | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 3431356..e41d818 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -47,10 +47,10 @@ pipeline { stage('Push image in gitea registry') { steps { echo 'Start Pushing' - script { - docker.withRegistry("${ REGISTRY }", 'docker-login') { - docker.build("${ IMAGE }").push('latest') - } + // script { + // docker.withRegistry("${ REGISTRY }", 'docker-login') { + // docker.build("${ IMAGE }").push('latest') + // } } } } From 8c29d39bf6be827d34032fdb39d8464251a33b0b Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 15:08:38 +0200 Subject: [PATCH 038/343] fixed push image job --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index e41d818..7c2d107 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -51,7 +51,7 @@ pipeline { // docker.withRegistry("${ REGISTRY }", 'docker-login') { // docker.build("${ IMAGE }").push('latest') // } - } + //} } } } From 1c394dff7218ba2412fb3752bf1e0ebfefcba1bd Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 15:11:12 +0200 Subject: [PATCH 039/343] fixed push image --- Jenkinsfile | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 7c2d107..68c178c 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -14,18 +14,18 @@ pipeline { } stages { - // stage('Install Dependencies') { - // steps { - // sh 'npm ci' - // } - // } + stage('Install Dependencies') { + steps { + sh 'npm ci' + } + } - // stage('Test & Security Audit') { - // steps { - // echo 'Start checking security vulnerabilities in npm packages' - // sh 'npm audit' - // } - // } + stage('Test & Security Audit') { + steps { + echo 'Start checking security vulnerabilities in npm packages' + sh 'npm audit' + } + } // stage('Build') { // when { From 997ef6e30d3325337ab3a034a0b9c3cc8cee3d9e Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 15:15:58 +0200 Subject: [PATCH 040/343] fixed push image --- Jenkinsfile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 68c178c..bd2d801 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -6,12 +6,12 @@ pipeline { nodejs 'NodeJS-24.2.0' } - environment { - REGISTRY = 'https://gitea.innovation-hub-niedersachsen.de/' - IMAGE = 'tatort-app' - USER = 'jared' - TOKEN = credentials('c661e484bb4f032f8a0a5b02cda6f3344ca584b5') - } + // environment { + // REGISTRY = 'https://gitea.innovation-hub-niedersachsen.de/' + // IMAGE = 'tatort-app' + // USER = 'jared' + // TOKEN = credentials('c661e484bb4f032f8a0a5b02cda6f3344ca584b5') + // } stages { stage('Install Dependencies') { From 331b9c22e1890459c9a2a0d67f416d9f09bf701e Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 15:18:54 +0200 Subject: [PATCH 041/343] fixed push image --- Jenkinsfile | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index bd2d801..2c3f95c 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -14,18 +14,18 @@ pipeline { // } stages { - stage('Install Dependencies') { - steps { - sh 'npm ci' - } - } + // stage('Install Dependencies') { + // steps { + // sh 'npm ci' + // } + // } - stage('Test & Security Audit') { - steps { - echo 'Start checking security vulnerabilities in npm packages' - sh 'npm audit' - } - } + // stage('Test & Security Audit') { + // steps { + // echo 'Start checking security vulnerabilities in npm packages' + // sh 'npm audit' + // } + // } // stage('Build') { // when { @@ -47,11 +47,11 @@ pipeline { stage('Push image in gitea registry') { steps { echo 'Start Pushing' - // script { - // docker.withRegistry("${ REGISTRY }", 'docker-login') { - // docker.build("${ IMAGE }").push('latest') - // } - //} + script { + docker.withRegistry('https://gitea.innovation-hub-niedersachsen.de/', 'docker-login') { + docker.build('tatort-app').push('latest') + } + } } } } From 4dcd2e1a63a8a1d55e756af7fb0bee1378492a79 Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 15:22:35 +0200 Subject: [PATCH 042/343] fixed push image --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 2c3f95c..4ff8bb0 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -48,7 +48,7 @@ pipeline { steps { echo 'Start Pushing' script { - docker.withRegistry('https://gitea.innovation-hub-niedersachsen.de/', 'docker-login') { + docker.withRegistry('https://gitea.innovation-hub-niedersachsen.de/', '74a7c9bb-c80f-4699-ab0e-f98fb2f9a8e6') { docker.build('tatort-app').push('latest') } } From 9ad96abb772557d372217ff6b3292912f881e07b Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 15:26:26 +0200 Subject: [PATCH 043/343] fixed push image --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 4ff8bb0..590af71 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -48,7 +48,7 @@ pipeline { steps { echo 'Start Pushing' script { - docker.withRegistry('https://gitea.innovation-hub-niedersachsen.de/', '74a7c9bb-c80f-4699-ab0e-f98fb2f9a8e6') { + docker.withRegistry('https://gitea.innovation-hub-niedersachsen.de/innohub/-', '74a7c9bb-c80f-4699-ab0e-f98fb2f9a8e6') { docker.build('tatort-app').push('latest') } } From fd17d10119034b6ced05cff88d3aab51882b4ff1 Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 15:38:55 +0200 Subject: [PATCH 044/343] fixed push image --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 590af71..86c4dfc 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -48,8 +48,8 @@ pipeline { steps { echo 'Start Pushing' script { - docker.withRegistry('https://gitea.innovation-hub-niedersachsen.de/innohub/-', '74a7c9bb-c80f-4699-ab0e-f98fb2f9a8e6') { - docker.build('tatort-app').push('latest') + docker.withRegistry('https://gitea.innovation-hub-niedersachsen.de/', '74a7c9bb-c80f-4699-ab0e-f98fb2f9a8e6') { + docker.build('innohub/-/tatort-app').push('latest') } } } From 083efb3aec17ee55a62ae9e6ab7672054b457466 Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 15:41:09 +0200 Subject: [PATCH 045/343] fixed push image --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 86c4dfc..b7752cb 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -48,8 +48,8 @@ pipeline { steps { echo 'Start Pushing' script { - docker.withRegistry('https://gitea.innovation-hub-niedersachsen.de/', '74a7c9bb-c80f-4699-ab0e-f98fb2f9a8e6') { - docker.build('innohub/-/tatort-app').push('latest') + docker.withRegistry('https://gitea.innovation-hub-niedersachsen.de', '74a7c9bb-c80f-4699-ab0e-f98fb2f9a8e6') { + docker.build('https://gitea.innovation-hub-niedersachsen.de/innohub/-/tatort-app').push('latest') } } } From 1d84b67a9482d00f00f195528dbbe012b111f01b Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 15:44:18 +0200 Subject: [PATCH 046/343] fixed push image --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index b7752cb..5511c31 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -49,7 +49,7 @@ pipeline { echo 'Start Pushing' script { docker.withRegistry('https://gitea.innovation-hub-niedersachsen.de', '74a7c9bb-c80f-4699-ab0e-f98fb2f9a8e6') { - docker.build('https://gitea.innovation-hub-niedersachsen.de/innohub/-/tatort-app').push('latest') + docker.build('gitea.innovation-hub-niedersachsen.de/innohub/-/tatort-app').push('latest') } } } From 95936b09b5c928140f8b9ad893bdeca32fde603d Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 15:47:14 +0200 Subject: [PATCH 047/343] fixed push image --- Jenkinsfile | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 5511c31..ed6476a 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -6,13 +6,6 @@ pipeline { nodejs 'NodeJS-24.2.0' } - // environment { - // REGISTRY = 'https://gitea.innovation-hub-niedersachsen.de/' - // IMAGE = 'tatort-app' - // USER = 'jared' - // TOKEN = credentials('c661e484bb4f032f8a0a5b02cda6f3344ca584b5') - // } - stages { // stage('Install Dependencies') { // steps { @@ -48,8 +41,8 @@ pipeline { steps { echo 'Start Pushing' script { - docker.withRegistry('https://gitea.innovation-hub-niedersachsen.de', '74a7c9bb-c80f-4699-ab0e-f98fb2f9a8e6') { - docker.build('gitea.innovation-hub-niedersachsen.de/innohub/-/tatort-app').push('latest') + docker.withRegistry('https://gitea.innovation-hub-niedersachsen.de', 'JenkinsGitea') { + docker.build('innohub/tatort/tatort-app').push('latest') } } } From c74322228f1d88e00d93d0b46e78323beb9e7d79 Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 16:34:17 +0200 Subject: [PATCH 048/343] activate ci and audit, deactivate docker --- Jenkinsfile | 44 ++++++++++++++++++-------------------------- 1 file changed, 18 insertions(+), 26 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index ed6476a..1aa55ad 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -7,18 +7,18 @@ pipeline { } stages { - // stage('Install Dependencies') { - // steps { - // sh 'npm ci' - // } - // } + stage('Install Dependencies') { + steps { + sh 'npm ci' + } + } - // stage('Test & Security Audit') { - // steps { - // echo 'Start checking security vulnerabilities in npm packages' - // sh 'npm audit' - // } - // } + stage('Test & Security Audit') { + steps { + echo 'Start checking security vulnerabilities in npm packages' + sh 'npm audit' + } + } // stage('Build') { // when { @@ -29,24 +29,16 @@ pipeline { // } // } - // stage('Manuelles Containerisieren') { + // stage('Push image in gitea registry') { // steps { - // input message: 'Jetzt manuell freigeben für Deployment?', submitter: 'admin' - // sh 'docker build -t tatort-app .' - // sh 'docker image ls' + // echo 'Start Pushing' + // script { + // docker.withRegistry('https://gitea.innovation-hub-niedersachsen.de', 'JenkinsGitea') { + // docker.build('innohub/tatort-app').push('latest') + // } + // } // } // } - - stage('Push image in gitea registry') { - steps { - echo 'Start Pushing' - script { - docker.withRegistry('https://gitea.innovation-hub-niedersachsen.de', 'JenkinsGitea') { - docker.build('innohub/tatort/tatort-app').push('latest') - } - } - } - } } post { From 036798d330d84961edcfc3014002e19796feb95d Mon Sep 17 00:00:00 2001 From: Jared Date: Wed, 25 Jun 2025 16:59:55 +0200 Subject: [PATCH 049/343] disord pull request test --- Jenkinsfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Jenkinsfile b/Jenkinsfile index 1aa55ad..f4e4b7d 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -19,6 +19,7 @@ pipeline { sh 'npm audit' } } + // stage('Build') { // when { From 5a1cd22dc6e7b69929806d7b97500a9cb5e87f12 Mon Sep 17 00:00:00 2001 From: jared Date: Thu, 26 Jun 2025 08:04:19 +0200 Subject: [PATCH 050/343] Jenkinsfile aktualisiert Added options to delete old build --- Jenkinsfile | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index f4e4b7d..05f4320 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,4 +1,3 @@ - pipeline { agent any @@ -6,6 +5,15 @@ pipeline { nodejs 'NodeJS-24.2.0' } + options { + buildDiscarder( + BuildHistoryManager([ + [ continueAfterMatch: false, matchAtMost: 5 ], + [ actions: [ DeleteBuild() ] ] + ]) + ) + } + stages { stage('Install Dependencies') { steps { From 35c5323a19e141dbd6d1d40cc035a53e2e5a0663 Mon Sep 17 00:00:00 2001 From: Jared Date: Thu, 26 Jun 2025 08:06:15 +0200 Subject: [PATCH 051/343] added options and test push event webhook --- Jenkinsfile | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 05f4320..3dafcb1 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -6,7 +6,7 @@ pipeline { } options { - buildDiscarder( + buildDiscarder( BuildHistoryManager([ [ continueAfterMatch: false, matchAtMost: 5 ], [ actions: [ DeleteBuild() ] ] @@ -27,7 +27,6 @@ pipeline { sh 'npm audit' } } - // stage('Build') { // when { @@ -38,16 +37,16 @@ pipeline { // } // } - // stage('Push image in gitea registry') { - // steps { - // echo 'Start Pushing' - // script { - // docker.withRegistry('https://gitea.innovation-hub-niedersachsen.de', 'JenkinsGitea') { - // docker.build('innohub/tatort-app').push('latest') - // } - // } - // } - // } + // stage('Push image in gitea registry') { + // steps { + // echo 'Start Pushing' + // script { + // docker.withRegistry('https://gitea.innovation-hub-niedersachsen.de', 'JenkinsGitea') { + // docker.build('innohub/tatort-app').push('latest') + // } + // } + // } + // } } post { From 173f36fb50fa6405cfd0c5d2a998c6ac50b2888d Mon Sep 17 00:00:00 2001 From: Jared Date: Thu, 26 Jun 2025 08:07:54 +0200 Subject: [PATCH 052/343] test jenkins webhook --- src/routes/(angemeldet)/+layout.server.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/src/routes/(angemeldet)/+layout.server.ts b/src/routes/(angemeldet)/+layout.server.ts index 5251779..94cce7a 100644 --- a/src/routes/(angemeldet)/+layout.server.ts +++ b/src/routes/(angemeldet)/+layout.server.ts @@ -5,5 +5,6 @@ export const load: PageServerLoad = (event: ServerLoadEvent) => { if (!event.locals.user && event.url.pathname !== '/anmeldung') throw redirect(303, '/anmeldung'); return { user: event.locals.user + }; } From 843c4ecaf49d408acf265907a346eb44c71a198a Mon Sep 17 00:00:00 2001 From: Jared Date: Thu, 26 Jun 2025 08:11:40 +0200 Subject: [PATCH 053/343] test jenkins webhook --- Jenkinsfile | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Jenkinsfile b/Jenkinsfile index 3dafcb1..5b408ff 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -5,6 +5,13 @@ pipeline { nodejs 'NodeJS-24.2.0' } + environment { + REGISTRY = 'https://gitea.innovation-hub-niedersachsen.de/' + IMAGE = 'tatort-app' + USER = 'jared' + TOKEN = credentials('c661e484bb4f032f8a0a5b02cda6f3344ca584b5') + } + options { buildDiscarder( BuildHistoryManager([ From de3598663384d6393125f45b5e2de057fdb07c65 Mon Sep 17 00:00:00 2001 From: Jared Date: Thu, 26 Jun 2025 08:12:03 +0200 Subject: [PATCH 054/343] test jenkins webhook --- src/routes/(token-based)/+layout.server.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/routes/(token-based)/+layout.server.ts b/src/routes/(token-based)/+layout.server.ts index 99517b3..8a462eb 100644 --- a/src/routes/(token-based)/+layout.server.ts +++ b/src/routes/(token-based)/+layout.server.ts @@ -3,11 +3,11 @@ import { redirect } from '@sveltejs/kit'; import type { PageServerLoad } from './list/[vorgang]/$types'; export const load: PageServerLoad = async ({ params, url, locals }) => { - if (locals.user) { - return { - user: locals.user - }; - } + // if (locals.user) { + // return { + // user: locals.user + // }; + // } const caseId = params.vorgang; const caseToken = url.searchParams.get('token'); From 02d495731588c094ac4b340cea449963894daa3b Mon Sep 17 00:00:00 2001 From: Jared Date: Thu, 26 Jun 2025 08:19:27 +0200 Subject: [PATCH 055/343] test jenkins webhook --- src/routes/(token-based)/+layout.server.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/routes/(token-based)/+layout.server.ts b/src/routes/(token-based)/+layout.server.ts index 8a462eb..99517b3 100644 --- a/src/routes/(token-based)/+layout.server.ts +++ b/src/routes/(token-based)/+layout.server.ts @@ -3,11 +3,11 @@ import { redirect } from '@sveltejs/kit'; import type { PageServerLoad } from './list/[vorgang]/$types'; export const load: PageServerLoad = async ({ params, url, locals }) => { - // if (locals.user) { - // return { - // user: locals.user - // }; - // } + if (locals.user) { + return { + user: locals.user + }; + } const caseId = params.vorgang; const caseToken = url.searchParams.get('token'); From efcbc4d60fc2437732de96f691c7ce2fff2f14aa Mon Sep 17 00:00:00 2001 From: Jared Date: Thu, 26 Jun 2025 10:01:03 +0200 Subject: [PATCH 056/343] test jenkins webhook --- src/routes/(token-based)/+layout.server.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/routes/(token-based)/+layout.server.ts b/src/routes/(token-based)/+layout.server.ts index 99517b3..8a462eb 100644 --- a/src/routes/(token-based)/+layout.server.ts +++ b/src/routes/(token-based)/+layout.server.ts @@ -3,11 +3,11 @@ import { redirect } from '@sveltejs/kit'; import type { PageServerLoad } from './list/[vorgang]/$types'; export const load: PageServerLoad = async ({ params, url, locals }) => { - if (locals.user) { - return { - user: locals.user - }; - } + // if (locals.user) { + // return { + // user: locals.user + // }; + // } const caseId = params.vorgang; const caseToken = url.searchParams.get('token'); From f995b58d0fc09137e7de1edff99e661f22e45b75 Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Fri, 27 Jun 2025 09:09:31 +0200 Subject: [PATCH 057/343] return user data --- src/routes/(token-based)/+layout.server.ts | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/routes/(token-based)/+layout.server.ts b/src/routes/(token-based)/+layout.server.ts index 8a462eb..99517b3 100644 --- a/src/routes/(token-based)/+layout.server.ts +++ b/src/routes/(token-based)/+layout.server.ts @@ -3,11 +3,11 @@ import { redirect } from '@sveltejs/kit'; import type { PageServerLoad } from './list/[vorgang]/$types'; export const load: PageServerLoad = async ({ params, url, locals }) => { - // if (locals.user) { - // return { - // user: locals.user - // }; - // } + if (locals.user) { + return { + user: locals.user + }; + } const caseId = params.vorgang; const caseToken = url.searchParams.get('token'); From de7b27bd71b165d825d7614c256395f43d0be459 Mon Sep 17 00:00:00 2001 From: jared Date: Mon, 30 Jun 2025 07:17:53 +0200 Subject: [PATCH 058/343] Jenkinsfile aktualisiert Added additional Infos in pull request --- Jenkinsfile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Jenkinsfile b/Jenkinsfile index 5b408ff..ede5ffb 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -12,6 +12,11 @@ pipeline { TOKEN = credentials('c661e484bb4f032f8a0a5b02cda6f3344ca584b5') } + parameters { + string(name: 'REPO_NAME', defaultValue: '', description: 'Repo Name') + string(name: 'GIT_REF', defaultValue: '', description: 'Git Ref') + } + options { buildDiscarder( BuildHistoryManager([ From fe9f8add88ea91ad32dcc13e32fdd9694d27d2eb Mon Sep 17 00:00:00 2001 From: Jared Date: Mon, 30 Jun 2025 08:35:20 +0200 Subject: [PATCH 059/343] fixed tatort api route for deletion --- src/routes/(token-based)/list/[vorgang]/+page.svelte | 2 +- src/routes/api/list/{[[vorgang]] => [vorgang]}/+server.ts | 0 src/routes/api/{tatort => list/[vorgang]/[tatort]}/+server.ts | 0 src/routes/api/list/{[[vorgang]] => [vorgang]}/code/+server.ts | 0 4 files changed, 1 insertion(+), 1 deletion(-) rename src/routes/api/list/{[[vorgang]] => [vorgang]}/+server.ts (100%) rename src/routes/api/{tatort => list/[vorgang]/[tatort]}/+server.ts (100%) rename src/routes/api/list/{[[vorgang]] => [vorgang]}/code/+server.ts (100%) diff --git a/src/routes/(token-based)/list/[vorgang]/+page.svelte b/src/routes/(token-based)/list/[vorgang]/+page.svelte index 4b3cde4..0805f70 100644 --- a/src/routes/(token-based)/list/[vorgang]/+page.svelte +++ b/src/routes/(token-based)/list/[vorgang]/+page.svelte @@ -208,7 +208,7 @@ url.pathname += `/${filename}`; try { - const response = await fetch(`api/${url}`, { method: 'DELETE' }); + const response = await fetch(`/api${url.pathname}`, { method: 'DELETE' }); if (response.status == 204) { setTimeout(() => { window.location.reload(); diff --git a/src/routes/api/list/[[vorgang]]/+server.ts b/src/routes/api/list/[vorgang]/+server.ts similarity index 100% rename from src/routes/api/list/[[vorgang]]/+server.ts rename to src/routes/api/list/[vorgang]/+server.ts diff --git a/src/routes/api/tatort/+server.ts b/src/routes/api/list/[vorgang]/[tatort]/+server.ts similarity index 100% rename from src/routes/api/tatort/+server.ts rename to src/routes/api/list/[vorgang]/[tatort]/+server.ts diff --git a/src/routes/api/list/[[vorgang]]/code/+server.ts b/src/routes/api/list/[vorgang]/code/+server.ts similarity index 100% rename from src/routes/api/list/[[vorgang]]/code/+server.ts rename to src/routes/api/list/[vorgang]/code/+server.ts From 2b2fa7a82be5132adc6979577f2c7add5678a8dd Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 06:56:31 +0200 Subject: [PATCH 060/343] added Dockerfile dev and prod --- Dockerfile.dev | 17 +++++++++++++++++ Dockerfile => Dockerfile.prod | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 Dockerfile.dev rename Dockerfile => Dockerfile.prod (91%) diff --git a/Dockerfile.dev b/Dockerfile.dev new file mode 100644 index 0000000..81e9c36 --- /dev/null +++ b/Dockerfile.dev @@ -0,0 +1,17 @@ +# --- Build stage --- +FROM node:22 AS build +ENV NODE_ENV=production +ENV ORIGIN=https://tatort-dev.innovation-hub-niedersachsen.de +WORKDIR /app +COPY package*.json ./ +RUN npm ci +COPY . ./ +COPY config.json_dev ./config.json +RUN npm run build + +# --- Production stage --- +FROM node:22-alpine3.20 +COPY --from=build /app . +ENV HOST=0.0.0.0 +EXPOSE 3000 +CMD ["sh", "-c", "ORIGIN=https://tatort-dev.innovation-hub-niedersachsen.de node build/index.js"] \ No newline at end of file diff --git a/Dockerfile b/Dockerfile.prod similarity index 91% rename from Dockerfile rename to Dockerfile.prod index 50a19b5..2d92413 100644 --- a/Dockerfile +++ b/Dockerfile.prod @@ -6,6 +6,7 @@ WORKDIR /app COPY package*.json ./ RUN npm ci COPY . ./ +COPY config.json_prod ./config.json RUN npm run build # --- Production stage --- @@ -14,4 +15,3 @@ COPY --from=build /app . ENV HOST=0.0.0.0 EXPOSE 3000 CMD ["sh", "-c", "ORIGIN=https://tatort.innovation-hub-niedersachsen.de node build/index.js"] - From 7018c74884dae9b137124ae14c1f4899841bb52d Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 07:07:07 +0200 Subject: [PATCH 061/343] added webhook to get discrod message --- Jenkinsfile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index ede5ffb..ef6e229 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -59,14 +59,14 @@ pipeline { // } // } // } - } + // } post { success { - echo 'Pipeline erfolgreich!' - } + echo 'Pipeline erfolgreich!', + discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}", footer: "Building", link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: "https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc"} + failure { - echo 'Pipeline fehlgeschlagen!' - } + echo 'Pipeline fehlgeschlagen!', + discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}", footer: "Building", link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: "https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc"} } -} From 021ec3d38349620e5a9ff1ad90fd0b5abae658fd Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 07:11:01 +0200 Subject: [PATCH 062/343] fixed jenkinsfile --- Jenkinsfile | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index ef6e229..08e3843 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -39,6 +39,7 @@ pipeline { sh 'npm audit' } } + } // stage('Build') { // when { @@ -63,10 +64,13 @@ pipeline { post { success { - echo 'Pipeline erfolgreich!', - discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}", footer: "Building", link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: "https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc"} + echo 'Pipeline erfolgreich!' + discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}", footer: 'Pipeline succeeded', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' + } failure { - echo 'Pipeline fehlgeschlagen!', - discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}", footer: "Building", link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: "https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc"} + echo 'Pipeline fehlgeschlagen!' + discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}", footer: 'Pipeline failed', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' + } } +} From 2667db57554cc751db5fbd9392267ad39a5f211c Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 07:16:05 +0200 Subject: [PATCH 063/343] added git ref to message --- Jenkinsfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 08e3843..96b1d48 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -65,12 +65,12 @@ pipeline { post { success { echo 'Pipeline erfolgreich!' - discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}", footer: 'Pipeline succeeded', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' + discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline succeeded', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' } failure { echo 'Pipeline fehlgeschlagen!' - discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}", footer: 'Pipeline failed', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' + discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline failed', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' } } } From 890380609fdbbf2d01542a9ed499df2f6b9799e2 Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 07:25:04 +0200 Subject: [PATCH 064/343] added build id to image, set correct dockerfile --- Jenkinsfile | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 96b1d48..c69e9f0 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -50,17 +50,17 @@ pipeline { // } // } - // stage('Push image in gitea registry') { - // steps { - // echo 'Start Pushing' - // script { - // docker.withRegistry('https://gitea.innovation-hub-niedersachsen.de', 'JenkinsGitea') { - // docker.build('innohub/tatort-app').push('latest') - // } - // } - // } - // } - // } + stage('Push image in gitea registry') { + steps { + echo 'Start Pushing' + script { + def dockerfile = 'Dockerfile.dev' + docker.withRegistry('https://gitea.innovation-hub-niedersachsen.de', 'JenkinsGitea') { + docker.build("innohub/tatort:${env.BUILD_ID}", "-f ${dockerfile} .").push('latest') + } + } + } + } post { success { From 30b49029b22b6966b4c22b0f2fb0256a667958fe Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 07:29:07 +0200 Subject: [PATCH 065/343] fixed jenkinsfile --- Jenkinsfile | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index c69e9f0..ea12da3 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -39,6 +39,17 @@ pipeline { sh 'npm audit' } } + + stage('Push image to gitea registry') { + steps { + echo 'Start Pushing' + script { + docker.withRegistry('https://gitea.innovation-hub-niedersachsen.de', 'JenkinsGitea') { + docker.build("innohub/tatort:${env.BUILD_ID}", '-f Dockerfile.dev .').push('latest') + } + } + } + } } // stage('Build') { @@ -50,18 +61,6 @@ pipeline { // } // } - stage('Push image in gitea registry') { - steps { - echo 'Start Pushing' - script { - def dockerfile = 'Dockerfile.dev' - docker.withRegistry('https://gitea.innovation-hub-niedersachsen.de', 'JenkinsGitea') { - docker.build("innohub/tatort:${env.BUILD_ID}", "-f ${dockerfile} .").push('latest') - } - } - } - } - post { success { echo 'Pipeline erfolgreich!' From be4e351217f80b66bd3db8e6090c02a0c4e88bd7 Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 07:34:58 +0200 Subject: [PATCH 066/343] test jenkins pipeline --- src/routes/api/list/[[vorgang]]/+server.ts | 34 +++++++++++----------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/routes/api/list/[[vorgang]]/+server.ts b/src/routes/api/list/[[vorgang]]/+server.ts index 5a76090..cdd1b92 100644 --- a/src/routes/api/list/[[vorgang]]/+server.ts +++ b/src/routes/api/list/[[vorgang]]/+server.ts @@ -1,24 +1,24 @@ -import { client } from '$lib/minio'; +// import { client } from '$lib/minio'; -export async function DELETE({ params }) { - const vorgang = params.vorgang; +// export async function DELETE({ params }) { +// const vorgang = params.vorgang; - const object_list = await new Promise((resolve, reject) => { - const res = []; - const items_str = client.listObjects('tatort', vorgang, true); +// const object_list = await new Promise((resolve, reject) => { +// const res = []; +// const items_str = client.listObjects('tatort', vorgang, true); - items_str.on('data', (obj) => { - res.push(obj.name); - }); +// items_str.on('data', (obj) => { +// res.push(obj.name); +// }); - items_str.on('error', reject); +// items_str.on('error', reject); - items_str.on('end', async () => { - resolve(res); - }); - }); +// items_str.on('end', async () => { +// resolve(res); +// }); +// }); - await client.removeObjects('tatort', object_list); +// await client.removeObjects('tatort', object_list); - return new Response(null, { status: 204 }); -} +// return new Response(null, { status: 204 }); +// } From bb5ade22c66c5824f08767601707e857aad4e0af Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 07:39:38 +0200 Subject: [PATCH 067/343] test jenkins pipeline --- Jenkinsfile | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index ea12da3..3ba8407 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -5,17 +5,17 @@ pipeline { nodejs 'NodeJS-24.2.0' } - environment { - REGISTRY = 'https://gitea.innovation-hub-niedersachsen.de/' - IMAGE = 'tatort-app' - USER = 'jared' - TOKEN = credentials('c661e484bb4f032f8a0a5b02cda6f3344ca584b5') - } + // environment { + // REGISTRY = 'https://gitea.innovation-hub-niedersachsen.de/' + // IMAGE = 'tatort-app' + // USER = 'jared' + // TOKEN = credentials('c661e484bb4f032f8a0a5b02cda6f3344ca584b5') + // } - parameters { - string(name: 'REPO_NAME', defaultValue: '', description: 'Repo Name') - string(name: 'GIT_REF', defaultValue: '', description: 'Git Ref') - } + // parameters { + // string(name: 'REPO_NAME', defaultValue: '', description: 'Repo Name') + // string(name: 'GIT_REF', defaultValue: '', description: 'Git Ref') + // } options { buildDiscarder( From 2d003a619fd78bceb826ed80d02c303daf85311c Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 07:44:28 +0200 Subject: [PATCH 068/343] set audit level to moderate --- Jenkinsfile | 2 +- src/routes/api/list/[[vorgang]]/+server.ts | 34 +++++++++++----------- 2 files changed, 18 insertions(+), 18 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 3ba8407..0d479a4 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -36,7 +36,7 @@ pipeline { stage('Test & Security Audit') { steps { echo 'Start checking security vulnerabilities in npm packages' - sh 'npm audit' + sh 'npm audit --audit-level=moderate' } } diff --git a/src/routes/api/list/[[vorgang]]/+server.ts b/src/routes/api/list/[[vorgang]]/+server.ts index cdd1b92..5a76090 100644 --- a/src/routes/api/list/[[vorgang]]/+server.ts +++ b/src/routes/api/list/[[vorgang]]/+server.ts @@ -1,24 +1,24 @@ -// import { client } from '$lib/minio'; +import { client } from '$lib/minio'; -// export async function DELETE({ params }) { -// const vorgang = params.vorgang; +export async function DELETE({ params }) { + const vorgang = params.vorgang; -// const object_list = await new Promise((resolve, reject) => { -// const res = []; -// const items_str = client.listObjects('tatort', vorgang, true); + const object_list = await new Promise((resolve, reject) => { + const res = []; + const items_str = client.listObjects('tatort', vorgang, true); -// items_str.on('data', (obj) => { -// res.push(obj.name); -// }); + items_str.on('data', (obj) => { + res.push(obj.name); + }); -// items_str.on('error', reject); + items_str.on('error', reject); -// items_str.on('end', async () => { -// resolve(res); -// }); -// }); + items_str.on('end', async () => { + resolve(res); + }); + }); -// await client.removeObjects('tatort', object_list); + await client.removeObjects('tatort', object_list); -// return new Response(null, { status: 204 }); -// } + return new Response(null, { status: 204 }); +} From 739f67169e163d14be643cdf93877d2e2761c5ab Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 07:57:05 +0200 Subject: [PATCH 069/343] added confi for dev and prod --- Dockerfile.dev | 2 +- Dockerfile.prod | 2 +- config dev.json | 17 +++++++++++++++++ config.json => config prod.json | 4 ++-- 4 files changed, 21 insertions(+), 4 deletions(-) create mode 100644 config dev.json rename config.json => config prod.json (94%) diff --git a/Dockerfile.dev b/Dockerfile.dev index 81e9c36..3a1a399 100644 --- a/Dockerfile.dev +++ b/Dockerfile.dev @@ -6,7 +6,7 @@ WORKDIR /app COPY package*.json ./ RUN npm ci COPY . ./ -COPY config.json_dev ./config.json +COPY config_dev.json ./config.json RUN npm run build # --- Production stage --- diff --git a/Dockerfile.prod b/Dockerfile.prod index 2d92413..66a3f39 100644 --- a/Dockerfile.prod +++ b/Dockerfile.prod @@ -6,7 +6,7 @@ WORKDIR /app COPY package*.json ./ RUN npm ci COPY . ./ -COPY config.json_prod ./config.json +COPY config_prod.json ./config.json RUN npm run build # --- Production stage --- diff --git a/config dev.json b/config dev.json new file mode 100644 index 0000000..8ab9cb8 --- /dev/null +++ b/config dev.json @@ -0,0 +1,17 @@ +{ + "minio": { + "endPoint": "sws3.innovation-hub-niedersachsen.de", + "port": 443, + "useSSL": true, + "accessKey": "wjpKrmaqXra99rX3D61H", + "secretKey": "fTPi0u0FR6Lv9Y9IKydWv6WM0EA5XrsK008HCt9u" + }, + "jwt": { + "secret": "@S2!q@@wXz$dCQ8JoVsHLpzaJ6JCfB", + "expiresIn": 3600 + }, + "auth": { + "admin": { "password": "A-InnoHUB_2025!", "admin": true }, + "user": { "password": "U-InnoHUB_2025!", "admin": false } + } +} \ No newline at end of file diff --git a/config.json b/config prod.json similarity index 94% rename from config.json rename to config prod.json index 8490de6..126d80d 100644 --- a/config.json +++ b/config prod.json @@ -8,10 +8,10 @@ }, "jwt": { "secret": "@S2!q@@wXz$dCQ8JoVsHLpzaJ6JCfB", - "expiresIn": 36000 + "expiresIn": 3600 }, "auth": { "admin": { "password": "A-InnoHUB_2025!", "admin": true }, "user": { "password": "U-InnoHUB_2025!", "admin": false } } -} +} \ No newline at end of file From 517654bfbf2f3445c777a30af93256ce48900187 Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 08:00:16 +0200 Subject: [PATCH 070/343] fixed config names --- config dev.json => config_dev.json | 0 config prod.json => config_prod.json | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename config dev.json => config_dev.json (100%) rename config prod.json => config_prod.json (100%) diff --git a/config dev.json b/config_dev.json similarity index 100% rename from config dev.json rename to config_dev.json diff --git a/config prod.json b/config_prod.json similarity index 100% rename from config prod.json rename to config_prod.json From 3bd369c9e2954b01315031f9a34befde3a5a1881 Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 08:13:51 +0200 Subject: [PATCH 071/343] added params --- Jenkinsfile | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 0d479a4..6d88774 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -12,10 +12,10 @@ pipeline { // TOKEN = credentials('c661e484bb4f032f8a0a5b02cda6f3344ca584b5') // } - // parameters { - // string(name: 'REPO_NAME', defaultValue: '', description: 'Repo Name') - // string(name: 'GIT_REF', defaultValue: '', description: 'Git Ref') - // } + parameters { + string(name: 'REPO_NAME', defaultValue: '', description: 'Repo Name') + string(name: 'GIT_REF', defaultValue: '', description: 'Git Ref') + } options { buildDiscarder( @@ -44,8 +44,9 @@ pipeline { steps { echo 'Start Pushing' script { + def tag = "innohub/tatort:${env.BUILD_ID}-dev" docker.withRegistry('https://gitea.innovation-hub-niedersachsen.de', 'JenkinsGitea') { - docker.build("innohub/tatort:${env.BUILD_ID}", '-f Dockerfile.dev .').push('latest') + docker.build(tag, '-f Dockerfile.dev .').push() } } } From 29398698161c15396c55cdeae02259e3e9ad6475 Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 08:29:26 +0200 Subject: [PATCH 072/343] renamed image tag --- Jenkinsfile | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 6d88774..817e3de 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -7,7 +7,6 @@ pipeline { // environment { // REGISTRY = 'https://gitea.innovation-hub-niedersachsen.de/' - // IMAGE = 'tatort-app' // USER = 'jared' // TOKEN = credentials('c661e484bb4f032f8a0a5b02cda6f3344ca584b5') // } @@ -44,7 +43,7 @@ pipeline { steps { echo 'Start Pushing' script { - def tag = "innohub/tatort:${env.BUILD_ID}-dev" + def tag = "innohub/tatort-dev:${env.BUILD_ID}" docker.withRegistry('https://gitea.innovation-hub-niedersachsen.de', 'JenkinsGitea') { docker.build(tag, '-f Dockerfile.dev .').push() } @@ -53,15 +52,6 @@ pipeline { } } - // stage('Build') { - // when { - // branch 'development' - // } - // steps { - // sh 'npm run build' - // } - // } - post { success { echo 'Pipeline erfolgreich!' From abd756462b6fc710877b62434a110d65b80dcd6b Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 08:47:45 +0200 Subject: [PATCH 073/343] post statement only if changes --- Jenkinsfile | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 96b1d48..b5e4889 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -63,14 +63,17 @@ pipeline { // } post { - success { - echo 'Pipeline erfolgreich!' - discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline succeeded', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' - } + def hasChanges = currentBuild?.rawBuild?.changeSets?.any { it.items && it.items.length > 0 } + if (hasChanges) { + success { + echo 'Pipeline erfolgreich!' + discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline succeeded', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' + } - failure { - echo 'Pipeline fehlgeschlagen!' - discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline failed', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' + failure { + echo 'Pipeline fehlgeschlagen!' + discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline failed', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' + } } } } From 7ca8b295db9722a3309b46735cfabac8c4bc1a34 Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 08:53:31 +0200 Subject: [PATCH 074/343] no post statement --- Jenkinsfile | 24 ++++++++++-------------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index b5e4889..8b23f23 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -62,18 +62,14 @@ pipeline { // } // } - post { - def hasChanges = currentBuild?.rawBuild?.changeSets?.any { it.items && it.items.length > 0 } - if (hasChanges) { - success { - echo 'Pipeline erfolgreich!' - discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline succeeded', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' - } - - failure { - echo 'Pipeline fehlgeschlagen!' - discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline failed', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' - } - } - } + // post { + // success { + // echo 'Pipeline erfolgreich!' + // discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline succeeded', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' + // } + // failure { + // echo 'Pipeline fehlgeschlagen!' + // discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline failed', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' + // } + // } } From 0235b566374ebfbcb204845a8de9358351e5895f Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 08:55:53 +0200 Subject: [PATCH 075/343] deactivte post message --- Jenkinsfile | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 817e3de..12a3eea 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -52,15 +52,15 @@ pipeline { } } - post { - success { - echo 'Pipeline erfolgreich!' - discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline succeeded', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' - } + // post { + // success { + // echo 'Pipeline erfolgreich!' + // discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline succeeded', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' + // } - failure { - echo 'Pipeline fehlgeschlagen!' - discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline failed', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' - } - } + // failure { + // echo 'Pipeline fehlgeschlagen!' + // discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline failed', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' + // } + // } } From 22fc1f490c2a76d5ca176bef32e70c5397eec90f Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 08:58:09 +0200 Subject: [PATCH 076/343] activate post message --- Jenkinsfile | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 12a3eea..817e3de 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -52,15 +52,15 @@ pipeline { } } - // post { - // success { - // echo 'Pipeline erfolgreich!' - // discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline succeeded', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' - // } + post { + success { + echo 'Pipeline erfolgreich!' + discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline succeeded', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' + } - // failure { - // echo 'Pipeline fehlgeschlagen!' - // discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline failed', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' - // } - // } + failure { + echo 'Pipeline fehlgeschlagen!' + discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline failed', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' + } + } } From 93be24a8de61f55a3f17bb6cbdc5ddc5368263b5 Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 09:19:09 +0200 Subject: [PATCH 077/343] added check if pipeline job was running --- Jenkinsfile | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 817e3de..95efcf4 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,3 +1,5 @@ +def runJobs = false + pipeline { agent any @@ -30,6 +32,9 @@ pipeline { steps { sh 'npm ci' } + post { + runJobs = true + } } stage('Test & Security Audit') { @@ -37,30 +42,37 @@ pipeline { echo 'Start checking security vulnerabilities in npm packages' sh 'npm audit --audit-level=moderate' } + post { + runJobs = true + } } stage('Push image to gitea registry') { steps { - echo 'Start Pushing' script { - def tag = "innohub/tatort-dev:${env.BUILD_ID}" + def tag = "innohub/tatort-dev:0.${env.BUILD_ID}" docker.withRegistry('https://gitea.innovation-hub-niedersachsen.de', 'JenkinsGitea') { docker.build(tag, '-f Dockerfile.dev .').push() } } + post { + runJobs = true + } } } } post { - success { - echo 'Pipeline erfolgreich!' - discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline succeeded', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' - } + if (runJobs) { + success { + echo 'Pipeline erfolgreich!' + discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline succeeded', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' + } - failure { - echo 'Pipeline fehlgeschlagen!' - discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline failed', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' + failure { + echo 'Pipeline fehlgeschlagen!' + discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline failed', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' + } } } } From 49907da1b16f11fa4d9bb87d74f94123093dcb3b Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 09:21:44 +0200 Subject: [PATCH 078/343] added check if pipeline job was running --- Jenkinsfile | 20 +++++++++----------- 1 file changed, 9 insertions(+), 11 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 95efcf4..b523cfa 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,4 +1,4 @@ -def runJobs = false +def didRun = false pipeline { agent any @@ -29,41 +29,39 @@ pipeline { stages { stage('Install Dependencies') { + script { + didRun = true + } steps { sh 'npm ci' } - post { - runJobs = true - } } stage('Test & Security Audit') { + script { + didRun = true + } steps { echo 'Start checking security vulnerabilities in npm packages' sh 'npm audit --audit-level=moderate' } - post { - runJobs = true - } } stage('Push image to gitea registry') { steps { script { + didRun = true def tag = "innohub/tatort-dev:0.${env.BUILD_ID}" docker.withRegistry('https://gitea.innovation-hub-niedersachsen.de', 'JenkinsGitea') { docker.build(tag, '-f Dockerfile.dev .').push() } } - post { - runJobs = true - } } } } post { - if (runJobs) { + if (didRun) { success { echo 'Pipeline erfolgreich!' discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline succeeded', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' From 95a9364391ba438cffb1210ae648e4f97d9f3dd3 Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 09:25:21 +0200 Subject: [PATCH 079/343] added check if pipeline job was running --- Jenkinsfile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index b523cfa..f3d4456 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -29,19 +29,19 @@ pipeline { stages { stage('Install Dependencies') { - script { - didRun = true - } steps { + script { + didRun = true + } sh 'npm ci' } } stage('Test & Security Audit') { - script { - didRun = true - } steps { + script { + didRun = true + } echo 'Start checking security vulnerabilities in npm packages' sh 'npm audit --audit-level=moderate' } From c25c8498f33cbea76c2f141644d5f391c8871068 Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 09:49:43 +0200 Subject: [PATCH 080/343] added check if pipeline job was running --- Jenkinsfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Jenkinsfile b/Jenkinsfile index f3d4456..cb7e4fd 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -62,6 +62,7 @@ pipeline { post { if (didRun) { + success { echo 'Pipeline erfolgreich!' discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline succeeded', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' From eee820b39ed0d58ff1c050555c97b985731cb0c9 Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 09:52:45 +0200 Subject: [PATCH 081/343] added check if pipeline job was running --- Jenkinsfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index cb7e4fd..f3d4456 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -62,7 +62,6 @@ pipeline { post { if (didRun) { - success { echo 'Pipeline erfolgreich!' discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline succeeded', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' From b57a30338ec36822946e2c830304ec623520e61e Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 09:56:01 +0200 Subject: [PATCH 082/343] added check if pipeline job was running --- Jenkinsfile | 1 + 1 file changed, 1 insertion(+) diff --git a/Jenkinsfile b/Jenkinsfile index f3d4456..cb7e4fd 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -62,6 +62,7 @@ pipeline { post { if (didRun) { + success { echo 'Pipeline erfolgreich!' discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline succeeded', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' From 2ad9e5d86d3716f6691f82619cbf303453624389 Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 09:58:38 +0200 Subject: [PATCH 083/343] added check if pipeline job was running --- Jenkinsfile | 1 - 1 file changed, 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index cb7e4fd..f3d4456 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -62,7 +62,6 @@ pipeline { post { if (didRun) { - success { echo 'Pipeline erfolgreich!' discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline succeeded', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' From 0aa03aea1932d3ccc9c2a78dca47c27ea366f6aa Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 12:39:24 +0200 Subject: [PATCH 084/343] fix pipeline --- Jenkinsfile | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index f3d4456..4811a4e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -61,15 +61,20 @@ pipeline { } post { - if (didRun) { - success { - echo 'Pipeline erfolgreich!' - discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline succeeded', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' + success { + script { + if (didRun) { + echo 'Pipeline erfolgreich!' + discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline succeeded', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' + } } - - failure { - echo 'Pipeline fehlgeschlagen!' - discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline failed', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' + } + failure { + script { + if (didRun) { + echo 'Pipeline fehlgeschlagen!' + discordSend description: "Running ${env.BUILD_ID} on ${env.JENKINS_URL}, ${params.GIT_REF}", footer: 'Pipeline failed', link: env.BUILD_URL, result: currentBuild.currentResult, title: env.JOB_NAME, webhookURL: 'https://discordapp.com/api/webhooks/1389470542691831819/NdMO17sLBG2dplp_-oh6Ff0cbPOoADl0QwXKM9UzduxU44av_ZQkQjKTmpdK7YuwcZDc' + } } } } From 0de66fe533b2a9ba8594e248769f79644dd0ac19 Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 12:50:17 +0200 Subject: [PATCH 085/343] get gitea json object --- Jenkinsfile | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/Jenkinsfile b/Jenkinsfile index 4811a4e..b85e83f 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -27,6 +27,25 @@ pipeline { ) } + stages { + stage('Lade Konfiguration') { + steps { + script { + @Library('InnoHub-Library@master') + + // z. B. Methode in Library: getRepoConfig(repo, ref) + def repoConfig = getRepoConfig(REPO_NAME, GIT_REF) + + echo "Gefunden: ${repoConfig.name}, Branch: ${repoConfig.branch}" + + echo repoConfig + + def jobsToTrigger = repoConfig.jobs + } + } + } + } + stages { stage('Install Dependencies') { steps { From 0622fce790469cfe219bd120751b29c5c4ad5277 Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 12:51:42 +0200 Subject: [PATCH 086/343] get gitea json object --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index b85e83f..d064352 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -39,7 +39,7 @@ pipeline { echo "Gefunden: ${repoConfig.name}, Branch: ${repoConfig.branch}" echo repoConfig - + def jobsToTrigger = repoConfig.jobs } } From 45644c9695bf9cfbdbde51f9cf91df2e2ecfea1a Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 12:53:19 +0200 Subject: [PATCH 087/343] get gitea json object --- Jenkinsfile | 2 -- 1 file changed, 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index d064352..a1b959d 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -39,8 +39,6 @@ pipeline { echo "Gefunden: ${repoConfig.name}, Branch: ${repoConfig.branch}" echo repoConfig - - def jobsToTrigger = repoConfig.jobs } } } From 32d6245b5accc8beaa6d41d88fcc0f879e6a9c11 Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 12:54:25 +0200 Subject: [PATCH 088/343] get gitea json object --- Jenkinsfile | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index a1b959d..e244c67 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -42,9 +42,7 @@ pipeline { } } } - } - - stages { + stage('Install Dependencies') { steps { script { @@ -70,7 +68,7 @@ pipeline { didRun = true def tag = "innohub/tatort-dev:0.${env.BUILD_ID}" docker.withRegistry('https://gitea.innovation-hub-niedersachsen.de', 'JenkinsGitea') { - docker.build(tag, '-f Dockerfile.dev .').push() + docker.build(tag, '-f Dockerfile.dev .').push('latest') } } } From 7a25dbf68cf90ebfe1137b748cd1e459612d7b8f Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 13:07:02 +0200 Subject: [PATCH 089/343] change gitea user --- Jenkinsfile | 25 +++++-------------------- 1 file changed, 5 insertions(+), 20 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index e244c67..de7e3e8 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -7,11 +7,11 @@ pipeline { nodejs 'NodeJS-24.2.0' } - // environment { - // REGISTRY = 'https://gitea.innovation-hub-niedersachsen.de/' - // USER = 'jared' - // TOKEN = credentials('c661e484bb4f032f8a0a5b02cda6f3344ca584b5') - // } + environment { + REGISTRY = 'https://gitea.innovation-hub-niedersachsen.de/' + USER = 'jenkins' + TOKEN = credentials('JenkinsGitea') + } parameters { string(name: 'REPO_NAME', defaultValue: '', description: 'Repo Name') @@ -28,21 +28,6 @@ pipeline { } stages { - stage('Lade Konfiguration') { - steps { - script { - @Library('InnoHub-Library@master') - - // z. B. Methode in Library: getRepoConfig(repo, ref) - def repoConfig = getRepoConfig(REPO_NAME, GIT_REF) - - echo "Gefunden: ${repoConfig.name}, Branch: ${repoConfig.branch}" - - echo repoConfig - } - } - } - stage('Install Dependencies') { steps { script { From b843e3abc0078a14672fe7e35890d3b5f1606437 Mon Sep 17 00:00:00 2001 From: Jared Date: Tue, 1 Jul 2025 13:11:36 +0200 Subject: [PATCH 090/343] push docker image only in dev branch --- Jenkinsfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Jenkinsfile b/Jenkinsfile index de7e3e8..eba846e 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -48,6 +48,9 @@ pipeline { } stage('Push image to gitea registry') { + when { + branch 'development' + } steps { script { didRun = true From e9eb2c1163b16a49923304292ce6998be2d22c44 Mon Sep 17 00:00:00 2001 From: Daniel Mann Date: Wed, 2 Jul 2025 07:41:05 +0200 Subject: [PATCH 091/343] Update Jenkinsfile --- Jenkinsfile | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/Jenkinsfile b/Jenkinsfile index eba846e..5e0d151 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -28,6 +28,24 @@ pipeline { } stages { + stage('Validate Run Parameters') { + steps { + script { + def jobParts = env.JOB_NAME.tokenize('/') + def detectedRepo = jobParts[1] + + echo "Detected Repo: ${detectedRepo}" + echo "Provided REPO_NAME: ${params.REPO_NAME}" + + if (params.REPO_NAME != detectedRepo) { + echo "Skipping build. REPO_NAME '${params.REPO_NAME}' does not match repo '${detectedRepo}'" + currentBuild.result = 'NOT_BUILT' + error("Stopping pipeline as REPO_NAME does not match repository.") + } + } + } + } + stage('Install Dependencies') { steps { script { From b63834eb5121d502f96e9763fd91256cf6a84a69 Mon Sep 17 00:00:00 2001 From: Daniel Mann Date: Wed, 2 Jul 2025 07:52:09 +0200 Subject: [PATCH 092/343] Update Jenkinsfile --- Jenkinsfile | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 5e0d151..12f7d92 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,3 +1,5 @@ +@Library('InnoHub-Library') _ + def didRun = false pipeline { @@ -28,20 +30,10 @@ pipeline { } stages { - stage('Validate Run Parameters') { + stage('Validate Repository') { steps { script { - def jobParts = env.JOB_NAME.tokenize('/') - def detectedRepo = jobParts[1] - - echo "Detected Repo: ${detectedRepo}" - echo "Provided REPO_NAME: ${params.REPO_NAME}" - - if (params.REPO_NAME != detectedRepo) { - echo "Skipping build. REPO_NAME '${params.REPO_NAME}' does not match repo '${detectedRepo}'" - currentBuild.result = 'NOT_BUILT' - error("Stopping pipeline as REPO_NAME does not match repository.") - } + checkRepoName(params.REPO_NAME) } } } From f0df67fb86dff560f63a7f01b2517ffb3dfccc20 Mon Sep 17 00:00:00 2001 From: Daniel Mann Date: Wed, 2 Jul 2025 08:12:56 +0200 Subject: [PATCH 093/343] Update Jenkinsfile --- Jenkinsfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index 12f7d92..2035c83 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -33,7 +33,7 @@ pipeline { stage('Validate Repository') { steps { script { - checkRepoName(params.REPO_NAME) + checkRepoName(params.REPO_NAME, true) //@jared: The "true" means, do not build PR's! } } } From 5f996e70072d67f4a63faa1b7d2e3cd47e11de1b Mon Sep 17 00:00:00 2001 From: Jared Date: Fri, 4 Jul 2025 10:09:06 +0200 Subject: [PATCH 094/343] added sonar to pipeline --- Jenkinsfile | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index eba846e..6d2f479 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,4 +1,7 @@ -def didRun = false +/* groovylint-disable-next-line UnusedVariable */ +@Library('InnoHub-Library') _ + +Boolean didRun = false pipeline { agent any @@ -28,6 +31,14 @@ pipeline { } stages { + stage('Validate Repository') { + steps { + script { + checkRepoName(params.REPO_NAME, true) + } + } + } + stage('Install Dependencies') { steps { script { @@ -47,6 +58,14 @@ pipeline { } } + stage('SonarQube Analysis') { + steps { + withSonarQubeEnv('sonarqube') { + sh 'sonar-scanner -Dsonar.projectKey=tatort -Dsonar.sources=src' + } + } + } + stage('Push image to gitea registry') { when { branch 'development' From 8d92e94bd65ce249a647f9b99b79d6a92d725469 Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Tue, 8 Jul 2025 09:29:06 +0200 Subject: [PATCH 095/343] populate db with default user --- src/init/init_db.js | 42 +++++++++++++++++++++++++++++++++++++++++ src/lib/data/tatort.db | Bin 0 -> 20480 bytes 2 files changed, 42 insertions(+) create mode 100644 src/init/init_db.js create mode 100644 src/lib/data/tatort.db diff --git a/src/init/init_db.js b/src/init/init_db.js new file mode 100644 index 0000000..fdf9caa --- /dev/null +++ b/src/init/init_db.js @@ -0,0 +1,42 @@ +import sqlite3 from 'sqlite3'; +import jsSHA from 'jssha'; + +const db = new sqlite3.Database('./src/lib/data/tatort.db'); + +db.serialize(() => { + // users table + + let create_stmt = `CREATE TABLE IF NOT EXISTS users + (id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + pw TEXT NOT NULL)`; + db.run(create_stmt); + + // check if there are any users; if not add one default admin one + let pw = 'pass-123'; + let hashed_pw = new jsSHA('SHA-512', 'TEXT').update(pw).getHash('HEX'); + + let check_ins_stmt = `INSERT INTO users (name, pw) SELECT 'admin', '${hashed_pw}' + WHERE NOT EXISTS (SELECT * FROM users);`; + + db.run(check_ins_stmt); + + let users_stmt = `SELECT * FROM USERS`; + db.each(users_stmt, (err, row) => { + console.log(`xxx ${row.name} + ${row.pw}`) + }); + + // cases table + + create_stmt = `CREATE TABLE IF NOT EXISTS cases + (id INTEGER PRIMARY KEY AUTOINCREMENT, + token TEXT NOT NULL UNIQUE, + name TEXT NOT NULL, + pw TEXT NOT NULL, + created_by INTEGER NOT NULL, + FOREIGN KEY(created_by) REFERENCES users(id))`; + + db.run(create_stmt); +}); + +db.close(); diff --git a/src/lib/data/tatort.db b/src/lib/data/tatort.db new file mode 100644 index 0000000000000000000000000000000000000000..5ab89f54ecaf1ee75b802b347fd29e7c543807b9 GIT binary patch literal 20480 zcmeI&&uZH+90zc@N&l>nWj9}T&@o=i@E^s04ufSyEn%tKx(+O-AS*J2Ht8CtY&$mW zN%jJLp*=^>Q@o{X0v&AhFv?e0wj}E(OCOyCK0WCSr;6qmlaZKGkGvp;LEchI2&w42 zuJa{VscG)?2HHx=2rlA=&Wd8_Uvyp?jAw%&C(Et|IKz0?>EXgf~%0Z-_0(mre@ zJ^G&aXseqZwPPK8$m4W(DTGch&eWKu{6k9PBb~dQ4(-P6lP+KBI2I$d+;64B$4`HJ zEhkD$)u5k!xtrtSgDV5=A0@nf5YMOH_#I`@gzxi&$9w#gUKMIm=;d0LRoyV(mz78kV>7cHvz%RdTU&}Ro0juqD5n6sJ~jD}-73|THz9?B^5GvzsX~F%kqI009U<00Izz00bZa0SG_<0{?@+mQgXEmA@R!&;R Date: Wed, 9 Jul 2025 08:08:59 +0200 Subject: [PATCH 096/343] include packages --- package.json | 3 +++ 1 file changed, 3 insertions(+) diff --git a/package.json b/package.json index 105e951..eb86a15 100644 --- a/package.json +++ b/package.json @@ -44,9 +44,12 @@ "@sveltejs/adapter-node": "^5.2.12", "@tailwindcss/forms": "^0.5.10", "autoprefixer": "^10.4.21", + "crypto": "^1.0.1", "jsonwebtoken": "^9.0.2", + "jssha": "^3.3.1", "minio": "^8.0.5", "postcss": "^8.5.4", + "sqlite3": "^5.1.7", "tailwindcss": "^3.4.17" } } From 0c6dbe30ab75030c054b6bd92940fa633aded1f7 Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Wed, 9 Jul 2025 12:07:34 +0200 Subject: [PATCH 097/343] replace with --- package.json | 1 + src/init/init_db.js | 57 +++++++++++++++++++++------------------------ src/lib/auth.ts | 52 +++++++++++++++++++++++++++++++++++------ 3 files changed, 73 insertions(+), 37 deletions(-) diff --git a/package.json b/package.json index eb86a15..ddaae9f 100644 --- a/package.json +++ b/package.json @@ -44,6 +44,7 @@ "@sveltejs/adapter-node": "^5.2.12", "@tailwindcss/forms": "^0.5.10", "autoprefixer": "^10.4.21", + "better-sqlite3": "^12.2.0", "crypto": "^1.0.1", "jsonwebtoken": "^9.0.2", "jssha": "^3.3.1", diff --git a/src/init/init_db.js b/src/init/init_db.js index fdf9caa..c47d240 100644 --- a/src/init/init_db.js +++ b/src/init/init_db.js @@ -1,42 +1,39 @@ -import sqlite3 from 'sqlite3'; +import Database from 'better-sqlite3'; import jsSHA from 'jssha'; -const db = new sqlite3.Database('./src/lib/data/tatort.db'); +const db = new Database('./src/lib/data/tatort.db'); -db.serialize(() => { - // users table +let create_stmt = `CREATE TABLE IF NOT EXISTS users + (id INTEGER PRIMARY KEY AUTOINCREMENT, + name TEXT NOT NULL, + pw TEXT NOT NULL)`; +db.exec(create_stmt); - let create_stmt = `CREATE TABLE IF NOT EXISTS users - (id INTEGER PRIMARY KEY AUTOINCREMENT, - name TEXT NOT NULL, - pw TEXT NOT NULL)`; - db.run(create_stmt); +// check if there are any users; if not add one default admin one +let pw = 'pass-123'; +let hashed_pw = new jsSHA('SHA-512', 'TEXT').update(pw).getHash('HEX'); - // check if there are any users; if not add one default admin one - let pw = 'pass-123'; - let hashed_pw = new jsSHA('SHA-512', 'TEXT').update(pw).getHash('HEX'); +let check_ins_stmt = `INSERT INTO users (name, pw) SELECT 'admin', '${hashed_pw}' + WHERE NOT EXISTS (SELECT * FROM users);`; - let check_ins_stmt = `INSERT INTO users (name, pw) SELECT 'admin', '${hashed_pw}' - WHERE NOT EXISTS (SELECT * FROM users);`; +db.exec(check_ins_stmt); - db.run(check_ins_stmt); +let users_stmt = `SELECT * FROM USERS`; +const stmt = db.prepare(users_stmt); +for (const usr of stmt.iterate()) { + console.log(`xxx ${usr.name} + ${usr.pw}`) +}; - let users_stmt = `SELECT * FROM USERS`; - db.each(users_stmt, (err, row) => { - console.log(`xxx ${row.name} + ${row.pw}`) - }); +// cases table - // cases table +create_stmt = `CREATE TABLE IF NOT EXISTS cases + (id INTEGER PRIMARY KEY AUTOINCREMENT, + token TEXT NOT NULL UNIQUE, + name TEXT NOT NULL, + pw TEXT NOT NULL, + created_by INTEGER NOT NULL, + FOREIGN KEY(created_by) REFERENCES users(id))`; - create_stmt = `CREATE TABLE IF NOT EXISTS cases - (id INTEGER PRIMARY KEY AUTOINCREMENT, - token TEXT NOT NULL UNIQUE, - name TEXT NOT NULL, - pw TEXT NOT NULL, - created_by INTEGER NOT NULL, - FOREIGN KEY(created_by) REFERENCES users(id))`; - - db.run(create_stmt); -}); +db.exec(create_stmt); db.close(); diff --git a/src/lib/auth.ts b/src/lib/auth.ts index 958bc6e..3582558 100644 --- a/src/lib/auth.ts +++ b/src/lib/auth.ts @@ -1,6 +1,12 @@ import jwt from 'jsonwebtoken'; +import jsSHA from 'jssha'; +import Database from 'better-sqlite3'; +import process from 'process'; import config from '$lib/config'; +// import db from '../init/init_db'; + +let db = new Database('./src/lib/data/tatort.db'); const SECRET = config.jwt.secret; const EXPIRES_IN = config.jwt.expiresIn; @@ -16,14 +22,46 @@ export function decryptToken(token: string) { } export function authenticate(user, pass) { - let userData = null; + // let userData = null; - if (AUTH[user]) { - const { password, ...data } = AUTH[user]; - if (password && password === pass) userData = data; + // if (AUTH[user]) { + // const { password, ...data } = AUTH[user]; + // + // // fetch user password from db; + // db.get(get_usr_stmt, [user], (err, row) => { + // console.log(`[row] ${row.name} + ${row.pw}`); + // let stored_pw = row.pw; + // // hash user password + // let hashed_pw = new jsSHA('SHA-512', 'TEXT').update(pass).getHash('HEX'); + // + // console.log(`+++ ${stored_pw} || ${hashed_pw} || ${pass}`); + // + // if (hashed_pw && hashed_pw === stored_pw) { + // console.log(`--- SUCCESS`); + // userData = data; + // } + // if (userData == null) return null; + // console.log(`^^^ ${userData}`); + // return createToken({ id: user, ...userData }); + // }); + // } + // + // if (userData == null) return null; + + let token; + + // hash user password + let hashed_pw = new jsSHA('SHA-512', 'TEXT').update(pass).getHash('HEX'); + + let get_usr_stmt = 'SELECT name, pw FROM users WHERE name = ?'; + const row = db.prepare(get_usr_stmt).get(user); + let stored_pw = row.pw; + + console.log(`+++ ${pass} || ${stored_pw} || ${hashed_pw}`); + + if (hashed_pw && hashed_pw === stored_pw) { + token = createToken({ id: user, admin: true }); } - if (userData == null) return null; - - return createToken({ id: user, ...userData }); + return token; } From dc2d038b1b449d405ff64876fb558a6e22dd572c Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Wed, 9 Jul 2025 12:13:19 +0200 Subject: [PATCH 098/343] remove old, commented implementation of authenticate --- src/lib/auth.ts | 26 -------------------------- 1 file changed, 26 deletions(-) diff --git a/src/lib/auth.ts b/src/lib/auth.ts index 3582558..8b94943 100644 --- a/src/lib/auth.ts +++ b/src/lib/auth.ts @@ -22,32 +22,6 @@ export function decryptToken(token: string) { } export function authenticate(user, pass) { - // let userData = null; - - // if (AUTH[user]) { - // const { password, ...data } = AUTH[user]; - // - // // fetch user password from db; - // db.get(get_usr_stmt, [user], (err, row) => { - // console.log(`[row] ${row.name} + ${row.pw}`); - // let stored_pw = row.pw; - // // hash user password - // let hashed_pw = new jsSHA('SHA-512', 'TEXT').update(pass).getHash('HEX'); - // - // console.log(`+++ ${stored_pw} || ${hashed_pw} || ${pass}`); - // - // if (hashed_pw && hashed_pw === stored_pw) { - // console.log(`--- SUCCESS`); - // userData = data; - // } - // if (userData == null) return null; - // console.log(`^^^ ${userData}`); - // return createToken({ id: user, ...userData }); - // }); - // } - // - // if (userData == null) return null; - let token; // hash user password From c034064d419f02772cb59eb4cafb5a018c031ecc Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Wed, 9 Jul 2025 12:20:16 +0200 Subject: [PATCH 099/343] refactor db design --- src/init/init_db.js | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/src/init/init_db.js b/src/init/init_db.js index c47d240..7cd6adc 100644 --- a/src/init/init_db.js +++ b/src/init/init_db.js @@ -21,18 +21,16 @@ db.exec(check_ins_stmt); let users_stmt = `SELECT * FROM USERS`; const stmt = db.prepare(users_stmt); for (const usr of stmt.iterate()) { - console.log(`xxx ${usr.name} + ${usr.pw}`) -}; + console.log(`xxx ${usr.name} + ${usr.pw}`); +} // cases table create_stmt = `CREATE TABLE IF NOT EXISTS cases (id INTEGER PRIMARY KEY AUTOINCREMENT, - token TEXT NOT NULL UNIQUE, - name TEXT NOT NULL, - pw TEXT NOT NULL, - created_by INTEGER NOT NULL, - FOREIGN KEY(created_by) REFERENCES users(id))`; + token TEXT NOT NULL UNIQUE, + name TEXT NOT NULL, + pw TEXT NOT NULL)`; db.exec(create_stmt); From f6513c9ed821b92710a53a372df3263b3e8092bc Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Thu, 10 Jul 2025 08:28:01 +0200 Subject: [PATCH 100/343] add uuid-package for token generation --- package.json | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index ddaae9f..88fbb61 100644 --- a/package.json +++ b/package.json @@ -51,6 +51,7 @@ "minio": "^8.0.5", "postcss": "^8.5.4", "sqlite3": "^5.1.7", - "tailwindcss": "^3.4.17" + "tailwindcss": "^3.4.17", + "uuid": "^11.1.0" } } From 8b1b3532fc5e35d37600dbc25658dccabb1a290b Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Thu, 10 Jul 2025 08:29:07 +0200 Subject: [PATCH 101/343] refactor init-script and display tables with data --- src/init/init_db.js | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/init/init_db.js b/src/init/init_db.js index 7cd6adc..5f64089 100644 --- a/src/init/init_db.js +++ b/src/init/init_db.js @@ -19,9 +19,10 @@ let check_ins_stmt = `INSERT INTO users (name, pw) SELECT 'admin', '${hashed_pw} db.exec(check_ins_stmt); let users_stmt = `SELECT * FROM USERS`; -const stmt = db.prepare(users_stmt); +let stmt = db.prepare(users_stmt); +console.log(`\n`, `*** Users table`); for (const usr of stmt.iterate()) { - console.log(`xxx ${usr.name} + ${usr.pw}`); + console.log(`[r] ${usr.name} + ${usr.pw}`); } // cases table @@ -34,4 +35,11 @@ create_stmt = `CREATE TABLE IF NOT EXISTS cases db.exec(create_stmt); +let cases_stmt = `SELECT * FROM cases`; +stmt = db.prepare(cases_stmt); +console.log(`\n`, `*** Cases table`); +for (const usr of stmt.iterate()) { + console.log(`[r] ${usr.name} + ${usr.token} + ${usr.pw}`); +} + db.close(); From 40599f4ffae0a9c1425c3e9d3b775e8d1109dd5a Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Thu, 10 Jul 2025 08:30:41 +0200 Subject: [PATCH 102/343] adding new vorgang in database --- .../(angemeldet)/upload/+page.server.ts | 30 +++++++++++-------- 1 file changed, 17 insertions(+), 13 deletions(-) diff --git a/src/routes/(angemeldet)/upload/+page.server.ts b/src/routes/(angemeldet)/upload/+page.server.ts index 1ca2879..55db9cb 100644 --- a/src/routes/(angemeldet)/upload/+page.server.ts +++ b/src/routes/(angemeldet)/upload/+page.server.ts @@ -2,6 +2,9 @@ import { Buffer } from 'buffer'; import { Readable } from 'stream'; import { client } from '$lib/minio'; import { fail } from '@sveltejs/kit'; +import { v4 as uuidv4 } from 'uuid'; + +import Database from 'better-sqlite3'; const isRequiredFieldValid = (value: unknown) => { if (value == null) return false; @@ -9,10 +12,10 @@ const isRequiredFieldValid = (value: unknown) => { if (typeof value === 'string' || value instanceof String) return value.trim() !== ''; return true; -} +}; export const actions = { - url: async ({ request }: {request: Request}) => { + url: async ({ request }: { request: Request }) => { const data = await request.formData(); const vorgang = data.get('vorgang'); const name = data.get('name'); @@ -26,22 +29,23 @@ export const actions = { if (!objectName.endsWith('.png')) objectName += '.png'; break; case '': - if (fileName?.toString().endsWith('.glb') && !objectName.endsWith('.glb')) objectName += '.glb'; + if (fileName?.toString().endsWith('.glb') && !objectName.endsWith('.glb')) + objectName += '.glb'; } const url = await client.presignedPutObject('tatort', objectName); - // store code in S3 - // tatort//__perm__ - const code_filename = '__perm__'; - const buf = Buffer.from(code, 'utf-8'); - const code_stream = Readable.from(buf); - const code_path = `${vorgang}/${code_filename}`; - await client.putObject('tatort', code_path, code_stream); + // store case in database + + let db = new Database('./src/lib/data/tatort.db'); + let token = uuidv4(); + let insert_stmt = `INSERT INTO cases (token, name, pw) VALUES (?, ?, ?)`; + const stmt = db.prepare(insert_stmt); + stmt.run(token, vorgang, code); return { url }; }, - validate: async ({ request }: {request: Request}) => { + validate: async ({ request }: { request: Request }) => { const requestData = await request.formData(); const data = Object.fromEntries(requestData); const vorgang = data.vorgang; @@ -73,7 +77,7 @@ export const actions = { return fail(400, err); }, - upload: async ({ request }: {request: Request}) => { + upload: async ({ request }: { request: Request }) => { const requestData = await request.formData(); const data = Object.fromEntries(requestData); const vorgang = data.vorgang; @@ -83,7 +87,7 @@ export const actions = { return { url }; }, - upload3: async ({ request }: {request: Request}) => { + upload3: async ({ request }: { request: Request }) => { const requestData = await request.formData(); const data = Object.fromEntries(requestData); const name = data.name; From 307894c98005f6ffde2f0fd138704f83a51f5993 Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Thu, 10 Jul 2025 08:31:45 +0200 Subject: [PATCH 103/343] listing of cases based on db --- src/routes/(angemeldet)/list/+page.server.ts | 11 ++++++----- src/routes/(angemeldet)/list/+page.svelte | 2 +- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/src/routes/(angemeldet)/list/+page.server.ts b/src/routes/(angemeldet)/list/+page.server.ts index 4d78120..98b3e69 100644 --- a/src/routes/(angemeldet)/list/+page.server.ts +++ b/src/routes/(angemeldet)/list/+page.server.ts @@ -1,10 +1,11 @@ -import { getListOfVorgänge } from '$lib/server/vorgangService'; +import { getListOfVorgänge, getVorgaenge } from '$lib/server/vorgangService'; import type { PageServerLoad } from '../../(token-based)/view/$types'; export const load: PageServerLoad = async () => { - const caseList = await getListOfVorgänge(); + // const caseList = await getListOfVorgänge(); + const caseList = getVorgaenge(); - return { - caseList - }; + return { + caseList + }; }; diff --git a/src/routes/(angemeldet)/list/+page.svelte b/src/routes/(angemeldet)/list/+page.svelte index b730a95..d59ad2f 100644 --- a/src/routes/(angemeldet)/list/+page.svelte +++ b/src/routes/(angemeldet)/list/+page.svelte @@ -51,7 +51,7 @@
    - {item.name} + {item[1]} + {/if}
      From a7eb81151f447693f1ad04a09b378720fd8554f2 Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Fri, 11 Jul 2025 11:39:42 +0200 Subject: [PATCH 111/343] refactor DB access --- src/lib/auth.ts | 5 +---- src/lib/server/dbService.ts | 3 +++ src/lib/server/vorgangService.ts | 3 +-- src/routes/(angemeldet)/upload/+page.server.ts | 3 +-- 4 files changed, 6 insertions(+), 8 deletions(-) create mode 100644 src/lib/server/dbService.ts diff --git a/src/lib/auth.ts b/src/lib/auth.ts index 8b94943..7397b86 100644 --- a/src/lib/auth.ts +++ b/src/lib/auth.ts @@ -1,12 +1,9 @@ import jwt from 'jsonwebtoken'; import jsSHA from 'jssha'; -import Database from 'better-sqlite3'; import process from 'process'; +import db from '$lib/server/dbService'; import config from '$lib/config'; -// import db from '../init/init_db'; - -let db = new Database('./src/lib/data/tatort.db'); const SECRET = config.jwt.secret; const EXPIRES_IN = config.jwt.expiresIn; diff --git a/src/lib/server/dbService.ts b/src/lib/server/dbService.ts new file mode 100644 index 0000000..1c562bc --- /dev/null +++ b/src/lib/server/dbService.ts @@ -0,0 +1,3 @@ +import Database from 'better-sqlite3'; + +export const db = new Database('./src/lib/data/tatort.db'); diff --git a/src/lib/server/vorgangService.ts b/src/lib/server/vorgangService.ts index d86172a..7d7c5e7 100644 --- a/src/lib/server/vorgangService.ts +++ b/src/lib/server/vorgangService.ts @@ -2,8 +2,7 @@ import { fail } from '@sveltejs/kit'; import { BUCKET, client, CONFIGFILENAME, TOKENFILENAME } from '$lib/minio'; import { checkIfExactDirectoryExists, getContentOfTextObject } from './s3ClientService'; -import Database from 'better-sqlite3'; -const db = new Database('./src/lib/data/tatort.db'); +import { db } from './dbService'; /** * Get Vorgang and corresponend list of tatorte diff --git a/src/routes/(angemeldet)/upload/+page.server.ts b/src/routes/(angemeldet)/upload/+page.server.ts index 7d413b4..8016dac 100644 --- a/src/routes/(angemeldet)/upload/+page.server.ts +++ b/src/routes/(angemeldet)/upload/+page.server.ts @@ -4,7 +4,7 @@ import { client } from '$lib/minio'; import { fail } from '@sveltejs/kit'; import { v4 as uuidv4 } from 'uuid'; -import Database from 'better-sqlite3'; +import { db } from '$lib/server/dbService'; const isRequiredFieldValid = (value: unknown) => { if (value == null) return false; @@ -25,7 +25,6 @@ export const actions = { // store case in database - let db = new Database('./src/lib/data/tatort.db'); let token = uuidv4(); let insert_stmt = `INSERT INTO cases (token, name, pw) VALUES (?, ?, ?)`; const stmt = db.prepare(insert_stmt); From cd5389666eac68881f4a9f145f10aacfc30b33e0 Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Mon, 14 Jul 2025 08:23:27 +0200 Subject: [PATCH 112/343] fix import error from default to explicit import --- src/lib/auth.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/auth.ts b/src/lib/auth.ts index 7397b86..1248d94 100644 --- a/src/lib/auth.ts +++ b/src/lib/auth.ts @@ -1,7 +1,7 @@ import jwt from 'jsonwebtoken'; import jsSHA from 'jssha'; import process from 'process'; -import db from '$lib/server/dbService'; +import { db } from '$lib/server/dbService'; import config from '$lib/config'; From 484acd3bcf1b434cb3b3453491be7d80fe8acb4f Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Mon, 14 Jul 2025 13:20:15 +0200 Subject: [PATCH 113/343] =?UTF-8?q?refactoring:=20'Datei=20zu=20Vorgang=20?= =?UTF-8?q?hinzuf=C3=BCgen'=20an=20DB=20angepasst?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/server/vorgangService.ts | 9 +++++ src/routes/(angemeldet)/upload/+page.svelte | 33 ++++++++----------- .../(token-based)/list/[vorgang]/+page.svelte | 2 +- src/routes/api/list/[vorgang]/+server.ts | 13 ++++++++ src/routes/api/list/[vorgang]/code/+server.ts | 22 ++++--------- 5 files changed, 43 insertions(+), 36 deletions(-) diff --git a/src/lib/server/vorgangService.ts b/src/lib/server/vorgangService.ts index 7d7c5e7..95b378e 100644 --- a/src/lib/server/vorgangService.ts +++ b/src/lib/server/vorgangService.ts @@ -117,6 +117,15 @@ export const vorgangExists = function (caseId: string | null) { return found; }; +export const vorgangNameExists = function (caseName: string) { + let vorgaenge = getVorgaenge(); + const vorgaenge_names = vorgaenge.map((vorg) => vorg.name); + + const found = vorgaenge_names.indexOf(caseName) != -1; + + return found; +}; + export const hasValidToken = async (caseId: string, caseToken: string) => { const objPath = `${caseId}/${TOKENFILENAME}`; diff --git a/src/routes/(angemeldet)/upload/+page.svelte b/src/routes/(angemeldet)/upload/+page.svelte index 0d93a8c..cabf2ab 100644 --- a/src/routes/(angemeldet)/upload/+page.svelte +++ b/src/routes/(angemeldet)/upload/+page.svelte @@ -152,40 +152,33 @@ } // `/(angemeldet)/view` return true or false - async function case_exists(case_no) { + async function case_exists(case_name: string) { - if (case_no == '') { + if (case_name == '') { zugangscode = zugangscode_old; + return; } - // ping `/view` with caseNumber in POST body - let url = '/view'; + let url = `/api/list/${case_name}` - let data = new FormData(); - data.append('caseNumber', case_no); + const response = await fetch(url, { method: 'HEAD'}); + const status = response.status; - // fetch code in parallel - const code = await get_code(case_no); - if (code != -1) { - zugangscode = code; + if (status == 200) { case_existing = true; + const code = await get_code(case_name); + zugangscode = code; + return true - } - const response = await fetch(url, { method: 'POST', body: data }); - - const res_json = await response.json(); - const status = res_json.status; - - if (status != 303) { + } else { case_existing = false; zugangscode = zugangscode_old; + return false } - - return false; } - async function get_code(case_no) { + async function get_code(case_no: string) { if (case_no == '') return; diff --git a/src/routes/(token-based)/list/[vorgang]/+page.svelte b/src/routes/(token-based)/list/[vorgang]/+page.svelte index 4c335ce..c73ac56 100644 --- a/src/routes/(token-based)/list/[vorgang]/+page.svelte +++ b/src/routes/(token-based)/list/[vorgang]/+page.svelte @@ -144,7 +144,7 @@

      Vorgang {vorg.name}

      {#if data?.user?.admin} - Zugangspasswort: {vorg.pw} + Zugangscode: {vorg.pw} {/if}
      diff --git a/src/routes/api/list/[vorgang]/+server.ts b/src/routes/api/list/[vorgang]/+server.ts index 5a76090..345b390 100644 --- a/src/routes/api/list/[vorgang]/+server.ts +++ b/src/routes/api/list/[vorgang]/+server.ts @@ -1,4 +1,5 @@ import { client } from '$lib/minio'; +import { vorgangNameExists } from '$lib/server/vorgangService'; export async function DELETE({ params }) { const vorgang = params.vorgang; @@ -22,3 +23,15 @@ export async function DELETE({ params }) { return new Response(null, { status: 204 }); } + +export async function HEAD({ params }) { + const vorgang_name = params.vorgang; + + const existing = vorgangNameExists(vorgang_name); + + if (existing) { + return new Response(null, { status: 200 }); + } else { + return new Response(null, { status: 404 }); + } +} diff --git a/src/routes/api/list/[vorgang]/code/+server.ts b/src/routes/api/list/[vorgang]/code/+server.ts index 3657b36..c2c8238 100644 --- a/src/routes/api/list/[vorgang]/code/+server.ts +++ b/src/routes/api/list/[vorgang]/code/+server.ts @@ -1,24 +1,16 @@ import { client } from '$lib/minio'; +import { db } from '$lib/server/dbService'; /** @type {import('./$types').RequestHandler} */ export async function GET({ params }) { - const prefix = params.vorgang ? `${params.vorgang}` : ''; + const vorgang_name = params.vorgang; - const code_name = '__perm__'; - const obj_path = `${prefix}/${code_name}`; + let get_code_stmt = `SELECT pw FROM cases WHERE name = ?;`; + const row = db.prepare(get_code_stmt).get(vorgang_name); + let pw = row.pw; - let result = null; - - try { - result = await client.getObject('tatort', obj_path); - } catch (error) { - if (error.name == 'S3Error') { - result = null; - } - } - - if (result != null) { - return new Response(result, { status: 200 }); + if (pw) { + return new Response(pw, { status: 200 }); } else { return new Response(null, { status: 404 }); } From fa59db7a8861029cee9ffdb1b7ec4973c6fdf667 Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Mon, 14 Jul 2025 13:25:19 +0200 Subject: [PATCH 114/343] make 'Vorgangsname' column unique --- src/init/init_db.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/init/init_db.js b/src/init/init_db.js index 5f64089..ecdfc5a 100644 --- a/src/init/init_db.js +++ b/src/init/init_db.js @@ -30,7 +30,7 @@ for (const usr of stmt.iterate()) { create_stmt = `CREATE TABLE IF NOT EXISTS cases (id INTEGER PRIMARY KEY AUTOINCREMENT, token TEXT NOT NULL UNIQUE, - name TEXT NOT NULL, + name TEXT NOT NULL UNIQUE, pw TEXT NOT NULL)`; db.exec(create_stmt); From 873a382f696f7644630c2291feb33a3303334175 Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Mon, 14 Jul 2025 13:54:08 +0200 Subject: [PATCH 115/343] =?UTF-8?q?refactor=20'Datei=20zu=20Vorgang=20hinz?= =?UTF-8?q?uf=C3=BCgen':=20Add=20model=20files=20to=20existing=20cases?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/lib/server/vorgangService.ts | 8 ++++++ .../(angemeldet)/upload/+page.server.ts | 25 ++++++++++++++++--- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/src/lib/server/vorgangService.ts b/src/lib/server/vorgangService.ts index 95b378e..09887a6 100644 --- a/src/lib/server/vorgangService.ts +++ b/src/lib/server/vorgangService.ts @@ -39,6 +39,14 @@ export const getVorgang = function (caseId: string) { return res; }; +export const getVorgangByName = function (caseName: string) { + let getVorgangByName_stmt = `SELECT token, name, pw FROM cases WHERE name = ?`; + const stmt = db.prepare(getVorgangByName_stmt); + const res = stmt.get(caseName); + + return res; +}; + /** * Fetches list of vorgänge from s3 bucket * @returns list of available cases diff --git a/src/routes/(angemeldet)/upload/+page.server.ts b/src/routes/(angemeldet)/upload/+page.server.ts index 8016dac..934cf75 100644 --- a/src/routes/(angemeldet)/upload/+page.server.ts +++ b/src/routes/(angemeldet)/upload/+page.server.ts @@ -5,6 +5,7 @@ import { fail } from '@sveltejs/kit'; import { v4 as uuidv4 } from 'uuid'; import { db } from '$lib/server/dbService'; +import { getVorgangByName, vorgangExists, vorgangNameExists } from '$lib/server/vorgangService'; const isRequiredFieldValid = (value: unknown) => { if (value == null) return false; @@ -24,11 +25,27 @@ export const actions = { const fileName = data.get('fileName'); // store case in database + // skip if Vorgang exists and token not changed - let token = uuidv4(); - let insert_stmt = `INSERT INTO cases (token, name, pw) VALUES (?, ?, ?)`; - const stmt = db.prepare(insert_stmt); - stmt.run(token, vorgang, code); + const vorgang_exists = vorgangNameExists(vorgang); + let token; + + if (!vorgang_exists) { + token = uuidv4(); + let insert_stmt = `INSERT INTO cases (token, name, pw) VALUES (?, ?, ?)`; + const stmt = db.prepare(insert_stmt); + stmt.run(token, vorgang, code); + } else { + // vorgang exists + // check if PW was changed, and update DB if it was + const vorg = getVorgangByName(vorgang); + token = vorg.token; + if (vorg.pw != code) { + let update_stmt = `UPDATE cases SET pw = ? WHERE name = ?`; + const stmt = db.prepare(update_stmt); + stmt.run(code, vorgang); + } + } let objectName = `${token}/${name}`; switch (type) { From 5070ac9f7a70e6671c23a29c0a504cb3ff1b5311 Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Tue, 15 Jul 2025 08:03:27 +0200 Subject: [PATCH 116/343] remove console.logs --- src/lib/auth.ts | 2 -- src/routes/(token-based)/list/[vorgang]/+page.svelte | 1 - 2 files changed, 3 deletions(-) diff --git a/src/lib/auth.ts b/src/lib/auth.ts index 1248d94..648f5d8 100644 --- a/src/lib/auth.ts +++ b/src/lib/auth.ts @@ -28,8 +28,6 @@ export function authenticate(user, pass) { const row = db.prepare(get_usr_stmt).get(user); let stored_pw = row.pw; - console.log(`+++ ${pass} || ${stored_pw} || ${hashed_pw}`); - if (hashed_pw && hashed_pw === stored_pw) { token = createToken({ id: user, admin: true }); } diff --git a/src/routes/(token-based)/list/[vorgang]/+page.svelte b/src/routes/(token-based)/list/[vorgang]/+page.svelte index c73ac56..16d713a 100644 --- a/src/routes/(token-based)/list/[vorgang]/+page.svelte +++ b/src/routes/(token-based)/list/[vorgang]/+page.svelte @@ -94,7 +94,6 @@ // construct PUT URL const url = $page.url; - console.log(url); let data_obj: { new_name: string; old_name: string } = { new_name: '', old_name: '' }; data_obj['new_name'] = new_name; From 51d3f19f3efaf84ce8a4c88036c197e0dcc80a54 Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Tue, 15 Jul 2025 09:06:45 +0200 Subject: [PATCH 117/343] delete functionality for Vorgang in DB --- src/lib/server/vorgangService.ts | 13 +++++++++++++ src/routes/api/list/[vorgang]/+server.ts | 14 ++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/lib/server/vorgangService.ts b/src/lib/server/vorgangService.ts index 09887a6..acbd7c8 100644 --- a/src/lib/server/vorgangService.ts +++ b/src/lib/server/vorgangService.ts @@ -47,6 +47,19 @@ export const getVorgangByName = function (caseName: string) { return res; }; +/** + * Delete Vorgang + * @param caseName + * @returns int: number of changes + */ +export const deleteVorgangByName = function (caseName: string) { + let delete_stmt = 'DELETE FROM cases WHERE name = ?'; + const stmt = db.prepare(delete_stmt); + const info = stmt.run(caseName); + + return info.changes; +}; + /** * Fetches list of vorgänge from s3 bucket * @returns list of available cases diff --git a/src/routes/api/list/[vorgang]/+server.ts b/src/routes/api/list/[vorgang]/+server.ts index 345b390..f10a1e6 100644 --- a/src/routes/api/list/[vorgang]/+server.ts +++ b/src/routes/api/list/[vorgang]/+server.ts @@ -1,12 +1,21 @@ import { client } from '$lib/minio'; -import { vorgangNameExists } from '$lib/server/vorgangService'; +import { db } from '$lib/server/dbService'; +import { + deleteVorgangByName, + getVorgang, + getVorgangByName, + vorgangNameExists +} from '$lib/server/vorgangService'; export async function DELETE({ params }) { const vorgang = params.vorgang; + const vorg = getVorgangByName(vorgang); + let vorg_token = vorg.token; + const object_list = await new Promise((resolve, reject) => { const res = []; - const items_str = client.listObjects('tatort', vorgang, true); + const items_str = client.listObjects('tatort', vorg_token, true); items_str.on('data', (obj) => { res.push(obj.name); @@ -20,6 +29,7 @@ export async function DELETE({ params }) { }); await client.removeObjects('tatort', object_list); + deleteVorgangByName(vorgang); return new Response(null, { status: 204 }); } From b8e50316693fd43b987d10efe3448ffe5d2af082 Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Tue, 15 Jul 2025 09:48:29 +0200 Subject: [PATCH 118/343] document DB initialization script --- README.md | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/README.md b/README.md index b5b2950..f17397c 100644 --- a/README.md +++ b/README.md @@ -36,3 +36,24 @@ npm run build You can preview the production build with `npm run preview`. > To deploy your app, you may need to install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment. + +## Initializing the SQLite DB + +A database initialization script `init_db.js` in included in the `src/init` folder. It will create a users database (if not existing) and populate it with a default admin user. Additionally, an empty cases table will be created. + +It can be run with `node init_db.js` + +Database schema: + +Users + +- id +- name +- pw + +Cases + +- id +- token +- name +- pw From 51af112610784a137d202e20691f85e730748f45 Mon Sep 17 00:00:00 2001 From: Daniel Mann Date: Tue, 15 Jul 2025 10:24:50 +0200 Subject: [PATCH 119/343] Update Jenkinsfile --- Jenkinsfile | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/Jenkinsfile b/Jenkinsfile index 6d2f479..465961b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -80,6 +80,38 @@ pipeline { } } } + + stage('Update helm chart repository') { + when { + branch 'development' + } + steps { + script { + def newTag = "0.${env.BUILD_ID}" + def chartRepo = "https://jenkins:${env.TOKEN}@gitea.innovation-hub-niedersachsen.de/innohub/charts.git" + def chartPath = "tatort-dev/tatort" + + sh """ + rm -rf charts-tmp + git clone ${chartRepo} charts-tmp + cd charts-tmp/${chartPath} + + # update image tag in values.yaml + sed -i 's/^ tag: .*/ tag: ${newTag}/' values.yaml + + # optional: bump version in Chart.yaml + sed -i 's/^version: .*/version: ${newTag}/' Chart.yaml + sed -i 's/^appVersion: .*/appVersion: ${newTag}/' Chart.yaml + + git config user.name 'Jenkins' + git config user.email 'jenkins@innohub.local' + git add values.yaml Chart.yaml + git commit -m 'ci: update tatort-dev chart with image tag ${newTag}' + git push origin main + """ + } + } + } } post { From 73c551c9dee3670f8e7192c908166eb00b653e30 Mon Sep 17 00:00:00 2001 From: Daniel Mann Date: Tue, 15 Jul 2025 10:49:51 +0200 Subject: [PATCH 120/343] Update Jenkinsfile --- Jenkinsfile | 44 +++++++++++++++++++++++--------------------- 1 file changed, 23 insertions(+), 21 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 465961b..ea554d6 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -81,38 +81,40 @@ pipeline { } } - stage('Update helm chart repository') { + stage('Update Helm Chart Repository') { when { branch 'development' } steps { - script { - def newTag = "0.${env.BUILD_ID}" - def chartRepo = "https://jenkins:${env.TOKEN}@gitea.innovation-hub-niedersachsen.de/innohub/charts.git" - def chartPath = "tatort-dev/tatort" + withCredentials([usernamePassword(credentialsId: 'JenkinsGitea', usernameVariable: 'GIT_USER', passwordVariable: 'GIT_PAT')]) { + script { + def newTag = "0.${env.BUILD_ID}" + def chartRepo = "https://${GIT_USER}:${GIT_PAT}@gitea.innovation-hub-niedersachsen.de/innohub/charts.git" + def chartPath = "tatort-dev/tatort" - sh """ - rm -rf charts-tmp - git clone ${chartRepo} charts-tmp - cd charts-tmp/${chartPath} + sh """ + # Clean clone + rm -rf charts-tmp + git clone ${chartRepo} charts-tmp + cd charts-tmp/${chartPath} - # update image tag in values.yaml - sed -i 's/^ tag: .*/ tag: ${newTag}/' values.yaml + # Update values.yaml image tag + sed -i 's/^ tag: .*/ tag: ${newTag}/' values.yaml - # optional: bump version in Chart.yaml - sed -i 's/^version: .*/version: ${newTag}/' Chart.yaml - sed -i 's/^appVersion: .*/appVersion: ${newTag}/' Chart.yaml + # Optional: bump chart version and appVersion + sed -i 's/^version: .*/version: ${newTag}/' Chart.yaml + sed -i 's/^appVersion: .*/appVersion: ${newTag}/' Chart.yaml - git config user.name 'Jenkins' - git config user.email 'jenkins@innohub.local' - git add values.yaml Chart.yaml - git commit -m 'ci: update tatort-dev chart with image tag ${newTag}' - git push origin main - """ + git config user.name "jenkins" + git config user.email "jenkins@innohub.local" + git add values.yaml Chart.yaml + git commit -m "ci: update tatort-dev chart with image tag ${newTag}" + git push origin main + """ + } } } } - } post { success { From c5202bb75716b2baa8f19961ea8f332f9ce73320 Mon Sep 17 00:00:00 2001 From: Daniel Mann Date: Tue, 15 Jul 2025 10:53:14 +0200 Subject: [PATCH 121/343] Update Jenkinsfile --- Jenkinsfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index ea554d6..3148580 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -115,7 +115,8 @@ pipeline { } } } - + } + post { success { script { From 24443496940b65c8c482c66615326f4586dd09d9 Mon Sep 17 00:00:00 2001 From: Daniel Mann Date: Tue, 15 Jul 2025 11:08:26 +0200 Subject: [PATCH 122/343] Update Jenkinsfile --- Jenkinsfile | 33 +++++++++++++++++++++++---------- 1 file changed, 23 insertions(+), 10 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 3148580..14db86b 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -86,29 +86,42 @@ pipeline { branch 'development' } steps { - withCredentials([usernamePassword(credentialsId: 'JenkinsGitea', usernameVariable: 'GIT_USER', passwordVariable: 'GIT_PAT')]) { + withCredentials([ + usernamePassword( + credentialsId: 'JenkinsGitea', + usernameVariable: 'GIT_USER', + passwordVariable: 'GIT_PAT' + ) + ]) { script { def newTag = "0.${env.BUILD_ID}" def chartRepo = "https://${GIT_USER}:${GIT_PAT}@gitea.innovation-hub-niedersachsen.de/innohub/charts.git" def chartPath = "tatort-dev/tatort" + def chartDir = "charts-tmp/${chartPath}" sh """ - # Clean clone + set -e + rm -rf charts-tmp git clone ${chartRepo} charts-tmp - cd charts-tmp/${chartPath} + cd ${chartDir} - # Update values.yaml image tag + echo "[INFO] Updating values.yaml and Chart.yaml..." sed -i 's/^ tag: .*/ tag: ${newTag}/' values.yaml - - # Optional: bump chart version and appVersion sed -i 's/^version: .*/version: ${newTag}/' Chart.yaml sed -i 's/^appVersion: .*/appVersion: ${newTag}/' Chart.yaml - git config user.name "jenkins" + echo "[INFO] Packaging chart..." + helm package . + + echo "[INFO] Updating index.yaml..." + helm repo index . --merge index.yaml || helm repo index . + + echo "[INFO] Committing Helm chart changes..." + git config user.name "Jenkins" git config user.email "jenkins@innohub.local" - git add values.yaml Chart.yaml - git commit -m "ci: update tatort-dev chart with image tag ${newTag}" + git add values.yaml Chart.yaml *.tgz index.yaml + git commit -m "ci: bump tatort chart to ${newTag}, package + index" git push origin main """ } @@ -116,7 +129,7 @@ pipeline { } } } - + post { success { script { From 4633769366ed6432abdf83334761be700ffc9347 Mon Sep 17 00:00:00 2001 From: Daniel Mann Date: Tue, 15 Jul 2025 11:28:34 +0200 Subject: [PATCH 123/343] Update Jenkinsfile --- Jenkinsfile | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 14db86b..db91269 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -111,16 +111,22 @@ pipeline { sed -i 's/^version: .*/version: ${newTag}/' Chart.yaml sed -i 's/^appVersion: .*/appVersion: ${newTag}/' Chart.yaml - echo "[INFO] Packaging chart..." - helm package . + echo "[INFO] Removing old chart packages..." + cd .. + rm -f tatort-*.tgz - echo "[INFO] Updating index.yaml..." + echo "[INFO] Packaging chart into parent dir..." + cd tatort + helm package . --destination .. + + echo "[INFO] Updating index.yaml in parent dir..." + cd .. helm repo index . --merge index.yaml || helm repo index . echo "[INFO] Committing Helm chart changes..." git config user.name "Jenkins" git config user.email "jenkins@innohub.local" - git add values.yaml Chart.yaml *.tgz index.yaml + git add tatort/values.yaml tatort/Chart.yaml tatort-*.tgz index.yaml git commit -m "ci: bump tatort chart to ${newTag}, package + index" git push origin main """ From d9bcad9f7795592b2273d1a0ac815054f0c9d5b0 Mon Sep 17 00:00:00 2001 From: Daniel Mann Date: Tue, 15 Jul 2025 11:42:23 +0200 Subject: [PATCH 124/343] Update Jenkinsfile --- Jenkinsfile | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index db91269..7b3097c 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -94,40 +94,44 @@ pipeline { ) ]) { script { - def newTag = "0.${env.BUILD_ID}" + def newTag = "0.${env.BUILD_ID}-dev.1" def chartRepo = "https://${GIT_USER}:${GIT_PAT}@gitea.innovation-hub-niedersachsen.de/innohub/charts.git" def chartPath = "tatort-dev/tatort" def chartDir = "charts-tmp/${chartPath}" + def chartRepoRoot = "charts-tmp/tatort-dev" sh """ set -e + echo "[INFO] Cloning chart repo..." rm -rf charts-tmp git clone ${chartRepo} charts-tmp - cd ${chartDir} echo "[INFO] Updating values.yaml and Chart.yaml..." + cd ${chartDir} + sed -i 's|^ repository: .*| repository: gitea.innovation-hub-niedersachsen.de/innohub/tatort-dev|' values.yaml sed -i 's/^ tag: .*/ tag: ${newTag}/' values.yaml sed -i 's/^version: .*/version: ${newTag}/' Chart.yaml sed -i 's/^appVersion: .*/appVersion: ${newTag}/' Chart.yaml - echo "[INFO] Removing old chart packages..." + echo "[INFO] Cleaning up old chart packages..." cd .. + rm -f index.yaml rm -f tatort-*.tgz - echo "[INFO] Packaging chart into parent dir..." + echo "[INFO] Packaging Helm chart..." cd tatort helm package . --destination .. - echo "[INFO] Updating index.yaml in parent dir..." + echo "[INFO] Updating Helm index.yaml..." cd .. helm repo index . --merge index.yaml || helm repo index . - echo "[INFO] Committing Helm chart changes..." + echo "[INFO] Committing and pushing chart changes..." git config user.name "Jenkins" git config user.email "jenkins@innohub.local" git add tatort/values.yaml tatort/Chart.yaml tatort-*.tgz index.yaml - git commit -m "ci: bump tatort chart to ${newTag}, package + index" + git commit -m "ci: bump tatort-dev to ${newTag}, package chart + update index" git push origin main """ } From 552350354b6d277227963e52c489d9eddea623df Mon Sep 17 00:00:00 2001 From: Daniel Mann Date: Tue, 15 Jul 2025 11:54:50 +0200 Subject: [PATCH 125/343] Update Jenkinsfile --- Jenkinsfile | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 7b3097c..c3f314f 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -73,9 +73,13 @@ pipeline { steps { script { didRun = true - def tag = "innohub/tatort-dev:0.${env.BUILD_ID}" + def versionTag = "0.${env.BUILD_ID}-dev.1" + def imageName = "gitea.innovation-hub-niedersachsen.de/innohub/tatort-dev" + docker.withRegistry('https://gitea.innovation-hub-niedersachsen.de', 'JenkinsGitea') { - docker.build(tag, '-f Dockerfile.dev .').push('latest') + def img = docker.build("${imageName}:${versionTag}", '-f Dockerfile.dev .') + img.push() + img.push('latest') // Optional if you want to keep 'latest' tag } } } From 6786f768f0c7f239afc425f6ddd509ac0b5bf1f6 Mon Sep 17 00:00:00 2001 From: Daniel Mann Date: Tue, 15 Jul 2025 12:07:53 +0200 Subject: [PATCH 126/343] Update Jenkinsfile --- Jenkinsfile | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Jenkinsfile b/Jenkinsfile index c3f314f..8aa5902 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -122,6 +122,7 @@ pipeline { cd .. rm -f index.yaml rm -f tatort-*.tgz + git rm -f tatort-*.tgz || true echo "[INFO] Packaging Helm chart..." cd tatort @@ -132,7 +133,7 @@ pipeline { helm repo index . --merge index.yaml || helm repo index . echo "[INFO] Committing and pushing chart changes..." - git config user.name "Jenkins" + git config user.name "jenkins" git config user.email "jenkins@innohub.local" git add tatort/values.yaml tatort/Chart.yaml tatort-*.tgz index.yaml git commit -m "ci: bump tatort-dev to ${newTag}, package chart + update index" From 34d5034a713788462074d49ceb467056cf5102f8 Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Wed, 16 Jul 2025 09:39:02 +0200 Subject: [PATCH 127/343] refactoring part 1: camelcase naming, token vs pw naming --- src/init/init_db.js | 28 +++++----- src/lib/auth.ts | 16 +++--- src/lib/server/vorgangService.ts | 53 ++++++++++--------- .../(angemeldet)/upload/+page.server.ts | 22 ++++---- src/routes/(angemeldet)/upload/+page.svelte | 40 +++++++------- .../list/[vorgang]/+page.server.ts | 4 +- .../(token-based)/list/[vorgang]/+page.svelte | 2 +- src/routes/api/list/[vorgang]/+server.ts | 10 ++-- src/routes/api/list/[vorgang]/code/+server.ts | 12 ++--- 9 files changed, 96 insertions(+), 91 deletions(-) diff --git a/src/init/init_db.js b/src/init/init_db.js index ecdfc5a..3d08f0b 100644 --- a/src/init/init_db.js +++ b/src/init/init_db.js @@ -3,42 +3,42 @@ import jsSHA from 'jssha'; const db = new Database('./src/lib/data/tatort.db'); -let create_stmt = `CREATE TABLE IF NOT EXISTS users +let createSQLStmt = `CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL, pw TEXT NOT NULL)`; -db.exec(create_stmt); +db.exec(createSQLStmt); // check if there are any users; if not add one default admin one -let pw = 'pass-123'; -let hashed_pw = new jsSHA('SHA-512', 'TEXT').update(pw).getHash('HEX'); +let password = 'pass-123'; +let hashedPassword = new jsSHA('SHA-512', 'TEXT').update(password).getHash('HEX'); -let check_ins_stmt = `INSERT INTO users (name, pw) SELECT 'admin', '${hashed_pw}' +let checkInsertSQLStmt = `INSERT INTO users (name, pw) SELECT 'admin', '${hashedPassword}' WHERE NOT EXISTS (SELECT * FROM users);`; -db.exec(check_ins_stmt); +db.exec(checkInsertSQLStmt); -let users_stmt = `SELECT * FROM USERS`; -let stmt = db.prepare(users_stmt); +let usersSQLStmt = `SELECT * FROM USERS`; +let SQLStatement = db.prepare(usersSQLStmt); console.log(`\n`, `*** Users table`); -for (const usr of stmt.iterate()) { +for (const usr of SQLStatement.iterate()) { console.log(`[r] ${usr.name} + ${usr.pw}`); } // cases table -create_stmt = `CREATE TABLE IF NOT EXISTS cases +createSQLStmt = `CREATE TABLE IF NOT EXISTS cases (id INTEGER PRIMARY KEY AUTOINCREMENT, token TEXT NOT NULL UNIQUE, name TEXT NOT NULL UNIQUE, pw TEXT NOT NULL)`; -db.exec(create_stmt); +db.exec(createSQLStmt); -let cases_stmt = `SELECT * FROM cases`; -stmt = db.prepare(cases_stmt); +let casesSQLStmt = `SELECT * FROM cases`; +SQLStatement = db.prepare(casesSQLStmt); console.log(`\n`, `*** Cases table`); -for (const usr of stmt.iterate()) { +for (const usr of SQLStatement.iterate()) { console.log(`[r] ${usr.name} + ${usr.token} + ${usr.pw}`); } diff --git a/src/lib/auth.ts b/src/lib/auth.ts index 648f5d8..e300146 100644 --- a/src/lib/auth.ts +++ b/src/lib/auth.ts @@ -19,18 +19,18 @@ export function decryptToken(token: string) { } export function authenticate(user, pass) { - let token; + let JWTToken; // hash user password - let hashed_pw = new jsSHA('SHA-512', 'TEXT').update(pass).getHash('HEX'); + let hashedPW = new jsSHA('SHA-512', 'TEXT').update(pass).getHash('HEX'); - let get_usr_stmt = 'SELECT name, pw FROM users WHERE name = ?'; - const row = db.prepare(get_usr_stmt).get(user); - let stored_pw = row.pw; + let getUserSQLStmt = 'SELECT name, pw FROM users WHERE name = ?'; + const row = db.prepare(getUserSQLStmt).get(user); + let storedPW = row.pw; - if (hashed_pw && hashed_pw === stored_pw) { - token = createToken({ id: user, admin: true }); + if (hashedPW && hashedPW === storedPW) { + JWTToken = createToken({ id: user, admin: true }); } - return token; + return JWTToken; } diff --git a/src/lib/server/vorgangService.ts b/src/lib/server/vorgangService.ts index acbd7c8..b4b4083 100644 --- a/src/lib/server/vorgangService.ts +++ b/src/lib/server/vorgangService.ts @@ -28,23 +28,28 @@ export const getVorgangByCaseId = async (caseId: string) => { /** * Get Vorgang - * @param caseId + * @param caseToken * @returns caseObj with keys `token`, `name`, `pw` || undefined */ -export const getVorgang = function (caseId: string) { - let getVorgang_stmt = `SELECT token, name, pw FROM cases WHERE token = ?`; - const stmt = db.prepare(getVorgang_stmt); - const res = stmt.get(caseId); +export const getVorgangByToken = function (caseToken: string) { + let getVorgangSQLStmt = `SELECT token, name, pw FROM cases WHERE token = ?`; + const statement = db.prepare(getVorgangSQLStmt); + const result = statement.get(caseToken); - return res; + return result; }; +/** + * Get Vorgang + * @param caseName + * @returns caseObj with keys `token`, `name`, `pw` || undefined + */ export const getVorgangByName = function (caseName: string) { - let getVorgangByName_stmt = `SELECT token, name, pw FROM cases WHERE name = ?`; - const stmt = db.prepare(getVorgangByName_stmt); - const res = stmt.get(caseName); + let getVorgangByNameSQLStmt = `SELECT token, name, pw FROM cases WHERE name = ?`; + const statement = db.prepare(getVorgangByNameSQLStmt); + const result = statement.get(caseName); - return res; + return result; }; /** @@ -53,9 +58,9 @@ export const getVorgangByName = function (caseName: string) { * @returns int: number of changes */ export const deleteVorgangByName = function (caseName: string) { - let delete_stmt = 'DELETE FROM cases WHERE name = ?'; - const stmt = db.prepare(delete_stmt); - const info = stmt.run(caseName); + let deleteSQLStmt = 'DELETE FROM cases WHERE name = ?'; + const statement = db.prepare(deleteSQLStmt); + const info = statement.run(caseName); return info.changes; }; @@ -84,11 +89,11 @@ export const getListOfVorgänge = async () => { * @returns list with of available cases */ export const getVorgaenge = function () { - let getVorgaenge_stmt = `SELECT token, name, pw from cases`; - const stmt = db.prepare(getVorgaenge_stmt); - const res = stmt.all(); + let getVorgaengeSQLStmt = `SELECT token, name, pw from cases`; + const statement = db.prepare(getVorgaengeSQLStmt); + const result = statement.all(); const vorgaenge_list = []; - for (const r of res) { + for (const r of result) { const vorg = { token: r.token, name: r.name, pw: r.pw }; vorgaenge_list.push(vorg); } @@ -121,11 +126,11 @@ export const checkIfVorgangExists = async (caseId: string | null) => { return true; }; -export const vorgangExists = function (caseId: string | null) { - if (!caseId) { +export const vorgangExists = function (caseToken: string | null) { + if (!caseToken) { return fail(400, { success: false, - caseId, + caseId: caseToken, error: { message: 'Die Vorgangsnummer darf nicht leer sein.' } }); } @@ -133,16 +138,16 @@ export const vorgangExists = function (caseId: string | null) { let vorgaenge = getVorgaenge(); const vorgaenge_tokens = vorgaenge.map((vorg) => vorg.token); - const found = vorgaenge_tokens.indexOf(caseId) != -1; + const found = vorgaenge_tokens.indexOf(caseToken) != -1; return found; }; export const vorgangNameExists = function (caseName: string) { let vorgaenge = getVorgaenge(); - const vorgaenge_names = vorgaenge.map((vorg) => vorg.name); + const vorgaengeNames = vorgaenge.map((vorg) => vorg.name); - const found = vorgaenge_names.indexOf(caseName) != -1; + const found = vorgaengeNames.indexOf(caseName) != -1; return found; }; @@ -174,7 +179,7 @@ export const tokenValid = function (caseId, caseToken) { return false; } - const vorg = getVorgang(caseId); + const vorg = getVorgangByToken(caseId); if (!vorg || vorg.pw !== caseToken) { return false; diff --git a/src/routes/(angemeldet)/upload/+page.server.ts b/src/routes/(angemeldet)/upload/+page.server.ts index 934cf75..1797c8c 100644 --- a/src/routes/(angemeldet)/upload/+page.server.ts +++ b/src/routes/(angemeldet)/upload/+page.server.ts @@ -21,29 +21,29 @@ export const actions = { const vorgang = data.get('vorgang'); const name = data.get('name'); const type = data.get('type'); - const code = data.get('zugangscode'); + const pw = data.get('zugangscode'); const fileName = data.get('fileName'); // store case in database // skip if Vorgang exists and token not changed - const vorgang_exists = vorgangNameExists(vorgang); + const vorgangExists = vorgangNameExists(vorgang); let token; - if (!vorgang_exists) { + if (!vorgangExists) { token = uuidv4(); - let insert_stmt = `INSERT INTO cases (token, name, pw) VALUES (?, ?, ?)`; - const stmt = db.prepare(insert_stmt); - stmt.run(token, vorgang, code); + let insertSQLStmt = `INSERT INTO cases (token, name, pw) VALUES (?, ?, ?)`; + const statement = db.prepare(insertSQLStmt); + statement.run(token, vorgang, pw); } else { // vorgang exists // check if PW was changed, and update DB if it was - const vorg = getVorgangByName(vorgang); + const vorg = getVorgangByName(vorg); token = vorg.token; - if (vorg.pw != code) { - let update_stmt = `UPDATE cases SET pw = ? WHERE name = ?`; - const stmt = db.prepare(update_stmt); - stmt.run(code, vorgang); + if (vorg.pw != pw) { + let updateSQLStmt = `UPDATE cases SET pw = ? WHERE name = ?`; + const statement = db.prepare(updateSQLStmt); + statement.run(pw, vorg); } } diff --git a/src/routes/(angemeldet)/upload/+page.svelte b/src/routes/(angemeldet)/upload/+page.svelte index cabf2ab..1a87883 100644 --- a/src/routes/(angemeldet)/upload/+page.svelte +++ b/src/routes/(angemeldet)/upload/+page.svelte @@ -23,12 +23,12 @@ .slice(2, 2 + code_len); } let zugangscode = '' - let zugangscode_old = '' - $: zugangscode_old = generate_token(); - $: zugangscode = zugangscode_old + let zugangscodeOld = '' + $: zugangscodeOld = generate_token(); + $: zugangscode = zugangscodeOld - let case_existing = undefined; - $: case_existing = false; + let caseExisting = undefined; + $: caseExisting = false; let name = ''; let etag: string | null = null; @@ -152,37 +152,37 @@ } // `/(angemeldet)/view` return true or false - async function case_exists(case_name: string) { + async function caseExists(caseName: string) { - if (case_name == '') { - zugangscode = zugangscode_old; + if (caseName == '') { + zugangscode = zugangscodeOld; return; } - let url = `/api/list/${case_name}` + let url = `/api/list/${caseName}` const response = await fetch(url, { method: 'HEAD'}); const status = response.status; if (status == 200) { - case_existing = true; - const code = await get_code(case_name); + caseExisting = true; + const code = await getCode(caseName); zugangscode = code; return true } else { - case_existing = false; - zugangscode = zugangscode_old; + caseExisting = false; + zugangscode = zugangscodeOld; return false } } - async function get_code(case_no: string) { + async function getCode(caseName: string) { - if (case_no == '') return; + if (caseName == '') return; - let url = `/api/list/${case_no}/code`; + let url = `/api/list/${caseName}/code`; const response = await fetch(url); if (response.status == 200) { @@ -226,14 +226,14 @@ 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)} + on:input={() => caseExists(vorgang)} />
    {#if formErrors?.vorgang}

    {formErrors.vorgang}

    {/if} - {#if case_existing && vorgang.length > 0} + {#if caseExisting && vorgang.length > 0} Datei wird zum existierenden Vorgang hinzugefügt. {:else if vorgang.length > 0} Neuer Vorgang wird angelegt. @@ -284,7 +284,7 @@ type="text" name="zugangscode" id="zugangscode" - on:input="{ (ev) => { zugangscode_old = ev.target.value }}" + on:input="{ (ev) => { zugangscodeOld = ev.target.value }}" 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" /> @@ -292,7 +292,7 @@ diff --git a/src/routes/(token-based)/list/[vorgang]/+page.server.ts b/src/routes/(token-based)/list/[vorgang]/+page.server.ts index b47e459..12499ea 100644 --- a/src/routes/(token-based)/list/[vorgang]/+page.server.ts +++ b/src/routes/(token-based)/list/[vorgang]/+page.server.ts @@ -1,4 +1,4 @@ -import { getVorgang, getVorgangByCaseId } from '$lib/server/vorgangService'; +import { getVorgangByToken, getVorgangByCaseId } from '$lib/server/vorgangService'; import type { PageServerLoad } from './$types'; export const load: PageServerLoad = async ({ params, url }) => { @@ -6,7 +6,7 @@ export const load: PageServerLoad = async ({ params, url }) => { const caseToken = url.searchParams.get('token'); const crimesList = await getVorgangByCaseId(caseId); - const vorg = getVorgang(caseId); + const vorg = getVorgangByToken(caseId); return { crimesList, diff --git a/src/routes/(token-based)/list/[vorgang]/+page.svelte b/src/routes/(token-based)/list/[vorgang]/+page.svelte index 16d713a..038a2d2 100644 --- a/src/routes/(token-based)/list/[vorgang]/+page.svelte +++ b/src/routes/(token-based)/list/[vorgang]/+page.svelte @@ -143,7 +143,7 @@

    Vorgang {vorg.name}

    {#if data?.user?.admin} - Zugangscode: {vorg.pw} + Zugangspasswort: {vorg.pw} {/if}
    diff --git a/src/routes/api/list/[vorgang]/+server.ts b/src/routes/api/list/[vorgang]/+server.ts index f10a1e6..8461eab 100644 --- a/src/routes/api/list/[vorgang]/+server.ts +++ b/src/routes/api/list/[vorgang]/+server.ts @@ -2,7 +2,7 @@ import { client } from '$lib/minio'; import { db } from '$lib/server/dbService'; import { deleteVorgangByName, - getVorgang, + getVorgangByToken, getVorgangByName, vorgangNameExists } from '$lib/server/vorgangService'; @@ -11,11 +11,11 @@ export async function DELETE({ params }) { const vorgang = params.vorgang; const vorg = getVorgangByName(vorgang); - let vorg_token = vorg.token; + let vorgangToken = vorg.token; const object_list = await new Promise((resolve, reject) => { const res = []; - const items_str = client.listObjects('tatort', vorg_token, true); + const items_str = client.listObjects('tatort', vorgangToken, true); items_str.on('data', (obj) => { res.push(obj.name); @@ -35,9 +35,9 @@ export async function DELETE({ params }) { } export async function HEAD({ params }) { - const vorgang_name = params.vorgang; + const vorgangName = params.vorgang; - const existing = vorgangNameExists(vorgang_name); + const existing = vorgangNameExists(vorgangName); if (existing) { return new Response(null, { status: 200 }); diff --git a/src/routes/api/list/[vorgang]/code/+server.ts b/src/routes/api/list/[vorgang]/code/+server.ts index c2c8238..241d7e7 100644 --- a/src/routes/api/list/[vorgang]/code/+server.ts +++ b/src/routes/api/list/[vorgang]/code/+server.ts @@ -3,14 +3,14 @@ import { db } from '$lib/server/dbService'; /** @type {import('./$types').RequestHandler} */ export async function GET({ params }) { - const vorgang_name = params.vorgang; + const vorgangName = params.vorgang; - let get_code_stmt = `SELECT pw FROM cases WHERE name = ?;`; - const row = db.prepare(get_code_stmt).get(vorgang_name); - let pw = row.pw; + let getCodeSQLStmt = `SELECT pw FROM cases WHERE name = ?;`; + const row = db.prepare(getCodeSQLStmt).get(vorgangName); + let password = row.pw; - if (pw) { - return new Response(pw, { status: 200 }); + if (password) { + return new Response(password, { status: 200 }); } else { return new Response(null, { status: 404 }); } From a7527ccf22ac1406abe0f1bc0e530fc7a1bb6bda Mon Sep 17 00:00:00 2001 From: Daniel Mann Date: Wed, 16 Jul 2025 09:40:46 +0200 Subject: [PATCH 128/343] Update Jenkinsfile --- Jenkinsfile | 77 +++++++++++++++++------------------------------------ 1 file changed, 24 insertions(+), 53 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 8aa5902..6001215 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -11,6 +11,7 @@ pipeline { } environment { + VERSION_TAG = 'null' REGISTRY = 'https://gitea.innovation-hub-niedersachsen.de/' USER = 'jenkins' TOKEN = credentials('JenkinsGitea') @@ -31,6 +32,14 @@ pipeline { } stages { + stage('Set Version Tag') { + steps { + script { + env.VERSION_TAG = generateVersionTag(params.GIT_REF) + echo "[INFO] Using VERSION_TAG: ${env.VERSION_TAG}" + } + } + } stage('Validate Repository') { steps { script { @@ -72,15 +81,15 @@ pipeline { } steps { script { - didRun = true - def versionTag = "0.${env.BUILD_ID}-dev.1" def imageName = "gitea.innovation-hub-niedersachsen.de/innohub/tatort-dev" - docker.withRegistry('https://gitea.innovation-hub-niedersachsen.de', 'JenkinsGitea') { - def img = docker.build("${imageName}:${versionTag}", '-f Dockerfile.dev .') + docker.withRegistry(REGISTRY, 'JenkinsGitea') { + def img = docker.build("${imageName}:${env.VERSION_TAG}", '-f Dockerfile.dev .') img.push() - img.push('latest') // Optional if you want to keep 'latest' tag + img.push('latest') } + + didRun = true } } } @@ -90,56 +99,18 @@ pipeline { branch 'development' } steps { - withCredentials([ - usernamePassword( + script { + updateHelmChart([ + tag: env.VERSION_TAG, + repoUrl: 'gitea.innovation-hub-niedersachsen.de/innohub/charts.git', + chartPath: 'tatort-dev/tatort', + chartName: 'tatort', + imageRepo: 'gitea.innovation-hub-niedersachsen.de/innohub/tatort-dev', credentialsId: 'JenkinsGitea', - usernameVariable: 'GIT_USER', - passwordVariable: 'GIT_PAT' - ) - ]) { - script { - def newTag = "0.${env.BUILD_ID}-dev.1" - def chartRepo = "https://${GIT_USER}:${GIT_PAT}@gitea.innovation-hub-niedersachsen.de/innohub/charts.git" - def chartPath = "tatort-dev/tatort" - def chartDir = "charts-tmp/${chartPath}" - def chartRepoRoot = "charts-tmp/tatort-dev" + branch: 'main' + ]) - sh """ - set -e - - echo "[INFO] Cloning chart repo..." - rm -rf charts-tmp - git clone ${chartRepo} charts-tmp - - echo "[INFO] Updating values.yaml and Chart.yaml..." - cd ${chartDir} - sed -i 's|^ repository: .*| repository: gitea.innovation-hub-niedersachsen.de/innohub/tatort-dev|' values.yaml - sed -i 's/^ tag: .*/ tag: ${newTag}/' values.yaml - sed -i 's/^version: .*/version: ${newTag}/' Chart.yaml - sed -i 's/^appVersion: .*/appVersion: ${newTag}/' Chart.yaml - - echo "[INFO] Cleaning up old chart packages..." - cd .. - rm -f index.yaml - rm -f tatort-*.tgz - git rm -f tatort-*.tgz || true - - echo "[INFO] Packaging Helm chart..." - cd tatort - helm package . --destination .. - - echo "[INFO] Updating Helm index.yaml..." - cd .. - helm repo index . --merge index.yaml || helm repo index . - - echo "[INFO] Committing and pushing chart changes..." - git config user.name "jenkins" - git config user.email "jenkins@innohub.local" - git add tatort/values.yaml tatort/Chart.yaml tatort-*.tgz index.yaml - git commit -m "ci: bump tatort-dev to ${newTag}, package chart + update index" - git push origin main - """ - } + didRun = true } } } From b2f624a7d14f3d3b3d47306b64d3730c87111a04 Mon Sep 17 00:00:00 2001 From: Daniel Mann Date: Wed, 16 Jul 2025 09:54:56 +0200 Subject: [PATCH 129/343] Update Jenkinsfile --- Jenkinsfile | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Jenkinsfile b/Jenkinsfile index 6001215..28cde92 100644 --- a/Jenkinsfile +++ b/Jenkinsfile @@ -1,7 +1,8 @@ /* groovylint-disable-next-line UnusedVariable */ @Library('InnoHub-Library') _ -Boolean didRun = false +def didRun = false +def versionTag = 'null' pipeline { agent any @@ -11,7 +12,6 @@ pipeline { } environment { - VERSION_TAG = 'null' REGISTRY = 'https://gitea.innovation-hub-niedersachsen.de/' USER = 'jenkins' TOKEN = credentials('JenkinsGitea') @@ -35,8 +35,8 @@ pipeline { stage('Set Version Tag') { steps { script { - env.VERSION_TAG = generateVersionTag(params.GIT_REF) - echo "[INFO] Using VERSION_TAG: ${env.VERSION_TAG}" + versionTag = generateVersionTag(params.GIT_REF) + echo "[INFO] Using VERSION_TAG: ${versionTag}" } } } @@ -84,7 +84,7 @@ pipeline { def imageName = "gitea.innovation-hub-niedersachsen.de/innohub/tatort-dev" docker.withRegistry(REGISTRY, 'JenkinsGitea') { - def img = docker.build("${imageName}:${env.VERSION_TAG}", '-f Dockerfile.dev .') + def img = docker.build("${imageName}:${versionTag}", '-f Dockerfile.dev .') img.push() img.push('latest') } @@ -101,7 +101,7 @@ pipeline { steps { script { updateHelmChart([ - tag: env.VERSION_TAG, + tag: versionTag, repoUrl: 'gitea.innovation-hub-niedersachsen.de/innohub/charts.git', chartPath: 'tatort-dev/tatort', chartName: 'tatort', From 143bb128a5a746ace4830e06e794cba3713613cc Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Thu, 17 Jul 2025 08:09:17 +0200 Subject: [PATCH 130/343] refactoring part 2: mainly consolidation of token, ids and passwort --- src/lib/server/vorgangService.ts | 14 ++++---- src/routes/(angemeldet)/list/+page.svelte | 2 +- .../(angemeldet)/upload/+page.server.ts | 32 +++++++++---------- src/routes/(angemeldet)/upload/+page.svelte | 31 +++++++++--------- src/routes/(token-based)/+layout.server.ts | 12 +++---- .../list/[vorgang]/+page.server.ts | 14 ++++---- .../(token-based)/list/[vorgang]/+page.svelte | 10 +++--- src/routes/anmeldung/+page.server.ts | 12 ++++--- src/routes/anmeldung/+page.svelte | 18 +++++------ src/routes/api/list/[vorgang]/code/+server.ts | 5 ++- 10 files changed, 74 insertions(+), 76 deletions(-) diff --git a/src/lib/server/vorgangService.ts b/src/lib/server/vorgangService.ts index b4b4083..1b65817 100644 --- a/src/lib/server/vorgangService.ts +++ b/src/lib/server/vorgangService.ts @@ -6,11 +6,11 @@ import { db } from './dbService'; /** * Get Vorgang and corresponend list of tatorte - * @param caseId + * @param caseToken * @returns */ -export const getVorgangByCaseId = async (caseId: string) => { - const prefix = `${caseId}/`; +export const getCrimesListByToken = async (caseToken: string) => { + const prefix = `${caseToken}/`; const stream = client.listObjectsV2(BUCKET, prefix, false, ''); @@ -174,14 +174,14 @@ export const hasValidToken = async (caseId: string, caseToken: string) => { } }; -export const tokenValid = function (caseId, caseToken) { - if (!caseToken) { +export const passwordValid = function (caseToken, casePassword) { + if (!casePassword) { return false; } - const vorg = getVorgangByToken(caseId); + const vorg = getVorgangByToken(caseToken); - if (!vorg || vorg.pw !== caseToken) { + if (!vorg || vorg.pw !== casePassword) { return false; } diff --git a/src/routes/(angemeldet)/list/+page.svelte b/src/routes/(angemeldet)/list/+page.svelte index 24b1503..3dccabd 100644 --- a/src/routes/(angemeldet)/list/+page.svelte +++ b/src/routes/(angemeldet)/list/+page.svelte @@ -46,7 +46,7 @@
    From e45b0e34c91a29a5e19951215a0c76321e59a510 Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Mon, 4 Aug 2025 09:41:13 +0200 Subject: [PATCH 163/343] =?UTF-8?q?add=20=C2=B4unique=C2=B4=20constraint?= =?UTF-8?q?=20in=20db=20init=20script=20for=20username?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/init/init_db.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/init/init_db.ts b/src/init/init_db.ts index 559708b..b057c3c 100644 --- a/src/init/init_db.ts +++ b/src/init/init_db.ts @@ -5,7 +5,7 @@ const db = new Database('./src/lib/data/tatort.db'); let createSQLStmt = `CREATE TABLE IF NOT EXISTS users (id INTEGER PRIMARY KEY AUTOINCREMENT, - name TEXT NOT NULL, + name TEXT NOT NULL UNIQUE, pw TEXT NOT NULL)`; db.exec(createSQLStmt); From 5b408b096e0bd9fbea5c505a090bdc8a754f44ce Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Tue, 5 Aug 2025 08:12:34 +0200 Subject: [PATCH 164/343] remove console.log --- src/routes/(token-based)/list/[vorgang]/+page.svelte | 1 - 1 file changed, 1 deletion(-) diff --git a/src/routes/(token-based)/list/[vorgang]/+page.svelte b/src/routes/(token-based)/list/[vorgang]/+page.svelte index 1166781..db59e16 100644 --- a/src/routes/(token-based)/list/[vorgang]/+page.svelte +++ b/src/routes/(token-based)/list/[vorgang]/+page.svelte @@ -113,7 +113,6 @@ err = true; if (response.status == 400) { let json_res = await response.json(); - console.log(`Fehler: ${json_res.msg}`); return; } throw new Error(`Fehlgeschlagen: ${response.status}`); From ef1ddb58a0518a1e7ac3299248f3a588aa4b5aaa Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Tue, 5 Aug 2025 08:21:28 +0200 Subject: [PATCH 165/343] encode body in mail-to-link button --- .../(token-based)/list/[vorgang]/+page.svelte | 24 ++++++++----------- 1 file changed, 10 insertions(+), 14 deletions(-) diff --git a/src/routes/(token-based)/list/[vorgang]/+page.svelte b/src/routes/(token-based)/list/[vorgang]/+page.svelte index 4bcc446..eef65c3 100644 --- a/src/routes/(token-based)/list/[vorgang]/+page.svelte +++ b/src/routes/(token-based)/list/[vorgang]/+page.svelte @@ -132,21 +132,17 @@ function constructMailToLink() { const subject = "Link zum Tatvorgang"; const link = $page.url.toString().split('?')[0]; - const body = ` - Hallo, - %0D%0A - %0D%0A - hier ist der Link zum Tatvorgang:%0D%0A - ${link} - %0D%0A - %0D%0A - Der Zugangs-PIN wird zur Sicherheit über einen zweiten Kommunikationskanal übermittelt. - %0D%0A - %0D%0A - Mit freundlichen Grüßen, - `; + const body = `Hallo, - const mailtoLink = `mailto:?subject=${encodeURIComponent(subject)}&body=${body}`; +hier ist der Link zum Tatvorgang: +${link} + +Der Zugangs-PIN wird zur Sicherheit über einen zweiten Kommunikationskanal übermittelt. + +Mit freundlichen Grüßen, +`; + + const mailtoLink = `mailto:?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(body)}`; return mailtoLink; } From 26b94938a99a6f9ba191ad55dc377ef8560c0737 Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Wed, 6 Aug 2025 08:37:24 +0200 Subject: [PATCH 166/343] user list and possibility of adding new users implemented on FE and BE --- src/lib/server/userService.ts | 36 ++++ src/routes/(angemeldet)/+page.svelte | 12 ++ .../(angemeldet)/user-management/+page.svelte | 180 ++++++++++++++++++ src/routes/api/users/+server.ts | 25 +++ 4 files changed, 253 insertions(+) create mode 100644 src/lib/server/userService.ts create mode 100644 src/routes/(angemeldet)/user-management/+page.svelte create mode 100644 src/routes/api/users/+server.ts diff --git a/src/lib/server/userService.ts b/src/lib/server/userService.ts new file mode 100644 index 0000000..80c41ae --- /dev/null +++ b/src/lib/server/userService.ts @@ -0,0 +1,36 @@ +import { db } from '$lib/server/dbService'; + +export const getUsers = (): { userId: string; userName: string }[] => { + const getUsersSQLStmt = `SELECT id, name + FROM users;`; + const statement = db.prepare(getUsersSQLStmt); + const result = statement.all() as { id: string; name: string }[]; + const userList: { userId: string; userName: string }[] = []; + + for (const resultItem of result) { + const user = { userId: resultItem.id, userName: resultItem.name }; + userList.push(user); + } + + return userList; +}; + +export const addUser = (userName: string, userPassword: string): number => { + const addUserSQLStmt = `INSERT into users(name, pw) + values (?, ?)`; + const statement = db.prepare(addUserSQLStmt); + + let rowCount; + try { + const info = statement.run(userName, userPassword); + rowCount = info.changes; + } catch (error) { + console.log(error); + rowCount = 0; + } + + return rowCount; +}; + +export const deleteUser = () => { +}; diff --git a/src/routes/(angemeldet)/+page.svelte b/src/routes/(angemeldet)/+page.svelte index 6287a40..16f5d0a 100644 --- a/src/routes/(angemeldet)/+page.svelte +++ b/src/routes/(angemeldet)/+page.svelte @@ -42,6 +42,18 @@

    Fügen Sie einem Tatort Bilder hinzu.

    {/if} +
    +
    + +
    + + Benutzerverwaltung + + +

    Füge neue Benutzer hinzu oder entferne welche.

    +
    diff --git a/src/routes/(angemeldet)/user-management/+page.svelte b/src/routes/(angemeldet)/user-management/+page.svelte new file mode 100644 index 0000000..ebff868 --- /dev/null +++ b/src/routes/(angemeldet)/user-management/+page.svelte @@ -0,0 +1,180 @@ + + +

    + Benutzerverwaltung +

    + +

    + Benutzerliste +

    + +
    + + + + + + + + + {#each userList as user} + + + + + {/each} + +
    BenutzernameEntfernen
    {user.userName} + +
    +
    + +

    + Neuer Nutzer +

    + +
    +
    +
    + + +
    + +
    + + +
    +
    +
    + +
    + {#if addUserError} + + {/if} + {#if addUserSuccess} + + {/if} + + +
    + + \ No newline at end of file diff --git a/src/routes/api/users/+server.ts b/src/routes/api/users/+server.ts new file mode 100644 index 0000000..c14b677 --- /dev/null +++ b/src/routes/api/users/+server.ts @@ -0,0 +1,25 @@ +import { json } from '@sveltejs/kit'; +import { addUser, getUsers } from '$lib/server/userService'; + +export function GET({ locals }) { + if (!locals.user) { + return json({ error: 'Unauthorized' }, { status: 401 }); + } + + const users_list = getUsers(); + + return new Response(JSON.stringify(users_list)); +} + +export async function POST({ request, locals }) { + if (!locals.user) { + return json({ error: 'Unauthorized' }, { status: 401 }); + } + + const data = await request.json(); + const userName = data.userName; + const userPassword = data.userPassword; + const rowCount = addUser(userName, userPassword); + + return new Response(null, { status: rowCount == 1 ? 200 : 400 }); +} From dd06c93b1c261dfab1438e796bad87ae2159983d Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Wed, 6 Aug 2025 09:58:00 +0200 Subject: [PATCH 167/343] fix currentUser fetching from loaded data --- src/routes/(angemeldet)/user-management/+page.svelte | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/(angemeldet)/user-management/+page.svelte b/src/routes/(angemeldet)/user-management/+page.svelte index ebff868..a0478a9 100644 --- a/src/routes/(angemeldet)/user-management/+page.svelte +++ b/src/routes/(angemeldet)/user-management/+page.svelte @@ -11,7 +11,7 @@ let userList = $state([]) let addUserError = $state(false); let addUserSuccess = $state(false); - const currentUser: string = data.id; + const currentUser: string = data.user.id; onMount(async () => { userList = await getUsers(); From 4f0526c71f26f9a4c784f7f3c41b66f24a4c25cf Mon Sep 17 00:00:00 2001 From: Chi Cong Tran Date: Wed, 6 Aug 2025 09:59:18 +0200 Subject: [PATCH 168/343] rename loop item variable for userlist-user --- src/routes/(angemeldet)/user-management/+page.svelte | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/routes/(angemeldet)/user-management/+page.svelte b/src/routes/(angemeldet)/user-management/+page.svelte index a0478a9..24fa530 100644 --- a/src/routes/(angemeldet)/user-management/+page.svelte +++ b/src/routes/(angemeldet)/user-management/+page.svelte @@ -88,16 +88,16 @@ - {#each userList as user} + {#each userList as userItem} - {user.userName} + {userItem.userName} + Zugangs-PIN: {vorgang.pin} + {/if}
    @@ -186,7 +188,6 @@ Mit freundlichen Grüßen, }}>{item.name} - {#if item.show_button} + + {#if manualError || error} +

    {manualError || error}

    + {/if} +
    diff --git a/src/routes/(token-based)/list/[vorgang]/+page.server.ts b/src/routes/(token-based)/list/[vorgang]/+page.server.ts index cfacdd7..b8b54e0 100644 --- a/src/routes/(token-based)/list/[vorgang]/+page.server.ts +++ b/src/routes/(token-based)/list/[vorgang]/+page.server.ts @@ -1,17 +1,28 @@ import { getVorgangByToken, getCrimesListByToken } from '$lib/server/vorgangService'; import type { PageServerLoad } from './$types'; -export const load: PageServerLoad = async ({ params, url }) => { +export const load: PageServerLoad = async ({fetch, params, url }) => { const vorgangToken = params.vorgang; const vorgangPIN = url.searchParams.get('pin'); + const adminRes = await fetch(`/api/user`) +const user = await adminRes.json() + const crimesList = await getCrimesListByToken(vorgangToken); // TatortList zum Vorgang - const vorgang = getVorgangByToken(vorgangToken); //einzelner Vorgang + const vorgangObjekt = getVorgangByToken(vorgangToken); //einzelner Vorgang //TypeScript darf nicht undefined sein +let vorgangName:string; + if(vorgangObjekt){ +vorgangName = vorgangObjekt.name; + }else{ + vorgangName = ''; + } return { - crimesList, - vorgangPIN, - vorgang + crimesList, //crimesList + vorgangPIN, //caseToken + vorgangName, //caseId? + vorgangObjekt, + user }; }; diff --git a/src/routes/(token-based)/list/[vorgang]/+page.svelte b/src/routes/(token-based)/list/[vorgang]/+page.svelte index 372a0df..143a061 100644 --- a/src/routes/(token-based)/list/[vorgang]/+page.svelte +++ b/src/routes/(token-based)/list/[vorgang]/+page.svelte @@ -1,7 +1,5 @@ -
    -
    -

    Vorgang {vorgang.name}

    - {#if data?.user?.admin} - Zugangs-PIN: {vorgang.pin} - - {/if} -
    -
    - +
    - Umbenennen - {#if inProgress} -

    Vorgang läuft...

    - {/if} - {#if err} - Fehler beim Umbenennen - {/if} -
    - -
    -
    + Umbenennen + {#if inProgress} +

    Vorgang läuft...

    + {/if} + {#if err} + Fehler beim Umbenennen + {/if} +
    + +
    + +{/if} - - - -{#if href} - - -{:else} - -{/if} diff --git a/src/lib/components/EditableItem.svelte b/src/lib/components/EditableItem.svelte index 33c49c9..8a3c07b 100644 --- a/src/lib/components/EditableItem.svelte +++ b/src/lib/components/EditableItem.svelte @@ -16,7 +16,6 @@ onDelete = () => {} } = $props(); - let names = list.map((l: ListItem) => l.name); let localName = $state(currentName); let wasCancelled = $state(false); @@ -46,6 +45,8 @@ function commitIfValid() { if (!error && !wasCancelled && localName != currentName) { editedName = localName.trim(); + inputRef?.blur(); + isEditing = false; onSave(editedName, currentName); } else { localName = currentName; diff --git a/src/lib/config.ts b/src/lib/config.ts index 0775514..2e2bf34 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').toString()); +export default JSON.parse(readFileSync('./config_prod.json').toString()); diff --git a/src/lib/data/tatort.db b/src/lib/data/tatort.db index a1e5df718fe557992da7640f69c07ec31b3bda19..4fd1b06d57f43de6263e41efdab9415e03c37b7f 100644 GIT binary patch delta 234 zcmZoTz}Rqrae_1>=R_H2M$U~1%jDT!Gw^@of4x~S;6A@1Clj+cV{&3~YB3WBBeOVX zX>n>%F)srH0~3Eg1OIXU{>_34&HNT-Osou{;iax=AS( zNxG)Vrp88wNtS8mi3SywRl3F*7RF|&DH(>7kK5aFF!8Tv;9t*w18CG@eq9abP)1_R pVNz!f<(z!ZUS(1M3(yFlqrXBOEy@XWGuRp?E@o*?5X;cW7yu0{K7{}P delta 125 zcmZoTz}Rqrae_1>%S0JxMwX2U%jDVKFz|olf3sOo;THeI05&-eCT4NYYWFz1J diff --git a/src/routes/(token-based)/list/[vorgang]/+page.server.ts b/src/routes/(token-based)/list/[vorgang]/+page.server.ts deleted file mode 100644 index b8b54e0..0000000 --- a/src/routes/(token-based)/list/[vorgang]/+page.server.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { getVorgangByToken, getCrimesListByToken } from '$lib/server/vorgangService'; -import type { PageServerLoad } from './$types'; - -export const load: PageServerLoad = async ({fetch, params, url }) => { - const vorgangToken = params.vorgang; - const vorgangPIN = url.searchParams.get('pin'); - - const adminRes = await fetch(`/api/user`) -const user = await adminRes.json() - - const crimesList = await getCrimesListByToken(vorgangToken); // TatortList zum Vorgang - const vorgangObjekt = getVorgangByToken(vorgangToken); //einzelner Vorgang //TypeScript darf nicht undefined sein -let vorgangName:string; - if(vorgangObjekt){ -vorgangName = vorgangObjekt.name; - }else{ - vorgangName = ''; - } - - return { - crimesList, //crimesList - vorgangPIN, //caseToken - vorgangName, //caseId? - vorgangObjekt, - user - }; -}; - - -// Ersetze diese Verbindung zum Server durch API Endpunkte - diff --git a/src/routes/(token-based)/list/[vorgang]/+page.svelte b/src/routes/(token-based)/list/[vorgang]/+page.svelte index 143a061..31d2abb 100644 --- a/src/routes/(token-based)/list/[vorgang]/+page.svelte +++ b/src/routes/(token-based)/list/[vorgang]/+page.svelte @@ -9,77 +9,59 @@ import ModalContent from '$lib/components/Modal/ModalContent.svelte'; import ModalFooter from '$lib/components/Modal/ModalFooter.svelte'; import Cube from '$lib/icons/Cube.svelte'; - import EditableItem from '$lib/components/EditableItem.svelte'; - - import { invalidate } from '$app/navigation'; - import { page } from '$app/stores'; + import { invalidate, invalidateAll } from '$app/navigation'; //Seite für die Tatort-Liste let { data } = $props(); - console.log('tatorte: debug ', data); + console.log('tatorte: debug ', data); //zur besseren Nachvollziehbarkeit noch drin gelassen, kann vorm merge gelöscht werden interface ListItem { + //sollte Typ Vorgang sein, aber der einfachheit ist es noch ListItem, damit die Komponente EditableItem für Vorgang und Tatort eingesetzt werden kann name: string; size: number; lastModified: string | number | Date; show_button?: boolean; + prefix?: string; // add other properties as needed } - let vorgang: string = data.vorgangName; // let vorgang = data.caseId; + let vorgangName: string = data.vorgang.vorgangName; // let vorgang = data.caseId; let crimesList: ListItem[] = $state(data.crimesList); - const vorgangPIN: string = data.vorgangPIN; //caseToken?? // const token: string | null = data.caseToken; + const vorgangPIN: string = data.vorgang.vorgangPIN; //caseToken?? // const token: string | null = data.caseToken; + let vorgangToken: string = data.vorgang.vorgangToken; //Variablen für Modal let open = $state(false); let inProgress = $state(false); let err = $state(false); - function uploadSuccessful() { - open = false; - } - //Variabeln für EditableItem - let names: string[] = $state(crimesList.map((l) => l.name)); - let editedName: string = $state(''); - let currentName: string = $state(''); - - let editingId: number; - - // let admin = data?.user?.admin; - let admin = true; - - let rename_input; - - $effect(() => { - console.log('rename_input hat sich geändert:', rename_input); - }); + //Variable um nur admin UI anzuzeigen + let admin = data?.user?.admin; async function handleSave(newName: string, oldName: string) { - console.log('Eltern, speichern erfolgreich', newName, oldName); + open = true; + console.log('Eltern, speichern erfolgreich', newName, oldName); //zur besseren Nachvollziehbarkeit noch drin gelassen, kann vorm merge gelöscht werden try { - const res = await fetch(`/api/list/${vorgang}/${oldName}`, { + const res = await fetch(`/api/list/${vorgangToken}/${oldName}`, { + //irgendwas stimmt hier nicht, vorgangToken führt zu Fehler in API, method: 'PUT', headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ vorgang, oldName, newName }) + body: JSON.stringify({ vorgangToken, oldName, newName }) }); - const clone = res.clone(); - const data = await res.json(); - let message = data.message; - let error = !data.success; - - console.log('Tatort Update: ', message); if (!res.ok) { - const msg = await clone.text(); + const msg = await res.text(); console.error('❌ Fehler beim Speichern:', msg); } else { - console.log('✅ Erfolgreich gespeichert:', newName); - await invalidate(''); - currentName = newName; + await invalidate(`/api/list/${vorgangToken}`); + await invalidateAll(); + crimesList = data.crimesList; + console.log('✅ Erfolgreich gespeichert:', crimesList, data.crimesList, newName); //zur besseren Nachvollziehbarkeit noch drin gelassen, kann vorm merge gelöscht werden + open = false; } } catch (err) { console.error('⚠️ Netzwerkfehler:', err); @@ -87,7 +69,7 @@ } async function handleDelete(tatort: string) { - let url = new URL($page.url); + let url = new URL(data.url); url.pathname += `/${tatort}`; console.log('Delete tatort: ', `/api${url.pathname}`, url.pathname); @@ -97,7 +79,7 @@ headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({ vorgang, tatort }) + body: JSON.stringify({ vorgangToken, tatort }) }); if (!res.ok) { @@ -105,255 +87,67 @@ console.error('❌ Fehler beim Löschen:', msg); } else { console.log('🗑️ Erfolgreich gelöscht:', url.pathname); + await invalidate(`/api/list/${vorgangToken}`); + await invalidateAll(); + crimesList = data.crimesList; } } catch (err) { console.error('⚠️ Netzwerkfehler beim Löschen:', err); } } - // function defocus_element(i: number) { - // let item = crimesList[i]; - // let text_field_id = `label__${item.name}`; + function constructMailToLink() { + const subject = 'Link zum Tatvorgang'; - // let text_field = document.getElementById(text_field_id); - // if (text_field) { - // text_field.setAttribute('contenteditable', 'false'); - // text_field.textContent = item.name; - // } + const link = data.url.origin + data.url.pathname; + const body = `Hallo, - // // reshow button - // crimesList[i].show_button = true; - // return; - // } + hier ist der Link zum Tatvorgang: + ${link} - // async function handleEditFieldInput(ev: KeyboardEvent, listItemIndex: number) { - // let item = crimesList[listItemIndex]; - // if (ev.key == 'Escape') { - // let text_field_id = `label__${item.name}`; + Der Zugangs-PIN wird zur Sicherheit über einen zweiten Kommunikationskanal übermittelt. - // let text_field = document.getElementById(text_field_id); - // if (text_field) { - // text_field.setAttribute('contenteditable', 'false'); - // text_field.textContent = item.name; - // } + Mit freundlichen Grüßen, + `; - // // reshow button - // item.show_button = true; - // return; - // } - // if (ev.key == 'Enter') { - // let name_field = ev.currentTarget as HTMLElement | null; - // let new_name = name_field - // ? name_field.textContent || (name_field as any).innerText || '' - // : ''; + const mailtoLink = `mailto:?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(body)}`; - // if (new_name == '') { - // alert('Bitte einen gültigen Namen eingeben.'); - // ev.preventDefault(); - // return; - // } + return mailtoLink; + } - // // actual upload - // // ------------- - - // // to prevent from item being selected - // ev.preventDefault(); - - // // construct PUT URL - // const url = $page.url.pathname.split('?')[0]; - - // let data_obj: { new_name: string; old_name: string } = { new_name: '', old_name: '' }; - // data_obj['new_name'] = new_name; - // data_obj['old_name'] = - // ev.currentTarget && (ev.currentTarget as HTMLElement).id - // ? (ev.currentTarget as HTMLElement).id.split('__')[1] - // : ''; - - // open = true; - // inProgress = true; - - // const response = await fetch(url, { method: 'PUT', body: JSON.stringify(data_obj) }); - - // inProgress = false; - - // if (!response.ok) { - // err = true; - // if (response.status == 400) { - // let json_res = await response.json(); - // return; - // } - // throw new Error(`Fehlgeschlagen: ${response.status}`); - // } else { - // uploadSuccessful(); - // setTimeout(() => { - // window.location.reload(); - // }, 500); - // } - - // // --- upload finished --- - - // return; - // } - // } - - // function constructMailToLink() { - // const subject = 'Link zum Tatvorgang'; - // const link = $page.url.toString().split('?')[0]; - // const body = `Hallo, - - // hier ist der Link zum Tatvorgang: - // ${link} - - // Der Zugangs-PIN wird zur Sicherheit über einen zweiten Kommunikationskanal übermittelt. - - // Mit freundlichen Grüßen, - // `; - - // const mailtoLink = `mailto:?subject=${encodeURIComponent(subject)}&body=${encodeURIComponent(body)}`; - - // return mailtoLink; - // } + function closeModal() { + open = false; + } -{#if vorgang} +{#if data.vorgang && data.crimesList}
    -

    Vorgang {vorgang}

    +

    Vorgang {vorgangName}

    - + {#if admin} + Zugangs-PIN: {vorgangPIN} + + {/if}