Files
Beacon/src/db/schema/workspaces.ts
T
Uklonil 3aeaed0af2
CI / quality (push) Waiting to run
UPD: initial architecture
2026-07-27 10:23:50 +02:00

54 lines
2.2 KiB
TypeScript

import { index, pgTable, primaryKey, text, timestamp, uniqueIndex } from "drizzle-orm/pg-core";
import { workspaceRoleEnum } from "./enums";
import { users } from "./auth";
export const workspaces = pgTable("workspace", {
id: text("id").primaryKey(),
name: text("name").notNull(),
slug: text("slug").notNull().unique(),
description: text("description"),
imageUrl: text("image_url"),
createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
});
export const workspaceMembers = pgTable(
"workspace_member",
{
workspaceId: text("workspace_id")
.notNull()
.references(() => workspaces.id, { onDelete: "cascade" }),
userId: text("user_id")
.notNull()
.references(() => users.id, { onDelete: "cascade" }),
role: workspaceRoleEnum("role").notNull().default("MEMBER"),
joinedAt: timestamp("joined_at", { withTimezone: true }).notNull().defaultNow(),
createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow(),
},
(table) => [
primaryKey({ columns: [table.workspaceId, table.userId] }),
index("workspace_member_user_idx").on(table.userId),
],
);
export const workspaceInvitations = pgTable(
"workspace_invitation",
{
id: text("id").primaryKey(),
workspaceId: text("workspace_id")
.notNull()
.references(() => workspaces.id, { onDelete: "cascade" }),
email: text("email").notNull(),
role: workspaceRoleEnum("role").notNull().default("MEMBER"),
tokenHash: text("token_hash").notNull().unique(),
expiresAt: timestamp("expires_at", { withTimezone: true }).notNull(),
acceptedAt: timestamp("accepted_at", { withTimezone: true }),
createdByUserId: text("created_by_user_id")
.notNull()
.references(() => users.id, { onDelete: "restrict" }),
createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
},
(table) => [
uniqueIndex("workspace_invitation_email_active_idx").on(table.workspaceId, table.email),
index("workspace_invitation_workspace_idx").on(table.workspaceId),
],
);