Update packages, add to game types and mapping values, adding slug to publisher, and creating things when searching.

This commit is contained in:
Bradley Shellnut 2023-06-25 23:14:26 -07:00
parent b23a101c0f
commit b02609f009
7 changed files with 276 additions and 116 deletions

View file

@ -26,7 +26,7 @@
"@rgossiaux/svelte-heroicons": "^0.1.2", "@rgossiaux/svelte-heroicons": "^0.1.2",
"@sveltejs/adapter-auto": "^1.0.3", "@sveltejs/adapter-auto": "^1.0.3",
"@sveltejs/adapter-vercel": "^1.0.6", "@sveltejs/adapter-vercel": "^1.0.6",
"@sveltejs/kit": "^1.20.4", "@sveltejs/kit": "^1.20.5",
"@types/cookie": "^0.5.1", "@types/cookie": "^0.5.1",
"@types/node": "^18.16.18", "@types/node": "^18.16.18",
"@typescript-eslint/eslint-plugin": "^5.60.0", "@typescript-eslint/eslint-plugin": "^5.60.0",
@ -34,7 +34,7 @@
"autoprefixer": "^10.4.14", "autoprefixer": "^10.4.14",
"eslint": "^8.43.0", "eslint": "^8.43.0",
"eslint-config-prettier": "^8.8.0", "eslint-config-prettier": "^8.8.0",
"eslint-plugin-svelte": "^2.31.0", "eslint-plugin-svelte": "^2.31.1",
"just-clone": "^6.2.0", "just-clone": "^6.2.0",
"just-debounce-it": "^3.2.0", "just-debounce-it": "^3.2.0",
"postcss": "^8.4.24", "postcss": "^8.4.24",
@ -48,7 +48,7 @@
"svelte": "^3.59.2", "svelte": "^3.59.2",
"svelte-check": "^2.10.3", "svelte-check": "^2.10.3",
"svelte-preprocess": "^5.0.4", "svelte-preprocess": "^5.0.4",
"sveltekit-superforms": "^1.1.1", "sveltekit-superforms": "^1.1.2",
"ts-node": "^10.9.1", "ts-node": "^10.9.1",
"tslib": "^2.5.3", "tslib": "^2.5.3",
"typescript": "^4.9.5", "typescript": "^4.9.5",

View file

@ -70,7 +70,7 @@ dependencies:
version: 0.2.1(svelte@3.59.2) version: 0.2.1(svelte@3.59.2)
sveltekit-flash-message: sveltekit-flash-message:
specifier: ^0.11.3 specifier: ^0.11.3
version: 0.11.3(@sveltejs/kit@1.20.4)(svelte@3.59.2) version: 0.11.3(@sveltejs/kit@1.20.5)(svelte@3.59.2)
zod-to-json-schema: zod-to-json-schema:
specifier: ^3.21.2 specifier: ^3.21.2
version: 3.21.2(zod@3.21.4) version: 3.21.2(zod@3.21.4)
@ -87,13 +87,13 @@ devDependencies:
version: 0.1.2(svelte@3.59.2) version: 0.1.2(svelte@3.59.2)
'@sveltejs/adapter-auto': '@sveltejs/adapter-auto':
specifier: ^1.0.3 specifier: ^1.0.3
version: 1.0.3(@sveltejs/kit@1.20.4) version: 1.0.3(@sveltejs/kit@1.20.5)
'@sveltejs/adapter-vercel': '@sveltejs/adapter-vercel':
specifier: ^1.0.6 specifier: ^1.0.6
version: 1.0.6(@sveltejs/kit@1.20.4) version: 1.0.6(@sveltejs/kit@1.20.5)
'@sveltejs/kit': '@sveltejs/kit':
specifier: ^1.20.4 specifier: ^1.20.5
version: 1.20.4(svelte@3.59.2)(vite@4.3.9) version: 1.20.5(svelte@3.59.2)(vite@4.3.9)
'@types/cookie': '@types/cookie':
specifier: ^0.5.1 specifier: ^0.5.1
version: 0.5.1 version: 0.5.1
@ -116,8 +116,8 @@ devDependencies:
specifier: ^8.8.0 specifier: ^8.8.0
version: 8.8.0(eslint@8.43.0) version: 8.8.0(eslint@8.43.0)
eslint-plugin-svelte: eslint-plugin-svelte:
specifier: ^2.31.0 specifier: ^2.31.1
version: 2.31.0(eslint@8.43.0)(svelte@3.59.2)(ts-node@10.9.1) version: 2.31.1(eslint@8.43.0)(svelte@3.59.2)(ts-node@10.9.1)
just-clone: just-clone:
specifier: ^6.2.0 specifier: ^6.2.0
version: 6.2.0 version: 6.2.0
@ -158,8 +158,8 @@ devDependencies:
specifier: ^5.0.4 specifier: ^5.0.4
version: 5.0.4(postcss-load-config@4.0.1)(postcss@8.4.24)(sass@1.63.6)(svelte@3.59.2)(typescript@4.9.5) version: 5.0.4(postcss-load-config@4.0.1)(postcss@8.4.24)(sass@1.63.6)(svelte@3.59.2)(typescript@4.9.5)
sveltekit-superforms: sveltekit-superforms:
specifier: ^1.1.1 specifier: ^1.1.2
version: 1.1.1(@sveltejs/kit@1.20.4)(svelte@3.59.2)(zod@3.21.4) version: 1.1.2(@sveltejs/kit@1.20.5)(svelte@3.59.2)(zod@3.21.4)
ts-node: ts-node:
specifier: ^10.9.1 specifier: ^10.9.1
version: 10.9.1(@types/node@18.16.18)(typescript@4.9.5) version: 10.9.1(@types/node@18.16.18)(typescript@4.9.5)
@ -1123,7 +1123,7 @@ packages:
nopt: 5.0.0 nopt: 5.0.0
npmlog: 5.0.1 npmlog: 5.0.1
rimraf: 3.0.2 rimraf: 3.0.2
semver: 7.5.2 semver: 7.5.3
tar: 6.1.13 tar: 6.1.13
transitivePeerDependencies: transitivePeerDependencies:
- encoding - encoding
@ -1211,21 +1211,21 @@ packages:
picomatch: 2.3.1 picomatch: 2.3.1
dev: true dev: true
/@sveltejs/adapter-auto@1.0.3(@sveltejs/kit@1.20.4): /@sveltejs/adapter-auto@1.0.3(@sveltejs/kit@1.20.5):
resolution: {integrity: sha512-hc7O12YQqvZ1CD4fo1gMJuPzBZvuoG5kwxb2RRoz4fVoB8B2vuPO2cY751Ln0G6T/HMrAf8kCqw6Pg+wbxcstw==} resolution: {integrity: sha512-hc7O12YQqvZ1CD4fo1gMJuPzBZvuoG5kwxb2RRoz4fVoB8B2vuPO2cY751Ln0G6T/HMrAf8kCqw6Pg+wbxcstw==}
peerDependencies: peerDependencies:
'@sveltejs/kit': ^1.0.0 '@sveltejs/kit': ^1.0.0
dependencies: dependencies:
'@sveltejs/kit': 1.20.4(svelte@3.59.2)(vite@4.3.9) '@sveltejs/kit': 1.20.5(svelte@3.59.2)(vite@4.3.9)
import-meta-resolve: 2.2.0 import-meta-resolve: 2.2.0
dev: true dev: true
/@sveltejs/adapter-vercel@1.0.6(@sveltejs/kit@1.20.4): /@sveltejs/adapter-vercel@1.0.6(@sveltejs/kit@1.20.5):
resolution: {integrity: sha512-fo6aaEygPd/6B5Jms4Ff7R4jbADnppuLvKOWBNTGe5MGB7ZRUkl+gxHWMQx2av2knyEZkA6V8y5M6R3ML5yN4g==} resolution: {integrity: sha512-fo6aaEygPd/6B5Jms4Ff7R4jbADnppuLvKOWBNTGe5MGB7ZRUkl+gxHWMQx2av2knyEZkA6V8y5M6R3ML5yN4g==}
peerDependencies: peerDependencies:
'@sveltejs/kit': ^1.0.0 '@sveltejs/kit': ^1.0.0
dependencies: dependencies:
'@sveltejs/kit': 1.20.4(svelte@3.59.2)(vite@4.3.9) '@sveltejs/kit': 1.20.5(svelte@3.59.2)(vite@4.3.9)
'@vercel/nft': 0.22.6 '@vercel/nft': 0.22.6
esbuild: 0.16.8 esbuild: 0.16.8
transitivePeerDependencies: transitivePeerDependencies:
@ -1233,8 +1233,8 @@ packages:
- supports-color - supports-color
dev: true dev: true
/@sveltejs/kit@1.20.4(svelte@3.59.2)(vite@4.3.9): /@sveltejs/kit@1.20.5(svelte@3.59.2)(vite@4.3.9):
resolution: {integrity: sha512-MmAzIuMrP7A+8fqDVbxm6ekGHRHL/+Fk8sQPAzPG4G2TxUDtHdn/WcIxeEqHzARMf0OtGSC+VPyOSFuw2Cy2Mg==} resolution: {integrity: sha512-8rJYZ2boRlO75lwpbpB+DlSzIwmTuamXTpVlDtw4dBk86o3UaDe/+Ro4xCsV/4FtTw2U8xPHyV83edAWbQHG0w==}
engines: {node: ^16.14 || >=18} engines: {node: ^16.14 || >=18}
hasBin: true hasBin: true
requiresBuild: true requiresBuild: true
@ -1446,7 +1446,7 @@ packages:
debug: 4.3.4 debug: 4.3.4
globby: 11.1.0 globby: 11.1.0
is-glob: 4.0.3 is-glob: 4.0.3
semver: 7.5.2 semver: 7.5.3
tsutils: 3.21.0(typescript@4.9.5) tsutils: 3.21.0(typescript@4.9.5)
typescript: 4.9.5 typescript: 4.9.5
transitivePeerDependencies: transitivePeerDependencies:
@ -2027,8 +2027,8 @@ packages:
eslint: 8.43.0 eslint: 8.43.0
dev: true dev: true
/eslint-plugin-svelte@2.31.0(eslint@8.43.0)(svelte@3.59.2)(ts-node@10.9.1): /eslint-plugin-svelte@2.31.1(eslint@8.43.0)(svelte@3.59.2)(ts-node@10.9.1):
resolution: {integrity: sha512-Q70jPFRraTkc/giPSfY7yuatmJcb5fPelWNplevqd45gfaJDjc3qXRtWQ6m9U5tWVVYERU9dcdUod294vwD8Gw==} resolution: {integrity: sha512-08v+DqzHiwIVEbi+266D7+BDhayp9OSqCwa/lHaZlZOlFY0vZLYs/h7SkkUPzA5fTVt8OUJBtvCxFiWEYOvvGg==}
engines: {node: ^14.17.0 || >=16.0.0} engines: {node: ^14.17.0 || >=16.0.0}
peerDependencies: peerDependencies:
eslint: ^7.0.0 || ^8.0.0-0 eslint: ^7.0.0 || ^8.0.0-0
@ -2047,6 +2047,7 @@ packages:
postcss-load-config: 3.1.4(postcss@8.4.24)(ts-node@10.9.1) postcss-load-config: 3.1.4(postcss@8.4.24)(ts-node@10.9.1)
postcss-safe-parser: 6.0.0(postcss@8.4.24) postcss-safe-parser: 6.0.0(postcss@8.4.24)
postcss-selector-parser: 6.0.13 postcss-selector-parser: 6.0.13
semver: 7.5.3
svelte: 3.59.2 svelte: 3.59.2
svelte-eslint-parser: 0.31.0(svelte@3.59.2) svelte-eslint-parser: 0.31.0(svelte@3.59.2)
transitivePeerDependencies: transitivePeerDependencies:
@ -3447,8 +3448,8 @@ packages:
lru-cache: 6.0.0 lru-cache: 6.0.0
dev: true dev: true
/semver@7.5.2: /semver@7.5.3:
resolution: {integrity: sha512-SoftuTROv/cRjCze/scjGyiDtcUyxw1rgYQSZY7XTmtR5hX+dm76iDbTH8TkLPHCQmlbQVSSbNZCPM2hb0knnQ==} resolution: {integrity: sha512-QBlUtyVk/5EeHbi7X0fw6liDZc7BBmEaSYn01fMU1OUYbf6GPsbTtd8WmnqbI20SeycoHSeiybkE/q1Q+qlThQ==}
engines: {node: '>=10'} engines: {node: '>=10'}
hasBin: true hasBin: true
dependencies: dependencies:
@ -3764,24 +3765,24 @@ packages:
resolution: {integrity: sha512-vzSyuGr3eEoAtT/A6bmajosJZIUWySzY2CzB3w2pgPvnkUjGqlDnsNnA0PMO+mMAhuyMul6C2uuZzY6ELSkzyA==} resolution: {integrity: sha512-vzSyuGr3eEoAtT/A6bmajosJZIUWySzY2CzB3w2pgPvnkUjGqlDnsNnA0PMO+mMAhuyMul6C2uuZzY6ELSkzyA==}
engines: {node: '>= 8'} engines: {node: '>= 8'}
/sveltekit-flash-message@0.11.3(@sveltejs/kit@1.20.4)(svelte@3.59.2): /sveltekit-flash-message@0.11.3(@sveltejs/kit@1.20.5)(svelte@3.59.2):
resolution: {integrity: sha512-tMKBobVFLYth0z2Kq9M+pi7Ip2OBhOrzivzx64v9+D2bWRwnZ3pmdWStYfQYxlz5CayozRQsmtipNg1vM+JN9Q==} resolution: {integrity: sha512-tMKBobVFLYth0z2Kq9M+pi7Ip2OBhOrzivzx64v9+D2bWRwnZ3pmdWStYfQYxlz5CayozRQsmtipNg1vM+JN9Q==}
peerDependencies: peerDependencies:
'@sveltejs/kit': ^1.0.0 '@sveltejs/kit': ^1.0.0
svelte: ^3 svelte: ^3
dependencies: dependencies:
'@sveltejs/kit': 1.20.4(svelte@3.59.2)(vite@4.3.9) '@sveltejs/kit': 1.20.5(svelte@3.59.2)(vite@4.3.9)
svelte: 3.59.2 svelte: 3.59.2
dev: false dev: false
/sveltekit-superforms@1.1.1(@sveltejs/kit@1.20.4)(svelte@3.59.2)(zod@3.21.4): /sveltekit-superforms@1.1.2(@sveltejs/kit@1.20.5)(svelte@3.59.2)(zod@3.21.4):
resolution: {integrity: sha512-lD3ov06C/O8hD7mCzEQZ7CTsbHrh6kWhRP3njI9ZSwvG5DW6vhfi6Re/cyYy//cS0oMONI0xBieWyr9s24Y9jA==} resolution: {integrity: sha512-oWW3+Phcs/CkUKGEx0IsCr6Dw3a22/MVs4Tvi8k/jh66pqwP/jOZu3/dT367pkbIh5T7NK20yrnbHu8nm2E7pQ==}
peerDependencies: peerDependencies:
'@sveltejs/kit': 1.x '@sveltejs/kit': 1.x
svelte: 3.x svelte: 3.x || 4.x
zod: 3.x zod: 3.x
dependencies: dependencies:
'@sveltejs/kit': 1.20.4(svelte@3.59.2)(vite@4.3.9) '@sveltejs/kit': 1.20.5(svelte@3.59.2)(vite@4.3.9)
svelte: 3.59.2 svelte: 3.59.2
zod: 3.21.4 zod: 3.21.4
dev: true dev: true

View file

@ -129,8 +129,8 @@ model Game {
id String @id @default(cuid()) id String @id @default(cuid())
name String name String
slug String slug String
description String? description String? @db.LongText
description_preview String? description_preview String? @db.LongText
year_published Int? year_published Int?
min_players Int? min_players Int?
max_players Int? max_players Int?
@ -143,6 +143,8 @@ model Game {
rules_url String? rules_url String?
primary_publisher_id String? primary_publisher_id String?
primary_publisher Publisher? @relation("PrimaryPublishers", references: [id], fields: [primary_publisher_id]) primary_publisher Publisher? @relation("PrimaryPublishers", references: [id], fields: [primary_publisher_id])
primary_designer_id String?
primary_designer Designer? @relation("PrimaryDesigners", references: [id], fields: [primary_designer_id])
categories Category[] categories Category[]
mechanics Mechanic[] mechanics Mechanic[]
designers Designer[] designers Designer[]
@ -162,37 +164,39 @@ model Game {
} }
model GameName { model GameName {
id String @id @default(cuid()) id String @id @default(cuid())
name String name String
game_id String game_id String
game Game @relation(references: [id], fields: [game_id]) game Game @relation(references: [id], fields: [game_id])
created_at DateTime @default(now()) @db.Timestamp(6) created_at DateTime @default(now()) @db.Timestamp(6)
updated_at DateTime @updatedAt @db.Timestamp(6) updated_at DateTime @updatedAt @db.Timestamp(6)
@@index([game_id]) @@index([game_id])
@@map("game_names") @@map("game_names")
} }
model Publisher { model Publisher {
id String @id @default(cuid()) id String @id @default(cuid())
name String name String
games Game[] slug String
primary_publisher Game[] @relation("PrimaryPublishers") external_id String @unique
created_at DateTime @default(now()) @db.Timestamp(6) games Game[]
updated_at DateTime @updatedAt @db.Timestamp(6) primary_publisher Game[] @relation("PrimaryPublishers")
created_at DateTime @default(now()) @db.Timestamp(6)
updated_at DateTime @updatedAt @db.Timestamp(6)
@@fulltext([name]) @@fulltext([name])
@@map("publishers") @@map("publishers")
} }
model Category { model Category {
id String @id @default(cuid()) id String @id @default(cuid())
name String name String
slug String slug String
games Game[] games Game[]
external_id String @unique external_id String @unique
created_at DateTime @default(now()) @db.Timestamp(6) created_at DateTime @default(now()) @db.Timestamp(6)
updated_at DateTime @updatedAt @db.Timestamp(6) updated_at DateTime @updatedAt @db.Timestamp(6)
@@fulltext([name]) @@fulltext([name])
@@map("categories") @@map("categories")
@ -212,36 +216,39 @@ model Mechanic {
} }
model Designer { model Designer {
id String @id @default(cuid()) id String @id @default(cuid())
name String name String
games Game[] external_id String @unique
created_at DateTime @default(now()) @db.Timestamp(6) games Game[]
updated_at DateTime @updatedAt @db.Timestamp(6) primary_designer Game[] @relation("PrimaryDesigners")
created_at DateTime @default(now()) @db.Timestamp(6)
updated_at DateTime @updatedAt @db.Timestamp(6)
@@fulltext([name]) @@fulltext([name])
@@map("designers") @@map("designers")
} }
model Artist { model Artist {
id String @id @default(cuid()) id String @id @default(cuid())
name String name String
games Game[] external_id String @unique
created_at DateTime @default(now()) @db.Timestamp(6) games Game[]
updated_at DateTime @updatedAt @db.Timestamp(6) created_at DateTime @default(now()) @db.Timestamp(6)
updated_at DateTime @updatedAt @db.Timestamp(6)
@@fulltext([name]) @@fulltext([name])
@@map("artists") @@map("artists")
} }
model Expansion { model Expansion {
id String @id @default(cuid()) id String @id @default(cuid())
name String name String
year_published Int? year_published Int?
baseGame Game? @relation(fields: [base_game_id], references: [id]) baseGame Game? @relation(fields: [base_game_id], references: [id])
base_game_id String? base_game_id String?
external_id String @unique external_id String @unique
created_at DateTime @default(now()) @db.Timestamp(6) created_at DateTime @default(now()) @db.Timestamp(6)
updated_at DateTime @updatedAt @db.Timestamp(6) updated_at DateTime @updatedAt @db.Timestamp(6)
@@fulltext([name]) @@fulltext([name])
@@index([base_game_id]) @@index([base_game_id])

View file

@ -57,6 +57,24 @@ export type SavedGameType = {
includeInRandom: boolean; includeInRandom: boolean;
}; };
export type MechanicType = {
id: string;
};
export type CategoryType = {
id: string;
};
export type PublisherType = {
id: string;
name: string;
};
export type DesignerType = {
id: string;
name: string;
};
export type GameType = { export type GameType = {
id: string; id: string;
handle: string; handle: string;
@ -71,6 +89,14 @@ export type GameType = {
price_au: number; price_au: number;
msrp: number; msrp: number;
year_published: number; year_published: number;
categories: CategoryType[];
mechanics: MechanicType[];
primary_publisher: PublisherType;
publishers: PublisherType[];
primary_designer: DesignerType;
designers: DesignerType[];
developers: String[];
artists: String[];
min_players: number; min_players: number;
max_players: number; max_players: number;
min_playtime: number; min_playtime: number;

View file

@ -41,22 +41,23 @@ export function mapSavedGameToGame(game: SavedGameType): GameType {
}; };
} }
// TODO: TYpe API response // TODO: Type API response
export function mapAPIGameToBoredGame(game: any): GameType { export function mapAPIGameToBoredGame(game: any): GameType {
const { const {
id, id,
handle, handle,
name, name,
url, url,
edit_url,
thumb_url, thumb_url,
image_url, image_url,
price,
price_ca,
price_uk,
price_au,
msrp,
year_published, year_published,
categories,
mechanics,
primary_designer,
designers,
primary_publisher,
publishers,
artists,
min_players, min_players,
max_players, max_players,
min_playtime, min_playtime,
@ -72,15 +73,16 @@ export function mapAPIGameToBoredGame(game: any): GameType {
handle, handle,
name, name,
url, url,
edit_url,
thumb_url, thumb_url,
image_url, image_url,
price,
price_ca,
price_uk,
price_au,
msrp,
year_published, year_published,
categories,
mechanics,
primary_designer,
designers,
primary_publisher,
publishers,
artists,
min_players, min_players,
max_players, max_players,
min_playtime, min_playtime,

View file

@ -1,46 +1,87 @@
import { BOARD_GAME_ATLAS_CLIENT_ID } from '$env/static/private';
import { error } from '@sveltejs/kit'; import { error } from '@sveltejs/kit';
import { superValidate } from 'sveltekit-superforms/server'; import { superValidate } from 'sveltekit-superforms/server';
import kebabCase from 'just-kebab-case';
import { BOARD_GAME_ATLAS_CLIENT_ID } from '$env/static/private';
import prisma from '$lib/prisma.js';
import type { GameType, SearchQuery } from '$lib/types'; import type { GameType, SearchQuery } from '$lib/types';
import { mapAPIGameToBoredGame } from '$lib/util/gameMapper'; import { mapAPIGameToBoredGame } from '$lib/util/gameMapper';
import { search_schema } from '$lib/zodValidation'; import { search_schema } from '$lib/zodValidation';
async function searchForGames(urlQueryParams: SearchQuery) { async function searchForGames(urlQueryParams: SearchQuery) {
try { try {
const url = `https://api.boardgameatlas.com/api/search${ let dbGames = await prisma.game.findMany({
urlQueryParams ? `?${urlQueryParams}` : '' where: {
}`; name: {
const response = await fetch(url, { search: urlQueryParams?.name
method: 'get', },
headers: { min_players: {
'content-type': 'application/json' gte: urlQueryParams?.min_players || 0
},
max_players: {
lte: urlQueryParams?.max_players || 100
},
min_playtime: {
gte: urlQueryParams?.min_playtime || 0
},
max_playtime: {
lte: urlQueryParams?.max_playtime || 5000
},
min_age: {
gte: urlQueryParams?.min_age || 130
}
},
skip: urlQueryParams?.skip,
take: urlQueryParams?.limit,
orderBy: {
name: 'asc'
} }
}); });
console.log('dbGames', dbGames);
if (!response.ok) { if (!dbGames || dbGames.length === 0) {
console.log('Status not 200', response.status); const url = new URL(
throw error(response.status); `https://api.boardgameatlas.com/api/search${urlQueryParams ? `?${urlQueryParams}` : ''}`
} );
const headers: HeadersInit = new Headers();
headers.set('Content-Type', 'application/json');
const requestInit: RequestInit = {
method: 'GET',
headers
};
const response = await fetch(url, requestInit);
const games: GameType[] = []; if (!response.ok) {
let totalCount = 0; console.log('Status not 200', response.status);
if (response.ok) { throw error(response.status);
const gameResponse = await response.json(); }
const gameList: GameType[] = gameResponse?.games;
totalCount = gameResponse?.count; const games: GameType[] = [];
console.log('totalCount', totalCount); let totalCount = 0;
gameList.forEach((game) => { if (response.ok) {
if (game?.min_players && game?.max_players) { const gameResponse = await response.json();
game.players = `${game.min_players}-${game.max_players}`; const gameList: GameType[] = gameResponse?.games;
game.playtime = `${game.min_playtime}-${game.max_playtime}`; totalCount = gameResponse?.count;
} console.log('totalCount', totalCount);
games.push(mapAPIGameToBoredGame(game)); gameList.forEach((game) => {
}); if (game?.min_players && game?.max_players) {
game.players = `${game.min_players}-${game.max_players}`;
game.playtime = `${game.min_playtime}-${game.max_playtime}`;
}
const boredGame = mapAPIGameToBoredGame(game);
createOrUpdateGame(boredGame);
games.push(boredGame);
});
}
return {
totalCount,
games
};
} else {
return {
totalCount: dbGames.length,
dbGames
};
} }
return {
totalCount,
games
};
} catch (e) { } catch (e) {
console.log(`Error searching board games ${e}`); console.log(`Error searching board games ${e}`);
} }
@ -50,7 +91,85 @@ async function searchForGames(urlQueryParams: SearchQuery) {
}; };
} }
export const load = async ({ fetch, url }) => { async function createOrUpdateGame(game: GameType) {
const categoryIds = game.categories.map((category) => ({
external_id: category.id
}));
const mechanicIds = game.mechanics.map((mechanic) => ({
external_id: mechanic.id
}));
return await prisma.game.upsert({
where: {
external_id: game.id
},
create: {
name: game.name,
slug: kebabCase(game.name),
description: game.description,
description_preview: game.description_preview,
external_id: game.id,
thumb_url: game.thumb_url,
min_age: game.min_age,
min_players: game.min_players,
max_players: game.max_players,
min_playtime: game.min_playtime,
max_playtime: game.max_playtime,
year_published: game.year_published,
primary_publisher: {
connectOrCreate: {
where: {
external_id: game.primary_publisher.id
},
create: {
external_id: game.primary_publisher.id,
name: game.primary_publisher.name,
slug: kebabCase(game.primary_publisher.name)
}
}
},
categories: {
connect: categoryIds
},
mechanics: {
connect: mechanicIds
}
},
update: {
name: game.name,
slug: kebabCase(game.name),
description: game.description,
description_preview: game.description_preview,
external_id: game.id,
thumb_url: game.thumb_url,
min_age: game.min_age,
min_players: game.min_players,
max_players: game.max_players,
min_playtime: game.min_playtime,
max_playtime: game.max_playtime,
year_published: game.year_published,
primary_publisher: {
connectOrCreate: {
where: {
external_id: game.primary_publisher.id
},
create: {
external_id: game.primary_publisher.id,
name: game.primary_publisher.name
}
}
},
categories: {
connect: categoryIds
},
mechanics: {
connect: mechanicIds
}
}
});
}
export const load = async (event) => {
const { params, locals, request, fetch, url } = event;
const defaults = { const defaults = {
limit: 10, limit: 10,
skip: 0 skip: 0

View file

@ -48,15 +48,20 @@ export const actions = {
throw redirect(302, '/auth/signin'); throw redirect(302, '/auth/signin');
} }
const game = await prisma.game.findUnique({ let game = await prisma.game.findUnique({
where: { where: {
id: form.id id: form.id
} }
}); });
// if (!game) { if (!game) {
// throw redirect(302, '/404'); game = await prisma.game.create({
// } data: {
name: form.name
}
});
throw redirect(302, '/404');
}
if (game) { if (game) {
const wishlist = await prisma.wishlist.create({ const wishlist = await prisma.wishlist.create({