81 lines
2.3 KiB
TypeScript
81 lines
2.3 KiB
TypeScript
import {
|
|
pgTable,
|
|
timestamp,
|
|
uuid,
|
|
varchar,
|
|
uniqueIndex,
|
|
integer,
|
|
} from "drizzle-orm/pg-core";
|
|
import { companiesTable } from "./companies";
|
|
import { usersTable } from "./users";
|
|
import { relations } from "drizzle-orm";
|
|
import { serversTable } from "./servers";
|
|
import { clientsTable } from "./clients";
|
|
import { appsTable } from "./apps";
|
|
import { sql } from "drizzle-orm";
|
|
import { commentsTable } from "./comments";
|
|
|
|
export const sessionsTable = pgTable(
|
|
"sessions",
|
|
{
|
|
id: uuid("id").defaultRandom().primaryKey(),
|
|
status: varchar("status", {
|
|
enum: ["starting", "started", "restarting", "ending", "ended"],
|
|
})
|
|
.notNull()
|
|
.default("starting"),
|
|
pid: integer("pid"),
|
|
appId: uuid("app_id")
|
|
.notNull()
|
|
.references(() => appsTable.id, { onDelete: "cascade" }),
|
|
ownerId: uuid("owner_id")
|
|
.notNull()
|
|
.references(() => usersTable.id, { onDelete: "cascade" }),
|
|
serverId: uuid("server_id")
|
|
.notNull()
|
|
.references(() => serversTable.id, { onDelete: "cascade" }),
|
|
clientId: uuid("client_id")
|
|
.notNull()
|
|
.references(() => clientsTable.id, { onDelete: "cascade" }),
|
|
companyId: uuid("company_id")
|
|
.notNull()
|
|
.references(() => companiesTable.id, { onDelete: "cascade" }),
|
|
createdAt: timestamp("created_at", { withTimezone: true })
|
|
.notNull()
|
|
.defaultNow(),
|
|
updatedAt: timestamp("updated_at", { withTimezone: true })
|
|
.notNull()
|
|
.defaultNow()
|
|
.$onUpdate(() => new Date()),
|
|
},
|
|
(table) => ({
|
|
activeServerSessionIdx: uniqueIndex("active_server_session_idx")
|
|
.on(table.serverId, table.status)
|
|
.where(sql`${table.status} IN ('starting', 'started')`),
|
|
})
|
|
);
|
|
|
|
export const sessionsRelations = relations(sessionsTable, ({ one, many }) => ({
|
|
owner: one(usersTable, {
|
|
fields: [sessionsTable.ownerId],
|
|
references: [usersTable.id],
|
|
}),
|
|
server: one(serversTable, {
|
|
fields: [sessionsTable.serverId],
|
|
references: [serversTable.id],
|
|
}),
|
|
company: one(companiesTable, {
|
|
fields: [sessionsTable.companyId],
|
|
references: [companiesTable.id],
|
|
}),
|
|
client: one(clientsTable, {
|
|
fields: [sessionsTable.clientId],
|
|
references: [clientsTable.id],
|
|
}),
|
|
app: one(appsTable, {
|
|
fields: [sessionsTable.appId],
|
|
references: [appsTable.id],
|
|
}),
|
|
comments: many(commentsTable),
|
|
}));
|