File
Blob: src/worker/db/d1/schema/namespaceMemberships.ts
| 1 | import { index, integer, primaryKey, sqliteTable, text } from "drizzle-orm/sqlite-core"; |
| 2 | |
| 3 | import { namespaces } from "./namespaces"; |
| 4 | import { 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. |
| 8 | export 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 | |
| 27 | export type NamespaceMembershipRow = typeof namespaceMemberships.$inferSelect; |
| 28 | export type NewNamespaceMembershipRow = typeof namespaceMemberships.$inferInsert; |