60 lines
2.5 KiB
TypeScript
60 lines
2.5 KiB
TypeScript
import { sql } from "drizzle-orm";
|
|
import { index, integer, sqliteTable, text } from "drizzle-orm/sqlite-core";
|
|
|
|
export const registration = sqliteTable(
|
|
"registration",
|
|
{
|
|
id: text("id").primaryKey(),
|
|
firstName: text("first_name").notNull(),
|
|
lastName: text("last_name").notNull(),
|
|
email: text("email").notNull(),
|
|
phone: text("phone"),
|
|
// registrationType: 'performer' | 'watcher'
|
|
registrationType: text("registration_type").notNull().default("watcher"),
|
|
// Performer-specific fields
|
|
artForm: text("art_form"),
|
|
experience: text("experience"),
|
|
isOver16: integer("is_over_16", { mode: "boolean" })
|
|
.notNull()
|
|
.default(false),
|
|
// Watcher-specific fields
|
|
drinkCardValue: integer("drink_card_value").default(0),
|
|
// Guests: JSON array of {firstName, lastName, email?, phone?, birthdate, postcode} objects
|
|
guests: text("guests"),
|
|
// Shared
|
|
birthdate: text("birthdate").notNull().default(""),
|
|
postcode: text("postcode").notNull().default(""),
|
|
extraQuestions: text("extra_questions"),
|
|
managementToken: text("management_token").unique(),
|
|
cancelledAt: integer("cancelled_at", { mode: "timestamp_ms" }),
|
|
// Payment fields
|
|
paymentStatus: text("payment_status").notNull().default("pending"),
|
|
paymentAmount: integer("payment_amount").default(0),
|
|
giftAmount: integer("gift_amount").default(0),
|
|
molliePaymentId: text("mollie_payment_id"),
|
|
paidAt: integer("paid_at", { mode: "timestamp_ms" }),
|
|
// Set when the drinkCardValue has been credited to the user's drinkkaart.
|
|
// Null means not yet credited (either unpaid, account doesn't exist yet, or
|
|
// the registration is a performer). Used to prevent double-crediting.
|
|
drinkkaartCreditedAt: integer("drinkkaart_credited_at", {
|
|
mode: "timestamp_ms",
|
|
}),
|
|
paymentReminderSentAt: integer("payment_reminder_sent_at", {
|
|
mode: "timestamp_ms",
|
|
}),
|
|
createdAt: integer("created_at", { mode: "timestamp_ms" })
|
|
.default(sql`(cast(unixepoch('subsecond') * 1000 as integer))`)
|
|
.notNull(),
|
|
},
|
|
(table) => [
|
|
index("registration_email_idx").on(table.email),
|
|
index("registration_registrationType_idx").on(table.registrationType),
|
|
index("registration_artForm_idx").on(table.artForm),
|
|
index("registration_createdAt_idx").on(table.createdAt),
|
|
index("registration_managementToken_idx").on(table.managementToken),
|
|
index("registration_paymentStatus_idx").on(table.paymentStatus),
|
|
index("registration_giftAmount_idx").on(table.giftAmount),
|
|
index("registration_molliePaymentId_idx").on(table.molliePaymentId),
|
|
],
|
|
);
|