Files
wanderer/web/src/lib/models/trail.ts
2024-06-06 02:02:23 +02:00

133 lines
3.6 KiB
TypeScript

import type { Category } from "./category";
import type { Comment } from "./comment";
import type { SummitLog } from "./summit_log";
import type { TrailShare } from "./trail_share";
import type { Waypoint } from "./waypoint";
class Trail {
id?: string;
name: string;
location?: string;
date?: string;
public: boolean;
distance?: number;
elevation_gain?: number;
duration?: number;
difficulty?: "easy" | "moderate" | "difficult"
lat?: number;
lon?: number;
thumbnail: number;
photos: string[];
gpx?: string;
created?: string;
category?: string;
waypoints: string[];
summit_logs: string[];
expand: {
category?: Category;
waypoints: Waypoint[]
summit_logs: SummitLog[]
comments_via_trail: Comment[]
gpx_data?: string
trail_share_via_trail?: TrailShare[]
}
tags?: string[];
description?: string;
author?: string;
constructor(name: string,
params?: {
id?: string,
location?: string,
date?: string,
public?: boolean,
distance?: number,
elevation_gain?: number,
duration?: number,
difficulty?: "easy" | "moderate" | "difficult",
lat?: number,
lon?: number,
thumbnail?: number,
photos?: string[],
gpx?: string,
category?: Category,
waypoints?: Waypoint[],
summit_logs?: SummitLog[],
comments?: Comment[],
shares?: TrailShare[],
tags?: string[],
description?: string
created?: string
}
) {
this.id = params?.id;
this.name = name;
this.location = params?.location;
this.date = params?.date ?? new Date().toISOString().split('T')[0];
this.public = params?.public ?? false
this.distance = params?.distance;
this.elevation_gain = params?.elevation_gain;
this.duration = params?.duration;
this.difficulty = params?.difficulty ?? "easy";
this.lat = params?.lat;
this.lon = params?.lon;
this.thumbnail = params?.thumbnail ?? 0;
this.photos = params?.photos ?? [];
this.waypoints = [];
this.summit_logs = [];
this.gpx = params?.gpx;
this.expand = {
category: params?.category,
waypoints: params?.waypoints ?? [],
summit_logs: params?.summit_logs ?? [],
comments_via_trail: params?.comments ?? [],
trail_share_via_trail: params?.shares ?? []
}
this.tags = params?.tags ?? []
this.description = params?.description ?? "";
this.created = params?.created;
}
}
interface TrailFilter {
q: string,
category: string[],
difficulty: ("easy" | "moderate" | "difficult")[]
near: {
lat?: number,
lon?: number,
radius: number
}
distanceMin: number,
distanceMax: number,
distanceLimit: number,
elevationGainMin: number;
elevationGainMax: number;
elevationGainLimit: number;
startDate?: string;
endDate?: string;
completed?: boolean;
sort: "name" | "distance" | "elevation_gain" | "created";
sortOrder: "+" | "-"
}
interface TrailFilterValues {
min_distance: number,
max_distance: number,
min_elevation_gain: number,
max_elevation_gain: number,
min_durtation: number,
max_duration: number,
}
interface TrailBoundingBox {
max_lat: number,
min_lat: number,
max_lon: number,
min_lon: number,
}
export { Trail };
export type { TrailFilter, TrailFilterValues, TrailBoundingBox };