import { pgTable, serial, varchar, boolean, integer, bigint, real, text } from "drizzle-orm/pg-core"; import { InferSelectModel } from "drizzle-orm"; import { domains, orgs, targets, users, exitNodes, sessions } from "./schema"; export const certificates = pgTable("certificates", { certId: serial("certId").primaryKey(), domain: varchar("domain", { length: 255 }).notNull().unique(), domainId: varchar("domainId").references(() => domains.domainId, { onDelete: "cascade" }), wildcard: boolean("wildcard").default(false), status: varchar("status", { length: 50 }).notNull().default("pending"), // pending, requested, valid, expired, failed expiresAt: bigint("expiresAt", { mode: "number" }), lastRenewalAttempt: bigint("lastRenewalAttempt", { mode: "number" }), createdAt: bigint("createdAt", { mode: "number" }).notNull(), updatedAt: bigint("updatedAt", { mode: "number" }).notNull(), orderId: varchar("orderId", { length: 500 }), errorMessage: text("errorMessage"), renewalCount: integer("renewalCount").default(0), certFile: text("certFile"), keyFile: text("keyFile") }); export const dnsChallenge = pgTable("dnsChallenges", { dnsChallengeId: serial("dnsChallengeId").primaryKey(), domain: varchar("domain", { length: 255 }).notNull(), token: varchar("token", { length: 255 }).notNull(), keyAuthorization: varchar("keyAuthorization", { length: 1000 }).notNull(), createdAt: bigint("createdAt", { mode: "number" }).notNull(), expiresAt: bigint("expiresAt", { mode: "number" }).notNull(), completed: boolean("completed").default(false) }); export const account = pgTable("account", { accountId: serial("accountId").primaryKey(), userId: varchar("userId") .notNull() .references(() => users.userId, { onDelete: "cascade" }) }); export const customers = pgTable("customers", { customerId: varchar("customerId", { length: 255 }).primaryKey().notNull(), orgId: varchar("orgId", { length: 255 }) .notNull() .references(() => orgs.orgId, { onDelete: "cascade" }), // accountId: integer("accountId") // .references(() => account.accountId, { onDelete: "cascade" }), // Optional, if using accounts email: varchar("email", { length: 255 }), name: varchar("name", { length: 255 }), phone: varchar("phone", { length: 50 }), address: text("address"), createdAt: bigint("createdAt", { mode: "number" }).notNull(), updatedAt: bigint("updatedAt", { mode: "number" }).notNull() }); export const subscriptions = pgTable("subscriptions", { subscriptionId: varchar("subscriptionId", { length: 255 }) .primaryKey() .notNull(), customerId: varchar("customerId", { length: 255 }) .notNull() .references(() => customers.customerId, { onDelete: "cascade" }), status: varchar("status", { length: 50 }).notNull().default("active"), // active, past_due, canceled, unpaid canceledAt: bigint("canceledAt", { mode: "number" }), createdAt: bigint("createdAt", { mode: "number" }).notNull(), updatedAt: bigint("updatedAt", { mode: "number" }), billingCycleAnchor: bigint("billingCycleAnchor", { mode: "number" }) }); export const subscriptionItems = pgTable("subscriptionItems", { subscriptionItemId: serial("subscriptionItemId").primaryKey(), subscriptionId: varchar("subscriptionId", { length: 255 }) .notNull() .references(() => subscriptions.subscriptionId, { onDelete: "cascade" }), planId: varchar("planId", { length: 255 }).notNull(), priceId: varchar("priceId", { length: 255 }), meterId: varchar("meterId", { length: 255 }), unitAmount: real("unitAmount"), tiers: text("tiers"), interval: varchar("interval", { length: 50 }), currentPeriodStart: bigint("currentPeriodStart", { mode: "number" }), currentPeriodEnd: bigint("currentPeriodEnd", { mode: "number" }), name: varchar("name", { length: 255 }) }); export const accountDomains = pgTable("accountDomains", { accountId: integer("accountId") .notNull() .references(() => account.accountId, { onDelete: "cascade" }), domainId: varchar("domainId") .notNull() .references(() => domains.domainId, { onDelete: "cascade" }) }); export const usage = pgTable("usage", { usageId: varchar("usageId", { length: 255 }).primaryKey(), featureId: varchar("featureId", { length: 255 }).notNull(), orgId: varchar("orgId") .references(() => orgs.orgId, { onDelete: "cascade" }) .notNull(), meterId: varchar("meterId", { length: 255 }), instantaneousValue: real("instantaneousValue"), latestValue: real("latestValue").notNull(), previousValue: real("previousValue"), updatedAt: bigint("updatedAt", { mode: "number" }).notNull(), rolledOverAt: bigint("rolledOverAt", { mode: "number" }), nextRolloverAt: bigint("nextRolloverAt", { mode: "number" }) }); export const limits = pgTable("limits", { limitId: varchar("limitId", { length: 255 }).primaryKey(), featureId: varchar("featureId", { length: 255 }).notNull(), orgId: varchar("orgId") .references(() => orgs.orgId, { onDelete: "cascade" }) .notNull(), value: real("value"), description: text("description") }); export const usageNotifications = pgTable("usageNotifications", { notificationId: serial("notificationId").primaryKey(), orgId: varchar("orgId") .notNull() .references(() => orgs.orgId, { onDelete: "cascade" }), featureId: varchar("featureId", { length: 255 }).notNull(), limitId: varchar("limitId", { length: 255 }).notNull(), notificationType: varchar("notificationType", { length: 50 }).notNull(), sentAt: bigint("sentAt", { mode: "number" }).notNull() }); export const domainNamespaces = pgTable("domainNamespaces", { domainNamespaceId: varchar("domainNamespaceId", { length: 255 }).primaryKey(), domainId: varchar("domainId") .references(() => domains.domainId, { onDelete: "set null" }) .notNull() }); export const exitNodeOrgs = pgTable("exitNodeOrgs", { exitNodeId: integer("exitNodeId") .notNull() .references(() => exitNodes.exitNodeId, { onDelete: "cascade" }), orgId: text("orgId") .notNull() .references(() => orgs.orgId, { onDelete: "cascade" }) }); export const remoteExitNodes = pgTable("remoteExitNode", { remoteExitNodeId: varchar("id").primaryKey(), secretHash: varchar("secretHash").notNull(), dateCreated: varchar("dateCreated").notNull(), version: varchar("version"), exitNodeId: integer("exitNodeId").references(() => exitNodes.exitNodeId, { onDelete: "cascade" }) }); export const remoteExitNodeSessions = pgTable("remoteExitNodeSession", { sessionId: varchar("id").primaryKey(), remoteExitNodeId: varchar("remoteExitNodeId") .notNull() .references(() => remoteExitNodes.remoteExitNodeId, { onDelete: "cascade" }), expiresAt: bigint("expiresAt", { mode: "number" }).notNull() }); export const loginPage = pgTable("loginPage", { loginPageId: serial("loginPageId").primaryKey(), subdomain: varchar("subdomain"), fullDomain: varchar("fullDomain"), exitNodeId: integer("exitNodeId").references(() => exitNodes.exitNodeId, { onDelete: "set null" }), domainId: varchar("domainId").references(() => domains.domainId, { onDelete: "set null" }) }); export const loginPageOrg = pgTable("loginPageOrg", { loginPageId: integer("loginPageId") .notNull() .references(() => loginPage.loginPageId, { onDelete: "cascade" }), orgId: varchar("orgId") .notNull() .references(() => orgs.orgId, { onDelete: "cascade" }) }); export const sessionTransferToken = pgTable("sessionTransferToken", { token: varchar("token").primaryKey(), sessionId: varchar("sessionId") .notNull() .references(() => sessions.sessionId, { onDelete: "cascade" }), encryptedSession: text("encryptedSession").notNull(), expiresAt: bigint("expiresAt", { mode: "number" }).notNull() }); export type Limit = InferSelectModel; export type Account = InferSelectModel; export type Certificate = InferSelectModel; export type DnsChallenge = InferSelectModel; export type Customer = InferSelectModel; export type Subscription = InferSelectModel; export type SubscriptionItem = InferSelectModel; export type Usage = InferSelectModel; export type UsageLimit = InferSelectModel; export type AccountDomain = InferSelectModel; export type UsageNotification = InferSelectModel; export type RemoteExitNode = InferSelectModel; export type RemoteExitNodeSession = InferSelectModel< typeof remoteExitNodeSessions >; export type ExitNodeOrg = InferSelectModel; export type LoginPage = InferSelectModel;