fosrl.pangolin/server/db/schema.ts

76 lines
2.8 KiB
TypeScript
Raw Normal View History

2024-09-27 21:39:03 -04:00
import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core";
2024-09-28 11:51:21 -04:00
import { InferSelectModel } from "drizzle-orm";
2024-09-28 13:31:22 -04:00
// Orgs table
export const orgs = sqliteTable("orgs", {
2024-09-28 15:21:13 -04:00
orgId: integer("orgId").primaryKey({ autoIncrement: true }),
name: text("name").notNull(),
domain: text("domain").notNull(),
2024-09-28 11:51:21 -04:00
});
// Users table
export const users = sqliteTable("users", {
2024-09-28 15:21:13 -04:00
userId: integer("userId").primaryKey({ autoIncrement: true }),
2024-09-28 17:10:03 -04:00
orgId: integer("orgId").references(() => orgs.orgId, { onDelete: "cascade" }),
2024-09-28 15:21:13 -04:00
name: text("name").notNull(),
email: text("email").notNull(),
groups: text("groups"),
2024-09-28 11:51:21 -04:00
});
// Sites table
export const sites = sqliteTable("sites", {
2024-09-28 15:21:13 -04:00
siteId: integer("siteId").primaryKey({ autoIncrement: true }),
2024-09-28 17:10:03 -04:00
orgId: integer("orgId").references(() => orgs.orgId, { onDelete: "cascade" }),
exitNode: integer("exitNode").references(() => exitNodes.exitNodeId, { onDelete: "set null" }),
2024-09-28 15:21:13 -04:00
name: text("name").notNull(),
subdomain: text("subdomain"),
pubKey: text("pubKey"),
subnet: text("subnet"),
megabytesIn: integer("bytesIn"),
megabytesOut: integer("bytesOut")
2024-09-28 11:51:21 -04:00
});
// Resources table
export const resources = sqliteTable("resources", {
2024-09-28 17:10:03 -04:00
resourceId: text("resourceId", { length: 2048 }).primaryKey(),
siteId: integer("siteId").references(() => sites.siteId, { onDelete: "cascade" }),
2024-09-28 15:21:13 -04:00
name: text("name").notNull(),
subdomain: text("subdomain"),
2024-09-28 11:51:21 -04:00
});
2024-09-28 17:10:03 -04:00
// Targets table
export const targets = sqliteTable("targets", {
targetId: integer("targetId").primaryKey({ autoIncrement: true }),
resourceId: text("resourceId").references(() => resources.resourceId, { onDelete: "cascade" }),
ip: text("ip").notNull(),
2024-09-28 22:50:10 -04:00
method: text("method").notNull(),
port: integer("port").notNull(),
2024-09-28 17:10:03 -04:00
protocol: text("protocol"),
enabled: integer("enabled", { mode: "boolean" }).notNull().default(true),
2024-09-28 17:10:03 -04:00
});
2024-09-28 11:51:21 -04:00
// Exit Nodes table
export const exitNodes = sqliteTable("exitNodes", {
2024-09-28 15:21:13 -04:00
exitNodeId: integer("exitNodeId").primaryKey({ autoIncrement: true }),
name: text("name").notNull(),
address: text("address").notNull(),
privateKey: text("privateKey"),
listenPort: integer("listenPort"),
2024-09-28 11:51:21 -04:00
});
2024-09-27 21:39:03 -04:00
2024-09-28 11:51:21 -04:00
// Routes table
export const routes = sqliteTable("routes", {
2024-09-28 15:21:13 -04:00
routeId: integer("routeId").primaryKey({ autoIncrement: true }),
2024-09-28 17:10:03 -04:00
exitNodeId: integer("exitNodeId").references(() => exitNodes.exitNodeId, { onDelete: "cascade" }),
2024-09-28 15:21:13 -04:00
subnet: text("subnet").notNull(),
2024-09-28 13:31:22 -04:00
});
2024-09-28 11:51:21 -04:00
// Define the model types for type inference
2024-09-28 13:31:22 -04:00
export type Org = InferSelectModel<typeof orgs>;
2024-09-28 11:51:21 -04:00
export type User = InferSelectModel<typeof users>;
export type Site = InferSelectModel<typeof sites>;
export type Resource = InferSelectModel<typeof resources>;
export type ExitNode = InferSelectModel<typeof exitNodes>;
export type Route = InferSelectModel<typeof routes>;
2024-09-28 22:50:10 -04:00
export type Target = InferSelectModel<typeof targets>;