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,
|
"when": 1777198863362,
|
||||||
"tag": "0002_chemical_shocker",
|
"tag": "0002_chemical_shocker",
|
||||||
"breakpoints": true
|
"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 { sqliteTable, text, integer, real } from "drizzle-orm/sqlite-core";
|
||||||
import { alertRules } from "./alert_rules";
|
import { alertRules } from "./alert_rules";
|
||||||
|
import { users } from "./users";
|
||||||
|
|
||||||
export const alerts = sqliteTable("alerts", {
|
export const alerts = sqliteTable("alerts", {
|
||||||
id: integer("id").primaryKey({ autoIncrement: true }),
|
id: integer("id").primaryKey({ autoIncrement: true }),
|
||||||
@@ -11,7 +12,7 @@ export const alerts = sqliteTable("alerts", {
|
|||||||
message: text("message").notNull(),
|
message: text("message").notNull(),
|
||||||
wasSent: integer("was_sent", { mode: "boolean" }).notNull().default(false),
|
wasSent: integer("was_sent", { mode: "boolean" }).notNull().default(false),
|
||||||
sentAt: integer("sent_at", { mode: "timestamp" }),
|
sentAt: integer("sent_at", { mode: "timestamp" }),
|
||||||
acknowledgedBy: integer("acknowledged_by"),
|
acknowledgedBy: integer("acknowledged_by").references(() => users.id),
|
||||||
acknowledgedAt: integer("acknowledged_at", { mode: "timestamp" }),
|
acknowledgedAt: integer("acknowledged_at", { mode: "timestamp" }),
|
||||||
createdAt: integer("created_at", { mode: "timestamp" }).notNull().default(new Date()),
|
createdAt: integer("created_at", { mode: "timestamp" }).notNull().default(new Date()),
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core";
|
import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core";
|
||||||
|
import { users } from "./users";
|
||||||
|
|
||||||
export const cohorts = sqliteTable("cohorts", {
|
export const cohorts = sqliteTable("cohorts", {
|
||||||
id: integer("id").primaryKey({ autoIncrement: true }),
|
id: integer("id").primaryKey({ autoIncrement: true }),
|
||||||
@@ -16,7 +17,7 @@ export const cohorts = sqliteTable("cohorts", {
|
|||||||
export const cohortMembers = sqliteTable("cohort_members", {
|
export const cohortMembers = sqliteTable("cohort_members", {
|
||||||
id: integer("id").primaryKey({ autoIncrement: true }),
|
id: integer("id").primaryKey({ autoIncrement: true }),
|
||||||
cohortId: integer("cohort_id").notNull().references(() => cohorts.id),
|
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()),
|
joinedAt: integer("joined_at", { mode: "timestamp" }).notNull().default(new Date()),
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,7 @@
|
|||||||
export { users, type User, type NewUser } from "./users";
|
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 { 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 { scripts, type Script, type NewScript } from "./scripts";
|
||||||
export { characters, characterRelationships, type Character, type NewCharacter, type CharacterRelationship, type NewCharacterRelationship } from "./characters";
|
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";
|
export { scenes, sceneCharacters, type Scene, type NewScene, type SceneCharacter, type NewSceneCharacter } from "./scenes";
|
||||||
|
|||||||
@@ -43,8 +43,9 @@ export async function seedDatabase() {
|
|||||||
|
|
||||||
// Create test character
|
// Create test character
|
||||||
const character = await db.insert(characters).values({
|
const character = await db.insert(characters).values({
|
||||||
scriptId: script[0].id,
|
projectId: project[0].id,
|
||||||
name: "John Doe",
|
name: "John Doe",
|
||||||
|
slug: "john-doe",
|
||||||
role: "protagonist",
|
role: "protagonist",
|
||||||
description: "The main character",
|
description: "The main character",
|
||||||
age: 30,
|
age: 30,
|
||||||
@@ -55,14 +56,10 @@ export async function seedDatabase() {
|
|||||||
|
|
||||||
// Create test scene
|
// Create test scene
|
||||||
const scene = await db.insert(scenes).values({
|
const scene = await db.insert(scenes).values({
|
||||||
scriptId: script[0].id,
|
projectId: project[0].id,
|
||||||
sceneNumber: 1,
|
title: "INT. OFFICE - DAY",
|
||||||
actNumber: 1,
|
|
||||||
slugline: "INT. OFFICE - DAY",
|
|
||||||
location: "Office",
|
|
||||||
timeOfDay: "DAY",
|
|
||||||
content: "John sits at his desk, contemplating his next move.",
|
content: "John sits at his desk, contemplating his next move.",
|
||||||
summary: "John in his office",
|
order: 1,
|
||||||
}).returning();
|
}).returning();
|
||||||
|
|
||||||
if (!scene[0]) throw new Error("Failed to create scene");
|
if (!scene[0]) throw new Error("Failed to create scene");
|
||||||
|
|||||||
Reference in New Issue
Block a user