Skip to content
File

Blob: src/worker/db/d1/schema/namespaceMemberships.ts

typescript29 lines
1import { index, integer, primaryKey, sqliteTable, text } from "drizzle-orm/sqlite-core";
2 
3import { namespaces } from "./namespaces";
4import { users } from "./users";
5 
6// Any membership row implies owner-level access. Roles are intentionally
7// deferred — only the user/namespace edge is recorded today.
8export const namespaceMemberships = sqliteTable(
9 "namespace_memberships",
10 {
11 namespaceId: text("namespace_id")
12 .notNull()
13 .references(() => namespaces.id, { onDelete: "cascade" }),
14 userId: text("user_id")
15 .notNull()
16 .references(() => users.id, { onDelete: "cascade" }),
17 createdAt: integer("created_at").notNull(),
18 },
19 (table) => [
20 primaryKey({ columns: [table.namespaceId, table.userId] }),
21 // Reverse-direction index for "my namespaces" / "my repositories" pages.
22 // The PK already covers (namespace_id, user_id) lookups.
23 index("idx_namespace_memberships_user_ns").on(table.userId, table.namespaceId),
24 ]
25);
26 
27export type NamespaceMembershipRow = typeof namespaceMemberships.$inferSelect;
28export type NewNamespaceMembershipRow = typeof namespaceMemberships.$inferInsert;