UPD: initial architecture
CI / quality (push) Waiting to run

This commit is contained in:
Uklonil
2026-07-27 10:23:50 +02:00
parent 63fc0e6771
commit 3aeaed0af2
108 changed files with 11103 additions and 0 deletions
+53
View File
@@ -0,0 +1,53 @@
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),
],
);