import { sql } from "drizzle-orm"; import { pgTableCreator, serial, timestamp, varchar, text, integer, boolean, pgEnum } from "drizzle-orm/pg-core"; export const createTable = pgTableCreator((name) => `${name}`); export const statusEnum = pgEnum("status", ["pending", "accepted", "rejected"]); export const messageTypeEnum = pgEnum("message_types", ["text", "image", "video", "audio", "file", "link"]); export const users = createTable( "user", { id: serial("id").primaryKey(), appleId: varchar("apple_id", { length: 255 }).unique(), appleEmail: varchar("apple_email", { length: 255 }).unique().notNull(), fullName: varchar("full_name", { length: 100 }), pfpURL: varchar("pfp_url", { length: 255 }), pushToken: varchar("pushToken", { length: 255 }), createdAt: timestamp("created_at", { withTimezone: true }) .default(sql`CURRENT_TIMESTAMP`) .notNull(), }, ); export const relationships = createTable( "relationship", { id: serial("id").primaryKey(), title: varchar("title", { length: 100 }).default("Relationship").notNull(), status: statusEnum("status").default("pending").notNull(), relationshipStartDate: timestamp("relationship_start_date", { withTimezone: true }) .default(sql`CURRENT_TIMESTAMP`).notNull(), createdAt: timestamp("created_at", { withTimezone: true }) .default(sql`CURRENT_TIMESTAMP`).notNull(), }, ); export const userRelationships = createTable( "user_relationship", { id: serial("id").primaryKey(), userId: integer("user_id").references(() => users.id).notNull(), relationshipId: integer("relationship_id").references(() => relationships.id).notNull(), }, ); export const messages = createTable( "message", { id: serial("id").primaryKey(), senderId: integer("sender_id").references(() => users.id).notNull(), receiverId: integer("receiver_id").references(() => users.id).notNull(), content: text("content").notNull(), createdAt: timestamp("created_at", { withTimezone: true }) .default(sql`CURRENT_TIMESTAMP`) .notNull(), isRead: boolean("is_read").default(false).notNull(), }, ); export const messageMedia = createTable( "message_media", { id: serial("id").primaryKey(), messageId: integer("message_id").references(() => messages.id).notNull(), type: messageTypeEnum("type").notNull(), mediaUrl: varchar("url", { length: 255 }).notNull(), }, ); export const countdowns = createTable( "countdown", { id: serial("id").primaryKey(), relationshipId: integer("relationship_id").references(() => relationships.id).notNull(), title: varchar("title", { length: 100 }) .default("Countdown to Next Visit") .notNull(), date: timestamp("date", { withTimezone: true }), createdAt: timestamp("created_at", { withTimezone: true }) .default(sql`CURRENT_TIMESTAMP`) .notNull(), }, );