From f58a2b690d78388613c9eb16f3e60b03a617e3fc Mon Sep 17 00:00:00 2001 From: Richard R Date: Mon, 16 Feb 2026 17:29:26 -0700 Subject: [PATCH] refactor(db): remove user_id foreign key from user_tts_chars Remove the foreign key constraint referencing the user table in both Postgres and SQLite schemas. This decouples the usage tracking from the primary user table. --- ...tin_hammer.sql => 0000_fearless_vargas.sql} | 1 - drizzle/postgres/meta/0000_snapshot.json | 18 ++---------------- drizzle/postgres/meta/_journal.json | 4 ++-- ...ervous_preak.sql => 0000_lucky_inertia.sql} | 3 +-- drizzle/sqlite/meta/0000_snapshot.json | 18 ++---------------- drizzle/sqlite/meta/_journal.json | 4 ++-- src/db/schema_postgres.ts | 2 +- src/db/schema_sqlite.ts | 2 +- 8 files changed, 11 insertions(+), 41 deletions(-) rename drizzle/postgres/{0000_famous_justin_hammer.sql => 0000_fearless_vargas.sql} (97%) rename drizzle/sqlite/{0000_nervous_preak.sql => 0000_lucky_inertia.sql} (98%) diff --git a/drizzle/postgres/0000_famous_justin_hammer.sql b/drizzle/postgres/0000_fearless_vargas.sql similarity index 97% rename from drizzle/postgres/0000_famous_justin_hammer.sql rename to drizzle/postgres/0000_fearless_vargas.sql index a52c405..a4e7837 100644 --- a/drizzle/postgres/0000_famous_justin_hammer.sql +++ b/drizzle/postgres/0000_fearless_vargas.sql @@ -139,7 +139,6 @@ ALTER TABLE "audiobooks" ADD CONSTRAINT "audiobooks_user_id_user_id_fk" FOREIGN ALTER TABLE "documents" ADD CONSTRAINT "documents_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "user_document_progress" ADD CONSTRAINT "user_document_progress_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "user_preferences" ADD CONSTRAINT "user_preferences_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint -ALTER TABLE "user_tts_chars" ADD CONSTRAINT "user_tts_chars_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "account" ADD CONSTRAINT "account_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint ALTER TABLE "session" ADD CONSTRAINT "session_user_id_user_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."user"("id") ON DELETE cascade ON UPDATE no action;--> statement-breakpoint CREATE INDEX "idx_document_previews_status_lease" ON "document_previews" USING btree ("status","lease_until_ms");--> statement-breakpoint diff --git a/drizzle/postgres/meta/0000_snapshot.json b/drizzle/postgres/meta/0000_snapshot.json index 00399f8..5a0f4c1 100644 --- a/drizzle/postgres/meta/0000_snapshot.json +++ b/drizzle/postgres/meta/0000_snapshot.json @@ -1,5 +1,5 @@ { - "id": "ad9a34b6-48d9-4e3a-95cd-38941cb2e055", + "id": "ed6cbfef-d016-4265-999b-239f10f9e4e1", "prevId": "00000000-0000-0000-0000-000000000000", "version": "7", "dialect": "postgresql", @@ -688,21 +688,7 @@ "with": {} } }, - "foreignKeys": { - "user_tts_chars_user_id_user_id_fk": { - "name": "user_tts_chars_user_id_user_id_fk", - "tableFrom": "user_tts_chars", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, + "foreignKeys": {}, "compositePrimaryKeys": { "user_tts_chars_user_id_date_pk": { "name": "user_tts_chars_user_id_date_pk", diff --git a/drizzle/postgres/meta/_journal.json b/drizzle/postgres/meta/_journal.json index 92851a2..e32ad39 100644 --- a/drizzle/postgres/meta/_journal.json +++ b/drizzle/postgres/meta/_journal.json @@ -5,8 +5,8 @@ { "idx": 0, "version": "7", - "when": 1771188820113, - "tag": "0000_famous_justin_hammer", + "when": 1771284020206, + "tag": "0000_fearless_vargas", "breakpoints": true } ] diff --git a/drizzle/sqlite/0000_nervous_preak.sql b/drizzle/sqlite/0000_lucky_inertia.sql similarity index 98% rename from drizzle/sqlite/0000_nervous_preak.sql rename to drizzle/sqlite/0000_lucky_inertia.sql index c7dab2b..5bf7e20 100644 --- a/drizzle/sqlite/0000_nervous_preak.sql +++ b/drizzle/sqlite/0000_lucky_inertia.sql @@ -91,8 +91,7 @@ CREATE TABLE `user_tts_chars` ( `char_count` integer DEFAULT 0, `created_at` integer DEFAULT (cast(strftime('%s','now') as int) * 1000), `updated_at` integer DEFAULT (cast(strftime('%s','now') as int) * 1000), - PRIMARY KEY(`user_id`, `date`), - FOREIGN KEY (`user_id`) REFERENCES `user`(`id`) ON UPDATE no action ON DELETE cascade + PRIMARY KEY(`user_id`, `date`) ); --> statement-breakpoint CREATE INDEX `idx_user_tts_chars_date` ON `user_tts_chars` (`date`);--> statement-breakpoint diff --git a/drizzle/sqlite/meta/0000_snapshot.json b/drizzle/sqlite/meta/0000_snapshot.json index 13599f0..6162db8 100644 --- a/drizzle/sqlite/meta/0000_snapshot.json +++ b/drizzle/sqlite/meta/0000_snapshot.json @@ -1,7 +1,7 @@ { "version": "6", "dialect": "sqlite", - "id": "d7c41fe0-7d08-42af-8f53-d95fd35776c2", + "id": "2406985e-1b41-49e8-9add-304814080095", "prevId": "00000000-0000-0000-0000-000000000000", "tables": { "audiobook_chapters": { @@ -673,21 +673,7 @@ "isUnique": false } }, - "foreignKeys": { - "user_tts_chars_user_id_user_id_fk": { - "name": "user_tts_chars_user_id_user_id_fk", - "tableFrom": "user_tts_chars", - "tableTo": "user", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "no action" - } - }, + "foreignKeys": {}, "compositePrimaryKeys": { "user_tts_chars_user_id_date_pk": { "columns": [ diff --git a/drizzle/sqlite/meta/_journal.json b/drizzle/sqlite/meta/_journal.json index 637471a..0aa3b15 100644 --- a/drizzle/sqlite/meta/_journal.json +++ b/drizzle/sqlite/meta/_journal.json @@ -5,8 +5,8 @@ { "idx": 0, "version": "6", - "when": 1771188819810, - "tag": "0000_nervous_preak", + "when": 1771284019941, + "tag": "0000_lucky_inertia", "breakpoints": true } ] diff --git a/src/db/schema_postgres.ts b/src/db/schema_postgres.ts index 1a4bec2..5afc567 100644 --- a/src/db/schema_postgres.ts +++ b/src/db/schema_postgres.ts @@ -51,7 +51,7 @@ export const audiobookChapters = pgTable('audiobook_chapters', { // defined here. Only application-specific tables belong in this file. export const userTtsChars = pgTable("user_tts_chars", { - userId: text('user_id').notNull().references(() => user.id, { onDelete: 'cascade' }), + userId: text('user_id').notNull(), date: date('date').notNull(), charCount: bigint('char_count', { mode: 'number' }).default(0), createdAt: timestamp('created_at').defaultNow(), diff --git a/src/db/schema_sqlite.ts b/src/db/schema_sqlite.ts index 6ac98f7..9b5a7e0 100644 --- a/src/db/schema_sqlite.ts +++ b/src/db/schema_sqlite.ts @@ -52,7 +52,7 @@ export const audiobookChapters = sqliteTable('audiobook_chapters', { // defined here. Only application-specific tables belong in this file. export const userTtsChars = sqliteTable("user_tts_chars", { - userId: text('user_id').notNull().references(() => user.id, { onDelete: 'cascade' }), + userId: text('user_id').notNull(), date: text('date').notNull(), // SQLite doesn't have native DATE type, text YYYY-MM-DD is standard charCount: integer('char_count').default(0), createdAt: integer('created_at').default(sql`(cast(strftime('%s','now') as int) * 1000)`),