156 lines
3.6 KiB
TypeScript
156 lines
3.6 KiB
TypeScript
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;
|
|
};
|