- pgSchema tables for auth, money, house, ref, games, cs, animaldex, site, meta (lists excluded via schemaFilter; runtime list tables are managed by meta.*) - drizzle/ baseline matches the reorged DB exactly (catalog diff = 0 on rehearsal) - db/reorg: one-time SQL that moves the flat public schema (rehearsed on a prod copy) - scripts/db-migrate.ts: migrator with --init to record the baseline and a guard against running the baseline on a non-empty, unrecorded database
40 lines
1.1 KiB
TypeScript
40 lines
1.1 KiB
TypeScript
import { integer, text, unique } from 'drizzle-orm/pg-core';
|
|
import { siteSchema } from './schemas';
|
|
import { id, timestamps } from './helpers';
|
|
|
|
export const tasks = siteSchema.table('tasks', {
|
|
id: id(),
|
|
name: text('name').notNull(),
|
|
currentPoints: integer('current_points').notNull().default(0),
|
|
totalPoints: integer('total_points').notNull().default(1),
|
|
notes: text('notes'),
|
|
...timestamps
|
|
});
|
|
|
|
export const topics = siteSchema.table('topics', {
|
|
id: id(),
|
|
name: text('name').notNull(),
|
|
emoji: text('emoji'),
|
|
...timestamps
|
|
});
|
|
|
|
export const tasksToTopics = siteSchema.table(
|
|
'task_topics',
|
|
{
|
|
id: id(),
|
|
taskId: integer('task_id')
|
|
.notNull()
|
|
.references(() => tasks.id, { onDelete: 'cascade' }),
|
|
topicId: integer('topic_id')
|
|
.notNull()
|
|
.references(() => topics.id, { onDelete: 'cascade' }),
|
|
...timestamps
|
|
},
|
|
(table) => [unique().on(table.taskId, table.topicId)]
|
|
);
|
|
|
|
export type Task = typeof tasks.$inferSelect;
|
|
export type NewTask = typeof tasks.$inferInsert;
|
|
export type Topic = typeof topics.$inferSelect;
|
|
export type NewTopic = typeof topics.$inferInsert;
|