/** * Water Log. Source: `db/migrations/0001_init.sql`. */ import { pgTable, uuid, text, numeric, boolean, timestamp, index, } from "drizzle-orm/pg-core"; import { brands } from "./brands"; import { adminUsers } from "./brands"; export const waterHeadgates = pgTable( "water_headgates", { id: uuid("id").primaryKey().defaultRandom(), brandId: uuid("brand_id") .notNull() .references(() => brands.id, { onDelete: "cascade" }), name: text("name").notNull(), active: boolean("active").notNull().default(true), createdAt: timestamp("created_at", { withTimezone: true }) .notNull() .defaultNow(), }, ); export const waterIrrigators = pgTable( "water_irrigators", { id: uuid("id").primaryKey().defaultRandom(), brandId: uuid("brand_id") .notNull() .references(() => brands.id, { onDelete: "cascade" }), name: text("name").notNull(), pinHash: text("pin_hash").notNull(), languagePreference: text("language_preference") .notNull() .default("en"), active: boolean("active").notNull().default(true), lastUsedAt: timestamp("last_used_at", { withTimezone: true }), createdAt: timestamp("created_at", { withTimezone: true }) .notNull() .defaultNow(), }, ); export const waterSessions = pgTable( "water_sessions", { id: uuid("id").primaryKey().defaultRandom(), irrigatorId: uuid("irrigator_id") .notNull() .references(() => waterIrrigators.id, { onDelete: "cascade" }), expiresAt: timestamp("expires_at", { withTimezone: true }).notNull(), createdAt: timestamp("created_at", { withTimezone: true }) .notNull() .defaultNow(), }, ); export const waterLogEntries = pgTable( "water_log_entries", { id: uuid("id").primaryKey().defaultRandom(), brandId: uuid("brand_id") .notNull() .references(() => brands.id, { onDelete: "cascade" }), headgateId: uuid("headgate_id") .notNull() .references(() => waterHeadgates.id, { onDelete: "cascade" }), irrigatorId: uuid("irrigator_id") .notNull() .references(() => waterIrrigators.id, { onDelete: "cascade" }), measurement: numeric("measurement").notNull(), unit: text("unit").notNull(), notes: text("notes"), submittedVia: text("submitted_via").notNull().default("app"), loggedAt: timestamp("logged_at", { withTimezone: true }) .notNull() .defaultNow(), loggedBy: uuid("logged_by").references(() => adminUsers.id), }, (t) => ({ brandIdx: index("water_log_entries_brand_idx").on(t.brandId), headgateIdx: index("water_log_entries_headgate_idx").on(t.headgateId), }), ); export const waterAlertLog = pgTable( "water_alert_log", { id: uuid("id").primaryKey().defaultRandom(), brandId: uuid("brand_id") .notNull() .references(() => brands.id, { onDelete: "cascade" }), alertType: text("alert_type").notNull(), headgateId: uuid("headgate_id").references(() => waterHeadgates.id), message: text("message").notNull(), sentTo: text("sent_to"), sentAt: timestamp("sent_at", { withTimezone: true }), createdAt: timestamp("created_at", { withTimezone: true }) .notNull() .defaultNow(), }, ); export type WaterHeadgate = typeof waterHeadgates.$inferSelect; export type WaterIrrigator = typeof waterIrrigators.$inferSelect; export type WaterSession = typeof waterSessions.$inferSelect; export type WaterLogEntry = typeof waterLogEntries.$inferSelect; export type WaterAlertLog = typeof waterAlertLog.$inferSelect;