39 lines
1.0 KiB
TypeScript
39 lines
1.0 KiB
TypeScript
import { db } from '$lib/server/db';
|
|
import type { LayoutServerLoad } from './$types';
|
|
|
|
export const load: LayoutServerLoad = ({ locals }) => {
|
|
// the overview: every user's tracks, thinned for the persistent map
|
|
const rows = db
|
|
.prepare(
|
|
`SELECT a.id, a.name, a.type, a.date, a.distance_m, a.points, u.username
|
|
FROM activities a JOIN users u ON u.id = a.user_id`
|
|
)
|
|
.all() as {
|
|
id: number;
|
|
name: string;
|
|
type: string;
|
|
date: string | null;
|
|
distance_m: number;
|
|
points: string;
|
|
username: string;
|
|
}[];
|
|
const tracks = rows.map((row) => {
|
|
const points = JSON.parse(row.points) as { lat: number; lon: number }[];
|
|
const step = Math.max(1, Math.floor(points.length / 300));
|
|
const latlngs = points
|
|
.filter((_, i) => i % step === 0 || i === points.length - 1)
|
|
.map((p) => [p.lat, p.lon] as [number, number]);
|
|
return {
|
|
id: row.id,
|
|
name: row.name,
|
|
username: row.username,
|
|
type: row.type,
|
|
date: row.date,
|
|
distance_m: row.distance_m,
|
|
latlngs
|
|
};
|
|
});
|
|
|
|
return { user: locals.user, tracks };
|
|
};
|