mirror of
https://github.com/Myxelium/Bridge-Multi.git
synced 2026-07-07 18:45:09 +00:00
Update search API
This commit is contained in:
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user