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 @@