From 658a58cad8d5e32b135c13b186f62853195b9c0d Mon Sep 17 00:00:00 2001 From: dromzeh <65048232+dromzeh@users.noreply.github.com> Date: Fri, 8 Dec 2023 20:11:23 +0000 Subject: [PATCH] reimpl login w/ password and signup --- src/scripts/seed/seed.ts | 29 +- src/v2/db/migrations/meta/0000_snapshot.json | 3930 ++++++++---------- src/v2/db/migrations/meta/_journal.json | 24 +- src/v2/db/schema/user/user.ts | 2 +- src/v2/lib/managers/auth/user-auth.ts | 67 +- src/v2/lib/managers/auth/user-session.ts | 5 +- 6 files changed, 1919 insertions(+), 2138 deletions(-) diff --git a/src/scripts/seed/seed.ts b/src/scripts/seed/seed.ts index c5aff492..c7836e55 100644 --- a/src/scripts/seed/seed.ts +++ b/src/scripts/seed/seed.ts @@ -14,8 +14,10 @@ import { userCollectionAsset, userFavoriteAsset, userFavorite, + authCredentials, } from "@/v2/db/schema" import { generateID } from "@/v2/lib/oslo" +import { Scrypt } from "oslo/password" const { ENVIRONMENT } = process.env @@ -46,8 +48,8 @@ async function main() { .values([ { id: generateID(), - username: "testuser", - email: "hi@dromzeh.dev", + username: "adminuser", + email: "admin@wanderer.moe", emailVerified: 1, usernameColour: "#84E6F8", bio: "test bio", @@ -58,7 +60,7 @@ async function main() { { id: generateID(), username: "testuser2", - email: "hi2@dromzeh.dev", + email: "testuser2@dromzeh.dev", emailVerified: 1, bio: "test bio 2", pronouns: "he/him/his", @@ -69,7 +71,7 @@ async function main() { { id: generateID(), username: "testuser3", - email: "hi3@dromzeh.dev", + email: "testuser3@wanderer.moe", emailVerified: 1, bio: "test bio 3", roleFlags: 1, @@ -80,6 +82,25 @@ async function main() { .returning() console.log(`[SEED] [authUser] inserted ${newUsers.length} rows\n`) + const devAdminPassword = generateID(12) + + console.log( + `[SEED] [userCredentials] Seeding user login for admin with password ${devAdminPassword}...` + ) + + const newCredentials = await db + .insert(authCredentials) + .values({ + id: generateID(20), + userId: newUsers[0].id, + hashedPassword: await new Scrypt().hash(devAdminPassword), + }) + .returning() + + console.log( + `[SEED] [userCredentials] inserted ${newCredentials.length} rows\n` + ) + console.log("[SEED] [userFollowing] Seeding user following...") const newuserFollowing = await db .insert(userFollowing) diff --git a/src/v2/db/migrations/meta/0000_snapshot.json b/src/v2/db/migrations/meta/0000_snapshot.json index d740882e..c2850777 100644 --- a/src/v2/db/migrations/meta/0000_snapshot.json +++ b/src/v2/db/migrations/meta/0000_snapshot.json @@ -1,2113 +1,1829 @@ { - "version": "5", - "dialect": "sqlite", - "id": "62d78f01-fa41-4210-9f30-93df02adfa75", - "prevId": "00000000-0000-0000-0000-000000000000", - "tables": { - "asset": { - "name": "asset", - "columns": { - "id": { - "name": "id", - "type": "integer", - "primaryKey": true, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "extension": { - "name": "extension", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false + "version": "5", + "dialect": "sqlite", + "id": "62d78f01-fa41-4210-9f30-93df02adfa75", + "prevId": "00000000-0000-0000-0000-000000000000", + "tables": { + "asset": { + "name": "asset", + "columns": { + "id": { + "name": "id", + "type": "integer", + "primaryKey": true, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "extension": { + "name": "extension", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game": { + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category": { + "name": "asset_category", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_id": { + "name": "uploaded_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_name": { + "name": "uploaded_by_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "status": { + "name": "status", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'pending'" + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_is_optimized": { + "name": "asset_is_optimized", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "asset_is_suggestive": { + "name": "asset_is_suggestive", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "view_count": { + "name": "view_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "download_count": { + "name": "download_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "width": { + "name": "width", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "height": { + "name": "height", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "assets_id_idx": { + "name": "assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "assets_name_idx": { + "name": "assets_name_idx", + "columns": ["name"], + "isUnique": false + }, + "assets_game_name_idx": { + "name": "assets_game_name_idx", + "columns": ["game"], + "isUnique": false + }, + "assets_asset_category_name_idx": { + "name": "assets_asset_category_name_idx", + "columns": ["asset_category"], + "isUnique": false + }, + "assets_uploaded_by_id_idx": { + "name": "assets_uploaded_by_id_idx", + "columns": ["uploaded_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "asset_game_game_id_fk": { + "name": "asset_game_game_id_fk", + "tableFrom": "asset", + "tableTo": "game", + "columnsFrom": ["game"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_asset_category_assetCategory_id_fk": { + "name": "asset_asset_category_assetCategory_id_fk", + "tableFrom": "asset", + "tableTo": "assetCategory", + "columnsFrom": ["asset_category"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_uploaded_by_id_authUser_id_fk": { + "name": "asset_uploaded_by_id_authUser_id_fk", + "tableFrom": "asset", + "tableTo": "authUser", + "columnsFrom": ["uploaded_by_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "asset_uploaded_by_name_authUser_username_fk": { + "name": "asset_uploaded_by_name_authUser_username_fk", + "tableFrom": "asset", + "tableTo": "authUser", + "columnsFrom": ["uploaded_by_name"], + "columnsTo": ["username"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlas": { + "name": "atlas", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "url": { + "name": "url", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by": { + "name": "uploaded_by", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_by_name": { + "name": "uploaded_by_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "uploaded_date": { + "name": "uploaded_date", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "file_size": { + "name": "file_size", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "atlas_id_unique": { + "name": "atlas_id_unique", + "columns": ["id"], + "isUnique": true + }, + "atlas_id_idx": { + "name": "atlas_id_idx", + "columns": ["id"], + "isUnique": false + }, + "atlas_uploaded_by_idx": { + "name": "atlas_uploaded_by_idx", + "columns": ["uploaded_by"], + "isUnique": false + }, + "atlas_uploaded_by_name_idx": { + "name": "atlas_uploaded_by_name_idx", + "columns": ["uploaded_by_name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "atlasToAsset": { + "name": "atlasToAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "atlas_id": { + "name": "atlas_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "atlas_to_assets_id_idx": { + "name": "atlas_to_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "atlas_to_assets_atlas_id_idx": { + "name": "atlas_to_assets_atlas_id_idx", + "columns": ["atlas_id"], + "isUnique": false + }, + "atlas_to_assets_asset_id_idx": { + "name": "atlas_to_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "atlasToAsset_atlas_id_atlas_id_fk": { + "name": "atlasToAsset_atlas_id_atlas_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "atlas", + "columnsFrom": ["atlas_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "atlasToAsset_asset_id_asset_id_fk": { + "name": "atlasToAsset_asset_id_asset_id_fk", + "tableFrom": "atlasToAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetLikes": { + "name": "assetLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetlikes_asset_idx": { + "name": "assetlikes_asset_idx", + "columns": ["asset_id"], + "isUnique": false + }, + "assetlikes_likedBy_idx": { + "name": "assetlikes_likedBy_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetLikes_asset_id_asset_id_fk": { + "name": "assetLikes_asset_id_asset_id_fk", + "tableFrom": "assetLikes", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "assetLikes_liked_by_id_authUser_id_fk": { + "name": "assetLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCategory": { + "name": "assetCategory", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetCategory_id_unique": { + "name": "assetCategory_id_unique", + "columns": ["id"], + "isUnique": true + }, + "assetCategory_name_unique": { + "name": "assetCategory_name_unique", + "columns": ["name"], + "isUnique": true + }, + "asset_category_id_idx": { + "name": "asset_category_id_idx", + "columns": ["id"], + "isUnique": false + }, + "asset_category_name_idx": { + "name": "asset_category_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "gameAssetCategory": { + "name": "gameAssetCategory", + "columns": { + "game_id": { + "name": "game_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_category_id": { + "name": "asset_category_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_asset_category_game_id_idx": { + "name": "game_asset_category_game_id_idx", + "columns": ["game_id"], + "isUnique": false + }, + "game_asset_category_asset_category_id_idx": { + "name": "game_asset_category_asset_category_id_idx", + "columns": ["asset_category_id"], + "isUnique": false + } + }, + "foreignKeys": { + "gameAssetCategory_game_id_game_id_fk": { + "name": "gameAssetCategory_game_id_game_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "game", + "columnsFrom": ["game_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "gameAssetCategory_asset_category_id_assetCategory_id_fk": { + "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", + "tableFrom": "gameAssetCategory", + "tableTo": "assetCategory", + "columnsFrom": ["asset_category_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetCategoryLikes": { + "name": "assetCategoryLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetCategoryLikes_asset_idx": { + "name": "assetCategoryLikes_asset_idx", + "columns": ["asset_id"], + "isUnique": false + }, + "assetCategoryLikes_likedby_idx": { + "name": "assetCategoryLikes_likedby_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetCategoryLikes_asset_id_assetCategory_id_fk": { + "name": "assetCategoryLikes_asset_id_assetCategory_id_fk", + "tableFrom": "assetCategoryLikes", + "tableTo": "assetCategory", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "assetCategoryLikes_liked_by_id_authUser_id_fk": { + "name": "assetCategoryLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetCategoryLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} }, "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category": { - "name": "asset_category", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_id": { - "name": "uploaded_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_name": { - "name": "uploaded_by_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "status": { - "name": "status", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'pending'" - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_is_optimized": { - "name": "asset_is_optimized", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "asset_is_suggestive": { - "name": "asset_is_suggestive", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "view_count": { - "name": "view_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "download_count": { - "name": "download_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "width": { - "name": "width", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "height": { - "name": "height", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "assets_id_idx": { - "name": "assets_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "assets_name_idx": { - "name": "assets_name_idx", - "columns": [ - "name" - ], - "isUnique": false - }, - "assets_game_name_idx": { - "name": "assets_game_name_idx", - "columns": [ - "game" - ], - "isUnique": false - }, - "assets_asset_category_name_idx": { - "name": "assets_asset_category_name_idx", - "columns": [ - "asset_category" - ], - "isUnique": false - }, - "assets_uploaded_by_id_idx": { - "name": "assets_uploaded_by_id_idx", - "columns": [ - "uploaded_by_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "asset_game_game_id_fk": { - "name": "asset_game_game_id_fk", - "tableFrom": "asset", - "tableTo": "game", - "columnsFrom": [ - "game" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_asset_category_assetCategory_id_fk": { - "name": "asset_asset_category_assetCategory_id_fk", - "tableFrom": "asset", - "tableTo": "assetCategory", - "columnsFrom": [ - "asset_category" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_uploaded_by_id_authUser_id_fk": { - "name": "asset_uploaded_by_id_authUser_id_fk", - "tableFrom": "asset", - "tableTo": "authUser", - "columnsFrom": [ - "uploaded_by_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "asset_uploaded_by_name_authUser_username_fk": { - "name": "asset_uploaded_by_name_authUser_username_fk", - "tableFrom": "asset", - "tableTo": "authUser", - "columnsFrom": [ - "uploaded_by_name" - ], - "columnsTo": [ - "username" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlas": { - "name": "atlas", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "url": { - "name": "url", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by": { - "name": "uploaded_by", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_by_name": { - "name": "uploaded_by_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "uploaded_date": { - "name": "uploaded_date", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "file_size": { - "name": "file_size", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "atlas_id_unique": { - "name": "atlas_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "atlas_id_idx": { - "name": "atlas_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "atlas_uploaded_by_idx": { - "name": "atlas_uploaded_by_idx", - "columns": [ - "uploaded_by" - ], - "isUnique": false - }, - "atlas_uploaded_by_name_idx": { - "name": "atlas_uploaded_by_name_idx", - "columns": [ - "uploaded_by_name" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "atlasToAsset": { - "name": "atlasToAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "atlas_id": { - "name": "atlas_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "atlas_to_assets_id_idx": { - "name": "atlas_to_assets_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "atlas_to_assets_atlas_id_idx": { - "name": "atlas_to_assets_atlas_id_idx", - "columns": [ - "atlas_id" - ], - "isUnique": false - }, - "atlas_to_assets_asset_id_idx": { - "name": "atlas_to_assets_asset_id_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "atlasToAsset_atlas_id_atlas_id_fk": { - "name": "atlasToAsset_atlas_id_atlas_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "atlas", - "columnsFrom": [ - "atlas_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "atlasToAsset_asset_id_asset_id_fk": { - "name": "atlasToAsset_asset_id_asset_id_fk", - "tableFrom": "atlasToAsset", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetLikes": { - "name": "assetLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetlikes_asset_idx": { - "name": "assetlikes_asset_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - }, - "assetlikes_likedBy_idx": { - "name": "assetlikes_likedBy_idx", - "columns": [ - "liked_by_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "assetLikes_asset_id_asset_id_fk": { - "name": "assetLikes_asset_id_asset_id_fk", - "tableFrom": "assetLikes", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "assetLikes_liked_by_id_authUser_id_fk": { - "name": "assetLikes_liked_by_id_authUser_id_fk", - "tableFrom": "assetLikes", - "tableTo": "authUser", - "columnsFrom": [ - "liked_by_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCategory": { - "name": "assetCategory", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetCategory_id_unique": { - "name": "assetCategory_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "assetCategory_name_unique": { - "name": "assetCategory_name_unique", - "columns": [ - "name" - ], - "isUnique": true - }, - "asset_category_id_idx": { - "name": "asset_category_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "asset_category_name_idx": { - "name": "asset_category_name_idx", - "columns": [ - "name" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "gameAssetCategory": { - "name": "gameAssetCategory", - "columns": { - "game_id": { - "name": "game_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_category_id": { - "name": "asset_category_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_asset_category_game_id_idx": { - "name": "game_asset_category_game_id_idx", - "columns": [ - "game_id" - ], - "isUnique": false - }, - "game_asset_category_asset_category_id_idx": { - "name": "game_asset_category_asset_category_id_idx", - "columns": [ - "asset_category_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "gameAssetCategory_game_id_game_id_fk": { - "name": "gameAssetCategory_game_id_game_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "game", - "columnsFrom": [ - "game_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "gameAssetCategory_asset_category_id_assetCategory_id_fk": { - "name": "gameAssetCategory_asset_category_id_assetCategory_id_fk", - "tableFrom": "gameAssetCategory", - "tableTo": "assetCategory", - "columnsFrom": [ - "asset_category_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetCategoryLikes": { - "name": "assetCategoryLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetCategoryLikes_asset_idx": { - "name": "assetCategoryLikes_asset_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - }, - "assetCategoryLikes_likedby_idx": { - "name": "assetCategoryLikes_likedby_idx", - "columns": [ - "liked_by_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "assetCategoryLikes_asset_id_assetCategory_id_fk": { - "name": "assetCategoryLikes_asset_id_assetCategory_id_fk", - "tableFrom": "assetCategoryLikes", - "tableTo": "assetCategory", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "assetCategoryLikes_liked_by_id_authUser_id_fk": { - "name": "assetCategoryLikes_liked_by_id_authUser_id_fk", - "tableFrom": "assetCategoryLikes", - "tableTo": "authUser", - "columnsFrom": [ - "liked_by_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "game": { - "name": "game", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": false, - "autoincrement": false, - "default": 0 - }, - "possible_suggestive_content": { - "name": "possible_suggestive_content", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "game_id_unique": { - "name": "game_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "game_name_unique": { - "name": "game_name_unique", - "columns": [ - "name" - ], - "isUnique": true - }, - "game_id_idx": { - "name": "game_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "game_name_idx": { - "name": "game_name_idx", - "columns": [ - "name" - ], - "isUnique": false + "name": "game", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": false, + "autoincrement": false, + "default": 0 + }, + "possible_suggestive_content": { + "name": "possible_suggestive_content", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "game_id_unique": { + "name": "game_id_unique", + "columns": ["id"], + "isUnique": true + }, + "game_name_unique": { + "name": "game_name_unique", + "columns": ["name"], + "isUnique": true + }, + "game_id_idx": { + "name": "game_id_idx", + "columns": ["id"], + "isUnique": false + }, + "game_name_idx": { + "name": "game_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "gameLikes": { + "name": "gameLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "gamelikes_game_idx": { + "name": "gamelikes_game_idx", + "columns": ["asset_id"], + "isUnique": false + }, + "gamelikes_likedby_idx": { + "name": "gamelikes_likedby_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "gameLikes_asset_id_game_id_fk": { + "name": "gameLikes_asset_id_game_id_fk", + "tableFrom": "gameLikes", + "tableTo": "game", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "gameLikes_liked_by_id_authUser_id_fk": { + "name": "gameLikes_liked_by_id_authUser_id_fk", + "tableFrom": "gameLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTag": { + "name": "assetTag", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "formatted_name": { + "name": "formatted_name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_count": { + "name": "asset_count", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "last_updated": { + "name": "last_updated", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetTag_id_unique": { + "name": "assetTag_id_unique", + "columns": ["id"], + "isUnique": true + }, + "assetTag_name_unique": { + "name": "assetTag_name_unique", + "columns": ["name"], + "isUnique": true + }, + "asset_tag_id_idx": { + "name": "asset_tag_id_idx", + "columns": ["id"], + "isUnique": false + }, + "asset_tag_name_idx": { + "name": "asset_tag_name_idx", + "columns": ["name"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTagAsset": { + "name": "assetTagAsset", + "columns": { + "asset_tag_id": { + "name": "asset_tag_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "asset_tags_assets_asset_tag_id_idx": { + "name": "asset_tags_assets_asset_tag_id_idx", + "columns": ["asset_tag_id"], + "isUnique": false + }, + "asset_tags_assets_asset_id_idx": { + "name": "asset_tags_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetTagAsset_asset_tag_id_assetTag_id_fk": { + "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "assetTag", + "columnsFrom": ["asset_tag_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "assetTagAsset_asset_id_asset_id_fk": { + "name": "assetTagAsset_asset_id_asset_id_fk", + "tableFrom": "assetTagAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "assetTagLikes": { + "name": "assetTagLikes", + "columns": { + "asset_id": { + "name": "asset_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "created_at": { + "name": "created_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "assetTagLikes_asset_idx": { + "name": "assetTagLikes_asset_idx", + "columns": ["asset_id"], + "isUnique": false + }, + "assetTagLikes_likedby_idx": { + "name": "assetTagLikes_likedby_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "assetTagLikes_asset_id_assetTag_id_fk": { + "name": "assetTagLikes_asset_id_assetTag_id_fk", + "tableFrom": "assetTagLikes", + "tableTo": "assetTag", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "assetTagLikes_liked_by_id_authUser_id_fk": { + "name": "assetTagLikes_liked_by_id_authUser_id_fk", + "tableFrom": "assetTagLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "savedOcGenerators": { + "name": "savedOcGenerators", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "game": { + "name": "game", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "content": { + "name": "content", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "saved_color_palette": { + "name": "saved_color_palette", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "sakura_url": { + "name": "sakura_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "savedOcGenerators_id_unique": { + "name": "savedOcGenerators_id_unique", + "columns": ["id"], + "isUnique": true + }, + "saved_oc_generators_id_idx": { + "name": "saved_oc_generators_id_idx", + "columns": ["id"], + "isUnique": false + }, + "saved_oc_generators_user_id_idx": { + "name": "saved_oc_generators_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "savedOcGenerators_user_id_authUser_id_fk": { + "name": "savedOcGenerators_user_id_authUser_id_fk", + "tableFrom": "savedOcGenerators", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authCredentials": { + "name": "authCredentials", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "hashed_password": { + "name": "hashed_password", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "authCredentials_id_unique": { + "name": "authCredentials_id_unique", + "columns": ["id"], + "isUnique": true + }, + "key_user_id_idx": { + "name": "key_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "authCredentials_user_id_authUser_id_fk": { + "name": "authCredentials_user_id_authUser_id_fk", + "tableFrom": "authCredentials", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authUser": { + "name": "authUser", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "avatar_url": { + "name": "avatar_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "banner_url": { + "name": "banner_url", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "display_name": { + "name": "display_name", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "username": { + "name": "username", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "username_colour": { + "name": "username_colour", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "email": { + "name": "email", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "email_verified": { + "name": "email_verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "pronouns": { + "name": "pronouns", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + }, + "verified": { + "name": "verified", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + }, + "bio": { + "name": "bio", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": "'No bio set'" + }, + "date_joined": { + "name": "date_joined", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "role_flags": { + "name": "role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 1 + }, + "is_contributor": { + "name": "is_contributor", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + }, + "self_assignable_role_flags": { + "name": "self_assignable_role_flags", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": 0 + } + }, + "indexes": { + "authUser_id_unique": { + "name": "authUser_id_unique", + "columns": ["id"], + "isUnique": true + }, + "authUser_username_unique": { + "name": "authUser_username_unique", + "columns": ["username"], + "isUnique": true + }, + "user_id_idx": { + "name": "user_id_idx", + "columns": ["id"], + "isUnique": false + }, + "user_username_idx": { + "name": "user_username_idx", + "columns": ["username"], + "isUnique": false + }, + "user_email_idx": { + "name": "user_email_idx", + "columns": ["email"], + "isUnique": false + } + }, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "authSession": { + "name": "authSession", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "active_expires": { + "name": "active_expires", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "idle_expires": { + "name": "idle_expires", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "authSession_id_unique": { + "name": "authSession_id_unique", + "columns": ["id"], + "isUnique": true + }, + "session_user_id_idx": { + "name": "session_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "authSession_user_id_authUser_id_fk": { + "name": "authSession_user_id_authUser_id_fk", + "tableFrom": "authSession", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "emailVerificationToken": { + "name": "emailVerificationToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "emailVerificationToken_id_unique": { + "name": "emailVerificationToken_id_unique", + "columns": ["id"], + "isUnique": true + }, + "email_verification_token_user_id_idx": { + "name": "email_verification_token_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "email_verification_token_token_idx": { + "name": "email_verification_token_token_idx", + "columns": ["token"], + "isUnique": false + } + }, + "foreignKeys": { + "emailVerificationToken_user_id_authUser_id_fk": { + "name": "emailVerificationToken_user_id_authUser_id_fk", + "tableFrom": "emailVerificationToken", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "passwordResetToken": { + "name": "passwordResetToken", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "token": { + "name": "token", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "expires_at": { + "name": "expires_at", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "passwordResetToken_id_unique": { + "name": "passwordResetToken_id_unique", + "columns": ["id"], + "isUnique": true + }, + "password_reset_token_user_id_idx": { + "name": "password_reset_token_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "password_reset_token_token_idx": { + "name": "password_reset_token_token_idx", + "columns": ["token"], + "isUnique": false + } + }, + "foreignKeys": { + "passwordResetToken_user_id_authUser_id_fk": { + "name": "passwordResetToken_user_id_authUser_id_fk", + "tableFrom": "passwordResetToken", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollection": { + "name": "userCollection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "description": { + "name": "description", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_created": { + "name": "date_created", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "userCollection_id_unique": { + "name": "userCollection_id_unique", + "columns": ["id"], + "isUnique": true + }, + "collection_id_idx": { + "name": "collection_id_idx", + "columns": ["id"], + "isUnique": false + }, + "user_collection_id_idx": { + "name": "user_collection_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userCollection_user_id_authUser_id_fk": { + "name": "userCollection_user_id_authUser_id_fk", + "tableFrom": "userCollection", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollectionAsset": { + "name": "userCollectionAsset", + "columns": { + "collection_id": { + "name": "collection_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "date_added": { + "name": "date_added", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "collection_assets_collection_id_idx": { + "name": "collection_assets_collection_id_idx", + "columns": ["collection_id"], + "isUnique": false + }, + "collection_assets_asset_id_idx": { + "name": "collection_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userCollectionAsset_collection_id_userCollection_id_fk": { + "name": "userCollectionAsset_collection_id_userCollection_id_fk", + "tableFrom": "userCollectionAsset", + "tableTo": "userCollection", + "columnsFrom": ["collection_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "userCollectionAsset_asset_id_asset_id_fk": { + "name": "userCollectionAsset_asset_id_asset_id_fk", + "tableFrom": "userCollectionAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "socialsConnection": { + "name": "socialsConnection", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "discord_id": { + "name": "discord_id", + "type": "text", + "primaryKey": false, + "notNull": false, + "autoincrement": false + } + }, + "indexes": { + "socialsConnection_id_unique": { + "name": "socialsConnection_id_unique", + "columns": ["id"], + "isUnique": true + }, + "socialsConnection_user_id_unique": { + "name": "socialsConnection_user_id_unique", + "columns": ["user_id"], + "isUnique": true + }, + "socials_connection_user_id_idx": { + "name": "socials_connection_user_id_idx", + "columns": ["user_id"], + "isUnique": false + }, + "socials_connection_discord_id_idx": { + "name": "socials_connection_discord_id_idx", + "columns": ["discord_id"], + "isUnique": false + } + }, + "foreignKeys": { + "socialsConnection_user_id_authUser_id_fk": { + "name": "socialsConnection_user_id_authUser_id_fk", + "tableFrom": "socialsConnection", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavorite": { + "name": "userFavorite", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "is_public": { + "name": "is_public", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false, + "default": false + } + }, + "indexes": { + "userFavorite_id_unique": { + "name": "userFavorite_id_unique", + "columns": ["id"], + "isUnique": true + }, + "favorited_assets_id_idx": { + "name": "favorited_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "favorited_assets_user_id_idx": { + "name": "favorited_assets_user_id_idx", + "columns": ["user_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userFavorite_user_id_authUser_id_fk": { + "name": "userFavorite_user_id_authUser_id_fk", + "tableFrom": "userFavorite", + "tableTo": "authUser", + "columnsFrom": ["user_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFavoriteAsset": { + "name": "userFavoriteAsset", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "favorited_assets_id": { + "name": "favorited_assets_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "asset_id": { + "name": "asset_id", + "type": "integer", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userFavoriteAsset_id_unique": { + "name": "userFavoriteAsset_id_unique", + "columns": ["id"], + "isUnique": true + }, + "favorited_assets_assets_id_idx": { + "name": "favorited_assets_assets_id_idx", + "columns": ["id"], + "isUnique": false + }, + "favorited_assets_assets_user_id_idx": { + "name": "favorited_assets_assets_user_id_idx", + "columns": ["favorited_assets_id"], + "isUnique": false + }, + "favorited_assets_assets_asset_id_idx": { + "name": "favorited_assets_assets_asset_id_idx", + "columns": ["asset_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { + "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "userFavorite", + "columnsFrom": ["favorited_assets_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + }, + "userFavoriteAsset_asset_id_asset_id_fk": { + "name": "userFavoriteAsset_asset_id_asset_id_fk", + "tableFrom": "userFavoriteAsset", + "tableTo": "asset", + "columnsFrom": ["asset_id"], + "columnsTo": ["id"], + "onDelete": "cascade", + "onUpdate": "cascade" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userFollowing": { + "name": "userFollowing", + "columns": { + "followerId": { + "name": "followerId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "followingId": { + "name": "followingId", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userfollowing_follower_idx": { + "name": "userfollowing_follower_idx", + "columns": ["followerId"], + "isUnique": false + }, + "userfollowing_following_idx": { + "name": "userfollowing_following_idx", + "columns": ["followingId"], + "isUnique": false + } + }, + "foreignKeys": { + "userFollowing_followerId_authUser_id_fk": { + "name": "userFollowing_followerId_authUser_id_fk", + "tableFrom": "userFollowing", + "tableTo": "authUser", + "columnsFrom": ["followerId"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "userFollowing_followingId_authUser_id_fk": { + "name": "userFollowing_followingId_authUser_id_fk", + "tableFrom": "userFollowing", + "tableTo": "authUser", + "columnsFrom": ["followingId"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "userCollectionLikes": { + "name": "userCollectionLikes", + "columns": { + "collection_id": { + "name": "collection_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "liked_by_id": { + "name": "liked_by_id", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + }, + "createdAt": { + "name": "createdAt", + "type": "text", + "primaryKey": false, + "notNull": true, + "autoincrement": false + } + }, + "indexes": { + "userCollectionNetworking_collection_idx": { + "name": "userCollectionNetworking_collection_idx", + "columns": ["collection_id"], + "isUnique": false + }, + "userCollectionNetworking_likedBy_idx": { + "name": "userCollectionNetworking_likedBy_idx", + "columns": ["liked_by_id"], + "isUnique": false + } + }, + "foreignKeys": { + "userCollectionLikes_collection_id_userCollection_id_fk": { + "name": "userCollectionLikes_collection_id_userCollection_id_fk", + "tableFrom": "userCollectionLikes", + "tableTo": "userCollection", + "columnsFrom": ["collection_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + }, + "userCollectionLikes_liked_by_id_authUser_id_fk": { + "name": "userCollectionLikes_liked_by_id_authUser_id_fk", + "tableFrom": "userCollectionLikes", + "tableTo": "authUser", + "columnsFrom": ["liked_by_id"], + "columnsTo": ["id"], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} }, - "gameLikes": { - "name": "gameLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "gamelikes_game_idx": { - "name": "gamelikes_game_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - }, - "gamelikes_likedby_idx": { - "name": "gamelikes_likedby_idx", - "columns": [ - "liked_by_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "gameLikes_asset_id_game_id_fk": { - "name": "gameLikes_asset_id_game_id_fk", - "tableFrom": "gameLikes", - "tableTo": "game", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "gameLikes_liked_by_id_authUser_id_fk": { - "name": "gameLikes_liked_by_id_authUser_id_fk", - "tableFrom": "gameLikes", - "tableTo": "authUser", - "columnsFrom": [ - "liked_by_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTag": { - "name": "assetTag", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "formatted_name": { - "name": "formatted_name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_count": { - "name": "asset_count", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "last_updated": { - "name": "last_updated", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetTag_id_unique": { - "name": "assetTag_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "assetTag_name_unique": { - "name": "assetTag_name_unique", - "columns": [ - "name" - ], - "isUnique": true - }, - "asset_tag_id_idx": { - "name": "asset_tag_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "asset_tag_name_idx": { - "name": "asset_tag_name_idx", - "columns": [ - "name" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTagAsset": { - "name": "assetTagAsset", - "columns": { - "asset_tag_id": { - "name": "asset_tag_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "asset_tags_assets_asset_tag_id_idx": { - "name": "asset_tags_assets_asset_tag_id_idx", - "columns": [ - "asset_tag_id" - ], - "isUnique": false - }, - "asset_tags_assets_asset_id_idx": { - "name": "asset_tags_assets_asset_id_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "assetTagAsset_asset_tag_id_assetTag_id_fk": { - "name": "assetTagAsset_asset_tag_id_assetTag_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "assetTag", - "columnsFrom": [ - "asset_tag_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "assetTagAsset_asset_id_asset_id_fk": { - "name": "assetTagAsset_asset_id_asset_id_fk", - "tableFrom": "assetTagAsset", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "assetTagLikes": { - "name": "assetTagLikes", - "columns": { - "asset_id": { - "name": "asset_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "created_at": { - "name": "created_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "assetTagLikes_asset_idx": { - "name": "assetTagLikes_asset_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - }, - "assetTagLikes_likedby_idx": { - "name": "assetTagLikes_likedby_idx", - "columns": [ - "liked_by_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "assetTagLikes_asset_id_assetTag_id_fk": { - "name": "assetTagLikes_asset_id_assetTag_id_fk", - "tableFrom": "assetTagLikes", - "tableTo": "assetTag", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "assetTagLikes_liked_by_id_authUser_id_fk": { - "name": "assetTagLikes_liked_by_id_authUser_id_fk", - "tableFrom": "assetTagLikes", - "tableTo": "authUser", - "columnsFrom": [ - "liked_by_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "savedOcGenerators": { - "name": "savedOcGenerators", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "game": { - "name": "game", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "content": { - "name": "content", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "saved_color_palette": { - "name": "saved_color_palette", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "sakura_url": { - "name": "sakura_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "savedOcGenerators_id_unique": { - "name": "savedOcGenerators_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "saved_oc_generators_id_idx": { - "name": "saved_oc_generators_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "saved_oc_generators_user_id_idx": { - "name": "saved_oc_generators_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "savedOcGenerators_user_id_authUser_id_fk": { - "name": "savedOcGenerators_user_id_authUser_id_fk", - "tableFrom": "savedOcGenerators", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authCredentials": { - "name": "authCredentials", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "hashed_password": { - "name": "hashed_password", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "authCredentials_id_unique": { - "name": "authCredentials_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "key_user_id_idx": { - "name": "key_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "authCredentials_user_id_authUser_id_fk": { - "name": "authCredentials_user_id_authUser_id_fk", - "tableFrom": "authCredentials", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authUser": { - "name": "authUser", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "avatar_url": { - "name": "avatar_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "banner_url": { - "name": "banner_url", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "display_name": { - "name": "display_name", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "username": { - "name": "username", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "username_colour": { - "name": "username_colour", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "email": { - "name": "email", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "email_verified": { - "name": "email_verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "pronouns": { - "name": "pronouns", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - }, - "verified": { - "name": "verified", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - }, - "bio": { - "name": "bio", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": "'No bio set'" - }, - "date_joined": { - "name": "date_joined", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "role_flags": { - "name": "role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 1 - }, - "is_contributor": { - "name": "is_contributor", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - }, - "self_assignable_role_flags": { - "name": "self_assignable_role_flags", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": 0 - } - }, - "indexes": { - "authUser_id_unique": { - "name": "authUser_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "authUser_username_unique": { - "name": "authUser_username_unique", - "columns": [ - "username" - ], - "isUnique": true - }, - "user_id_idx": { - "name": "user_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "user_username_idx": { - "name": "user_username_idx", - "columns": [ - "username" - ], - "isUnique": false - }, - "user_email_idx": { - "name": "user_email_idx", - "columns": [ - "email" - ], - "isUnique": false - } - }, - "foreignKeys": {}, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "authSession": { - "name": "authSession", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "active_expires": { - "name": "active_expires", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "idle_expires": { - "name": "idle_expires", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "authSession_id_unique": { - "name": "authSession_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "session_user_id_idx": { - "name": "session_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "authSession_user_id_authUser_id_fk": { - "name": "authSession_user_id_authUser_id_fk", - "tableFrom": "authSession", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "emailVerificationToken": { - "name": "emailVerificationToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "emailVerificationToken_id_unique": { - "name": "emailVerificationToken_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "email_verification_token_user_id_idx": { - "name": "email_verification_token_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - }, - "email_verification_token_token_idx": { - "name": "email_verification_token_token_idx", - "columns": [ - "token" - ], - "isUnique": false - } - }, - "foreignKeys": { - "emailVerificationToken_user_id_authUser_id_fk": { - "name": "emailVerificationToken_user_id_authUser_id_fk", - "tableFrom": "emailVerificationToken", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "passwordResetToken": { - "name": "passwordResetToken", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "token": { - "name": "token", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "expires_at": { - "name": "expires_at", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "passwordResetToken_id_unique": { - "name": "passwordResetToken_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "password_reset_token_user_id_idx": { - "name": "password_reset_token_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - }, - "password_reset_token_token_idx": { - "name": "password_reset_token_token_idx", - "columns": [ - "token" - ], - "isUnique": false - } - }, - "foreignKeys": { - "passwordResetToken_user_id_authUser_id_fk": { - "name": "passwordResetToken_user_id_authUser_id_fk", - "tableFrom": "passwordResetToken", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollection": { - "name": "userCollection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "name": { - "name": "name", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "description": { - "name": "description", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_created": { - "name": "date_created", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - } - }, - "indexes": { - "userCollection_id_unique": { - "name": "userCollection_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "collection_id_idx": { - "name": "collection_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "user_collection_id_idx": { - "name": "user_collection_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userCollection_user_id_authUser_id_fk": { - "name": "userCollection_user_id_authUser_id_fk", - "tableFrom": "userCollection", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollectionAsset": { - "name": "userCollectionAsset", - "columns": { - "collection_id": { - "name": "collection_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "date_added": { - "name": "date_added", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "collection_assets_collection_id_idx": { - "name": "collection_assets_collection_id_idx", - "columns": [ - "collection_id" - ], - "isUnique": false - }, - "collection_assets_asset_id_idx": { - "name": "collection_assets_asset_id_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userCollectionAsset_collection_id_userCollection_id_fk": { - "name": "userCollectionAsset_collection_id_userCollection_id_fk", - "tableFrom": "userCollectionAsset", - "tableTo": "userCollection", - "columnsFrom": [ - "collection_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "userCollectionAsset_asset_id_asset_id_fk": { - "name": "userCollectionAsset_asset_id_asset_id_fk", - "tableFrom": "userCollectionAsset", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "socialsConnection": { - "name": "socialsConnection", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "discord_id": { - "name": "discord_id", - "type": "text", - "primaryKey": false, - "notNull": false, - "autoincrement": false - } - }, - "indexes": { - "socialsConnection_id_unique": { - "name": "socialsConnection_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "socialsConnection_user_id_unique": { - "name": "socialsConnection_user_id_unique", - "columns": [ - "user_id" - ], - "isUnique": true - }, - "socials_connection_user_id_idx": { - "name": "socials_connection_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - }, - "socials_connection_discord_id_idx": { - "name": "socials_connection_discord_id_idx", - "columns": [ - "discord_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "socialsConnection_user_id_authUser_id_fk": { - "name": "socialsConnection_user_id_authUser_id_fk", - "tableFrom": "socialsConnection", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavorite": { - "name": "userFavorite", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "user_id": { - "name": "user_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "is_public": { - "name": "is_public", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false, - "default": false - } - }, - "indexes": { - "userFavorite_id_unique": { - "name": "userFavorite_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "favorited_assets_id_idx": { - "name": "favorited_assets_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "favorited_assets_user_id_idx": { - "name": "favorited_assets_user_id_idx", - "columns": [ - "user_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userFavorite_user_id_authUser_id_fk": { - "name": "userFavorite_user_id_authUser_id_fk", - "tableFrom": "userFavorite", - "tableTo": "authUser", - "columnsFrom": [ - "user_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFavoriteAsset": { - "name": "userFavoriteAsset", - "columns": { - "id": { - "name": "id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "favorited_assets_id": { - "name": "favorited_assets_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "asset_id": { - "name": "asset_id", - "type": "integer", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userFavoriteAsset_id_unique": { - "name": "userFavoriteAsset_id_unique", - "columns": [ - "id" - ], - "isUnique": true - }, - "favorited_assets_assets_id_idx": { - "name": "favorited_assets_assets_id_idx", - "columns": [ - "id" - ], - "isUnique": false - }, - "favorited_assets_assets_user_id_idx": { - "name": "favorited_assets_assets_user_id_idx", - "columns": [ - "favorited_assets_id" - ], - "isUnique": false - }, - "favorited_assets_assets_asset_id_idx": { - "name": "favorited_assets_assets_asset_id_idx", - "columns": [ - "asset_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk": { - "name": "userFavoriteAsset_favorited_assets_id_userFavorite_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "userFavorite", - "columnsFrom": [ - "favorited_assets_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - }, - "userFavoriteAsset_asset_id_asset_id_fk": { - "name": "userFavoriteAsset_asset_id_asset_id_fk", - "tableFrom": "userFavoriteAsset", - "tableTo": "asset", - "columnsFrom": [ - "asset_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "cascade", - "onUpdate": "cascade" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userFollowing": { - "name": "userFollowing", - "columns": { - "followerId": { - "name": "followerId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "followingId": { - "name": "followingId", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userfollowing_follower_idx": { - "name": "userfollowing_follower_idx", - "columns": [ - "followerId" - ], - "isUnique": false - }, - "userfollowing_following_idx": { - "name": "userfollowing_following_idx", - "columns": [ - "followingId" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userFollowing_followerId_authUser_id_fk": { - "name": "userFollowing_followerId_authUser_id_fk", - "tableFrom": "userFollowing", - "tableTo": "authUser", - "columnsFrom": [ - "followerId" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "userFollowing_followingId_authUser_id_fk": { - "name": "userFollowing_followingId_authUser_id_fk", - "tableFrom": "userFollowing", - "tableTo": "authUser", - "columnsFrom": [ - "followingId" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} - }, - "userCollectionLikes": { - "name": "userCollectionLikes", - "columns": { - "collection_id": { - "name": "collection_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "liked_by_id": { - "name": "liked_by_id", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - }, - "createdAt": { - "name": "createdAt", - "type": "text", - "primaryKey": false, - "notNull": true, - "autoincrement": false - } - }, - "indexes": { - "userCollectionNetworking_collection_idx": { - "name": "userCollectionNetworking_collection_idx", - "columns": [ - "collection_id" - ], - "isUnique": false - }, - "userCollectionNetworking_likedBy_idx": { - "name": "userCollectionNetworking_likedBy_idx", - "columns": [ - "liked_by_id" - ], - "isUnique": false - } - }, - "foreignKeys": { - "userCollectionLikes_collection_id_userCollection_id_fk": { - "name": "userCollectionLikes_collection_id_userCollection_id_fk", - "tableFrom": "userCollectionLikes", - "tableTo": "userCollection", - "columnsFrom": [ - "collection_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - }, - "userCollectionLikes_liked_by_id_authUser_id_fk": { - "name": "userCollectionLikes_liked_by_id_authUser_id_fk", - "tableFrom": "userCollectionLikes", - "tableTo": "authUser", - "columnsFrom": [ - "liked_by_id" - ], - "columnsTo": [ - "id" - ], - "onDelete": "no action", - "onUpdate": "no action" - } - }, - "compositePrimaryKeys": {}, - "uniqueConstraints": {} + "enums": {}, + "_meta": { + "schemas": {}, + "tables": {}, + "columns": {} } - }, - "enums": {}, - "_meta": { - "schemas": {}, - "tables": {}, - "columns": {} - } -} \ No newline at end of file +} diff --git a/src/v2/db/migrations/meta/_journal.json b/src/v2/db/migrations/meta/_journal.json index 89fe7ef2..912f9d9f 100644 --- a/src/v2/db/migrations/meta/_journal.json +++ b/src/v2/db/migrations/meta/_journal.json @@ -1,13 +1,13 @@ { - "version": "5", - "dialect": "sqlite", - "entries": [ - { - "idx": 0, - "version": "5", - "when": 1702062637541, - "tag": "0000_jittery_hardball", - "breakpoints": true - } - ] -} \ No newline at end of file + "version": "5", + "dialect": "sqlite", + "entries": [ + { + "idx": 0, + "version": "5", + "when": 1702062637541, + "tag": "0000_jittery_hardball", + "breakpoints": true + } + ] +} diff --git a/src/v2/db/schema/user/user.ts b/src/v2/db/schema/user/user.ts index 1be2cc20..6707f63b 100644 --- a/src/v2/db/schema/user/user.ts +++ b/src/v2/db/schema/user/user.ts @@ -119,7 +119,7 @@ export const usersRelations = relations(authUser, ({ one, many }) => ({ following: many(userFollowing, { relationName: "following", }), - authCredentials: many(authCredentials), + authCredentials: one(authCredentials), userSession: many(userSession), asset: many(asset), atlas: many(atlas), diff --git a/src/v2/lib/managers/auth/user-auth.ts b/src/v2/lib/managers/auth/user-auth.ts index b37e2737..513eefdc 100644 --- a/src/v2/lib/managers/auth/user-auth.ts +++ b/src/v2/lib/managers/auth/user-auth.ts @@ -1,4 +1,3 @@ -import { Context } from "hono" import { luciaAuth } from "../../auth/lucia" import { Scrypt } from "oslo/password" import { getConnection } from "@/v2/db/turso" @@ -6,6 +5,7 @@ import { authCredentials, authUser } from "@/v2/db/schema" import { createInsertSchema } from "drizzle-zod" import { z } from "zod" import { generateID } from "../../oslo" +import { eq } from "drizzle-orm" const authUserInsertSchema = createInsertSchema(authUser).pick({ username: true, @@ -13,15 +13,15 @@ const authUserInsertSchema = createInsertSchema(authUser).pick({ }) export class UserAuthenticationManager { - constructor(private ctx: Context) {} + constructor(private ctx: APIContext) {} private lucia = luciaAuth(this.ctx.env as Bindings) - private drizzleInstance = getConnection(this.ctx.env).drizzle + private drizzle = getConnection(this.ctx.env).drizzle public async createAccount( attributes: Required>, - password: string + password?: string ) { - const createUserTransaction = await this.drizzleInstance.transaction( + const createUserTransaction = await this.drizzle.transaction( async (db) => { try { const [newUser] = await db @@ -33,11 +33,13 @@ export class UserAuthenticationManager { }) .returning() - await db.insert(authCredentials).values({ - id: generateID(20), - userId: newUser.id, - hashedPassword: await new Scrypt().hash(password), - }) + if (password) { + await db.insert(authCredentials).values({ + id: generateID(20), + userId: newUser.id, + hashedPassword: await new Scrypt().hash(password), + }) + } return newUser } catch (e) { @@ -46,12 +48,53 @@ export class UserAuthenticationManager { } ) - await this.lucia.createSession(createUserTransaction.id, { + const newSession = await this.lucia.createSession( + createUserTransaction.id, + { + user_agent: this.ctx.req.header("user-agent") || "", + ip_address: this.ctx.req.header("cf-connecting-ip") || "", + country_code: this.ctx.req.header("cf-ipcountry") || "", + } + ) + + const newSessionCookie = await this.lucia.createSessionCookie( + newSession.id + ) + + return newSessionCookie + } + + public async loginViaPassword(email: string, password: string) { + const [foundUser] = await this.drizzle + .select({ id: authUser.id, email: authUser.email }) + .from(authUser) + .where(eq(authUser.email, email)) + + if (!foundUser) { + return null + } + + const [credentials] = await this.drizzle + .select() + .from(authCredentials) + .where(eq(authCredentials.userId, foundUser.id)) + + if ( + !(await new Scrypt().verify(password, credentials.hashedPassword)) + ) { + return null + } + + const newSession = await this.lucia.createSession(foundUser.id, { user_agent: this.ctx.req.header("user-agent") || "", ip_address: this.ctx.req.header("cf-connecting-ip") || "", country_code: this.ctx.req.header("cf-ipcountry") || "", }) - return createUserTransaction.id + const newSessionCookie = await this.lucia.createSessionCookie( + newSession.id + ) + + return newSessionCookie } } diff --git a/src/v2/lib/managers/auth/user-session.ts b/src/v2/lib/managers/auth/user-session.ts index e622347c..becfd300 100644 --- a/src/v2/lib/managers/auth/user-session.ts +++ b/src/v2/lib/managers/auth/user-session.ts @@ -1,9 +1,10 @@ -import { Context } from "hono" import { luciaAuth } from "../../auth/lucia" +import { getConnection } from "@/v2/db/turso" export class AuthSessionManager { - constructor(private ctx: Context) {} + constructor(private ctx: APIContext) {} private lucia = luciaAuth(this.ctx.env as Bindings) + private drizzleInstance = getConnection(this.ctx.env).drizzle async validateSession(sessionId: string) { return await this.lucia.validateSession(sessionId)