FRE-588: Consolidate schema - add teams/project_members exports, fix FK references, update seed
- Export teams, teamMembers, projectMembers from schema index barrel - Add missing FK: cohortMembers.userId → users.id - Add missing FK: alerts.acknowledgedBy → users.id - Update seed.ts to match current schema (characters/scenes use projectId, not scriptId)
This commit is contained in:
78
src/db/migrations/0003_goofy_the_leader.sql
Normal file
78
src/db/migrations/0003_goofy_the_leader.sql
Normal file
@@ -0,0 +1,78 @@
|
||||
CREATE TABLE `project_members` (
|
||||
`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||
`project_id` integer NOT NULL,
|
||||
`user_id` integer NOT NULL,
|
||||
`role` text DEFAULT 'editor' NOT NULL,
|
||||
`added_at` integer NOT NULL,
|
||||
FOREIGN KEY (`project_id`) REFERENCES `projects`(`id`) ON UPDATE no action ON DELETE cascade,
|
||||
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE cascade
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE INDEX `project_members_project_user_unique` ON `project_members` (`project_id`,`user_id`);--> statement-breakpoint
|
||||
CREATE INDEX `idx_project_members_user` ON `project_members` (`user_id`);--> statement-breakpoint
|
||||
CREATE TABLE `team_members` (
|
||||
`id` integer PRIMARY KEY AUTOINCREMENT NOT NULL,
|
||||
`team_id` text NOT NULL,
|
||||
`user_id` integer NOT NULL,
|
||||
`role` text DEFAULT 'editor' NOT NULL,
|
||||
`joined_at` integer NOT NULL,
|
||||
FOREIGN KEY (`team_id`) REFERENCES `teams`(`id`) ON UPDATE no action ON DELETE cascade,
|
||||
FOREIGN KEY (`user_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE cascade
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE INDEX `team_members_team_user_unique` ON `team_members` (`team_id`,`user_id`);--> statement-breakpoint
|
||||
CREATE INDEX `idx_team_members_user` ON `team_members` (`user_id`);--> statement-breakpoint
|
||||
CREATE TABLE `teams` (
|
||||
`id` text PRIMARY KEY NOT NULL,
|
||||
`name` text NOT NULL,
|
||||
`owner_id` integer NOT NULL,
|
||||
`created_at` integer NOT NULL,
|
||||
`updated_at` integer NOT NULL,
|
||||
FOREIGN KEY (`owner_id`) REFERENCES `users`(`id`) ON UPDATE no action ON DELETE no action
|
||||
);
|
||||
--> statement-breakpoint
|
||||
CREATE INDEX `idx_teams_owner` ON `teams` (`owner_id`);--> statement-breakpoint
|
||||
DROP INDEX "character_relationships_unique_pair";--> statement-breakpoint
|
||||
DROP INDEX "project_members_project_user_unique";--> statement-breakpoint
|
||||
DROP INDEX "idx_project_members_user";--> statement-breakpoint
|
||||
DROP INDEX "revision_changes_revision_idx";--> statement-breakpoint
|
||||
DROP INDEX "revision_changes_type_idx";--> statement-breakpoint
|
||||
DROP INDEX "revisions_script_version_idx";--> statement-breakpoint
|
||||
DROP INDEX "revisions_script_branch_idx";--> statement-breakpoint
|
||||
DROP INDEX "revisions_author_idx";--> statement-breakpoint
|
||||
DROP INDEX "team_members_team_user_unique";--> statement-breakpoint
|
||||
DROP INDEX "idx_team_members_user";--> statement-breakpoint
|
||||
DROP INDEX "idx_teams_owner";--> statement-breakpoint
|
||||
DROP INDEX "users_email_unique";--> statement-breakpoint
|
||||
DROP INDEX "users_username_unique";--> statement-breakpoint
|
||||
DROP INDEX "waitlist_signups_email_unique";--> statement-breakpoint
|
||||
ALTER TABLE `alert_rules` ALTER COLUMN "created_at" TO "created_at" integer NOT NULL DEFAULT '"2026-04-26T22:14:11.161Z"';--> statement-breakpoint
|
||||
CREATE UNIQUE INDEX `character_relationships_unique_pair` ON `character_relationships` (`character_a_id`,`character_b_id`);--> statement-breakpoint
|
||||
CREATE INDEX `revision_changes_revision_idx` ON `revision_changes` (`revision_id`);--> statement-breakpoint
|
||||
CREATE INDEX `revision_changes_type_idx` ON `revision_changes` (`change_type`);--> statement-breakpoint
|
||||
CREATE INDEX `revisions_script_version_idx` ON `revisions` (`script_id`,`version_number`);--> statement-breakpoint
|
||||
CREATE INDEX `revisions_script_branch_idx` ON `revisions` (`script_id`,`branch_name`);--> statement-breakpoint
|
||||
CREATE INDEX `revisions_author_idx` ON `revisions` (`author_id`);--> statement-breakpoint
|
||||
CREATE UNIQUE INDEX `users_email_unique` ON `users` (`email`);--> statement-breakpoint
|
||||
CREATE UNIQUE INDEX `users_username_unique` ON `users` (`username`);--> statement-breakpoint
|
||||
CREATE UNIQUE INDEX `waitlist_signups_email_unique` ON `waitlist_signups` (`email`);--> statement-breakpoint
|
||||
ALTER TABLE `alert_rules` ALTER COLUMN "updated_at" TO "updated_at" integer NOT NULL DEFAULT '"2026-04-26T22:14:11.161Z"';--> statement-breakpoint
|
||||
ALTER TABLE `alerts` ALTER COLUMN "created_at" TO "created_at" integer NOT NULL DEFAULT '"2026-04-26T22:14:11.165Z"';--> statement-breakpoint
|
||||
ALTER TABLE `alerts` ALTER COLUMN "acknowledged_by" TO "acknowledged_by" integer REFERENCES users(id) ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
||||
ALTER TABLE `cohort_members` ALTER COLUMN "joined_at" TO "joined_at" integer NOT NULL DEFAULT '"2026-04-26T22:14:11.174Z"';--> statement-breakpoint
|
||||
ALTER TABLE `cohort_members` ALTER COLUMN "user_id" TO "user_id" integer NOT NULL REFERENCES users(id) ON DELETE no action ON UPDATE no action;--> statement-breakpoint
|
||||
ALTER TABLE `cohorts` ALTER COLUMN "created_at" TO "created_at" integer NOT NULL DEFAULT '"2026-04-26T22:14:11.174Z"';--> statement-breakpoint
|
||||
ALTER TABLE `cohorts` ALTER COLUMN "updated_at" TO "updated_at" integer NOT NULL DEFAULT '"2026-04-26T22:14:11.174Z"';--> statement-breakpoint
|
||||
ALTER TABLE `kpi_snapshots` ALTER COLUMN "created_at" TO "created_at" integer NOT NULL DEFAULT '"2026-04-26T22:14:11.158Z"';--> statement-breakpoint
|
||||
ALTER TABLE `nps_responses` ALTER COLUMN "created_at" TO "created_at" integer NOT NULL DEFAULT '"2026-04-26T22:14:11.171Z"';--> statement-breakpoint
|
||||
ALTER TABLE `projects` ALTER COLUMN "created_at" TO "created_at" integer NOT NULL DEFAULT '"2026-04-26T22:14:11.134Z"';--> statement-breakpoint
|
||||
ALTER TABLE `projects` ALTER COLUMN "updated_at" TO "updated_at" integer NOT NULL DEFAULT '"2026-04-26T22:14:11.134Z"';--> statement-breakpoint
|
||||
ALTER TABLE `scheduled_reports` ALTER COLUMN "created_at" TO "created_at" integer NOT NULL DEFAULT '"2026-04-26T22:14:11.168Z"';--> statement-breakpoint
|
||||
ALTER TABLE `scheduled_reports` ALTER COLUMN "updated_at" TO "updated_at" integer NOT NULL DEFAULT '"2026-04-26T22:14:11.168Z"';--> statement-breakpoint
|
||||
ALTER TABLE `scripts` ALTER COLUMN "created_at" TO "created_at" integer NOT NULL DEFAULT '"2026-04-26T22:14:11.141Z"';--> statement-breakpoint
|
||||
ALTER TABLE `scripts` ALTER COLUMN "updated_at" TO "updated_at" integer NOT NULL DEFAULT '"2026-04-26T22:14:11.141Z"';--> statement-breakpoint
|
||||
ALTER TABLE `users` ALTER COLUMN "created_at" TO "created_at" integer NOT NULL DEFAULT '"2026-04-26T22:14:11.126Z"';--> statement-breakpoint
|
||||
ALTER TABLE `users` ALTER COLUMN "updated_at" TO "updated_at" integer NOT NULL DEFAULT '"2026-04-26T22:14:11.126Z"';--> statement-breakpoint
|
||||
ALTER TABLE `waitlist_events` ALTER COLUMN "created_at" TO "created_at" integer NOT NULL DEFAULT '"2026-04-26T22:14:11.178Z"';--> statement-breakpoint
|
||||
ALTER TABLE `waitlist_signups` ALTER COLUMN "created_at" TO "created_at" integer NOT NULL DEFAULT '"2026-04-26T22:14:11.178Z"';--> statement-breakpoint
|
||||
ALTER TABLE `waitlist_signups` ALTER COLUMN "updated_at" TO "updated_at" integer NOT NULL DEFAULT '"2026-04-26T22:14:11.178Z"';
|
||||
1984
src/db/migrations/meta/0003_snapshot.json
Normal file
1984
src/db/migrations/meta/0003_snapshot.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -22,6 +22,13 @@
|
||||
"when": 1777198863362,
|
||||
"tag": "0002_chemical_shocker",
|
||||
"breakpoints": true
|
||||
},
|
||||
{
|
||||
"idx": 3,
|
||||
"version": "6",
|
||||
"when": 1777241651204,
|
||||
"tag": "0003_goofy_the_leader",
|
||||
"breakpoints": true
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -1,5 +1,6 @@
|
||||
import { sqliteTable, text, integer, real } from "drizzle-orm/sqlite-core";
|
||||
import { alertRules } from "./alert_rules";
|
||||
import { users } from "./users";
|
||||
|
||||
export const alerts = sqliteTable("alerts", {
|
||||
id: integer("id").primaryKey({ autoIncrement: true }),
|
||||
@@ -11,7 +12,7 @@ export const alerts = sqliteTable("alerts", {
|
||||
message: text("message").notNull(),
|
||||
wasSent: integer("was_sent", { mode: "boolean" }).notNull().default(false),
|
||||
sentAt: integer("sent_at", { mode: "timestamp" }),
|
||||
acknowledgedBy: integer("acknowledged_by"),
|
||||
acknowledgedBy: integer("acknowledged_by").references(() => users.id),
|
||||
acknowledgedAt: integer("acknowledged_at", { mode: "timestamp" }),
|
||||
createdAt: integer("created_at", { mode: "timestamp" }).notNull().default(new Date()),
|
||||
});
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core";
|
||||
import { users } from "./users";
|
||||
|
||||
export const cohorts = sqliteTable("cohorts", {
|
||||
id: integer("id").primaryKey({ autoIncrement: true }),
|
||||
@@ -16,7 +17,7 @@ export const cohorts = sqliteTable("cohorts", {
|
||||
export const cohortMembers = sqliteTable("cohort_members", {
|
||||
id: integer("id").primaryKey({ autoIncrement: true }),
|
||||
cohortId: integer("cohort_id").notNull().references(() => cohorts.id),
|
||||
userId: integer("user_id").notNull(),
|
||||
userId: integer("user_id").notNull().references(() => users.id),
|
||||
joinedAt: integer("joined_at", { mode: "timestamp" }).notNull().default(new Date()),
|
||||
});
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
export { users, type User, type NewUser } from "./users";
|
||||
export { teams, teamMembers, type Team, type NewTeam, type TeamMember, type NewTeamMember } from "./teams";
|
||||
export { projects, type Project, type NewProject } from "./projects";
|
||||
export { projectMembers, type ProjectMember, type NewProjectMember } from "./project_members";
|
||||
export { scripts, type Script, type NewScript } from "./scripts";
|
||||
export { characters, characterRelationships, type Character, type NewCharacter, type CharacterRelationship, type NewCharacterRelationship } from "./characters";
|
||||
export { scenes, sceneCharacters, type Scene, type NewScene, type SceneCharacter, type NewSceneCharacter } from "./scenes";
|
||||
|
||||
@@ -43,8 +43,9 @@ export async function seedDatabase() {
|
||||
|
||||
// Create test character
|
||||
const character = await db.insert(characters).values({
|
||||
scriptId: script[0].id,
|
||||
projectId: project[0].id,
|
||||
name: "John Doe",
|
||||
slug: "john-doe",
|
||||
role: "protagonist",
|
||||
description: "The main character",
|
||||
age: 30,
|
||||
@@ -55,14 +56,10 @@ export async function seedDatabase() {
|
||||
|
||||
// Create test scene
|
||||
const scene = await db.insert(scenes).values({
|
||||
scriptId: script[0].id,
|
||||
sceneNumber: 1,
|
||||
actNumber: 1,
|
||||
slugline: "INT. OFFICE - DAY",
|
||||
location: "Office",
|
||||
timeOfDay: "DAY",
|
||||
projectId: project[0].id,
|
||||
title: "INT. OFFICE - DAY",
|
||||
content: "John sits at his desk, contemplating his next move.",
|
||||
summary: "John in his office",
|
||||
order: 1,
|
||||
}).returning();
|
||||
|
||||
if (!scene[0]) throw new Error("Failed to create scene");
|
||||
|
||||
Reference in New Issue
Block a user