From 2d8ad8feaac193712dfb0d88dbf5390d9293a229 Mon Sep 17 00:00:00 2001 From: Mariusz Wachowski Date: Thu, 17 Oct 2024 23:15:18 +0200 Subject: [PATCH] added cascade on delete user for sessions and email-verification --- .../postgres/migrations/0002_sharp_risque.sql | 15 + .../migrations/meta/0002_snapshot.json | 315 ++++++++++++++++++ .../postgres/migrations/meta/_journal.json | 7 + .../tables/email-verifications.table.ts | 2 +- .../postgres/tables/sessions.table.ts | 2 +- 5 files changed, 339 insertions(+), 2 deletions(-) create mode 100644 src/lib/server/api/databases/postgres/migrations/0002_sharp_risque.sql create mode 100644 src/lib/server/api/databases/postgres/migrations/meta/0002_snapshot.json diff --git a/src/lib/server/api/databases/postgres/migrations/0002_sharp_risque.sql b/src/lib/server/api/databases/postgres/migrations/0002_sharp_risque.sql new file mode 100644 index 0000000..d1f8ae0 --- /dev/null +++ b/src/lib/server/api/databases/postgres/migrations/0002_sharp_risque.sql @@ -0,0 +1,15 @@ +ALTER TABLE "email_verifications" DROP CONSTRAINT "email_verifications_user_id_users_id_fk"; +--> statement-breakpoint +ALTER TABLE "sessions" DROP CONSTRAINT "sessions_user_id_users_id_fk"; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "email_verifications" ADD CONSTRAINT "email_verifications_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "sessions" ADD CONSTRAINT "sessions_user_id_users_id_fk" FOREIGN KEY ("user_id") REFERENCES "public"."users"("id") ON DELETE cascade ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; diff --git a/src/lib/server/api/databases/postgres/migrations/meta/0002_snapshot.json b/src/lib/server/api/databases/postgres/migrations/meta/0002_snapshot.json new file mode 100644 index 0000000..1f4e16f --- /dev/null +++ b/src/lib/server/api/databases/postgres/migrations/meta/0002_snapshot.json @@ -0,0 +1,315 @@ +{ + "id": "5796b846-6715-463d-8a8b-15b8dad25d10", + "prevId": "00340fa1-eeb1-41d9-bbe3-972ed52f7ca1", + "version": "7", + "dialect": "postgresql", + "tables": { + "public.email_verifications": { + "name": "email_verifications", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "hashed_token": { + "name": "hashed_token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "requested_email": { + "name": "requested_email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "email_verifications_user_id_users_id_fk": { + "name": "email_verifications_user_id_users_id_fk", + "tableFrom": "email_verifications", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "email_verifications_user_id_unique": { + "name": "email_verifications_user_id_unique", + "nullsNotDistinct": false, + "columns": [ + "user_id" + ] + } + }, + "checkConstraints": {} + }, + "public.files": { + "name": "files", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "key": { + "name": "key", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "size": { + "name": "size", + "type": "bigint", + "primaryKey": false, + "notNull": true + }, + "content_type": { + "name": "content_type", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.login_requests": { + "name": "login_requests", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "hashed_token": { + "name": "hashed_token", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "login_requests_email_unique": { + "name": "login_requests_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "checkConstraints": {} + }, + "public.sessions": { + "name": "sessions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "sessions_user_id_users_id_fk": { + "name": "sessions_user_id_users_id_fk", + "tableFrom": "sessions", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {}, + "checkConstraints": {} + }, + "public.users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "avatar": { + "name": "avatar", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "citext", + "primaryKey": false, + "notNull": true + }, + "verified": { + "name": "verified", + "type": "boolean", + "primaryKey": false, + "notNull": true, + "default": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "users_avatar_files_id_fk": { + "name": "users_avatar_files_id_fk", + "tableFrom": "users", + "tableTo": "files", + "columnsFrom": [ + "avatar" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_email_unique": { + "name": "users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + }, + "checkConstraints": {} + } + }, + "enums": {}, + "schemas": {}, + "sequences": {}, + "views": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/src/lib/server/api/databases/postgres/migrations/meta/_journal.json b/src/lib/server/api/databases/postgres/migrations/meta/_journal.json index df4ee3b..ac9cb27 100644 --- a/src/lib/server/api/databases/postgres/migrations/meta/_journal.json +++ b/src/lib/server/api/databases/postgres/migrations/meta/_journal.json @@ -15,6 +15,13 @@ "when": 1729196878223, "tag": "0001_gifted_james_howlett", "breakpoints": true + }, + { + "idx": 2, + "version": "7", + "when": 1729199803558, + "tag": "0002_sharp_risque", + "breakpoints": true } ] } \ No newline at end of file diff --git a/src/lib/server/api/databases/postgres/tables/email-verifications.table.ts b/src/lib/server/api/databases/postgres/tables/email-verifications.table.ts index 03bffb6..d007301 100644 --- a/src/lib/server/api/databases/postgres/tables/email-verifications.table.ts +++ b/src/lib/server/api/databases/postgres/tables/email-verifications.table.ts @@ -11,7 +11,7 @@ export const emailVerificationsTable = pgTable('email_verifications', { hashedToken: text('hashed_token').notNull(), userId: text('user_id') .notNull() - .references(() => usersTable.id).unique(), + .references(() => usersTable.id, { onDelete: 'cascade' }).unique(), requestedEmail: text('requested_email').notNull(), expiresAt: timestamp('expires_at', { mode: 'date', diff --git a/src/lib/server/api/databases/postgres/tables/sessions.table.ts b/src/lib/server/api/databases/postgres/tables/sessions.table.ts index 9e9bd79..24e6bde 100644 --- a/src/lib/server/api/databases/postgres/tables/sessions.table.ts +++ b/src/lib/server/api/databases/postgres/tables/sessions.table.ts @@ -7,7 +7,7 @@ export const sessionsTable = pgTable('sessions', { id: cuid2('id').primaryKey(), userId: text('user_id') .notNull() - .references(() => usersTable.id), + .references(() => usersTable.id, { onDelete: 'cascade' }), expiresAt: timestamp('expires_at', { withTimezone: true, mode: 'date'