diff --git a/src/lib/server/database.ts b/src/lib/server/database.ts
index d95f736..ac090f3 100644
--- a/src/lib/server/database.ts
+++ b/src/lib/server/database.ts
@@ -99,13 +99,13 @@ export class StrikePunishment extends Model {
@Table({ modelName: 'feedback', underscored: true })
export class Feedback extends Model {
- @Column({ type: DataTypes.STRING, allowNull: false, unique: true })
- @Index
- declare url_hash: string;
@Column({ type: DataTypes.STRING, allowNull: false })
declare event: string;
@Column({ type: DataTypes.STRING })
declare content: string;
+ @Column({ type: DataTypes.STRING, allowNull: false, unique: true })
+ @Index
+ declare url_hash: string;
@Column({ type: DataTypes.INTEGER })
@ForeignKey(() => User)
declare user_id: number;
diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte
index 6194bc2..09f6f43 100644
--- a/src/routes/+layout.svelte
+++ b/src/routes/+layout.svelte
@@ -29,6 +29,12 @@
href: `${env.PUBLIC_BASE_PATH}/faq`,
active: false
},
+ {
+ name: 'Feedback & Kontakt',
+ sprite: `${env.PUBLIC_BASE_PATH}/img/menu-feedback.png`,
+ href: `${env.PUBLIC_BASE_PATH}/feedback`,
+ active: false
+ },
{
name: 'Team',
sprite: `${env.PUBLIC_BASE_PATH}/img/menu-team.png`,
diff --git a/src/routes/feedback/+layout.svelte b/src/routes/feedback/+layout.svelte
new file mode 100644
index 0000000..7d25c0b
--- /dev/null
+++ b/src/routes/feedback/+layout.svelte
@@ -0,0 +1,5 @@
+
diff --git a/src/routes/feedback/+page.svelte b/src/routes/feedback/+page.svelte
new file mode 100644
index 0000000..1287757
--- /dev/null
+++ b/src/routes/feedback/+page.svelte
@@ -0,0 +1,122 @@
+
+
+
+ Feedback & Kontakt
+
+
+
+
+
+
+
diff --git a/src/routes/feedback/+page.ts b/src/routes/feedback/+page.ts
deleted file mode 100644
index 826ac63..0000000
--- a/src/routes/feedback/+page.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import type { PageLoad } from './$types';
-import { redirect } from '@sveltejs/kit';
-import { env } from '$env/dynamic/public';
-
-export const load: PageLoad = async () => {
- throw redirect(302, `${env.PUBLIC_BASE_PATH}/`);
-};
diff --git a/src/routes/feedback/+server.ts b/src/routes/feedback/+server.ts
new file mode 100644
index 0000000..d778e46
--- /dev/null
+++ b/src/routes/feedback/+server.ts
@@ -0,0 +1,20 @@
+import type { RequestHandler } from '@sveltejs/kit';
+import { Feedback } from '$lib/server/database';
+import { FeedbackSubmitSchema } from './schema';
+import crypto from 'crypto';
+
+export const POST = (async ({ request }) => {
+ const parseResult = await FeedbackSubmitSchema.safeParseAsync(await request.json());
+ if (!parseResult.success) {
+ return new Response(null, { status: 400 });
+ }
+ const data = parseResult.data;
+
+ await Feedback.create({
+ event: `website-${data.type}`,
+ content: data.content,
+ url_hash: crypto.randomBytes(18).toString('hex')
+ });
+
+ return new Response(null, { status: 200 });
+}) satisfies RequestHandler;
diff --git a/src/routes/feedback/[...url_hash]/+layout.svelte b/src/routes/feedback/[...url_hash]/+layout.svelte
deleted file mode 100644
index 9001a18..0000000
--- a/src/routes/feedback/[...url_hash]/+layout.svelte
+++ /dev/null
@@ -1,3 +0,0 @@
-
-
-
diff --git a/src/routes/feedback/[...url_hash]/+page.svelte b/src/routes/feedback/[...url_hash]/+page.svelte
index 022c0fc..56cee00 100644
--- a/src/routes/feedback/[...url_hash]/+page.svelte
+++ b/src/routes/feedback/[...url_hash]/+page.svelte
@@ -13,18 +13,16 @@
-
- {#if data.draft}
-
- (data.draft = false)}
- />
-
- {:else}
-
-
-
- {/if}
-
+{#if data.draft}
+
+ (data.draft = false)}
+ />
+
+{:else}
+
+
+
+{/if}
diff --git a/src/routes/feedback/schema.ts b/src/routes/feedback/schema.ts
new file mode 100644
index 0000000..c6fb53a
--- /dev/null
+++ b/src/routes/feedback/schema.ts
@@ -0,0 +1,6 @@
+import { z } from 'zod';
+
+export const FeedbackSubmitSchema = z.object({
+ content: z.string(),
+ type: z.enum(['feedback', 'contact'])
+});
diff --git a/static/img/menu-feedback.png b/static/img/menu-feedback.png
new file mode 100644
index 0000000..074373f
Binary files /dev/null and b/static/img/menu-feedback.png differ