feat:update form
This commit is contained in:
+35
-6
@@ -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",
|
||||
}),
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user