adds trail recommend

This commit is contained in:
Christian Beutel
2025-01-09 20:35:43 +01:00
parent a2d5d5dc8d
commit 0afc565441
2 changed files with 32 additions and 11 deletions

View File

@@ -7,15 +7,15 @@ const TrailCreateSchema = z.object({
name: z.string().min(1, "required"), name: z.string().min(1, "required"),
description: z.string().optional(), description: z.string().optional(),
location: z.string().optional(), location: z.string().optional(),
date: z.string().optional().refine((val) => !val || !isNaN(Date.parse(val)), "invalid-date"), date: z.string().optional().refine((val) => !val || !isNaN(Date.parse(val)), "invalid-date"),
public: z.boolean(), public: z.boolean(),
difficulty: z.enum(["easy", "moderate", "difficult"]).optional(), difficulty: z.enum(["easy", "moderate", "difficult"]).optional(),
lat: z.number().min(-90).max(90).optional(), lat: z.number().min(-90).max(90).optional(),
lon: z.number().min(-180).max(180).optional(), lon: z.number().min(-180).max(180).optional(),
distance: z.number({coerce: true}).nonnegative().optional(), distance: z.number({ coerce: true }).nonnegative().optional(),
elevation_gain: z.number({coerce: true}).nonnegative().optional(), elevation_gain: z.number({ coerce: true }).nonnegative().optional(),
elevation_loss: z.number({coerce: true}).nonnegative().optional(), elevation_loss: z.number({ coerce: true }).nonnegative().optional(),
duration: z.number({coerce: true}).nonnegative().optional(), duration: z.number({ coerce: true }).nonnegative().optional(),
photos: z.array(z.string()).default([]), photos: z.array(z.string()).default([]),
thumbnail: z.number().int().nonnegative().optional(), thumbnail: z.number().int().nonnegative().optional(),
waypoints: z.array(z.string()).default([]), waypoints: z.array(z.string()).default([]),
@@ -30,15 +30,15 @@ const TrailUpdateSchema = z.object({
name: z.string(), name: z.string(),
description: z.string().optional(), description: z.string().optional(),
location: z.string().optional(), location: z.string().optional(),
date: z.string().optional().refine((val) => !val || !isNaN(Date.parse(val)), "invalid-date"), date: z.string().optional().refine((val) => !val || !isNaN(Date.parse(val)), "invalid-date"),
public: z.boolean().optional(), public: z.boolean().optional(),
difficulty: z.enum(["easy", "moderate", "difficult"]).optional(), difficulty: z.enum(["easy", "moderate", "difficult"]).optional(),
lat: z.number().min(-90).max(90).optional(), lat: z.number().min(-90).max(90).optional(),
lon: z.number().min(-180).max(180).optional(), lon: z.number().min(-180).max(180).optional(),
distance: z.number({coerce: true}).nonnegative().optional(), distance: z.number({ coerce: true }).nonnegative().optional(),
elevation_gain: z.number({coerce: true}).nonnegative().optional(), elevation_gain: z.number({ coerce: true }).nonnegative().optional(),
elevation_loss: z.number({coerce: true}).nonnegative().optional(), elevation_loss: z.number({ coerce: true }).nonnegative().optional(),
duration: z.number({coerce: true}).nonnegative().optional(), duration: z.number({ coerce: true }).nonnegative().optional(),
photos: z.array(z.string()).optional(), photos: z.array(z.string()).optional(),
"photos-": z.string().optional(), "photos-": z.string().optional(),
"photos+": z.string().optional(), "photos+": z.string().optional(),
@@ -49,4 +49,8 @@ const TrailUpdateSchema = z.object({
gpx: z.string().optional(), gpx: z.string().optional(),
}) satisfies ZodType<Partial<Trail>> }) satisfies ZodType<Partial<Trail>>
export { TrailCreateSchema, TrailUpdateSchema }; const TrailRecommendSchema = z.object({
size: z.number({ coerce: true }).optional()
})
export { TrailCreateSchema, TrailUpdateSchema, TrailRecommendSchema };

View File

@@ -37,6 +37,23 @@ export async function trails_index(perPage: number = 21, random: boolean = false
} }
export async function trails_recommend(size: number, f: (url: RequestInfo | URL, config?: RequestInit) => Promise<Response> = fetch) {
const r = await f('/api/v1/trail/recommend?' + new URLSearchParams({
"size": size.toString(),
}), {
method: 'GET',
})
const response: Trail[] = await r.json()
if (!r.ok) {
const response = await r.json();
throw new APIError(r.status, response.message, response.detail)
}
return response;
}
export async function trails_search_filter(filter: TrailFilter, page: number = 1, f: (url: RequestInfo | URL, config?: RequestInit) => Promise<Response> = fetch) { export async function trails_search_filter(filter: TrailFilter, page: number = 1, f: (url: RequestInfo | URL, config?: RequestInit) => Promise<Response> = fetch) {
let filterText: string = buildFilterText(filter, true); let filterText: string = buildFilterText(filter, true);