60 lines
3.0 KiB
TypeScript
60 lines
3.0 KiB
TypeScript
import { sqliteTable, text, integer, real } from "drizzle-orm/sqlite-core";
|
|
import { sql } from "drizzle-orm";
|
|
|
|
export const users = sqliteTable("users", {
|
|
id: integer("id").primaryKey({ autoIncrement: true }),
|
|
email: text("email", { length: 255 }).notNull().unique(),
|
|
passwordHash: text("password_hash", { length: 255 }).notNull(),
|
|
role: text("role", { length: 50 }).notNull().default("user"),
|
|
createdAt: integer("created_at", { mode: "timestamp" }).notNull().default(sql`CURRENT_TIMESTAMP`),
|
|
updatedAt: integer("updated_at", { mode: "timestamp" }).notNull().default(sql`CURRENT_TIMESTAMP`),
|
|
});
|
|
|
|
export const medications = sqliteTable("medications", {
|
|
id: integer("id").primaryKey({ autoIncrement: true }),
|
|
name: text("name", { length: 100 }).notNull().unique(),
|
|
genericName: text("generic_name", { length: 100 }),
|
|
takenBy: text("taken_by", { length: 100 }),
|
|
count: integer("count").notNull().default(0),
|
|
strips: integer("strips").notNull().default(0),
|
|
packCount: integer("pack_count").notNull().default(1),
|
|
stripsPerPack: integer("strips_per_pack").notNull().default(1),
|
|
tabsPerStrip: integer("tabs_per_strip").notNull().default(1),
|
|
looseTablets: integer("loose_tablets").notNull().default(0),
|
|
pillWeightMg: integer("pill_weight_mg"),
|
|
usageJson: text("usage_json").notNull().default("[]"),
|
|
everyJson: text("every_json").notNull().default("[]"),
|
|
startJson: text("start_json").notNull().default("[]"),
|
|
stripSize: integer("strip_size").notNull().default(1),
|
|
imageUrl: text("image_url"),
|
|
expiryDate: text("expiry_date"),
|
|
notes: text("notes"),
|
|
intakeRemindersEnabled: integer("intake_reminders_enabled", { mode: "boolean" }).notNull().default(false),
|
|
updatedAt: integer("updated_at", { mode: "timestamp" }).notNull().default(sql`CURRENT_TIMESTAMP`),
|
|
});
|
|
|
|
export const refreshTokens = sqliteTable("refresh_tokens", {
|
|
id: integer("id").primaryKey({ autoIncrement: true }),
|
|
userId: integer("user_id").notNull().references(() => users.id, { onDelete: "cascade" }),
|
|
tokenId: text("token_id", { length: 255 }).notNull().unique(),
|
|
expiresAt: integer("expires_at", { mode: "timestamp" }).notNull(),
|
|
rotatedAt: integer("rotated_at", { mode: "timestamp" }),
|
|
revoked: integer("revoked", { mode: "boolean" }).notNull().default(false),
|
|
createdAt: integer("created_at", { mode: "timestamp" }).notNull().default(sql`CURRENT_TIMESTAMP`),
|
|
});
|
|
|
|
export const settings = sqliteTable("settings", {
|
|
id: integer("id").primaryKey({ autoIncrement: true }),
|
|
smtpHost: text("smtp_host"),
|
|
smtpPort: integer("smtp_port"),
|
|
smtpUser: text("smtp_user"),
|
|
smtpPassEncrypted: text("smtp_pass_encrypted"),
|
|
smtpFrom: text("smtp_from"),
|
|
smtpSecure: integer("smtp_secure", { mode: "boolean" }).notNull().default(false),
|
|
// Email notification settings
|
|
emailEnabled: integer("email_enabled", { mode: "boolean" }).notNull().default(false),
|
|
notificationEmail: text("notification_email"),
|
|
reminderDaysBefore: integer("reminder_days_before").notNull().default(7),
|
|
updatedAt: integer("updated_at", { mode: "timestamp" }).notNull().default(sql`CURRENT_TIMESTAMP`),
|
|
});
|