Files
graff-mate-session-server/src/db/schema/sessions.ts
T
2025-06-17 12:27:30 +05:00

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),
}));