import { singlestoreTable, text, boolean, varchar, datetime, } from "drizzle-orm/singlestore-core"; import { relations, sql } from "drizzle-orm"; export const user = singlestoreTable("user", { id: varchar("id", { length: 16 }).primaryKey(), name: varchar("name", { length: 255 }).notNull(), email: varchar("email", { length: 255 }).notNull(), emailVerified: boolean("emailVerified").notNull(), image: text("image"), createdAt: datetime("createdAt", { mode: "date" }) .notNull() .default(sql`CURRENT_TIMESTAMP`), updatedAt: datetime("updatedAt", { mode: "date" }) .notNull() .default(sql`CURRENT_TIMESTAMP`), }); export const userEmail = singlestoreTable("user_email", { id: varchar("id", { length: 16 }).notNull(), email: varchar("email", { length: 255 }).primaryKey(), }); export const session = singlestoreTable("session", { id: varchar("id", { length: 16 }).primaryKey(), expiresAt: datetime("expiresAt", { mode: "date" }).notNull(), ipAddress: varchar("ipAddress", { length: 45 }), userAgent: text("userAgent"), userId: varchar("userId", { length: 16 }).notNull(), activeOrganizationId: varchar("activeOrganizationId", { length: 16 }), }); export const account = singlestoreTable("account", { id: varchar("id", { length: 16 }).primaryKey(), accountId: varchar("accountId", { length: 255 }).notNull(), providerId: varchar("providerId", { length: 255 }).notNull(), userId: varchar("userId", { length: 16 }).notNull(), accessToken: text("accessToken"), refreshToken: text("refreshToken"), idToken: text("idToken"), expiresAt: datetime("expiresAt", { mode: "date" }), password: text("password"), }); export const verification = singlestoreTable("verification", { id: varchar("id", { length: 16 }).primaryKey(), identifier: varchar("identifier", { length: 255 }).notNull(), value: varchar("value", { length: 255 }).notNull(), expiresAt: datetime("expiresAt", { mode: "date" }).notNull(), }); export const organization = singlestoreTable("organization", { id: varchar("id", { length: 16 }).primaryKey(), name: varchar("name", { length: 255 }).notNull(), slug: varchar("slug", { length: 255 }), logo: text("logo"), createdAt: datetime("createdAt", { mode: "date" }) .notNull() .default(sql`CURRENT_TIMESTAMP`), metadata: text("metadata"), }); export const organizationSlug = singlestoreTable("organization_slug", { id: varchar("id", { length: 16 }).notNull(), slug: varchar("slug", { length: 255 }).primaryKey(), }); export const member = singlestoreTable("member", { id: varchar("id", { length: 16 }).primaryKey(), organizationId: varchar("organizationId", { length: 16 }).notNull(), userId: varchar("userId", { length: 16 }).notNull(), email: varchar("email", { length: 255 }).notNull(), role: varchar("role", { length: 50 }).notNull(), createdAt: datetime("createdAt", { mode: "date" }) .notNull() .default(sql`CURRENT_TIMESTAMP`), }); export const invitation = singlestoreTable("invitation", { id: varchar("id", { length: 16 }).primaryKey(), organizationId: varchar("organizationId", { length: 16 }).notNull(), email: varchar("email", { length: 255 }).notNull(), role: varchar("role", { length: 50 }), status: varchar("status", { length: 50 }).notNull(), expiresAt: datetime("expiresAt", { mode: "date" }).notNull(), inviterId: varchar("inviterId", { length: 16 }).notNull(), }); // Relations export const userRelations = relations(user, ({ many }) => ({ sessions: many(session), accounts: many(account), memberships: many(member), sentInvitations: many(invitation, { relationName: "inviter" }), })); export const sessionRelations = relations(session, ({ one }) => ({ user: one(user, { fields: [session.userId], references: [user.id], }), })); export const accountRelations = relations(account, ({ one }) => ({ user: one(user, { fields: [account.userId], references: [user.id], }), })); export const organizationRelations = relations(organization, ({ many }) => ({ members: many(member), invitations: many(invitation), })); export const memberRelations = relations(member, ({ one }) => ({ organization: one(organization, { fields: [member.organizationId], references: [organization.id], }), user: one(user, { fields: [member.userId], references: [user.id], }), })); export const invitationRelations = relations(invitation, ({ one }) => ({ organization: one(organization, { fields: [invitation.organizationId], references: [organization.id], }), inviter: one(user, { fields: [invitation.inviterId], references: [user.id], }), })); export const schema = { user, userEmail, session, account, verification, organization, organizationSlug, member, invitation, userRelations, sessionRelations, accountRelations, organizationRelations, memberRelations, invitationRelations, };