feat(form): show response totals and queue numbers
This commit is contained in:
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user