diff --git a/src/lib/server/api/databases/postgres/migrations/0001_gifted_james_howlett.sql b/src/lib/server/api/databases/postgres/migrations/0001_gifted_james_howlett.sql new file mode 100644 index 0000000..057b264 --- /dev/null +++ b/src/lib/server/api/databases/postgres/migrations/0001_gifted_james_howlett.sql @@ -0,0 +1,14 @@ +CREATE TABLE IF NOT EXISTS "files" ( + "id" text PRIMARY KEY NOT NULL, + "key" text NOT NULL, + "size" bigint NOT NULL, + "content_type" text NOT NULL, + "created_at" timestamp with time zone DEFAULT now() NOT NULL, + "updated_at" timestamp with time zone DEFAULT now() NOT NULL +); +--> statement-breakpoint +DO $$ BEGIN + ALTER TABLE "users" ADD CONSTRAINT "users_avatar_files_id_fk" FOREIGN KEY ("avatar") REFERENCES "public"."files"("id") ON DELETE no action ON UPDATE no action; +EXCEPTION + WHEN duplicate_object THEN null; +END $$; diff --git a/src/lib/server/api/databases/postgres/migrations/meta/0001_snapshot.json b/src/lib/server/api/databases/postgres/migrations/meta/0001_snapshot.json new file mode 100644 index 0000000..a1c5423 --- /dev/null +++ b/src/lib/server/api/databases/postgres/migrations/meta/0001_snapshot.json @@ -0,0 +1,315 @@ +{ + "id": "00340fa1-eeb1-41d9-bbe3-972ed52f7ca1", + "prevId": "7c8066fe-53c3-4fbb-b700-34ae02d25480", + "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": "no action", + "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": "no action", + "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 cc5b97e..df4ee3b 100644 --- a/src/lib/server/api/databases/postgres/migrations/meta/_journal.json +++ b/src/lib/server/api/databases/postgres/migrations/meta/_journal.json @@ -8,6 +8,13 @@ "when": 1722983304054, "tag": "0000_clear_paper_doll", "breakpoints": true + }, + { + "idx": 1, + "version": "7", + "when": 1729196878223, + "tag": "0001_gifted_james_howlett", + "breakpoints": true } ] } \ No newline at end of file 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 dca266c..9e9bd79 100644 --- a/src/lib/server/api/databases/postgres/tables/sessions.table.ts +++ b/src/lib/server/api/databases/postgres/tables/sessions.table.ts @@ -1,3 +1,4 @@ +import { relations } from 'drizzle-orm'; import { cuid2 } from '../../../common/utils/table'; import { usersTable } from './users.table'; import { pgTable, text, timestamp } from 'drizzle-orm/pg-core'; @@ -12,3 +13,10 @@ export const sessionsTable = pgTable('sessions', { mode: 'date' }).notNull() }); + +export const sessionsRelations = relations(sessionsTable, ({ one }) => ({ + user: one(usersTable, { + fields: [sessionsTable.userId], + references: [usersTable.id], + }), + })); \ No newline at end of file