feat: Security CSRF Fix, Logout optimierung, Footer Anpassung, Rechtstexteanpassung
Docker Image bauen und veroeffentlichen / build-and-push (push) Failing after 1m33s
Docker Image bauen und veroeffentlichen / build-and-push (push) Failing after 1m33s
This commit is contained in:
1 parent
0753a3bc8a
commit
4d3100e9ba
28 files changed
+802
-121
No files matched your search
@@ -11,6 +11,11 @@ export async function createHarvestAction(formData: FormData): Promise<void> {
|
||||
const year = num(formData, "year");
|
||||
const type = str(formData, "type");
|
||||
const slug = `${type.toLowerCase().replace(/[^a-z0-9]+/g, "-")}-${year}`;
|
||||
// Checkbox: nur in formData vorhanden, wenn angehakt — fehlt sie ganz
|
||||
// (kein Feld im Formular), gilt "veroeffentlicht" als sicherer Default fuer
|
||||
// manuell im Admin-Bereich angelegte Ernten (bisheriges Verhalten vor
|
||||
// Einfuehrung von isPublished).
|
||||
const isPublished = !formData.has("isPublished") || formData.get("isPublished") === "on";
|
||||
|
||||
const harvest = await prisma.harvest.create({
|
||||
data: {
|
||||
@@ -20,6 +25,7 @@ export async function createHarvestAction(formData: FormData): Promise<void> {
|
||||
harvestDate: new Date(str(formData, "harvestDate")),
|
||||
location: str(formData, "location") || "Altenmünster",
|
||||
description: str(formData, "description"),
|
||||
isPublished,
|
||||
},
|
||||
});
|
||||
|
||||
@@ -31,12 +37,14 @@ export async function createHarvestAction(formData: FormData): Promise<void> {
|
||||
});
|
||||
|
||||
revalidatePath("/admin/ernten");
|
||||
revalidatePath("/ernten");
|
||||
redirect("/admin/ernten");
|
||||
}
|
||||
|
||||
export async function updateHarvestAction(formData: FormData): Promise<void> {
|
||||
const admin = await requireAdmin();
|
||||
const id = str(formData, "id");
|
||||
const isPublished = formData.get("isPublished") === "on";
|
||||
|
||||
await prisma.harvest.update({
|
||||
where: { id },
|
||||
@@ -46,12 +54,43 @@ export async function updateHarvestAction(formData: FormData): Promise<void> {
|
||||
harvestDate: new Date(str(formData, "harvestDate")),
|
||||
location: str(formData, "location") || "Altenmünster",
|
||||
description: str(formData, "description"),
|
||||
isPublished,
|
||||
},
|
||||
});
|
||||
|
||||
await logAdminAction(admin, { action: "harvest.update", entityType: "Harvest", entityId: id });
|
||||
|
||||
revalidatePath("/admin/ernten");
|
||||
revalidatePath("/ernten");
|
||||
redirect("/admin/ernten");
|
||||
}
|
||||
|
||||
/**
|
||||
* Isolierte "Veroeffentlichen"/"Verbergen"-Aktion, getrennt von
|
||||
* updateHarvestAction — so kann der Status per Knopfdruck direkt aus der
|
||||
* Ernten-Liste umgeschaltet werden, ohne durch das komplette Bearbeiten-
|
||||
* Formular zu muessen (insbesondere fuer den "veroeffentlichen"-Bestaetigungs-
|
||||
* schritt bei aus ApiCore synchronisierten Entwuerfen, siehe apicore-sync.ts).
|
||||
*/
|
||||
export async function toggleHarvestPublishedAction(formData: FormData): Promise<void> {
|
||||
const admin = await requireAdmin();
|
||||
const id = str(formData, "id");
|
||||
const isPublished = formData.get("isPublished") === "on";
|
||||
|
||||
const harvest = await prisma.harvest.update({
|
||||
where: { id },
|
||||
data: { isPublished },
|
||||
});
|
||||
|
||||
await logAdminAction(admin, {
|
||||
action: isPublished ? "harvest.publish" : "harvest.unpublish",
|
||||
entityType: "Harvest",
|
||||
entityId: id,
|
||||
detail: `${harvest.type} ${harvest.year}`,
|
||||
});
|
||||
|
||||
revalidatePath("/admin/ernten");
|
||||
revalidatePath("/ernten");
|
||||
redirect("/admin/ernten");
|
||||
}
|
||||
|
||||
|
||||
Reference in new issue
Block a user