feat(db): teams schema + preferences.mutable migration (#175)
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
All checks were successful
ci/woodpecker/push/ci Pipeline was successful
Co-authored-by: Jason Woltje <jason@diversecanvas.com> Co-committed-by: Jason Woltje <jason@diversecanvas.com>
This commit was merged in pull request #175.
This commit is contained in:
@@ -11,6 +11,7 @@ import {
|
||||
uuid,
|
||||
jsonb,
|
||||
index,
|
||||
uniqueIndex,
|
||||
real,
|
||||
integer,
|
||||
customType,
|
||||
@@ -72,6 +73,44 @@ export const verifications = pgTable('verifications', {
|
||||
updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(),
|
||||
});
|
||||
|
||||
// ─── Teams ───────────────────────────────────────────────────────────────────
|
||||
// Declared before projects because projects references teams.
|
||||
|
||||
export const teams = pgTable('teams', {
|
||||
id: uuid('id').primaryKey().defaultRandom(),
|
||||
name: text('name').notNull(),
|
||||
slug: text('slug').notNull().unique(),
|
||||
ownerId: text('owner_id')
|
||||
.notNull()
|
||||
.references(() => users.id, { onDelete: 'restrict' }),
|
||||
managerId: text('manager_id')
|
||||
.notNull()
|
||||
.references(() => users.id, { onDelete: 'restrict' }),
|
||||
createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),
|
||||
updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(),
|
||||
});
|
||||
|
||||
export const teamMembers = pgTable(
|
||||
'team_members',
|
||||
{
|
||||
id: uuid('id').primaryKey().defaultRandom(),
|
||||
teamId: uuid('team_id')
|
||||
.notNull()
|
||||
.references(() => teams.id, { onDelete: 'cascade' }),
|
||||
userId: text('user_id')
|
||||
.notNull()
|
||||
.references(() => users.id, { onDelete: 'cascade' }),
|
||||
role: text('role', { enum: ['manager', 'member'] })
|
||||
.notNull()
|
||||
.default('member'),
|
||||
invitedBy: text('invited_by').references(() => users.id, { onDelete: 'set null' }),
|
||||
joinedAt: timestamp('joined_at', { withTimezone: true }).notNull().defaultNow(),
|
||||
},
|
||||
(t) => ({
|
||||
uniq: uniqueIndex('team_members_team_user_idx').on(t.teamId, t.userId),
|
||||
}),
|
||||
);
|
||||
|
||||
// ─── Brain ───────────────────────────────────────────────────────────────────
|
||||
// Declared before Chat because conversations references projects.
|
||||
|
||||
@@ -83,6 +122,10 @@ export const projects = pgTable('projects', {
|
||||
.notNull()
|
||||
.default('active'),
|
||||
ownerId: text('owner_id').references(() => users.id, { onDelete: 'set null' }),
|
||||
teamId: uuid('team_id').references(() => teams.id, { onDelete: 'cascade' }),
|
||||
ownerType: text('owner_type', { enum: ['user', 'team'] })
|
||||
.notNull()
|
||||
.default('user'),
|
||||
metadata: jsonb('metadata'),
|
||||
createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),
|
||||
updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(),
|
||||
@@ -320,6 +363,7 @@ export const preferences = pgTable(
|
||||
.notNull()
|
||||
.default('general'),
|
||||
source: text('source'),
|
||||
mutable: boolean('mutable').notNull().default(true),
|
||||
createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),
|
||||
updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(),
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user