import { Readable } from 'stream'; import { BUCKET, client } from '$lib/minio'; import { fail } from '@sveltejs/kit'; import { v4 as uuidv4 } from 'uuid'; import { db } from '$lib/server/dbService'; import { getVorgangByName, vorgangNameExists } from '$lib/server/vorgangService'; const isRequiredFieldValid = (value: unknown) => { if (value == null) return false; if (typeof value === 'string' || value instanceof String) return value.trim() !== ''; return true; }; export const actions = { url: async ({ request }: { request: Request }) => { const data = await request.formData(); const vorgangName: string | null = data.get('vorgang') as string; const crimeName: string | null = data.get('name') as string; const type: string | null = data.get('type') as string; const vorgangPIN: string | null = data.get('vorgangPIN') as string; const fileName: string | null = data.get('fileName') as string; const vorgangExists = vorgangNameExists(vorgangName); let vorgangToken; if (!vorgangExists) { vorgangToken = uuidv4(); const insertSQLStatement = `INSERT INTO cases (token, name, pin) VALUES (?, ?, ?)`; const statement = db.prepare(insertSQLStatement); statement.run(vorgangToken, vorgangName, vorgangPIN); } else { const vorgang = getVorgangByName(vorgangName); vorgangToken = vorgang.token; if (vorgang && vorgang.pin != vorgangPIN) { const updateSQLStmt = `UPDATE cases SET pin = ? WHERE token = ?`; const statement = db.prepare(updateSQLStmt); statement.run(vorgangPIN, vorgangToken); } } let objectName = `${vorgangToken}/${crimeName}`; switch (type) { case 'image/png': if (!objectName.endsWith('.png')) objectName += '.png'; break; case '': if (fileName?.toString().endsWith('.glb') && !objectName.endsWith('.glb')) objectName += '.glb'; } const url = await client.presignedPutObject(BUCKET, objectName); return { url }; }, validate: async ({ request }: { request: Request }) => { const requestData = await request.formData(); const data = Object.fromEntries(requestData); const vorgang = data.vorgang; const name = data.name; const vorgangPIN = data.vorgangPIN; let success = true; const err = {}; if (isRequiredFieldValid(vorgang)) { err.vorgang = null; } else { err.vorgang = 'Das Feld Vorgang darf nicht leer bleiben.'; success = false; } if (isRequiredFieldValid(name)) { err.name = null; } else { err.name = 'Das Feld Name darf nicht leer bleiben.'; success = false; } if (isRequiredFieldValid(vorgangPIN)) { err.vorgangPIN = null; } else { err.vorgangPIN = 'Das Feld Zugangspasswort darf nicht leer bleiben.'; success = false; } if (success) return { success }; return fail(400, err); }, upload: async ({ request }: { request: Request }) => { const requestData = await request.formData(); const data = Object.fromEntries(requestData); const vorgang = data.vorgang; const name = data.name; const url = await client.presignedPutObject(BUCKET, `${vorgang}/${name}`, 60); return { url }; }, upload3: async ({ request }: { request: Request }) => { const requestData = await request.formData(); const data = Object.fromEntries(requestData); const name = data.name; const stream = data.file.stream(); const metaData = { 'Content-Type': 'model-gtlf-binary', 'X-VorgangsNr': '4711' }; const result = new Promise((resolve, reject) => { client.putObject(BUCKET, name, Readable.from(stream), metaData, function (err, etag) { if (err) return reject(err); resolve(etag); }); }); let etag = null; let error = null; try { etag = await result; } catch (err) { error = err; console.log('Error:', err); } return { etag, error }; } };