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:
2026-04-26 18:17:27 -04:00
parent 6183557e95
commit e7d7f455c6
7 changed files with 2080 additions and 10 deletions

View 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"';

File diff suppressed because it is too large Load Diff

View File

@@ -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
}
]
}

View File

@@ -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()),
});

View File

@@ -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()),
});

View File

@@ -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";

View File

@@ -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");