trails/apps/planner/app/routes/api.sessions.ts
Ullrich Schäfer 4b711abaec
Add split export: Export Route vs Export Plan
Split button with default "Export GPX" (track only) and dropdown:
- Export Route: clean track for use in any app
- Export Plan: track + waypoints + no-go areas in GPX extensions
  (trails:planning namespace) for reimporting into the planner

Also:
- Add no-go area serialization to generateGpx (GPX extensions)
- Parse no-go areas from GPX extensions on import
- Initialize no-go areas in Yjs session from imported GPX
- Save to Journal now exports track only (consistent with Export Route)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-03 10:52:39 +01:00

48 lines
1.5 KiB
TypeScript

import { data } from "react-router";
import type { Route } from "./+types/api.sessions";
import { createSession, listSessions, initializeSessionWithNoGoAreas } from "~/lib/sessions";
import { parseGpxAsync, extractWaypoints } from "@trails-cool/gpx";
import { withDb } from "@trails-cool/db";
export async function action({ request }: Route.ActionArgs) {
if (request.method !== "POST") {
return data({ error: "Method not allowed" }, { status: 405 });
}
const body = await request.json();
const { callbackUrl, callbackToken, gpx } = body as {
callbackUrl?: string;
callbackToken?: string;
gpx?: string;
};
return withDb(async () => {
const session = await createSession({ callbackUrl, callbackToken });
let initialWaypoints: Array<{ lat: number; lon: number; name?: string }> | undefined;
if (gpx) {
try {
const gpxData = await parseGpxAsync(gpx);
const wps = extractWaypoints(gpxData);
if (wps.length > 0) initialWaypoints = wps;
if (gpxData.noGoAreas.length > 0) {
initializeSessionWithNoGoAreas(session.id, gpxData.noGoAreas);
}
} catch {
// Continue with empty session if GPX is invalid
}
}
return data(
{ sessionId: session.id, url: `/session/${session.id}`, initialWaypoints },
{ status: 201 },
);
});
}
export async function loader(_args: Route.LoaderArgs) {
return withDb(async () => {
const sessions = await listSessions();
return data({ sessions });
});
}