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'); /** * Get Vorgang and corresponend list of tatorte * @param caseId * @returns */ 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; }; /** * Get Vorgang * @param caseId * @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); return res; }; /** * Fetches list of vorgänge from s3 bucket * @returns list of available cases */ 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; }; /** * Fetches list of vorgänge from database * @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(); const vorgaenge_list = []; for (const r of res) { const vorg = { token: r.token, name: r.name, pw: r.pw }; vorgaenge_list.push(vorg); } return vorgaenge_list; }; /** * Checks if Vorgang exists * @param request * @returns fail or true */ export const checkIfVorgangExists = async (caseId: string | null) => { if (!caseId) { return fail(400, { success: false, caseId, error: { message: 'Die Vorgangsnummer darf nicht leer sein.' } }); } if (typeof caseId === 'string' && !(await checkIfExactDirectoryExists(caseId))) { return fail(400, { success: false, caseId, error: { message: 'Die Vorgangsnummer existiert in dieser Anwendung nicht.' } }); } return true; }; export const vorgangExists = function (caseId: string | null) { if (!caseId) { return fail(400, { success: false, caseId, error: { message: 'Die Vorgangsnummer darf nicht leer sein.' } }); } let vorgaenge = getVorgaenge(); const vorgaenge_tokens = vorgaenge.map((vorg) => vorg.token); const found = vorgaenge_tokens.indexOf(caseId) != -1; return found; }; export const hasValidToken = async (caseId: string, caseToken: string) => { const objPath = `${caseId}/${TOKENFILENAME}`; try { if (!caseToken) { return false; } const token = await getContentOfTextObject(BUCKET, objPath); if (!token || token !== caseToken) { return false; } return true; } catch (error) { if (error.name == 'S3Error') { console.log(error); return false; } } }; export const tokenValid = function (caseId, caseToken) { if (!caseToken) { return false; } const vorg = getVorgang(caseId); if (!vorg || vorg.pw !== caseToken) { return false; } return true; };