2022-12-05 01:29:56 +00:00
|
|
|
import { z, ZodNumber, ZodOptional } from 'zod';
|
2022-12-05 06:37:49 +00:00
|
|
|
// import zodToJsonSchema from 'zod-to-json-schema';
|
2022-04-21 02:41:26 +00:00
|
|
|
|
|
|
|
|
export const BoardGameSearch = z.object({
|
2022-12-25 18:52:36 +00:00
|
|
|
minAge: z.number(),
|
|
|
|
|
maxAge: z.number(),
|
|
|
|
|
minPlayers: z.number(),
|
|
|
|
|
maxPlayers: z.number()
|
2022-04-21 02:41:26 +00:00
|
|
|
});
|
|
|
|
|
|
2022-12-01 18:29:24 +00:00
|
|
|
export const saved_game_schema = z.object({
|
2022-12-25 18:52:36 +00:00
|
|
|
id: z.string(),
|
|
|
|
|
name: z.string(),
|
|
|
|
|
thumb_url: z.string(),
|
|
|
|
|
players: z.string(),
|
|
|
|
|
playtime: IntegerString(z.number())
|
2022-12-01 18:29:24 +00:00
|
|
|
});
|
|
|
|
|
|
2022-12-05 01:29:56 +00:00
|
|
|
// https://github.com/colinhacks/zod/discussions/330
|
2022-12-25 18:52:36 +00:00
|
|
|
function IntegerString<schema extends ZodNumber | ZodOptional<ZodNumber>>(schema: schema) {
|
|
|
|
|
return z.preprocess(
|
|
|
|
|
(value) =>
|
|
|
|
|
typeof value === 'string'
|
|
|
|
|
? parseInt(value, 10)
|
|
|
|
|
: typeof value === 'number'
|
|
|
|
|
? value
|
|
|
|
|
: undefined,
|
|
|
|
|
schema
|
|
|
|
|
);
|
2022-12-05 05:26:32 +00:00
|
|
|
}
|
2022-12-05 01:29:56 +00:00
|
|
|
|
2022-12-25 18:52:36 +00:00
|
|
|
export const search_schema = z
|
|
|
|
|
.object({
|
2023-05-15 04:08:30 +00:00
|
|
|
q: z.string().trim().optional().default(''),
|
2022-12-25 18:52:36 +00:00
|
|
|
minAge: IntegerString(z.number().min(1).max(120).optional()),
|
|
|
|
|
minPlayers: IntegerString(z.number().min(1).max(50).optional()),
|
|
|
|
|
maxPlayers: IntegerString(z.number().min(1).max(50).optional()),
|
|
|
|
|
exactMinAge: z.preprocess((a) => Boolean(a), z.boolean().optional()),
|
|
|
|
|
exactMinPlayers: z.preprocess((a) => Boolean(a), z.boolean().optional()),
|
2023-05-15 04:08:30 +00:00
|
|
|
exactMaxPlayers: z.preprocess((a) => Boolean(a), z.boolean().optional()),
|
|
|
|
|
limit: z.number().min(10).max(100).default(10),
|
|
|
|
|
skip: z.number().min(0).default(0)
|
2022-12-25 18:52:36 +00:00
|
|
|
})
|
|
|
|
|
.superRefine(
|
|
|
|
|
({ minPlayers, maxPlayers, minAge, exactMinAge, exactMinPlayers, exactMaxPlayers }, ctx) => {
|
|
|
|
|
console.log({ minPlayers, maxPlayers });
|
|
|
|
|
if (minPlayers && maxPlayers && minPlayers > maxPlayers) {
|
|
|
|
|
ctx.addIssue({
|
|
|
|
|
code: 'custom',
|
|
|
|
|
message: 'Min Players must be smaller than Max Players',
|
|
|
|
|
path: ['minPlayers']
|
|
|
|
|
});
|
|
|
|
|
ctx.addIssue({
|
|
|
|
|
code: 'custom',
|
|
|
|
|
message: 'Min Players must be smaller than Max Players',
|
|
|
|
|
path: ['maxPlayers']
|
|
|
|
|
});
|
|
|
|
|
}
|
2022-12-01 18:29:24 +00:00
|
|
|
|
2022-12-25 18:52:36 +00:00
|
|
|
if (exactMinAge && !minAge) {
|
|
|
|
|
ctx.addIssue({
|
|
|
|
|
code: 'custom',
|
|
|
|
|
message: 'Min Age required when searching for exact min age',
|
|
|
|
|
path: ['minAge']
|
|
|
|
|
});
|
|
|
|
|
}
|
2022-12-01 18:29:24 +00:00
|
|
|
|
2022-12-25 18:52:36 +00:00
|
|
|
if (exactMinPlayers && !minPlayers) {
|
|
|
|
|
ctx.addIssue({
|
|
|
|
|
code: 'custom',
|
|
|
|
|
message: 'Min Players required when searching for exact min players',
|
|
|
|
|
path: ['minPlayers']
|
|
|
|
|
});
|
|
|
|
|
}
|
2022-12-01 18:29:24 +00:00
|
|
|
|
2022-12-25 18:52:36 +00:00
|
|
|
if (exactMaxPlayers && !maxPlayers) {
|
|
|
|
|
ctx.addIssue({
|
|
|
|
|
code: 'custom',
|
|
|
|
|
message: 'Max Players required when searching for exact max players',
|
|
|
|
|
path: ['maxPlayers']
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
);
|
2022-12-01 18:29:24 +00:00
|
|
|
|
|
|
|
|
export const search_result_schema = z.object({
|
2022-12-25 18:52:36 +00:00
|
|
|
client_id: z.string(),
|
|
|
|
|
limit: z.number(),
|
|
|
|
|
skip: z.number(),
|
|
|
|
|
ids: z.string().array(),
|
|
|
|
|
list_id: z.string(),
|
|
|
|
|
kickstarter: z.boolean(),
|
|
|
|
|
random: z.boolean(),
|
|
|
|
|
name: z.string(),
|
|
|
|
|
exact: z.boolean(),
|
|
|
|
|
fuzzy_match: z.boolean(),
|
|
|
|
|
designer: z.string(),
|
|
|
|
|
publisher: z.string(),
|
|
|
|
|
artist: z.string(),
|
|
|
|
|
mechanics: z.string(),
|
|
|
|
|
categories: z.string(),
|
|
|
|
|
order_by: z.string(),
|
|
|
|
|
ascending: z.boolean(),
|
|
|
|
|
min_players: z.number(),
|
|
|
|
|
max_players: z.number(),
|
|
|
|
|
min_playtime: z.number(),
|
|
|
|
|
max_playtime: z.number(),
|
|
|
|
|
min_age: z.number(),
|
|
|
|
|
year_published: z.number(),
|
|
|
|
|
gt_min_players: z.number(),
|
|
|
|
|
gt_max_players: z.number(),
|
|
|
|
|
gt_min_playtime: z.number(),
|
|
|
|
|
gt_max_playtime: z.number(),
|
|
|
|
|
gt_min_age: z.number(),
|
|
|
|
|
gt_year_published: z.number(),
|
|
|
|
|
gt_price: z.bigint(),
|
|
|
|
|
gt_msrp: z.bigint(),
|
|
|
|
|
gt_discount: z.bigint(),
|
|
|
|
|
gt_reddit_count: z.number(),
|
|
|
|
|
gt_reddit_week_count: z.number(),
|
|
|
|
|
gt_reddit_day_count: z.number(),
|
|
|
|
|
lt_min_players: z.number(),
|
|
|
|
|
lt_max_players: z.number(),
|
|
|
|
|
lt_min_playtime: z.number(),
|
|
|
|
|
lt_max_playtime: z.number(),
|
|
|
|
|
lt_min_age: z.number(),
|
|
|
|
|
lt_year_published: z.number(),
|
|
|
|
|
lt_price: z.bigint(),
|
|
|
|
|
lt_msrp: z.bigint(),
|
|
|
|
|
lt_discount: z.bigint(),
|
|
|
|
|
lt_reddit_count: z.number(),
|
|
|
|
|
lt_reddit_week_count: z.number(),
|
|
|
|
|
lt_reddit_day_count: z.number(),
|
|
|
|
|
fields: z.string()
|
2022-12-01 18:29:24 +00:00
|
|
|
});
|
2022-10-13 04:17:30 +00:00
|
|
|
|
|
|
|
|
export const game_schema = z.object({
|
2022-12-25 18:52:36 +00:00
|
|
|
id: z.string(),
|
|
|
|
|
handle: z.string(),
|
|
|
|
|
name: z.string(),
|
|
|
|
|
url: z.string(),
|
|
|
|
|
edit_url: z.string(),
|
|
|
|
|
price: z.number(),
|
|
|
|
|
price_ca: z.number(),
|
|
|
|
|
price_uk: z.number(),
|
|
|
|
|
price_au: z.number(),
|
|
|
|
|
msrp: z.number(),
|
|
|
|
|
year_published: z.number(),
|
|
|
|
|
min_players: z.number(),
|
|
|
|
|
max_players: z.number(),
|
|
|
|
|
min_playtime: z.number(),
|
|
|
|
|
max_playtime: z.number(),
|
|
|
|
|
min_age: z.number(),
|
|
|
|
|
description: z.string(),
|
|
|
|
|
players: z.string(),
|
|
|
|
|
playtime: z.string()
|
2022-04-21 02:41:26 +00:00
|
|
|
});
|
2022-10-13 04:17:30 +00:00
|
|
|
|
2022-12-05 06:37:49 +00:00
|
|
|
// export const game_raw_schema_json = zodToJsonSchema(game_schema, {
|
|
|
|
|
// $refStrategy: 'none',
|
|
|
|
|
// });
|
2022-10-13 04:17:30 +00:00
|
|
|
|
|
|
|
|
export type Game = z.infer<typeof game_schema>;
|