107 lines
2.9 KiB
TypeScript
107 lines
2.9 KiB
TypeScript
"use server";
|
|
|
|
import { db } from "@/db";
|
|
import { submissions, answers } from "@/db/schema";
|
|
import { eq } from "drizzle-orm";
|
|
import { revalidatePath } from "next/cache";
|
|
import { getServerSession } from "next-auth";
|
|
import { authOptions } from "@/app/api/auth/[...nextauth]/route";
|
|
|
|
export async function submitForm(
|
|
formId: string,
|
|
answersList: { questionId: string; value: string }[]
|
|
) {
|
|
const session = await getServerSession(authOptions);
|
|
if (!session?.user) throw new Error("Not authenticated");
|
|
|
|
const discordId = (session.user as { discordId?: string }).discordId;
|
|
if (!discordId) throw new Error("No Discord ID found");
|
|
|
|
const existingSubmission = await db.query.submissions.findFirst({
|
|
where: (s, { eq, and }) =>
|
|
and(eq(s.formId, formId), eq(s.userDiscordId, discordId)),
|
|
});
|
|
|
|
let submissionId = "";
|
|
|
|
if (existingSubmission) {
|
|
submissionId = existingSubmission.id;
|
|
|
|
// Fetch old answers
|
|
const oldAnswersList = await db.query.answers.findMany({
|
|
where: (a, { eq }) => eq(a.submissionId, submissionId),
|
|
});
|
|
|
|
const oldAnswersDict = oldAnswersList.reduce((acc, curr) => {
|
|
acc[curr.questionId] = curr.value;
|
|
return acc;
|
|
}, {} as Record<string, string>);
|
|
|
|
// Ensure editHistory is an array
|
|
let history = existingSubmission.editHistory;
|
|
if (!Array.isArray(history)) {
|
|
history = [];
|
|
}
|
|
|
|
// Push the old answers to history
|
|
history.push({
|
|
editedAt: new Date().toISOString(),
|
|
oldAnswers: oldAnswersDict,
|
|
});
|
|
|
|
// Update submission record
|
|
await db
|
|
.update(submissions)
|
|
.set({
|
|
editHistory: history,
|
|
})
|
|
.where(eq(submissions.id, submissionId));
|
|
|
|
// Delete old answers
|
|
await db.delete(answers).where(eq(answers.submissionId, submissionId));
|
|
} else {
|
|
// Insert new submission
|
|
const [inserted] = await db
|
|
.insert(submissions)
|
|
.values({
|
|
formId,
|
|
userDiscordId: discordId,
|
|
userName: session.user.name ?? null,
|
|
})
|
|
.returning();
|
|
submissionId = inserted.id;
|
|
}
|
|
|
|
// Insert new/updated answers
|
|
if (answersList.length > 0) {
|
|
await db.insert(answers).values(
|
|
answersList.map((a) => ({
|
|
submissionId,
|
|
questionId: a.questionId,
|
|
value: a.value,
|
|
}))
|
|
);
|
|
}
|
|
|
|
revalidatePath("/form/admin/result");
|
|
return { ok: true };
|
|
}
|
|
|
|
export async function deleteSubmission(id: string) {
|
|
const session = await getServerSession(authOptions);
|
|
if (!session?.user) throw new Error("Not authenticated");
|
|
|
|
await db.delete(submissions).where(eq(submissions.id, id));
|
|
revalidatePath("/form/admin/result");
|
|
return { ok: true };
|
|
}
|
|
|
|
export async function deleteAllSubmissions() {
|
|
const session = await getServerSession(authOptions);
|
|
if (!session?.user) throw new Error("Not authenticated");
|
|
|
|
await db.delete(submissions);
|
|
revalidatePath("/form/admin/result");
|
|
return { ok: true };
|
|
}
|