ich geh behindert

This commit is contained in:
2025-06-05 01:34:10 +02:00
parent 0ae23e5272
commit 375c48d72f
478 changed files with 11113 additions and 231267 deletions

View File

@@ -0,0 +1,25 @@
"use server";
import { lucia, validateRequest } from "@/server/auth";
import { AuthenticationError } from "@/utils/errors";
import { revalidatePath } from "next/cache";
import { cookies } from "next/headers";
export async function logout(path?: string) {
const { session } = await validateRequest();
if (!session) {
throw new AuthenticationError();
}
try {
await lucia.invalidateSession(session.id);
} catch (error) {
throw new AuthenticationError();
}
const sessionCookie = lucia.createBlankSessionCookie();
cookies().set(sessionCookie.name, sessionCookie.value, sessionCookie.attributes);
revalidatePath(path ?? "/");
}

View File

@@ -0,0 +1,269 @@
"use server";
import { validateRequest } from "@/server/auth";
import { UserRole } from "@/server/auth/permissions";
import { db } from "@/server/db";
import { printJobs, users } from "@/server/db/schema";
import { PermissionError } from "@/utils/errors";
import { IS, guard } from "@/utils/guard";
import { type InferInsertModel, eq } from "drizzle-orm";
import { revalidatePath } from "next/cache";
export async function createPrintJob(printJob: InferInsertModel<typeof printJobs>) {
const { user } = await validateRequest();
if (guard(user, IS, UserRole.GUEST)) {
throw new PermissionError();
}
const dbUser = await db.query.users.findFirst({
// biome-ignore lint/style/noNonNullAssertion: guard already checks against null
where: eq(users.id, user!.id),
});
if (guard(dbUser, IS, UserRole.GUEST)) {
throw new PermissionError();
}
try {
const result = await db.insert(printJobs).values(printJob).returning({
jobId: printJobs.id,
});
return result[0].jobId;
} catch (error) {
throw new Error("Druckauftrag konnte nicht hinzugefügt werden.");
}
}
/* async function updatePrintJob(jobId: string, printJob: InferInsertModel<typeof printJobs>) {
const { user } = await validateRequest();
if (guard(user, is, UserRole.GUEST)) {
throw new PermissionError();
}
const dbUser = await db.query.users.findFirst({
// biome-ignore lint/style/noNonNullAssertion: guard already checks against null
where: eq(users.id, user!.id),
});
if (guard(dbUser, is, UserRole.GUEST)) {
throw new PermissionError();
}
await db.update(printJobs).set(printJob).where(eq(printJobs.id, jobId));
} */
export async function abortPrintJob(jobId: string, reason: string) {
const { user } = await validateRequest();
if (guard(user, IS, UserRole.GUEST)) {
throw new PermissionError();
}
const dbUser = await db.query.users.findFirst({
// biome-ignore lint/style/noNonNullAssertion: guard already checks against null
where: eq(users.id, user!.id),
});
if (guard(dbUser, IS, UserRole.GUEST)) {
throw new PermissionError();
}
// Get the print job
const printJob = await db.query.printJobs.findFirst({
where: eq(printJobs.id, jobId),
});
if (!printJob) {
throw new Error("Druckauftrag nicht gefunden");
}
// Check if the print job is already aborted or completed
if (printJob.aborted) {
throw new Error("Druckauftrag wurde bereits abgebrochen");
}
if (new Date(printJob.startAt).getTime() + printJob.durationInMinutes * 60 * 1000 < Date.now()) {
throw new Error("Druckauftrag ist bereits abgeschlossen");
}
// Check if user is the owner of the print job
// biome-ignore lint/style/noNonNullAssertion: guard already checks against null
if (printJob.userId !== dbUser!.id || dbUser!.role !== UserRole.ADMIN) {
throw new PermissionError();
}
// Get duration in minutes since startAt
const duration = Math.floor((Date.now() - new Date(printJob.startAt).getTime()) / 1000 / 60);
await db
.update(printJobs)
.set({
aborted: true,
abortReason: reason,
durationInMinutes: duration,
comments: `${printJob.comments}\n\n---${dbUser?.username}: Druckauftrag abgebrochen`,
})
.where(eq(printJobs.id, jobId));
revalidatePath("/");
}
export async function earlyFinishPrintJob(jobId: string) {
const { user } = await validateRequest();
if (guard(user, IS, UserRole.GUEST)) {
throw new PermissionError();
}
const dbUser = await db.query.users.findFirst({
// biome-ignore lint/style/noNonNullAssertion: guard already checks against null
where: eq(users.id, user!.id),
});
if (guard(dbUser, IS, UserRole.GUEST)) {
throw new PermissionError();
}
// Get the print job
const printJob = await db.query.printJobs.findFirst({
where: eq(printJobs.id, jobId),
});
if (!printJob) {
throw new Error("Druckauftrag nicht gefunden");
}
// Check if the print job is already aborted or completed
if (printJob.aborted) {
throw new Error("Druckauftrag wurde bereits abgebrochen");
}
if (new Date(printJob.startAt).getTime() + printJob.durationInMinutes * 60 * 1000 < Date.now()) {
throw new Error("Druckauftrag ist bereits abgeschlossen");
}
// Check if user is the owner of the print job
// biome-ignore lint/style/noNonNullAssertion: guard already checks against null
if (printJob.userId !== dbUser!.id || dbUser!.role !== UserRole.ADMIN) {
throw new PermissionError();
}
// Get duration in minutes since startAt
const duration = Math.floor((Date.now() - new Date(printJob.startAt).getTime()) / 1000 / 60);
await db
.update(printJobs)
.set({
durationInMinutes: duration,
comments: `${printJob.comments}\n\n---${dbUser?.username}: Druckauftrag vorzeitig abgeschlossen`,
})
.where(eq(printJobs.id, jobId));
revalidatePath("/");
}
export async function extendPrintJob(jobId: string, minutes: number, hours: number) {
const { user } = await validateRequest();
if (guard(user, IS, UserRole.GUEST)) {
throw new PermissionError();
}
const dbUser = await db.query.users.findFirst({
// biome-ignore lint/style/noNonNullAssertion: guard already checks against null
where: eq(users.id, user!.id),
});
if (guard(dbUser, IS, UserRole.GUEST)) {
throw new PermissionError();
}
// Get the print job
const printJob = await db.query.printJobs.findFirst({
where: eq(printJobs.id, jobId),
});
if (!printJob) {
throw new Error("Druckauftrag nicht gefunden");
}
// Check if the print job is already aborted or completed
if (printJob.aborted) {
throw new Error("Druckauftrag wurde bereits abgebrochen");
}
if (new Date(printJob.startAt).getTime() + printJob.durationInMinutes * 60 * 1000 < Date.now()) {
throw new Error("Druckauftrag ist bereits abgeschlossen");
}
// Check if user is the owner of the print job
// biome-ignore lint/style/noNonNullAssertion: guard already checks against null
if (printJob.userId !== dbUser!.id || dbUser!.role !== UserRole.ADMIN) {
throw new PermissionError();
}
const duration = minutes + hours * 60;
await db
.update(printJobs)
.set({
durationInMinutes: printJob.durationInMinutes + duration,
comments: `${printJob.comments}\n\n---${dbUser?.username}: Verlängert um ${hours} Stunden und ${minutes} Minuten`,
})
.where(eq(printJobs.id, jobId));
revalidatePath("/");
}
export async function updatePrintComments(jobId: string, comments: string) {
const { user } = await validateRequest();
if (guard(user, IS, UserRole.GUEST)) {
throw new PermissionError();
}
const dbUser = await db.query.users.findFirst({
// biome-ignore lint/style/noNonNullAssertion: guard already checks against null
where: eq(users.id, user!.id),
});
if (guard(dbUser, IS, UserRole.GUEST)) {
throw new PermissionError();
}
// Get the print job
const printJob = await db.query.printJobs.findFirst({
where: eq(printJobs.id, jobId),
});
if (!printJob) {
throw new Error("Druckauftrag nicht gefunden");
}
// Check if the print job is already aborted or completed
if (printJob.aborted) {
throw new Error("Druckauftrag wurde bereits abgebrochen");
}
if (new Date(printJob.startAt).getTime() + printJob.durationInMinutes * 60 * 1000 < Date.now()) {
throw new Error("Druckauftrag ist bereits abgeschlossen");
}
// Check if user is the owner of the print job
// biome-ignore lint/style/noNonNullAssertion: guard already checks against null
if (printJob.userId !== dbUser!.id || dbUser!.role !== UserRole.ADMIN) {
throw new PermissionError();
}
await db
.update(printJobs)
.set({
comments,
})
.where(eq(printJobs.id, jobId));
revalidatePath("/");
}

View File

@@ -0,0 +1,107 @@
"use server";
import { validateRequest } from "@/server/auth";
import { UserRole } from "@/server/auth/permissions";
import { db } from "@/server/db";
import { printers, users } from "@/server/db/schema";
import { PermissionError } from "@/utils/errors";
import { IS_NOT, guard } from "@/utils/guard";
import { type InferInsertModel, eq } from "drizzle-orm";
import { revalidatePath } from "next/cache";
export async function createPrinter(printer: InferInsertModel<typeof printers>) {
const { user } = await validateRequest();
if (guard(user, IS_NOT, UserRole.ADMIN)) {
throw new PermissionError();
}
const dbUser = await db.query.users.findFirst({
// biome-ignore lint/style/noNonNullAssertion: guard already checks against null
where: eq(users.id, user!.id),
});
if (guard(dbUser, IS_NOT, UserRole.ADMIN)) {
throw new PermissionError();
}
if (!printer) {
throw new Error("Druckerdaten sind erforderlich.");
}
try {
await db.insert(printers).values(printer);
} catch (error) {
throw new Error("Drucker konnte nicht hinzugefügt werden.");
}
revalidatePath("/");
}
export async function updatePrinter(id: string, data: InferInsertModel<typeof printers>) {
const { user } = await validateRequest();
if (guard(user, IS_NOT, UserRole.ADMIN)) {
throw new PermissionError();
}
const dbUser = await db.query.users.findFirst({
// biome-ignore lint/style/noNonNullAssertion: guard already checks against null
where: eq(users.id, user!.id),
});
if (guard(dbUser, IS_NOT, UserRole.ADMIN)) {
throw new PermissionError();
}
if (!data) {
throw new Error("Druckerdaten sind erforderlich.");
}
try {
await db.update(printers).set(data).where(eq(printers.id, id));
} catch (error) {
throw new Error("Drucker konnte nicht aktualisiert werden.");
}
revalidatePath("/");
}
export async function deletePrinter(id: string) {
const { user } = await validateRequest();
if (guard(user, IS_NOT, UserRole.ADMIN)) {
throw new PermissionError();
}
const dbUser = await db.query.users.findFirst({
// biome-ignore lint/style/noNonNullAssertion: guard already checks against null
where: eq(users.id, user!.id),
});
if (guard(dbUser, IS_NOT, UserRole.ADMIN)) {
throw new PermissionError();
}
try {
await db.delete(printers).where(eq(printers.id, id));
} catch (error) {
if (error instanceof Error) {
throw new Error(error.message);
}
throw new Error("Ein unbekannter Fehler ist aufgetreten.");
}
revalidatePath("/");
}
export async function getPrinters() {
return await db.query.printers.findMany({
with: {
printJobs: {
limit: 1,
orderBy: (printJobs, { desc }) => [desc(printJobs.startAt)],
},
},
});
}

View File

@@ -0,0 +1,7 @@
"use server";
import { revalidatePath } from "next/cache";
export async function revalidate() {
revalidatePath("/");
}

View File

@@ -0,0 +1,48 @@
"use server";
import { validateRequest } from "@/server/auth";
import { UserRole } from "@/server/auth/permissions";
import { db } from "@/server/db";
import { users } from "@/server/db/schema";
import { PermissionError } from "@/utils/errors";
import { IS, IS_NOT, guard } from "@/utils/guard";
import { eq } from "drizzle-orm";
import { revalidatePath } from "next/cache";
/**
* Deletes a user from the database
* @param userId User ID to delete
* @param path Path to revalidate
*/
export async function deleteUser(userId: string, path?: string) {
const { user } = await validateRequest();
if (guard(user, IS_NOT, UserRole.ADMIN)) {
throw new PermissionError();
}
const dbUser = await db.query.users.findFirst({
// biome-ignore lint/style/noNonNullAssertion: guard already checks against null
where: eq(users.id, user!.id),
});
if (guard(dbUser, IS_NOT, UserRole.ADMIN)) {
throw new PermissionError();
}
const targetUser = await db.query.users.findFirst({
where: eq(users.id, userId),
});
if (!targetUser) {
throw new Error("Benutzer nicht gefunden");
}
if (guard(targetUser, IS, UserRole.ADMIN)) {
throw new Error("Kann keinen Admin löschen");
}
await db.delete(users).where(eq(users.id, userId));
revalidatePath(path ?? "/admin/users");
}

View File

@@ -0,0 +1,37 @@
import type { formSchema } from "@/app/admin/users/form";
import { validateRequest } from "@/server/auth";
import { UserRole } from "@/server/auth/permissions";
import { db } from "@/server/db";
import { users } from "@/server/db/schema";
import { PermissionError } from "@/utils/errors";
import { IS_NOT, guard } from "@/utils/guard";
import { eq } from "drizzle-orm";
import { revalidatePath } from "next/cache";
import type { z } from "zod";
/**
* Updates a user in the database
* @param userId User ID to update
* @param data Updated user data
* @param path Path to revalidate
*/
export async function updateUser(userId: string, data: z.infer<typeof formSchema>, path?: string) {
const { user } = await validateRequest();
if (guard(user, IS_NOT, UserRole.ADMIN)) {
throw new PermissionError();
}
const dbUser = await db.query.users.findFirst({
// biome-ignore lint/style/noNonNullAssertion: guard already checks against null
where: eq(users.id, user!.id),
});
if (guard(dbUser, IS_NOT, UserRole.ADMIN)) {
throw new PermissionError();
}
await db.update(users).set(data).where(eq(users.id, userId));
revalidatePath(path ?? "/admin/users");
}

View File

@@ -0,0 +1,72 @@
"use server";
import type { formSchema } from "@/app/admin/users/form";
import { validateRequest } from "@/server/auth";
import { UserRole } from "@/server/auth/permissions";
import { db } from "@/server/db";
import { users } from "@/server/db/schema";
import { PermissionError } from "@/utils/errors";
import { IS, IS_NOT, guard } from "@/utils/guard";
import { eq } from "drizzle-orm";
import { revalidatePath } from "next/cache";
import type { z } from "zod";
/**
* @deprecated
*/
export async function updateUser(userId: string, data: z.infer<typeof formSchema>) {
const { user } = await validateRequest();
if (guard(user, IS_NOT, UserRole.ADMIN)) {
throw new PermissionError();
}
const dbUser = await db.query.users.findFirst({
// biome-ignore lint/style/noNonNullAssertion: guard already checks against null
where: eq(users.id, user!.id),
});
if (guard(dbUser, IS_NOT, UserRole.ADMIN)) {
throw new PermissionError();
}
await db.update(users).set(data).where(eq(users.id, userId));
revalidatePath("/admin/users");
}
/**
* @deprecated
*/
export async function deleteUser(userId: string) {
const { user } = await validateRequest();
if (guard(user, IS_NOT, UserRole.ADMIN)) {
throw new PermissionError();
}
const dbUser = await db.query.users.findFirst({
// biome-ignore lint/style/noNonNullAssertion: guard already checks against null
where: eq(users.id, user!.id),
});
if (guard(dbUser, IS_NOT, UserRole.ADMIN)) {
throw new PermissionError();
}
const targetUser = await db.query.users.findFirst({
where: eq(users.id, userId),
});
if (!targetUser) {
throw new Error("Benutzer nicht gefunden");
}
if (guard(targetUser, IS, UserRole.ADMIN)) {
throw new Error("Kann keinen Admin löschen");
}
await db.delete(users).where(eq(users.id, userId));
revalidatePath("/admin/users");
}