From bbb6df0fecd7142b72750dede458b826d6805f22 Mon Sep 17 00:00:00 2001 From: Bradley Shellnut Date: Sun, 18 Feb 2024 00:03:08 -0800 Subject: [PATCH] Change prisma to drizzle in password change, profile update, collection page, and wishlist page. --- drizzle/0010_flat_mister_sinister.sql | 1 + drizzle/meta/0010_snapshot.json | 1201 +++++++++++++++++ drizzle/meta/_journal.json | 7 + package.json | 4 +- pnpm-lock.yaml | 24 +- src/lib/config/zod-schemas.ts | 1 - .../(protected)/collection/+page.server.ts | 78 +- .../password/change/+page.server.ts | 4 +- .../(protected)/password/change/+page.svelte | 8 +- .../(app)/(protected)/profile/+page.server.ts | 29 +- .../(app)/(protected)/profile/+page.svelte | 2 +- .../(protected)/wishlist/+page.server.ts | 76 +- src/routes/(auth)/login/+page.server.ts | 8 - src/schema.ts | 3 +- 14 files changed, 1318 insertions(+), 128 deletions(-) create mode 100644 drizzle/0010_flat_mister_sinister.sql create mode 100644 drizzle/meta/0010_snapshot.json diff --git a/drizzle/0010_flat_mister_sinister.sql b/drizzle/0010_flat_mister_sinister.sql new file mode 100644 index 0000000..c4599de --- /dev/null +++ b/drizzle/0010_flat_mister_sinister.sql @@ -0,0 +1 @@ +ALTER TABLE "collection_items" ADD COLUMN "times_played" integer DEFAULT 0; \ No newline at end of file diff --git a/drizzle/meta/0010_snapshot.json b/drizzle/meta/0010_snapshot.json new file mode 100644 index 0000000..3f16465 --- /dev/null +++ b/drizzle/meta/0010_snapshot.json @@ -0,0 +1,1201 @@ +{ + "id": "cc27c22a-1208-4b61-b2b1-07f09147fde3", + "prevId": "5d25f562-1d4b-4274-84ea-6d15dcf7fd74", + "version": "5", + "dialect": "pg", + "tables": { + "categories": { + "name": "categories", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "categories_to_external_ids": { + "name": "categories_to_external_ids", + "schema": "", + "columns": { + "category_id": { + "name": "category_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "categories_to_external_ids_category_id_categories_id_fk": { + "name": "categories_to_external_ids_category_id_categories_id_fk", + "tableFrom": "categories_to_external_ids", + "tableTo": "categories", + "columnsFrom": [ + "category_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "categories_to_external_ids_external_id_external_ids_id_fk": { + "name": "categories_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "categories_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "categories_to_games": { + "name": "categories_to_games", + "schema": "", + "columns": { + "category_id": { + "name": "category_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "collection_items": { + "name": "collection_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "collection_id": { + "name": "collection_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "times_played": { + "name": "times_played", + "type": "integer", + "primaryKey": false, + "notNull": false, + "default": 0 + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collection_items_collection_id_collections_id_fk": { + "name": "collection_items_collection_id_collections_id_fk", + "tableFrom": "collection_items", + "tableTo": "collections", + "columnsFrom": [ + "collection_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "collection_items_game_id_games_id_fk": { + "name": "collection_items_game_id_games_id_fk", + "tableFrom": "collection_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "collections": { + "name": "collections", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "collections_user_id_users_id_fk": { + "name": "collections_user_id_users_id_fk", + "tableFrom": "collections", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "expansions": { + "name": "expansions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "base_game_id": { + "name": "base_game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "expansions_base_game_id_games_id_fk": { + "name": "expansions_base_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "base_game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "expansions_game_id_games_id_fk": { + "name": "expansions_game_id_games_id_fk", + "tableFrom": "expansions", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "expansions_to_external_ids": { + "name": "expansions_to_external_ids", + "schema": "", + "columns": { + "expansion_id": { + "name": "expansion_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "expansions_to_external_ids_expansion_id_expansions_id_fk": { + "name": "expansions_to_external_ids_expansion_id_expansions_id_fk", + "tableFrom": "expansions_to_external_ids", + "tableTo": "expansions", + "columnsFrom": [ + "expansion_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "expansions_to_external_ids_external_id_external_ids_id_fk": { + "name": "expansions_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "expansions_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "external_ids": { + "name": "external_ids", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "type": { + "name": "type", + "type": "external_id_type", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "games": { + "name": "games", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": false + }, + "year_published": { + "name": "year_published", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_players": { + "name": "min_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_players": { + "name": "max_players", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "playtime": { + "name": "playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_playtime": { + "name": "min_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "max_playtime": { + "name": "max_playtime", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "min_age": { + "name": "min_age", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "image_url": { + "name": "image_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "thumb_url": { + "name": "thumb_url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "url": { + "name": "url", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "text_searchable_index": { + "name": "text_searchable_index", + "type": "tsvector", + "primaryKey": false, + "notNull": false + }, + "last_sync_at": { + "name": "last_sync_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": { + "text_searchable_idx": { + "name": "text_searchable_idx", + "columns": [ + "text_searchable_index" + ], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "games_to_external_ids": { + "name": "games_to_external_ids", + "schema": "", + "columns": { + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "games_to_external_ids_game_id_games_id_fk": { + "name": "games_to_external_ids_game_id_games_id_fk", + "tableFrom": "games_to_external_ids", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "games_to_external_ids_external_id_external_ids_id_fk": { + "name": "games_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "games_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "mechanics": { + "name": "mechanics", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "mechanics_to_external_ids": { + "name": "mechanics_to_external_ids", + "schema": "", + "columns": { + "mechanic_id": { + "name": "mechanic_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "mechanics_to_external_ids_mechanic_id_mechanics_id_fk": { + "name": "mechanics_to_external_ids_mechanic_id_mechanics_id_fk", + "tableFrom": "mechanics_to_external_ids", + "tableTo": "mechanics", + "columnsFrom": [ + "mechanic_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "mechanics_to_external_ids_external_id_external_ids_id_fk": { + "name": "mechanics_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "mechanics_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "mechanics_to_games": { + "name": "mechanics_to_games", + "schema": "", + "columns": { + "mechanic_id": { + "name": "mechanic_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers": { + "name": "publishers", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "slug": { + "name": "slug", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "external_id": { + "name": "external_id", + "type": "integer", + "primaryKey": false, + "notNull": false + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers_to_external_ids": { + "name": "publishers_to_external_ids", + "schema": "", + "columns": { + "publisher_id": { + "name": "publisher_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "external_id": { + "name": "external_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": { + "publishers_to_external_ids_publisher_id_publishers_id_fk": { + "name": "publishers_to_external_ids_publisher_id_publishers_id_fk", + "tableFrom": "publishers_to_external_ids", + "tableTo": "publishers", + "columnsFrom": [ + "publisher_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "publishers_to_external_ids_external_id_external_ids_id_fk": { + "name": "publishers_to_external_ids_external_id_external_ids_id_fk", + "tableFrom": "publishers_to_external_ids", + "tableTo": "external_ids", + "columnsFrom": [ + "external_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "publishers_to_games": { + "name": "publishers_to_games", + "schema": "", + "columns": { + "publisher_id": { + "name": "publisher_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "roles": { + "name": "roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "name": { + "name": "name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "roles_name_unique": { + "name": "roles_name_unique", + "nullsNotDistinct": false, + "columns": [ + "name" + ] + } + } + }, + "sessions": { + "name": "sessions", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "expires_at": { + "name": "expires_at", + "type": "timestamp with time zone", + "primaryKey": false, + "notNull": true + }, + "ip_country": { + "name": "ip_country", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "ip_address": { + "name": "ip_address", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + } + }, + "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": {} + }, + "user_roles": { + "name": "user_roles", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "role_id": { + "name": "role_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "user_roles_user_id_users_id_fk": { + "name": "user_roles_user_id_users_id_fk", + "tableFrom": "user_roles", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "user_roles_role_id_roles_id_fk": { + "name": "user_roles_role_id_roles_id_fk", + "tableFrom": "user_roles", + "tableTo": "roles", + "columnsFrom": [ + "role_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "username": { + "name": "username", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "email": { + "name": "email", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "first_name": { + "name": "first_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "last_name": { + "name": "last_name", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false + }, + "verified": { + "name": "verified", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "receive_email": { + "name": "receive_email", + "type": "boolean", + "primaryKey": false, + "notNull": false, + "default": false + }, + "theme": { + "name": "theme", + "type": "varchar(255)", + "primaryKey": false, + "notNull": false, + "default": "'system'" + }, + "created_at": { + "name": "created_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": { + "users_username_unique": { + "name": "users_username_unique", + "nullsNotDistinct": false, + "columns": [ + "username" + ] + }, + "users_email_unique": { + "name": "users_email_unique", + "nullsNotDistinct": false, + "columns": [ + "email" + ] + } + } + }, + "wishlist_items": { + "name": "wishlist_items", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "wishlist_id": { + "name": "wishlist_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "game_id": { + "name": "game_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlist_items_wishlist_id_wishlists_id_fk": { + "name": "wishlist_items_wishlist_id_wishlists_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "wishlists", + "columnsFrom": [ + "wishlist_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + }, + "wishlist_items_game_id_games_id_fk": { + "name": "wishlist_items_game_id_games_id_fk", + "tableFrom": "wishlist_items", + "tableTo": "games", + "columnsFrom": [ + "game_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "wishlists": { + "name": "wishlists", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "varchar(255)", + "primaryKey": true, + "notNull": true + }, + "user_id": { + "name": "user_id", + "type": "varchar(255)", + "primaryKey": false, + "notNull": true + }, + "created_at": { + "name": "created_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + }, + "updated_at": { + "name": "updated_at", + "type": "timestamp (6) with time zone", + "primaryKey": false, + "notNull": false, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "wishlists_user_id_users_id_fk": { + "name": "wishlists_user_id_users_id_fk", + "tableFrom": "wishlists", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "cascade", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": { + "external_id_type": { + "name": "external_id_type", + "values": { + "game": "game", + "category": "category", + "mechanic": "mechanic", + "publisher": "publisher", + "designer": "designer", + "artist": "artist" + } + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index 0705bc5..3ea473e 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -71,6 +71,13 @@ "when": 1708105890146, "tag": "0009_equal_christian_walker", "breakpoints": true + }, + { + "idx": 10, + "version": "5", + "when": 1708243232524, + "tag": "0010_flat_mister_sinister", + "breakpoints": true } ] } \ No newline at end of file diff --git a/package.json b/package.json index cc732ec..f163b38 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ }, "devDependencies": { "@melt-ui/pp": "^0.3.0", - "@melt-ui/svelte": "^0.74.0", + "@melt-ui/svelte": "^0.74.1", "@playwright/test": "^1.41.2", "@resvg/resvg-js": "^2.6.0", "@sveltejs/adapter-auto": "^3.1.1", @@ -110,7 +110,7 @@ "mysql2": "^3.9.1", "nanoid": "^5.0.5", "open-props": "^1.6.18", - "oslo": "^1.1.1", + "oslo": "^1.1.2", "pg": "^8.11.3", "postgres": "^3.4.3", "radix-svelte": "^0.9.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9b82459..efce8c2 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -99,8 +99,8 @@ dependencies: specifier: ^1.6.18 version: 1.6.18 oslo: - specifier: ^1.1.1 - version: 1.1.1 + specifier: ^1.1.2 + version: 1.1.2 pg: specifier: ^8.11.3 version: 8.11.3 @@ -132,10 +132,10 @@ dependencies: devDependencies: '@melt-ui/pp': specifier: ^0.3.0 - version: 0.3.0(@melt-ui/svelte@0.74.0)(svelte@4.2.11) + version: 0.3.0(@melt-ui/svelte@0.74.1)(svelte@4.2.11) '@melt-ui/svelte': - specifier: ^0.74.0 - version: 0.74.0(svelte@4.2.11) + specifier: ^0.74.1 + version: 0.74.1(svelte@4.2.11) '@playwright/test': specifier: ^1.41.2 version: 1.41.2 @@ -1745,14 +1745,14 @@ packages: - supports-color dev: false - /@melt-ui/pp@0.3.0(@melt-ui/svelte@0.74.0)(svelte@4.2.11): + /@melt-ui/pp@0.3.0(@melt-ui/svelte@0.74.1)(svelte@4.2.11): resolution: {integrity: sha512-b07Bdh8l2KcwKVCXOY+SoBw1dk9eWvQfMSi6SoacpRVyVmmfpi0kV4oGt3HYF0tUCB3sEmVicxse50ZzZxEzEA==} engines: {pnpm: '>=8.6.3'} peerDependencies: '@melt-ui/svelte': '>= 0.29.0' svelte: ^3.55.0 || ^4.0.0 || ^5.0.0-next.1 dependencies: - '@melt-ui/svelte': 0.74.0(svelte@4.2.11) + '@melt-ui/svelte': 0.74.1(svelte@4.2.11) estree-walker: 3.0.3 magic-string: 0.30.5 svelte: 4.2.11 @@ -1772,8 +1772,8 @@ packages: svelte: 4.2.11 dev: false - /@melt-ui/svelte@0.74.0(svelte@4.2.11): - resolution: {integrity: sha512-4rFhTkO34OK5lflvcj13/in1YQ+exsD2A7YSNIYw2iyNeBYFxOgM0n4qH5Y4Tf7vcekkkQ+SEqgiD3XNmVBHzw==} + /@melt-ui/svelte@0.74.1(svelte@4.2.11): + resolution: {integrity: sha512-5A6QrPGLKIr4s1kI0FZrD5QoZ+wnACF2MR77DvBo8icVyFmpY+WiwpnA3cAl+zEce9Er2Uj8KxPBEF8NSMdnqw==} peerDependencies: svelte: '>=3 <5' dependencies: @@ -3465,7 +3465,7 @@ packages: dotenv: 16.4.4 front-matter: 4.0.2 nanoid: 4.0.2 - oslo: 1.1.1 + oslo: 1.1.2 dev: false /autoprefixer@10.4.17(postcss@8.4.35): @@ -5550,8 +5550,8 @@ packages: '@node-rs/bcrypt': 1.9.2 dev: false - /oslo@1.1.1: - resolution: {integrity: sha512-BuJp5GfBW3jkUDLb8VftXD9FRTfjnodMyVshSy6p4UP8PhQI8auTxAQlef9NdFe6JC4mEgZb/mhMJpfNVudDTA==} + /oslo@1.1.2: + resolution: {integrity: sha512-l5tmumAHJy6wTfcxjwbPtcEn23lxnsBqbW1PqM11lqnQ79Q8Gzc7b3+OjRpLTbiqkfvhT4/BZ2Ooe8/QCJxyEg==} dependencies: '@node-rs/argon2': 1.7.0 '@node-rs/bcrypt': 1.9.0 diff --git a/src/lib/config/zod-schemas.ts b/src/lib/config/zod-schemas.ts index e00f59b..b4a3609 100644 --- a/src/lib/config/zod-schemas.ts +++ b/src/lib/config/zod-schemas.ts @@ -33,7 +33,6 @@ export const userSchema = z.object({ confirm_password: z .string({ required_error: 'Confirm Password is required' }) .trim(), - role: z.enum(['USER', 'ADMIN'], { required_error: 'You must have a role' }).default('USER'), verified: z.boolean().default(false), token: z.string().optional(), receiveEmail: z.boolean().default(false), diff --git a/src/routes/(app)/(protected)/collection/+page.server.ts b/src/routes/(app)/(protected)/collection/+page.server.ts index fc4b029..73c4be2 100644 --- a/src/routes/(app)/(protected)/collection/+page.server.ts +++ b/src/routes/(app)/(protected)/collection/+page.server.ts @@ -1,9 +1,11 @@ import { type Actions, error, fail, redirect } from '@sveltejs/kit'; import { superValidate } from 'sveltekit-superforms/server'; -import prisma from '$lib/prisma'; import { modifyListGameSchema, type ListGame } from '$lib/config/zod-schemas.js'; import { search_schema } from '$lib/zodValidation.js'; import type { PageServerLoad } from './$types'; +import db from '$lib/drizzle'; +import { and, eq } from 'drizzle-orm'; +import { collection_items, collections, games } from '../../../../schema'; export const load: PageServerLoad = async ({ fetch, url, locals }) => { const user = locals.user; @@ -28,10 +30,8 @@ export const load: PageServerLoad = async ({ fetch, url, locals }) => { const listManageForm = await superValidate(modifyListGameSchema); try { - let collection = await prisma.collection.findUnique({ - where: { - user_id: user.id - } + const collection = await db.query.collections.findFirst({ + where: eq(collections.user_id, user.id) }); console.log('collection', collection); @@ -45,27 +45,25 @@ export const load: PageServerLoad = async ({ fetch, url, locals }) => { // }); } - let collection_items = await prisma.collectionItem.findMany({ - where: { - collection_id: collection.id - }, - include: { + const collectionItems = await db.query.collection_items.findMany({ + where: eq(collection_items.collection_id, collection.id), + with: { game: { - select: { + columns: { id: true, name: true, thumb_url: true } } }, - skip, - take: limit + offset: skip, + limit }); - console.log('collection_items', collection_items); + console.log('collection_items', collectionItems); - let collectionItems: ListGame[] = []; - for (const item of collection_items) { + const items: ListGame[] = []; + for (const item of collectionItems) { console.log('item', item); const game = item.game; if (game) { @@ -77,14 +75,14 @@ export const load: PageServerLoad = async ({ fetch, url, locals }) => { times_played: item.times_played, in_collection: true }; - collectionItems.push(collectionItem); + items.push(collectionItem); } } return { searchForm, listManageForm, - collection: collectionItems + collection: items }; } catch (e) { console.error(e); @@ -108,10 +106,8 @@ export const actions: Actions = { } const user = event.locals.user; - let game = await prisma.game.findUnique({ - where: { - id: form.data.id - } + const game = await db.query.games.findFirst({ + where: eq(games.id, form.data.id) }); if (!game) { @@ -125,10 +121,8 @@ export const actions: Actions = { } try { - const collection = await prisma.collection.findUnique({ - where: { - user_id: user.id - } + const collection = await db.query.collections.findFirst({ + where: eq(collections.user_id, user.id) }); if (!collection) { @@ -136,12 +130,10 @@ export const actions: Actions = { return error(404, 'Wishlist not found'); } - await prisma.collectionItem.create({ - data: { - game_id: game.id, - collection_id: collection.id, - times_played: 0 - } + await db.insert(collection_items).values({ + game_id: game.id, + collection_id: collection.id, + times_played: 0 }); return { @@ -175,10 +167,8 @@ export const actions: Actions = { throw fail(401); } - let game = await prisma.game.findUnique({ - where: { - id: form.data.id - } + let game = await db.query.games.findFirst({ + where: eq(games.id, form.data.id) }); if (!game) { @@ -187,10 +177,8 @@ export const actions: Actions = { } try { - const collection = await prisma.collection.findUnique({ - where: { - user_id: locals.user.id - } + const collection = await db.query.collections.findFirst({ + where: eq(collections.user_id, locals.user.id) }); if (!collection) { @@ -198,12 +186,10 @@ export const actions: Actions = { return error(404, 'Collection not found'); } - await prisma.collectionItem.delete({ - where: { - collection_id: collection.id, - game_id: game.id - } - }); + await db.delete(collection_items).where(and( + eq(collection_items.collection_id, collection.id), + eq(collection_items.game_id, game.id) + )); return { form diff --git a/src/routes/(app)/(protected)/password/change/+page.server.ts b/src/routes/(app)/(protected)/password/change/+page.server.ts index 32df638..9182ef3 100644 --- a/src/routes/(app)/(protected)/password/change/+page.server.ts +++ b/src/routes/(app)/(protected)/password/change/+page.server.ts @@ -1,11 +1,11 @@ import { fail, redirect, type Actions } from "@sveltejs/kit"; +import { eq } from "drizzle-orm"; import { setError, superValidate } from 'sveltekit-superforms/server'; import { Argon2id } from "oslo/password"; +import db from "$lib/drizzle"; import { changeUserPasswordSchema } from '$lib/config/zod-schemas.js'; import { lucia } from '$lib/server/auth.js'; import type { PageServerLoad } from "./$types"; -import db from "$lib/drizzle"; -import { eq } from "drizzle-orm"; import { users } from "../../../../../schema"; export const load: PageServerLoad = async (event) => { diff --git a/src/routes/(app)/(protected)/password/change/+page.svelte b/src/routes/(app)/(protected)/password/change/+page.svelte index 74fd144..f6ffedb 100644 --- a/src/routes/(app)/(protected)/password/change/+page.svelte +++ b/src/routes/(app)/(protected)/password/change/+page.svelte @@ -51,4 +51,10 @@
- \ No newline at end of file + + + \ No newline at end of file diff --git a/src/routes/(app)/(protected)/profile/+page.server.ts b/src/routes/(app)/(protected)/profile/+page.server.ts index 36598b5..d0eba72 100644 --- a/src/routes/(app)/(protected)/profile/+page.server.ts +++ b/src/routes/(app)/(protected)/profile/+page.server.ts @@ -1,9 +1,11 @@ import { fail, type Actions } from '@sveltejs/kit'; +import { eq } from 'drizzle-orm'; import { message, setError, superValidate } from 'sveltekit-superforms/server'; import { redirect } from 'sveltekit-flash-message/server'; import { userSchema } from '$lib/config/zod-schemas'; import type { PageServerLoad } from './$types'; -import prisma from '$lib/prisma'; +import { users } from '../../../../schema'; +import db from '$lib/drizzle'; const profileSchema = userSchema.pick({ firstName: true, @@ -51,17 +53,24 @@ export const actions: Actions = { const user = event.locals.user; - await prisma.user.update({ - where: { - id: user.id - }, - data: { - firstName: form.data.firstName, - lastName: form.data.lastName, + const newUsername = form.data.username; + const existingUser = await db.query.users.findFirst({ + where: eq(users.username, newUsername) + }); + + if (existingUser && existingUser.id !== user.id) { + return setError(form, 'username', 'That username is already taken'); + } + + await db + .update(users) + .set({ + first_name: form.data.firstName, + last_name: form.data.lastName, email: form.data.email, username: form.data.username - } - }); + }) + .where(eq(users.id, user.id)); if (user.email !== form.data.email) { // Send email to confirm new email? diff --git a/src/routes/(app)/(protected)/profile/+page.svelte b/src/routes/(app)/(protected)/profile/+page.svelte index e8ae518..0ef0b12 100644 --- a/src/routes/(app)/(protected)/profile/+page.svelte +++ b/src/routes/(app)/(protected)/profile/+page.svelte @@ -89,6 +89,6 @@ \ No newline at end of file diff --git a/src/routes/(app)/(protected)/wishlist/+page.server.ts b/src/routes/(app)/(protected)/wishlist/+page.server.ts index bdc695d..18e2e29 100644 --- a/src/routes/(app)/(protected)/wishlist/+page.server.ts +++ b/src/routes/(app)/(protected)/wishlist/+page.server.ts @@ -1,7 +1,9 @@ import { error, redirect, type Actions } from '@sveltejs/kit'; import { superValidate } from 'sveltekit-superforms/server'; -import prisma from '$lib/prisma'; import { modifyListGameSchema } from '$lib/config/zod-schemas.js'; +import db from '$lib/drizzle.js'; +import { and, eq } from 'drizzle-orm'; +import { games, wishlist_items, wishlists } from '../../../../schema.js'; export async function load({ params, locals }) { if (!locals.user) { @@ -11,33 +13,31 @@ export async function load({ params, locals }) { console.log('Wishlist load User id', locals.user.id); try { - const wishlist = await prisma.wishlist.findUnique({ - where: { - user_id: locals.user.id - }, - include: { - items: { - include: { - game: { - select: { - id: true, - name: true, - thumb_url: true - } - } - } - } - } + const wishlist = await db.query.wishlists.findFirst({ + where: eq(wishlists.user_id, locals.user.id) }); if (!wishlist) { redirect(302, '/404'); } + const items = await db.query.wishlist_items.findMany({ + where: eq(wishlist_items.wishlist_id, wishlist.id), + with: { + game: { + columns: { + id: true, + name: true, + thumb_url: true + } + } + } + }); + console.log('wishlist', wishlist); return { - items: wishlist?.items + items }; } catch (e) { console.error(e); @@ -56,10 +56,8 @@ export const actions: Actions = { redirect(302, '/login'); } - const game = await prisma.game.findUnique({ - where: { - id: form.data.id - } + const game = await db.query.games.findFirst({ + where: eq(games.id, form.data.id) }); if (!game) { @@ -73,10 +71,8 @@ export const actions: Actions = { } if (game) { - const wishlist = await prisma.wishlist.findUnique({ - where: { - user_id: locals.user.id - } + const wishlist = await db.query.wishlists.findFirst({ + where: eq(wishlists.user_id, locals.user.id) }); if (!wishlist) { @@ -84,11 +80,9 @@ export const actions: Actions = { return error(404, 'Wishlist not found'); } - await prisma.wishlistItem.create({ - data: { + await db.insert(wishlist_items).values({ game_id: game.id, wishlist_id: wishlist.id - } }); } @@ -124,10 +118,8 @@ export const actions: Actions = { redirect(302, '/login'); } - const game = await prisma.game.findUnique({ - where: { - id: form.data.id - } + const game = await db.query.games.findFirst({ + where: eq(games.id, form.data.id) }); if (!game) { @@ -141,10 +133,8 @@ export const actions: Actions = { } if (game) { - const wishlist = await prisma.wishlist.findUnique({ - where: { - user_id: locals.user.id - } + const wishlist = await db.query.wishlists.findFirst({ + where: eq(wishlists.user_id, locals.user.id) }); if (!wishlist) { @@ -152,12 +142,10 @@ export const actions: Actions = { return error(404, 'Wishlist not found'); } - await prisma.wishlistItem.delete({ - where: { - wishlist_id: wishlist.id, - game_id: game.id - } - }); + await db.delete(wishlist_items).where(and( + eq(wishlist_items.wishlist_id, wishlist.id), + eq(wishlist_items.game_id, game.id) + )); } return { diff --git a/src/routes/(auth)/login/+page.server.ts b/src/routes/(auth)/login/+page.server.ts index 0c63cc2..a973a9a 100644 --- a/src/routes/(auth)/login/+page.server.ts +++ b/src/routes/(auth)/login/+page.server.ts @@ -70,14 +70,6 @@ export const actions: Actions = { ip_address: locals.ip }); sessionCookie = lucia.createSessionCookie(session.id); - - await db.insert(collections).values({ - user_id: user.id - }).onDuplicateKeyUpdate({ set: { user_id: sql`user_id` } }); - - await db.insert(wishlists).values({ - user_id: user.id - }).onDuplicateKeyUpdate({ set: { user_id: sql`user_id` } }); } catch (e) { // TODO: need to return error message to the client console.error(e); diff --git a/src/schema.ts b/src/schema.ts index 7736657..15b9013 100644 --- a/src/schema.ts +++ b/src/schema.ts @@ -173,6 +173,7 @@ export const collection_items = pgTable('collection_items', { }) .notNull() .references(() => games.id, { onDelete: 'cascade' }), + times_played: integer('times_played').default(0), created_at: timestamp('created_at', { withTimezone: true, mode: 'date', @@ -223,7 +224,7 @@ export const wishlists_relations = relations(wishlists, ({ one }) => ({ user: one(users, { fields: [wishlists.user_id], references: [users.id] - }) + }), })); export const wishlist_items = pgTable('wishlist_items', {