feat:update form

This commit is contained in:
2026-07-28 00:02:34 +07:00 Unverified
parent 0e8c816276
commit fa35f00f38
25 changed files with 919 additions and 149 deletions
+35 -6
View File
@@ -5,12 +5,23 @@ import {
boolean,
integer,
jsonb,
uniqueIndex,
index,
customType,
} from "drizzle-orm/pg-core";
import { uuidv7 } from "uuidv7";
export const formSchema = pgSchema("form");
export const bytea = customType<{
data: Buffer;
driverData: Buffer;
}>({
dataType() {
return "bytea";
},
fromDriver(value) {
return Buffer.isBuffer(value) ? value : Buffer.from(value);
},
});
export const forms = formSchema.table("form", {
id: text("id")
@@ -25,9 +36,11 @@ export const forms = formSchema.table("form", {
discordWebhookUpdateTemplate: text("discord_webhook_update_template"),
allowedRoles: jsonb("allowed_roles").$type<string[]>().default([]),
deniedRoles: jsonb("denied_roles").$type<string[]>().default([]),
allowMultipleSubmissions: boolean("allow_multiple_submissions").notNull().default(false),
});
export type QuestionType = "text" | "textarea" | "radio" | "checkbox";
export type ImageAnswerMode = "none" | "optional" | "required";
export const questions = formSchema.table("question", {
id: text("id")
@@ -43,6 +56,22 @@ export const questions = formSchema.table("question", {
required: boolean("required").notNull().default(false),
options: jsonb("options").$type<string[]>().default([]),
allowOther: boolean("allow_other").notNull().default(false),
imageAnswerMode: text("image_answer_mode")
.$type<ImageAnswerMode>()
.notNull()
.default("none"),
});
export const cdn = formSchema.table("cdn", {
id: text("id")
.primaryKey()
.$defaultFn(() => uuidv7()),
data: bytea("data").notNull(),
name: text("name"),
type: text("type").notNull(),
size: integer("size").notNull(),
ownerDiscordId: text("owner_discord_id"),
createdAt: timestamp("created_at", { mode: "date" }).defaultNow().notNull(),
});
export const submissions = formSchema.table(
@@ -58,14 +87,10 @@ export const submissions = formSchema.table(
userName: text("user_name"),
submittedAt: timestamp("submitted_at", { mode: "date" }).defaultNow().notNull(),
editHistory: jsonb("edit_history")
.$type<{ editedAt: string; oldAnswers: Record<string, string> }[]>()
.$type<{ editedAt: string; oldAnswers: Record<string, { value: string; imageCdnId: string | null }> }[]>()
.default([]),
},
(submission) => [
uniqueIndex("submission_form_user_discord_id_unique").on(
submission.formId,
submission.userDiscordId
),
index("submission_form_submitted_at_id_idx").on(
submission.formId,
submission.submittedAt,
@@ -85,4 +110,8 @@ export const answers = formSchema.table("answer", {
.notNull()
.references(() => questions.id, { onDelete: "cascade" }),
value: text("value").notNull().default(""),
imageCdnId: text("image_cdn_id").references(() => cdn.id, {
onUpdate: "cascade",
onDelete: "set null",
}),
});