first commit
Docker-Images bauen und veroeffentlichen / build-and-push (push) Failing after 1m32s

This commit is contained in:
Nick Szaunig committed 2026-09-27 06:06:56 +02:00
commit 59bb5a38a3
132 files changed
+19435

No files matched your search

+57
View File
@@ -0,0 +1,57 @@
import type { BookingStatus, PaymentStatus, Prisma } from "@/generated/prisma/client";
const BOOKING_STATUSES: BookingStatus[] = ["PENDING", "CONFIRMED", "CANCELED", "EXPIRED", "NEEDS_REVIEW"];
const PAYMENT_STATUSES: PaymentStatus[] = ["UNPAID", "PROCESSING", "PARTIALLY_PAID", "PAID", "FAILED", "PARTIALLY_REFUNDED", "REFUNDED"];
export type BookingFilter = { status?: BookingStatus; zahlung?: PaymentStatus; modus: "test" | "live"; q?: string };
/** Liest Filter aus der URL; Unbekanntes wird ignoriert statt uebernommen. */
export function parseBookingFilter(params: Record<string, string | string[] | undefined>, defaultMode: "test" | "live"): BookingFilter {
const get = (k: string) => (typeof params[k] === "string" ? (params[k] as string) : undefined);
const status = get("status");
const zahlung = get("zahlung");
const modus = get("modus");
const q = get("q")?.trim().slice(0, 100);
return {
status: BOOKING_STATUSES.includes(status as BookingStatus) ? (status as BookingStatus) : undefined,
zahlung: PAYMENT_STATUSES.includes(zahlung as PaymentStatus) ? (zahlung as PaymentStatus) : undefined,
modus: modus === "live" || modus === "test" ? modus : defaultMode,
q: q || undefined,
};
}
export function bookingWhere(filter: BookingFilter): Prisma.BookingWhereInput {
return {
livemode: filter.modus === "live",
...(filter.status ? { status: filter.status } : {}),
...(filter.zahlung ? { paymentStatus: filter.zahlung } : {}),
...(filter.q
? {
OR: [
{ reference: { contains: filter.q, mode: "insensitive" } },
{ email: { contains: filter.q, mode: "insensitive" } },
{ lastName: { contains: filter.q, mode: "insensitive" } },
{ firstName: { contains: filter.q, mode: "insensitive" } },
],
}
: {}),
};
}
export function filterQuery(filter: BookingFilter): string {
const params = new URLSearchParams();
params.set("modus", filter.modus);
if (filter.status) params.set("status", filter.status);
if (filter.zahlung) params.set("zahlung", filter.zahlung);
if (filter.q) params.set("q", filter.q);
return params.toString();
}
/** Schutz vor Formel-Injektion: Zellen, die mit = + - @ beginnen, werden entschaerft. */
export function csvCell(value: string | number | null | undefined): string {
let s = value === null || value === undefined ? "" : String(value);
if (/^[=+\-@\t\r]/.test(s)) s = `'${s}`;
return `"${s.replace(/"/g, '""')}"`;
}
export { BOOKING_STATUSES, PAYMENT_STATUSES };