Update search API

This commit is contained in:
Geomitron
2024-07-29 16:04:57 -05:00
parent 7db61734b2
commit 0014206988

View File

@@ -8,9 +8,10 @@ export const GeneralSearchSchema = z.object({
search: z.string(), search: z.string(),
per_page: z.number().positive().lte(250, 'Getting more than 250 results at a time is not supported').optional(), per_page: z.number().positive().lte(250, 'Getting more than 250 results at a time is not supported').optional(),
page: z.number().positive(), page: z.number().positive(),
instrument: z.enum(instruments).nullable(), instrument: z.enum(instruments).nullable().default(null),
difficulty: z.enum(difficulties).nullable(), difficulty: z.enum(difficulties).nullable().default(null),
drumType: z.enum(drumTypeNames).nullable(), drumType: z.enum(drumTypeNames).nullable().default(null),
source: z.enum(sources).optional(),
}) })
export type GeneralSearch = z.infer<typeof GeneralSearchSchema> export type GeneralSearch = z.infer<typeof GeneralSearchSchema>
@@ -18,49 +19,61 @@ const md5Validator = z.string().regex(/^[a-f0-9]{32}$/, 'Invalid MD5 hash')
const blakeValidator = z.string().regex(/^[A-Za-z0-9-_]+={0,2}$/, 'Invalid hash') const blakeValidator = z.string().regex(/^[A-Za-z0-9-_]+={0,2}$/, 'Invalid hash')
export const AdvancedSearchSchema = z.object({ export const AdvancedSearchSchema = z.object({
instrument: z.enum(instruments).nullable(), instrument: z.enum(instruments).nullable().default(null),
difficulty: z.enum(difficulties).nullable(), difficulty: z.enum(difficulties).nullable().default(null),
drumType: z.enum(drumTypeNames).nullable(), drumType: z.enum(drumTypeNames).nullable().default(null),
source: z.enum(sources).optional(), source: z.enum(sources).optional(),
per_page: z.number().positive().lte(250, 'Getting more than 250 results at a time is not supported').optional(), per_page: z.number().positive().lte(250, 'Getting more than 250 results at a time is not supported').optional(),
page: z.number().positive().optional(), page: z.number().positive().optional(),
name: z.object({ value: z.string(), exact: z.boolean(), exclude: z.boolean() }), name: z.object({ value: z.string(), exact: z.boolean(), exclude: z.boolean() }).nullable().default(null),
artist: z.object({ value: z.string(), exact: z.boolean(), exclude: z.boolean() }), artist: z.object({ value: z.string(), exact: z.boolean(), exclude: z.boolean() }).nullable().default(null),
album: z.object({ value: z.string(), exact: z.boolean(), exclude: z.boolean() }), album: z.object({ value: z.string(), exact: z.boolean(), exclude: z.boolean() }).nullable().default(null),
genre: z.object({ value: z.string(), exact: z.boolean(), exclude: z.boolean() }), genre: z.object({ value: z.string(), exact: z.boolean(), exclude: z.boolean() }).nullable().default(null),
year: z.object({ value: z.string(), exact: z.boolean(), exclude: z.boolean() }), year: z.object({ value: z.string(), exact: z.boolean(), exclude: z.boolean() }).nullable().default(null),
charter: z.object({ value: z.string(), exact: z.boolean(), exclude: z.boolean() }), charter: z.object({ value: z.string(), exact: z.boolean(), exclude: z.boolean() }).nullable().default(null),
minLength: z.number().nullable(), minLength: z.number().nullable().default(null),
maxLength: z.number().nullable(), maxLength: z.number().nullable().default(null),
minIntensity: z.number().nullable(), minIntensity: z.number().nullable().default(null),
maxIntensity: z.number().nullable(), maxIntensity: z.number().nullable().default(null),
minAverageNPS: z.number().nullable(), minAverageNPS: z.number().nullable().default(null),
maxAverageNPS: z.number().nullable(), maxAverageNPS: z.number().nullable().default(null),
minMaxNPS: z.number().nullable(), minMaxNPS: z.number().nullable().default(null),
maxMaxNPS: z.number().nullable(), maxMaxNPS: z.number().nullable().default(null),
minYear: z.number().nullable(), minYear: z.number().nullable().default(null),
maxYear: z.number().nullable(), maxYear: z.number().nullable().default(null),
modifiedAfter: z.string().regex(/^\d+-\d{2}-\d{2}$/, 'Invalid date').or(z.coerce.date()).or(z.literal('')).nullable(), modifiedAfter: z
hash: z.string().transform(data => .string()
data === '' || data.split(',').every(hash => md5Validator.safeParse(hash).success) ? data : 'invalid' .regex(/^\d+-\d{2}-\d{2}$/, 'Invalid date')
).nullable(), .or(z.coerce.date())
chartHash: z.string().transform(data => .or(z.literal(''))
data === '' || data.split(',').every(hash => md5Validator.safeParse(hash).success) ? data : 'invalid' .nullable()
).nullable().optional(), .default(null),
trackHash: z.string().transform(data => hash: z
data === '' || data.split(',').every(hash => blakeValidator.safeParse(hash).success) ? data : 'invalid' .string()
).nullable().optional(), .transform(data => (data === '' || data.split(',').every(hash => md5Validator.safeParse(hash).success) ? data : 'invalid'))
hasSoloSections: z.boolean().nullable(), .nullable()
hasForcedNotes: z.boolean().nullable(), .default(null),
hasOpenNotes: z.boolean().nullable(), chartHash: z
hasTapNotes: z.boolean().nullable(), .string()
hasLyrics: z.boolean().nullable(), .transform(data => (data === '' || data.split(',').every(hash => md5Validator.safeParse(hash).success) ? data : 'invalid'))
hasVocals: z.boolean().nullable(), .nullable()
hasRollLanes: z.boolean().nullable(), .optional(),
has2xKick: z.boolean().nullable(), trackHash: z
hasIssues: z.boolean().nullable(), .string()
hasVideoBackground: z.boolean().nullable(), .transform(data => (data === '' || data.split(',').every(hash => blakeValidator.safeParse(hash).success) ? data : 'invalid'))
modchart: z.boolean().nullable(), .nullable()
.optional(),
hasSoloSections: z.boolean().nullable().default(null),
hasForcedNotes: z.boolean().nullable().default(null),
hasOpenNotes: z.boolean().nullable().default(null),
hasTapNotes: z.boolean().nullable().default(null),
hasLyrics: z.boolean().nullable().default(null),
hasVocals: z.boolean().nullable().default(null),
hasRollLanes: z.boolean().nullable().default(null),
has2xKick: z.boolean().nullable().default(null),
hasIssues: z.boolean().nullable().default(null),
hasVideoBackground: z.boolean().nullable().default(null),
modchart: z.boolean().nullable().default(null),
chartIdAfter: z.number().positive().optional(), chartIdAfter: z.number().positive().optional(),
}) })
export type AdvancedSearch = z.infer<typeof AdvancedSearchSchema> export type AdvancedSearch = z.infer<typeof AdvancedSearchSchema>