diff --git a/src/lib/minio.ts b/src/lib/minio.ts index 6824b78..49ef470 100644 --- a/src/lib/minio.ts +++ b/src/lib/minio.ts @@ -8,3 +8,5 @@ import config from '$lib/config'; 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 c24a37c..0bf8469 100644 --- a/src/lib/server/vorgangService.ts +++ b/src/lib/server/vorgangService.ts @@ -1,17 +1,49 @@ -import { fail, redirect } from '@sveltejs/kit'; -import { BUCKET, client } from '$lib/minio'; -import { checkIfExactDirectoryExists } from './s3ClientService'; +import { fail } from '@sveltejs/kit'; +import { BUCKET, client, CONFIGFILENAME, TOKENFILENAME } from '$lib/minio'; +import { checkIfExactDirectoryExists, getContentofTextObject } from './s3ClientService'; /** - * Checks if Vorgang exists and token is valid. - * @param request - * @returns redirect to /list/caseId or error + * Get Vorgang and corresponend list of tatorte + * @param caseId + * @returns */ -export const redirectIfVorgangExists = async (request: Request) => { - const data = await request.formData(); - const caseId = data.get('case-id'); - const caseToken = data.get('case-token'); +export const getVorgangByCaseId = async (caseId: string) => { + const prefix = `${caseId}/`; + const stream = client.listObjectsV2(BUCKET, prefix, false, ''); + + 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; +}; + +export const getListOfVorgänge = async () => { + const stream = client.listObjectsV2(BUCKET, '', false, ''); + + const list = []; + for await (const chunk of stream) { + const objPath = `${chunk.prefix}${TOKENFILENAME}`; + + const token = await getContentofTextObject(BUCKET, objPath); + + const cleanedChunkPrefix = chunk.prefix.replace(/\/$/, ''); + list.push({ name: cleanedChunkPrefix, token: token }); + } + return list; +}; + +/** + * Checks if Vorgang exists + * @param request + * @returns fail or true + */ +export const checkIfVorgangExists = async (caseId: string) => { if (!caseId) { return fail(400, { success: false, @@ -28,66 +60,32 @@ export const redirectIfVorgangExists = async (request: Request) => { }); } - 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}`); + return true; }; -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' - } - }); -}; - -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; + if (!caseToken) { + return fail(400, { + success: false, + caseId, + error: { message: 'Bitte Zugangscode eingeben!' } + }); + } - const res = await client.getObject('tatort', objPath); + const token = await getContentofTextObject(BUCKET, objPath); - const savedToken = await new Response(res).text(); + if (!token || token !== caseToken) { + return fail(400, { + success: false, + caseId, + error: { message: 'Der Token ist ungültig.' } + }); + } - return savedToken === 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 be19d11..167b8ef 100644 --- a/src/routes/anmeldung/+page.server.ts +++ b/src/routes/anmeldung/+page.server.ts @@ -1,9 +1,20 @@ import { loginUser, logoutUser } from '$lib/server/authService'; -import { redirectIfVorgangExists } from '$lib/server/vorgangService.js'; - +import { checkIfVorgangExists, hasValidToken } from '$lib/server/vorgangService.js'; +import { redirect } from '@sveltejs/kit'; 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 isVorgangValid = await checkIfVorgangExists(caseId); + if (isVorgangValid !== true) return isVorgangValid; + const isTokenValid = await hasValidToken(caseId, caseToken); + if ( isTokenValid !== true) return isTokenValid; + + throw redirect(303, `/list/${caseId}?token=${caseToken}`); + } } 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 @@
-
+ { - 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 async function DELETE({ params }) { const vorgang = params.vorgang;