import { integer, sqliteTable, text, primaryKey, uniqueIndex } from "drizzle-orm/sqlite-core" import type { AdapterAccountType } from "next-auth/adapters" import { relations } from 'drizzle-orm'; // https://authjs.dev/getting-started/adapters/drizzle export const users = sqliteTable("user", { id: text("id") .primaryKey() .$defaultFn(() => crypto.randomUUID()), name: text("name"), email: text("email").unique(), emailVerified: integer("emailVerified", { mode: "timestamp_ms" }), image: text("image"), username: text("username").unique(), password: text("password"), }) export const accounts = sqliteTable( "account", { userId: text("userId") .notNull() .references(() => users.id, { onDelete: "cascade" }), type: text("type").$type().notNull(), provider: text("provider").notNull(), providerAccountId: text("providerAccountId").notNull(), refresh_token: text("refresh_token"), access_token: text("access_token"), expires_at: integer("expires_at"), token_type: text("token_type"), scope: text("scope"), id_token: text("id_token"), session_state: text("session_state"), }, (account) => ({ compoundKey: primaryKey({ columns: [account.provider, account.providerAccountId], }), }) ) export const emails = sqliteTable("email", { id: text("id").primaryKey().$defaultFn(() => crypto.randomUUID()), address: text("address").notNull().unique(), userId: text("userId").references(() => users.id, { onDelete: "cascade" }), createdAt: integer("created_at", { mode: "timestamp_ms" }) .notNull() .$defaultFn(() => new Date()), expiresAt: integer("expires_at", { mode: "timestamp_ms" }).notNull(), }) export const messages = sqliteTable("message", { id: text("id").primaryKey().$defaultFn(() => crypto.randomUUID()), emailId: text("emailId") .notNull() .references(() => emails.id, { onDelete: "cascade" }), fromAddress: text("from_address").notNull(), subject: text("subject").notNull(), content: text("content").notNull(), html: text("html"), receivedAt: integer("received_at", { mode: "timestamp_ms" }) .notNull() .$defaultFn(() => new Date()), }) export const webhooks = sqliteTable('webhook', { id: text('id').primaryKey().$defaultFn(() => crypto.randomUUID()), userId: text('user_id') .notNull() .references(() => users.id, { onDelete: "cascade" }), url: text('url').notNull(), enabled: integer('enabled', { mode: 'boolean' }).notNull().default(true), createdAt: integer('created_at', { mode: 'timestamp_ms' }) .notNull() .$defaultFn(() => new Date()), updatedAt: integer('updated_at', { mode: 'timestamp_ms' }) .notNull() .$defaultFn(() => new Date()), }) export const roles = sqliteTable("role", { id: text("id").primaryKey().$defaultFn(() => crypto.randomUUID()), name: text("name").notNull(), description: text("description"), createdAt: integer("created_at", { mode: "timestamp" }).$defaultFn(() => new Date()), updatedAt: integer("updated_at", { mode: "timestamp" }).$defaultFn(() => new Date()), }); export const userRoles = sqliteTable("user_role", { userId: text("user_id").notNull().references(() => users.id, { onDelete: "cascade" }), roleId: text("role_id").notNull().references(() => roles.id, { onDelete: "cascade" }), createdAt: integer("created_at", { mode: "timestamp" }).$defaultFn(() => new Date()), }, (table) => ({ pk: primaryKey({ columns: [table.userId, table.roleId] }), })); export const apiKeys = sqliteTable('api_keys', { id: text('id').primaryKey().$defaultFn(() => crypto.randomUUID()), userId: text('user_id').notNull().references(() => users.id), name: text('name').notNull(), key: text('key').notNull().unique(), createdAt: integer('created_at', { mode: 'timestamp' }).$defaultFn(() => new Date()), expiresAt: integer('expires_at', { mode: 'timestamp' }), enabled: integer('enabled', { mode: 'boolean' }).notNull().default(true), }, (table) => ({ nameUserIdUnique: uniqueIndex('name_user_id_unique').on(table.name, table.userId) })); export const apiKeysRelations = relations(apiKeys, ({ one }) => ({ user: one(users, { fields: [apiKeys.userId], references: [users.id], }), })); export const userRolesRelations = relations(userRoles, ({ one }) => ({ user: one(users, { fields: [userRoles.userId], references: [users.id], }), role: one(roles, { fields: [userRoles.roleId], references: [roles.id], }), })); export const usersRelations = relations(users, ({ many }) => ({ userRoles: many(userRoles), apiKeys: many(apiKeys), })); export const rolesRelations = relations(roles, ({ many }) => ({ userRoles: many(userRoles), }));