feat(form): show response totals and queue numbers

This commit is contained in:
2026-07-26 15:54:20 +07:00 Unverified
parent 1b58d2c363
commit 73bd6ef5d2
6 changed files with 148 additions and 10 deletions
+36 -3
View File
@@ -2,7 +2,7 @@
import { db } from "@/db";
import { submissions, answers } from "@/db/schema";
import { eq } from "drizzle-orm";
import { and, count, eq, lt, lte, or } from "drizzle-orm";
import { revalidatePath } from "next/cache";
import { getServerSession } from "next-auth";
import { authOptions } from "@/lib/auth-options";
@@ -44,11 +44,13 @@ export async function submitForm(
});
let submissionId = "";
let submittedAt = new Date();
const isUpdate = Boolean(existingSubmission);
let oldAnswersDict: Record<string, string> = {};
if (existingSubmission) {
submissionId = existingSubmission.id;
submittedAt = existingSubmission.submittedAt;
const oldAnswersList = await tx.query.answers.findMany({
where: (answer, { eq }) => eq(answer.submissionId, submissionId),
@@ -83,6 +85,7 @@ export async function submitForm(
})
.returning();
submissionId = inserted.id;
submittedAt = inserted.submittedAt;
}
if (normalizedAnswers.length > 0) {
@@ -95,7 +98,33 @@ export async function submitForm(
);
}
return { submissionId, isUpdate, oldAnswersDict };
const [submissionStats] = await tx
.select({ totalAnswers: count() })
.from(submissions)
.where(eq(submissions.formId, formId));
const [queueStats] = await tx
.select({ queueNumber: count() })
.from(submissions)
.where(
and(
eq(submissions.formId, formId),
or(
lt(submissions.submittedAt, submittedAt),
and(
eq(submissions.submittedAt, submittedAt),
lte(submissions.id, submissionId)
)
)
)
);
return {
submissionId,
isUpdate,
oldAnswersDict,
totalAnswers: submissionStats.totalAnswers,
queueNumber: queueStats.queueNumber,
};
});
// Send Discord Webhook
@@ -146,7 +175,11 @@ export async function submitForm(
action: result.isUpdate ? "updated" : "created",
});
revalidatePath(`/admin/form/${formId}/result`);
return { ok: true };
return {
ok: true,
totalAnswers: result.totalAnswers,
queueNumber: result.queueNumber,
};
}
export async function deleteSubmission(id: string) {