From 882603d075e91e266abf461cb26d448ecf3ab7b6 Mon Sep 17 00:00:00 2001 From: titver968 Date: Tue, 25 Feb 2025 14:49:28 +0100 Subject: [PATCH] src copy from Markus --- tatort/src/app.css | 3 + tatort/src/app.d.ts | 9 +- tatort/src/app.html | 6 +- tatort/src/hooks.server.js | 16 ++ tatort/src/index.test.js | 7 + tatort/src/lib/auth.js | 29 +++ tatort/src/lib/components/ui/Alert.svelte | 57 ++++ tatort/src/lib/components/ui/Button.svelte | 202 +++++++++++++++ .../lib/components/ui/DeleteIconButton.svelte | 70 +++++ .../src/lib/components/ui/Modal/Modal.svelte | 103 ++++++++ .../components/ui/Modal/ModalContent.svelte | 28 ++ .../components/ui/Modal/ModalFooter.svelte | 3 + .../lib/components/ui/Modal/ModalTitle.svelte | 5 + .../src/lib/components/ui/Notification.svelte | 87 +++++++ tatort/src/lib/components/ui/Panel.svelte | 17 ++ tatort/src/lib/components/ui/Select.svelte | 126 +++++++++ tatort/src/lib/config.js | 3 + tatort/src/lib/helper/caseNumberOccupied.js | 22 ++ tatort/src/lib/helper/shortenFileSize.js | 22 ++ tatort/src/lib/helper/timeElapsed.js | 33 +++ tatort/src/lib/icons/Arrow-left.svelte | 13 + tatort/src/lib/icons/Arrow-right.svelte | 13 + tatort/src/lib/icons/Bell.svelte | 14 + tatort/src/lib/icons/Book.svelte | 13 + tatort/src/lib/icons/Check.svelte | 13 + tatort/src/lib/icons/Chevron-left.svelte | 8 + tatort/src/lib/icons/Chevron-right.svelte | 8 + tatort/src/lib/icons/Chevron.svelte | 10 + tatort/src/lib/icons/Drag.svelte | 16 ++ .../src/lib/icons/Exclamation-circle.svelte | 13 + tatort/src/lib/icons/Exclamation.svelte | 13 + tatort/src/lib/icons/Info.svelte | 13 + tatort/src/lib/icons/Login.svelte | 14 + tatort/src/lib/icons/Play.svelte | 18 ++ tatort/src/lib/icons/Plus.svelte | 15 ++ .../src/lib/icons/Question-mark-circle.svelte | 13 + tatort/src/lib/icons/Selector.svelte | 13 + tatort/src/lib/icons/Trash.svelte | 14 + tatort/src/lib/icons/X.svelte | 13 + tatort/src/lib/minio.js | 6 + .../src/routes/(angemeldet)/+layout.server.js | 9 + tatort/src/routes/(angemeldet)/+layout.svelte | 96 +++++++ tatort/src/routes/(angemeldet)/+page.svelte | 123 +++++++++ .../src/routes/(angemeldet)/list/+page.svelte | 75 ++++++ .../(angemeldet)/list/[vorgang]/+page.svelte | 92 +++++++ .../(angemeldet)/tatorte/+page.server.js | 37 +++ .../routes/(angemeldet)/tatorte/+page.svelte | 99 +++++++ .../(angemeldet)/upload/+page.server.js | 103 ++++++++ .../routes/(angemeldet)/upload/+page.svelte | 244 ++++++++++++++++++ .../routes/(angemeldet)/view/+page.server.js | 27 ++ .../src/routes/(angemeldet)/view/+page.svelte | 64 +++++ .../view/[vorgang]/[tatort]/+page.server.js | 8 + .../view/[vorgang]/[tatort]/+page.svelte | 55 ++++ tatort/src/routes/+layout.svelte | 5 + tatort/src/routes/anmeldung/+layout.svelte | 1 + tatort/src/routes/anmeldung/+page.server.js | 31 +++ tatort/src/routes/anmeldung/+page.svelte | 75 ++++++ .../routes/api/list/[[vorgang]]/+server.js | 35 +++ tatort/src/routes/api/tatort/+server.js | 26 ++ tatort/src/routes/api/upload/+server.js | 6 + 60 files changed, 2306 insertions(+), 6 deletions(-) create mode 100644 tatort/src/app.css create mode 100644 tatort/src/hooks.server.js create mode 100644 tatort/src/index.test.js create mode 100644 tatort/src/lib/auth.js create mode 100644 tatort/src/lib/components/ui/Alert.svelte create mode 100644 tatort/src/lib/components/ui/Button.svelte create mode 100644 tatort/src/lib/components/ui/DeleteIconButton.svelte create mode 100644 tatort/src/lib/components/ui/Modal/Modal.svelte create mode 100644 tatort/src/lib/components/ui/Modal/ModalContent.svelte create mode 100644 tatort/src/lib/components/ui/Modal/ModalFooter.svelte create mode 100644 tatort/src/lib/components/ui/Modal/ModalTitle.svelte create mode 100644 tatort/src/lib/components/ui/Notification.svelte create mode 100644 tatort/src/lib/components/ui/Panel.svelte create mode 100644 tatort/src/lib/components/ui/Select.svelte create mode 100644 tatort/src/lib/config.js create mode 100644 tatort/src/lib/helper/caseNumberOccupied.js create mode 100644 tatort/src/lib/helper/shortenFileSize.js create mode 100644 tatort/src/lib/helper/timeElapsed.js create mode 100644 tatort/src/lib/icons/Arrow-left.svelte create mode 100644 tatort/src/lib/icons/Arrow-right.svelte create mode 100644 tatort/src/lib/icons/Bell.svelte create mode 100644 tatort/src/lib/icons/Book.svelte create mode 100644 tatort/src/lib/icons/Check.svelte create mode 100644 tatort/src/lib/icons/Chevron-left.svelte create mode 100644 tatort/src/lib/icons/Chevron-right.svelte create mode 100644 tatort/src/lib/icons/Chevron.svelte create mode 100644 tatort/src/lib/icons/Drag.svelte create mode 100644 tatort/src/lib/icons/Exclamation-circle.svelte create mode 100644 tatort/src/lib/icons/Exclamation.svelte create mode 100644 tatort/src/lib/icons/Info.svelte create mode 100644 tatort/src/lib/icons/Login.svelte create mode 100644 tatort/src/lib/icons/Play.svelte create mode 100644 tatort/src/lib/icons/Plus.svelte create mode 100644 tatort/src/lib/icons/Question-mark-circle.svelte create mode 100644 tatort/src/lib/icons/Selector.svelte create mode 100644 tatort/src/lib/icons/Trash.svelte create mode 100644 tatort/src/lib/icons/X.svelte create mode 100644 tatort/src/lib/minio.js create mode 100644 tatort/src/routes/(angemeldet)/+layout.server.js create mode 100644 tatort/src/routes/(angemeldet)/+layout.svelte create mode 100644 tatort/src/routes/(angemeldet)/+page.svelte create mode 100644 tatort/src/routes/(angemeldet)/list/+page.svelte create mode 100644 tatort/src/routes/(angemeldet)/list/[vorgang]/+page.svelte create mode 100644 tatort/src/routes/(angemeldet)/tatorte/+page.server.js create mode 100644 tatort/src/routes/(angemeldet)/tatorte/+page.svelte create mode 100644 tatort/src/routes/(angemeldet)/upload/+page.server.js create mode 100644 tatort/src/routes/(angemeldet)/upload/+page.svelte create mode 100644 tatort/src/routes/(angemeldet)/view/+page.server.js create mode 100644 tatort/src/routes/(angemeldet)/view/+page.svelte create mode 100644 tatort/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.server.js create mode 100644 tatort/src/routes/(angemeldet)/view/[vorgang]/[tatort]/+page.svelte create mode 100644 tatort/src/routes/+layout.svelte create mode 100644 tatort/src/routes/anmeldung/+layout.svelte create mode 100644 tatort/src/routes/anmeldung/+page.server.js create mode 100644 tatort/src/routes/anmeldung/+page.svelte create mode 100644 tatort/src/routes/api/list/[[vorgang]]/+server.js create mode 100644 tatort/src/routes/api/tatort/+server.js create mode 100644 tatort/src/routes/api/upload/+server.js diff --git a/tatort/src/app.css b/tatort/src/app.css new file mode 100644 index 0000000..bd6213e --- /dev/null +++ b/tatort/src/app.css @@ -0,0 +1,3 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; \ No newline at end of file diff --git a/tatort/src/app.d.ts b/tatort/src/app.d.ts index da08e6d..5ab1fbb 100644 --- a/tatort/src/app.d.ts +++ b/tatort/src/app.d.ts @@ -1,13 +1,14 @@ -// See https://svelte.dev/docs/kit/types#app.d.ts +// See https://kit.svelte.dev/docs/types#app // for information about these interfaces declare global { namespace App { // interface Error {} - // interface Locals {} + interface Locals { + user: any + } // interface PageData {} - // interface PageState {} // interface Platform {} } } -export {}; +export { }; diff --git a/tatort/src/app.html b/tatort/src/app.html index 77a5ff5..6302e29 100644 --- a/tatort/src/app.html +++ b/tatort/src/app.html @@ -1,9 +1,11 @@ - + + Tatort + - + %sveltekit.head% diff --git a/tatort/src/hooks.server.js b/tatort/src/hooks.server.js new file mode 100644 index 0000000..19b1bcc --- /dev/null +++ b/tatort/src/hooks.server.js @@ -0,0 +1,16 @@ +import { decryptToken } from '$lib/auth'; + +/** @type {import('@sveltejs/kit').Handle} */ +export async function handle({ event, resolve }) { + const jwt = event.cookies.get('session'); + try { + if (jwt) { + event.locals.user = decryptToken(jwt); + return resolve(event); + } + } catch (err) { + await event.cookies.delete('session'); + event.locals.user = null; + } + return resolve(event); +} diff --git a/tatort/src/index.test.js b/tatort/src/index.test.js new file mode 100644 index 0000000..e07cbbd --- /dev/null +++ b/tatort/src/index.test.js @@ -0,0 +1,7 @@ +import { describe, it, expect } from 'vitest'; + +describe('sum test', () => { + it('adds 1 + 2 to equal 3', () => { + expect(1 + 2).toBe(3); + }); +}); diff --git a/tatort/src/lib/auth.js b/tatort/src/lib/auth.js new file mode 100644 index 0000000..19d290a --- /dev/null +++ b/tatort/src/lib/auth.js @@ -0,0 +1,29 @@ +import jwt from 'jsonwebtoken'; + +import config from '$lib/config'; + +const SECRET = config.jwt.secret; +const EXPIRES_IN = config.jwt.expiresIn; + +const AUTH = config.auth; + +export function createToken(userData) { + return jwt.sign(userData, SECRET, { expiresIn: EXPIRES_IN }); +} + +export function decryptToken(token) { + return jwt.verify(token, SECRET); +} + +export function authenticate(user, pass) { + let userData = null; + + if (AUTH[user]) { + const { password, ...data } = AUTH[user]; + if (password && password === pass) userData = data; + } + + if (userData == null) return null; + + return createToken({ id: user, ...userData }); +} diff --git a/tatort/src/lib/components/ui/Alert.svelte b/tatort/src/lib/components/ui/Alert.svelte new file mode 100644 index 0000000..d461847 --- /dev/null +++ b/tatort/src/lib/components/ui/Alert.svelte @@ -0,0 +1,57 @@ + + + + +
+ +
diff --git a/tatort/src/lib/components/ui/Button.svelte b/tatort/src/lib/components/ui/Button.svelte new file mode 100644 index 0000000..dd05a7b --- /dev/null +++ b/tatort/src/lib/components/ui/Button.svelte @@ -0,0 +1,202 @@ + + + + +{#if href} + + +{:else} + +{/if} diff --git a/tatort/src/lib/components/ui/DeleteIconButton.svelte b/tatort/src/lib/components/ui/DeleteIconButton.svelte new file mode 100644 index 0000000..e2ef84c --- /dev/null +++ b/tatort/src/lib/components/ui/DeleteIconButton.svelte @@ -0,0 +1,70 @@ + + + + +
+ + + + {#if active} + + + + {/if} +
diff --git a/tatort/src/lib/components/ui/Modal/Modal.svelte b/tatort/src/lib/components/ui/Modal/Modal.svelte new file mode 100644 index 0000000..bdf0705 --- /dev/null +++ b/tatort/src/lib/components/ui/Modal/Modal.svelte @@ -0,0 +1,103 @@ + + + + + +
+
+ + +
diff --git a/tatort/src/lib/components/ui/Modal/ModalContent.svelte b/tatort/src/lib/components/ui/Modal/ModalContent.svelte new file mode 100644 index 0000000..d791e1a --- /dev/null +++ b/tatort/src/lib/components/ui/Modal/ModalContent.svelte @@ -0,0 +1,28 @@ + + + + +
+ +
diff --git a/tatort/src/lib/components/ui/Modal/ModalFooter.svelte b/tatort/src/lib/components/ui/Modal/ModalFooter.svelte new file mode 100644 index 0000000..9a6eb5d --- /dev/null +++ b/tatort/src/lib/components/ui/Modal/ModalFooter.svelte @@ -0,0 +1,3 @@ +
+ +
diff --git a/tatort/src/lib/components/ui/Modal/ModalTitle.svelte b/tatort/src/lib/components/ui/Modal/ModalTitle.svelte new file mode 100644 index 0000000..b39036b --- /dev/null +++ b/tatort/src/lib/components/ui/Modal/ModalTitle.svelte @@ -0,0 +1,5 @@ +
+ +
diff --git a/tatort/src/lib/components/ui/Notification.svelte b/tatort/src/lib/components/ui/Notification.svelte new file mode 100644 index 0000000..247e902 --- /dev/null +++ b/tatort/src/lib/components/ui/Notification.svelte @@ -0,0 +1,87 @@ + + +
+ +
+
+
+
+ + +
+
+

{title}

+

+ +

+
+
+ +
+
+
+
+
diff --git a/tatort/src/lib/components/ui/Panel.svelte b/tatort/src/lib/components/ui/Panel.svelte new file mode 100644 index 0000000..ab1a807 --- /dev/null +++ b/tatort/src/lib/components/ui/Panel.svelte @@ -0,0 +1,17 @@ + + + + +
+ +
diff --git a/tatort/src/lib/components/ui/Select.svelte b/tatort/src/lib/components/ui/Select.svelte new file mode 100644 index 0000000..d5752f3 --- /dev/null +++ b/tatort/src/lib/components/ui/Select.svelte @@ -0,0 +1,126 @@ + + + + +
+
+ + +
+
    + + {#each options as option, index} +
  • { + selectOnChange(index); + }} + id="listbox-item-0" + role="option" + class="group relative cursor-default select-none py-2 pl-3 pr-9 text-gray-900 hover:bg-blue-500 hover:text-white" + > +
    + {#if option.img} + {option.alt} + {/if} + + + {option.title} + +
    + {#if selected === index} + + + + {/if} +
  • + {/each} +
+
+
+
diff --git a/tatort/src/lib/config.js b/tatort/src/lib/config.js new file mode 100644 index 0000000..5c34af3 --- /dev/null +++ b/tatort/src/lib/config.js @@ -0,0 +1,3 @@ +import { readFileSync } from 'fs'; + +export default JSON.parse(readFileSync('./config.json')); diff --git a/tatort/src/lib/helper/caseNumberOccupied.js b/tatort/src/lib/helper/caseNumberOccupied.js new file mode 100644 index 0000000..50062e8 --- /dev/null +++ b/tatort/src/lib/helper/caseNumberOccupied.js @@ -0,0 +1,22 @@ +import { client } from '$lib/minio'; + +/** + * Check if caseNumber is used + * @param {string} caseNumber + * @returns {Promise { + let stream = client.listObjectsV2('tatort', prefix, false, ''); + stream.on('data', () => { + stream.destroy(); + resolve(true); + }); + stream.on('end', () => { + resolve(false); + }); + }); + + return promise; +} diff --git a/tatort/src/lib/helper/shortenFileSize.js b/tatort/src/lib/helper/shortenFileSize.js new file mode 100644 index 0000000..1525dfb --- /dev/null +++ b/tatort/src/lib/helper/shortenFileSize.js @@ -0,0 +1,22 @@ +const KILO = 1024; +const MEGA = KILO * KILO; +const GIGA = MEGA * KILO; + +/** + * Shortens the size in bytes + * @param {number} size + * @returns{string} + */ +export default function shortenFileSize(size) { + const giga = Math.floor(size / GIGA); + let remainder = size % GIGA; + const mega = Math.floor(remainder / MEGA); + remainder %= MEGA; + const kilo = Math.floor(remainder / KILO); + remainder %= KILO; + + if (giga > 0) return `${giga} GB`; + if (mega > 0) return `${mega} MB`; + if (kilo > 0) return `${kilo} kB`; + return `${remainder} B`; +} diff --git a/tatort/src/lib/helper/timeElapsed.js b/tatort/src/lib/helper/timeElapsed.js new file mode 100644 index 0000000..b2f8a73 --- /dev/null +++ b/tatort/src/lib/helper/timeElapsed.js @@ -0,0 +1,33 @@ +const MINUTE = 60; +const HOUR = 60 * MINUTE; +const DAY = 24 * HOUR; +const YEAR = 365 * DAY; +const MONTH = YEAR / 12; + +/** + * get readable string of time elapsed since date + * @param {Date} date + * @returns string + */ +export default function timeElapsed(date) { + const now = new Date(); + const age = Math.floor((now.getTime() - date.getTime()) / 1000); + + const years = Math.floor(age / YEAR); + let remainder = age % YEAR; + const months = Math.floor(remainder / MONTH); + remainder %= MONTH; + const days = Math.floor(remainder / DAY); + remainder %= DAY; + const hours = Math.floor(remainder / HOUR); + remainder %= HOUR; + const minutes = Math.floor(remainder / MINUTE); + const seconds = remainder % MINUTE; + if (years > 0) return years === 1 ? 'vor 1 Jahr' : `vor ${years} Jahren`; + if (months > 0) return months === 1 ? 'vor 1 Monat' : `vor ${months} Monaten`; + if (days > 0) return days === 1 ? 'vor 1 Tag' : `vor ${days} Tagen`; + if (hours > 0) return hours === 1 ? 'vor 1 Stunde' : `vor ${hours} Stunden`; + if (minutes > 0) return minutes === 1 ? 'vor 1 Minute' : `vor ${minutes} Minuten`; + + return seconds === 1 ? 'vor 1 Sekunde' : `vor ${seconds} Sekunden`; +} diff --git a/tatort/src/lib/icons/Arrow-left.svelte b/tatort/src/lib/icons/Arrow-left.svelte new file mode 100644 index 0000000..5b98b38 --- /dev/null +++ b/tatort/src/lib/icons/Arrow-left.svelte @@ -0,0 +1,13 @@ + diff --git a/tatort/src/lib/icons/Arrow-right.svelte b/tatort/src/lib/icons/Arrow-right.svelte new file mode 100644 index 0000000..cb9c9e9 --- /dev/null +++ b/tatort/src/lib/icons/Arrow-right.svelte @@ -0,0 +1,13 @@ + diff --git a/tatort/src/lib/icons/Bell.svelte b/tatort/src/lib/icons/Bell.svelte new file mode 100644 index 0000000..0ec709c --- /dev/null +++ b/tatort/src/lib/icons/Bell.svelte @@ -0,0 +1,14 @@ + + + diff --git a/tatort/src/lib/icons/Book.svelte b/tatort/src/lib/icons/Book.svelte new file mode 100644 index 0000000..4cc27f3 --- /dev/null +++ b/tatort/src/lib/icons/Book.svelte @@ -0,0 +1,13 @@ + diff --git a/tatort/src/lib/icons/Check.svelte b/tatort/src/lib/icons/Check.svelte new file mode 100644 index 0000000..1189789 --- /dev/null +++ b/tatort/src/lib/icons/Check.svelte @@ -0,0 +1,13 @@ + diff --git a/tatort/src/lib/icons/Chevron-left.svelte b/tatort/src/lib/icons/Chevron-left.svelte new file mode 100644 index 0000000..2a34fa5 --- /dev/null +++ b/tatort/src/lib/icons/Chevron-left.svelte @@ -0,0 +1,8 @@ + diff --git a/tatort/src/lib/icons/Chevron-right.svelte b/tatort/src/lib/icons/Chevron-right.svelte new file mode 100644 index 0000000..8b7440d --- /dev/null +++ b/tatort/src/lib/icons/Chevron-right.svelte @@ -0,0 +1,8 @@ + diff --git a/tatort/src/lib/icons/Chevron.svelte b/tatort/src/lib/icons/Chevron.svelte new file mode 100644 index 0000000..5440f50 --- /dev/null +++ b/tatort/src/lib/icons/Chevron.svelte @@ -0,0 +1,10 @@ + diff --git a/tatort/src/lib/icons/Drag.svelte b/tatort/src/lib/icons/Drag.svelte new file mode 100644 index 0000000..97def46 --- /dev/null +++ b/tatort/src/lib/icons/Drag.svelte @@ -0,0 +1,16 @@ + diff --git a/tatort/src/lib/icons/Exclamation-circle.svelte b/tatort/src/lib/icons/Exclamation-circle.svelte new file mode 100644 index 0000000..0b9c550 --- /dev/null +++ b/tatort/src/lib/icons/Exclamation-circle.svelte @@ -0,0 +1,13 @@ + diff --git a/tatort/src/lib/icons/Exclamation.svelte b/tatort/src/lib/icons/Exclamation.svelte new file mode 100644 index 0000000..f35ed58 --- /dev/null +++ b/tatort/src/lib/icons/Exclamation.svelte @@ -0,0 +1,13 @@ + diff --git a/tatort/src/lib/icons/Info.svelte b/tatort/src/lib/icons/Info.svelte new file mode 100644 index 0000000..560be4c --- /dev/null +++ b/tatort/src/lib/icons/Info.svelte @@ -0,0 +1,13 @@ + diff --git a/tatort/src/lib/icons/Login.svelte b/tatort/src/lib/icons/Login.svelte new file mode 100644 index 0000000..b164996 --- /dev/null +++ b/tatort/src/lib/icons/Login.svelte @@ -0,0 +1,14 @@ + + diff --git a/tatort/src/lib/icons/Play.svelte b/tatort/src/lib/icons/Play.svelte new file mode 100644 index 0000000..1c78552 --- /dev/null +++ b/tatort/src/lib/icons/Play.svelte @@ -0,0 +1,18 @@ + diff --git a/tatort/src/lib/icons/Plus.svelte b/tatort/src/lib/icons/Plus.svelte new file mode 100644 index 0000000..50dfeb3 --- /dev/null +++ b/tatort/src/lib/icons/Plus.svelte @@ -0,0 +1,15 @@ + diff --git a/tatort/src/lib/icons/Question-mark-circle.svelte b/tatort/src/lib/icons/Question-mark-circle.svelte new file mode 100644 index 0000000..4a2645c --- /dev/null +++ b/tatort/src/lib/icons/Question-mark-circle.svelte @@ -0,0 +1,13 @@ + diff --git a/tatort/src/lib/icons/Selector.svelte b/tatort/src/lib/icons/Selector.svelte new file mode 100644 index 0000000..81fdec3 --- /dev/null +++ b/tatort/src/lib/icons/Selector.svelte @@ -0,0 +1,13 @@ + diff --git a/tatort/src/lib/icons/Trash.svelte b/tatort/src/lib/icons/Trash.svelte new file mode 100644 index 0000000..2199194 --- /dev/null +++ b/tatort/src/lib/icons/Trash.svelte @@ -0,0 +1,14 @@ + + + diff --git a/tatort/src/lib/icons/X.svelte b/tatort/src/lib/icons/X.svelte new file mode 100644 index 0000000..56582da --- /dev/null +++ b/tatort/src/lib/icons/X.svelte @@ -0,0 +1,13 @@ + diff --git a/tatort/src/lib/minio.js b/tatort/src/lib/minio.js new file mode 100644 index 0000000..3f1b6b7 --- /dev/null +++ b/tatort/src/lib/minio.js @@ -0,0 +1,6 @@ +import Minio from 'minio'; +import config from '$lib/config'; + +process.env['NODE_TLS_REJECT_UNAUTHORIZED'] = '0'; + +export const client = new Minio.Client(config.minio); diff --git a/tatort/src/routes/(angemeldet)/+layout.server.js b/tatort/src/routes/(angemeldet)/+layout.server.js new file mode 100644 index 0000000..c54cfba --- /dev/null +++ b/tatort/src/routes/(angemeldet)/+layout.server.js @@ -0,0 +1,9 @@ +import { redirect } from '@sveltejs/kit'; + +/** @type {import('./$types').PageServerLoad} */ +export function load(event) { + if (!event.locals.user && event.url.pathname !== '/anmeldung') throw redirect(303, '/anmeldung'); + return { + user: event.locals.user + }; +} diff --git a/tatort/src/routes/(angemeldet)/+layout.svelte b/tatort/src/routes/(angemeldet)/+layout.svelte new file mode 100644 index 0000000..bbc47d3 --- /dev/null +++ b/tatort/src/routes/(angemeldet)/+layout.svelte @@ -0,0 +1,96 @@ + + +
+
+
+ +
+
+ +
+ +
+
diff --git a/tatort/src/routes/(angemeldet)/+page.svelte b/tatort/src/routes/(angemeldet)/+page.svelte new file mode 100644 index 0000000..dc92470 --- /dev/null +++ b/tatort/src/routes/(angemeldet)/+page.svelte @@ -0,0 +1,123 @@ + + + + +
+
+ {#if data.user.admin} +
+
+ + + +
+ + Liste + + +

+ Verschaffe Dir einen Überblick über alle gespeicherten Tatorte. +

+
+ {/if} + {#if data.user.admin} +
+
+ + + +
+ + Neueer Vorgang + + +

Stelle einen weiteren Tatort für die Anwendung bereit.

+
+ {/if} + {#if data.user.admin} +
+
+ +
+ + Hinzufügen + + +

Fügen Sie einem Tatort Bilder hinzu.

+
+ {/if} +
+
+ + + +
+ + Ansicht + + +

Schau Dir einen Tatort in der 3D Ansicht an.

+
+
+
diff --git a/tatort/src/routes/(angemeldet)/list/+page.svelte b/tatort/src/routes/(angemeldet)/list/+page.svelte new file mode 100644 index 0000000..fff40ab --- /dev/null +++ b/tatort/src/routes/(angemeldet)/list/+page.svelte @@ -0,0 +1,75 @@ + + + + +
+
+

Liste der Vorgänge

+
+
+ +
+
diff --git a/tatort/src/routes/(angemeldet)/list/[vorgang]/+page.svelte b/tatort/src/routes/(angemeldet)/list/[vorgang]/+page.svelte new file mode 100644 index 0000000..9b4c240 --- /dev/null +++ b/tatort/src/routes/(angemeldet)/list/[vorgang]/+page.svelte @@ -0,0 +1,92 @@ + + + + + diff --git a/tatort/src/routes/(angemeldet)/tatorte/+page.server.js b/tatort/src/routes/(angemeldet)/tatorte/+page.server.js new file mode 100644 index 0000000..48f197d --- /dev/null +++ b/tatort/src/routes/(angemeldet)/tatorte/+page.server.js @@ -0,0 +1,37 @@ +import { client } from '$lib/minio'; +import { fail } from '@sveltejs/kit'; + +import caseNumberOccupied from '$lib/helper/caseNumberOccupied'; + +/** @type {import('./$types').Actions} */ +export const actions = { + default: async ({ request }) => { + const data = await request.formData(); + const caseNumber = data.get('caseNumber'); + const description = data.get('description'); + + if (!caseNumber) { + return fail(400, { + caseNumber, + description, + error: { caseNumber: 'Es muss eine Vorgangsnummer vorhanden sein.' } + }); + } + + if (await caseNumberOccupied(`${caseNumber}`)) { + return fail(400, { + caseNumber, + description, + error: { caseNumber: 'Die Vorgangsnummer wurde im System bereits angelegt.' } + }); + } + + const config = `${JSON.stringify({ caseNumber, description, version: 1 })}\n`; + + await client.putObject('tatort', `${caseNumber}/config.json`, config, { + 'Content-Type': 'application/json' + }); + + return { success: true }; + } +}; diff --git a/tatort/src/routes/(angemeldet)/tatorte/+page.svelte b/tatort/src/routes/(angemeldet)/tatorte/+page.svelte new file mode 100644 index 0000000..8b657e5 --- /dev/null +++ b/tatort/src/routes/(angemeldet)/tatorte/+page.svelte @@ -0,0 +1,99 @@ + + +
+
+

Neuer Vorgang

+
+ +
+
+
+

+ This information will be displayed publicly so be careful what you share. +

+ +
+
+ +
+
+ +
+
+ {#if form?.error?.caseNumber} +

{form.error.caseNumber}

+ {/if} +
+ +
+ +
+