+ export let id: string | null = null;
+ export let name: string | null = null;
+ export let value: string | null = null;
+ export let label: string | null = null;
+ export let notice: string | null = null;
+ export let required = false;
+ export let disabled = false;
+ export let size: 'xs' | 'sm' | 'md' | 'lg' = 'md';
+ export let rows = 2;
+
+
+
diff --git a/src/lib/server/database.ts b/src/lib/server/database.ts
index 1108d53..0325a46 100644
--- a/src/lib/server/database.ts
+++ b/src/lib/server/database.ts
@@ -5,15 +5,17 @@ import * as bcrypt from 'bcrypt';
import {
BeforeCreate,
BeforeUpdate,
+ BelongsTo,
Column,
+ ForeignKey,
+ Index,
Model,
Sequelize,
- Table,
- Unique
+ Table
} from 'sequelize-typescript';
import { Permissions } from '$lib/permissions';
-@Table({ modelName: 'user' })
+@Table({ modelName: 'user', underscored: true })
export class User extends Model {
@Column({ type: DataTypes.STRING, allowNull: false })
declare firstname: string;
@@ -30,10 +32,37 @@ export class User extends Model {
@Column({ type: DataTypes.STRING })
declare password: string;
@Column({ type: DataTypes.UUIDV4 })
+ @Index
declare uuid: string;
}
-@Table({ modelName: 'admin' })
+@Table({ modelName: 'report', underscored: true })
+export class Report extends Model {
+ @Column({ type: DataTypes.STRING, allowNull: false, unique: true })
+ @Index
+ declare url_id: string;
+ @Column({ type: DataTypes.STRING, allowNull: false })
+ declare subject: string;
+ @Column({ type: DataTypes.STRING })
+ declare body: string;
+ @Column({ type: DataTypes.BOOLEAN, allowNull: false })
+ declare draft: boolean;
+ @Column({ type: DataTypes.BOOLEAN, allowNull: false })
+ declare completed: boolean;
+ @Column({ type: DataTypes.INTEGER, allowNull: false })
+ @ForeignKey(() => User)
+ declare reporter_user_id: number;
+ @Column({ type: DataTypes.INTEGER, allowNull: false })
+ @ForeignKey(() => User)
+ declare reported_user_id: number;
+
+ @BelongsTo(() => User)
+ declare reporter: User;
+ @BelongsTo(() => User)
+ declare reported: User;
+}
+
+@Table({ modelName: 'admin', underscored: true })
export class Admin extends Model {
@Column({ type: DataTypes.STRING, allowNull: false, unique: true })
declare username: string;
@@ -68,5 +97,5 @@ export class Admin extends Model {
export const sequelize = new Sequelize(building ? 'sqlite::memory:' : env.DATABASE_URI, {
// only log sql queries in dev mode
logging: dev ? console.log : false,
- models: [User, Admin]
+ models: [User, Report, Admin]
});
diff --git a/src/routes/admin/admin/+layout.svelte b/src/routes/admin/admin/+layout.svelte
index c281020..e6e435a 100644
--- a/src/routes/admin/admin/+layout.svelte
+++ b/src/routes/admin/admin/+layout.svelte
@@ -1,3 +1,3 @@
-
+
diff --git a/src/routes/report/+page.svelte b/src/routes/report/+page.svelte
new file mode 100644
index 0000000..0e49936
--- /dev/null
+++ b/src/routes/report/+page.svelte
@@ -0,0 +1,5 @@
+
+
+ Reports können nur ingame mittels des /report
Befehls erstellt werden
+
+
diff --git a/src/routes/report/+server.ts b/src/routes/report/+server.ts
new file mode 100644
index 0000000..cc026f3
--- /dev/null
+++ b/src/routes/report/+server.ts
@@ -0,0 +1,32 @@
+import type { RequestHandler } from '@sveltejs/kit';
+import { Report, User } from '$lib/server/database';
+import * as crypto from 'crypto';
+
+export const POST = (async ({ request, url }) => {
+ const data: { reporter: string; reported: string; reason: string } = await request.json();
+
+ if (data.reporter == undefined || data.reported == undefined || data.reason == undefined)
+ return new Response(null, { status: 400 });
+
+ const reporter = await User.findOne({ where: { uuid: data.reporter } });
+ const reported = await User.findOne({ where: { uuid: data.reported } });
+
+ if (reporter == null || reported == null) return new Response(null, { status: 400 });
+
+ const report = await Report.create({
+ subject: data.reason,
+ body: null,
+ draft: true,
+ url_id: crypto.randomBytes(18).toString('hex'),
+ completed: false,
+ reporter_user_id: reporter.id,
+ reported_user_id: reported.id
+ });
+
+ return new Response(
+ JSON.stringify({ url: `${url.toString().replace(/\/$/, '')}/${report.url_id}` }),
+ {
+ status: 201
+ }
+ );
+}) satisfies RequestHandler;
diff --git a/src/routes/report/[...url_id]/+layout.svelte b/src/routes/report/[...url_id]/+layout.svelte
new file mode 100644
index 0000000..9001a18
--- /dev/null
+++ b/src/routes/report/[...url_id]/+layout.svelte
@@ -0,0 +1,3 @@
+
+
+
diff --git a/src/routes/report/[...url_id]/+page.server.ts b/src/routes/report/[...url_id]/+page.server.ts
new file mode 100644
index 0000000..22c71f4
--- /dev/null
+++ b/src/routes/report/[...url_id]/+page.server.ts
@@ -0,0 +1,28 @@
+import type { PageServerLoad } from './$types';
+import { Report, User } from '$lib/server/database';
+import { redirect } from '@sveltejs/kit';
+import { env } from '$env/dynamic/public';
+
+export const load: PageServerLoad = async ({ params }) => {
+ const report = await Report.findOne({
+ where: { url_id: params.url_id },
+ include: [
+ { model: User, as: 'reporter' },
+ { model: User, as: 'reported' }
+ ]
+ });
+
+ if (report == null) throw redirect(302, `${env.PUBLIC_BASE_PATH}/`);
+
+ return {
+ draft: report.draft,
+ completed: report.completed,
+ reason: report.subject,
+ reporter: {
+ name: report.reporter.username
+ },
+ reported: {
+ name: report.reported.username
+ }
+ };
+};
diff --git a/src/routes/report/[...url_id]/+page.svelte b/src/routes/report/[...url_id]/+page.svelte
new file mode 100644
index 0000000..dffb35c
--- /dev/null
+++ b/src/routes/report/[...url_id]/+page.svelte
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+ {#if data.draft}
+
+ (data.draft = false)}
+ />
+
+ {:else if data.completed}
+
+ {:else}
+
+
+
+ {/if}
+
diff --git a/src/routes/report/[...url_id]/+server.ts b/src/routes/report/[...url_id]/+server.ts
new file mode 100644
index 0000000..f51e70e
--- /dev/null
+++ b/src/routes/report/[...url_id]/+server.ts
@@ -0,0 +1,13 @@
+import type { RequestHandler } from '@sveltejs/kit';
+import { Report } from '$lib/server/database';
+
+export const POST = (async ({ params }) => {
+ const report = await Report.findOne({ where: { url_id: params.url_id } });
+
+ if (report == null) return new Response(null, { status: 400 });
+
+ report.draft = false;
+ await report.save();
+
+ return new Response(null, { status: 200 });
+}) satisfies RequestHandler;
diff --git a/src/routes/report/[...url_id]/ReportCompleted.svelte b/src/routes/report/[...url_id]/ReportCompleted.svelte
new file mode 100644
index 0000000..b3ee96d
--- /dev/null
+++ b/src/routes/report/[...url_id]/ReportCompleted.svelte
@@ -0,0 +1,3 @@
+
+
Dieser Report wurde von einem Admin bearbeitet
+
diff --git a/src/routes/report/[...url_id]/ReportDraft.svelte b/src/routes/report/[...url_id]/ReportDraft.svelte
new file mode 100644
index 0000000..e3b8793
--- /dev/null
+++ b/src/routes/report/[...url_id]/ReportDraft.svelte
@@ -0,0 +1,67 @@
+
+
+
+
Report für {reportedName}
+
+
+
+
+
+ ✕
+
+
Report abschicken?
+
+
+ Nach dem Abschicken des Reports wird sich ein Moderator schnellstmöglich darum kümmern.
+
+
+
+ {
+ await submitReport();
+ dispatch('submit');
+ }}
+ />
+
+
+
+
+
+ close
+
+
diff --git a/src/routes/report/[...url_id]/ReportSubmitted.svelte b/src/routes/report/[...url_id]/ReportSubmitted.svelte
new file mode 100644
index 0000000..0dbf693
--- /dev/null
+++ b/src/routes/report/[...url_id]/ReportSubmitted.svelte
@@ -0,0 +1,6 @@
+
+
Report abgeschickt
+
+ Dein Report wurde abgeschickt und wird so schnell wie möglich von einem Admin bearbeitet.
+
+
diff --git a/svelte.config.js b/svelte.config.js
index 940bed5..3e9ded0 100644
--- a/svelte.config.js
+++ b/svelte.config.js
@@ -11,7 +11,10 @@ const config = {
// adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list.
// If your environment is not supported or you settled on a specific environment, switch out the adapter.
// See https://kit.svelte.dev/docs/adapters for more information about adapters.
- adapter: adapter()
+ adapter: adapter(),
+ csrf: {
+ checkOrigin: false
+ }
}
};
diff --git a/tailwind.config.js b/tailwind.config.js
index 58f0a21..db88b6e 100644
--- a/tailwind.config.js
+++ b/tailwind.config.js
@@ -8,5 +8,9 @@ export default {
roboto: ['Roboto']
}
},
- plugins: [require('daisyui')]
+ plugins: [require('daisyui')],
+
+ daisyui: {
+ logs: false
+ }
};