feat: add geo points endpoint
This commit is contained in:
29
apps/web/app/api/geo/route.ts
Normal file
29
apps/web/app/api/geo/route.ts
Normal file
@@ -0,0 +1,29 @@
|
||||
import { getDb } from "@tline/db";
|
||||
|
||||
import { shapeGeoRows } from "./shape";
|
||||
|
||||
export const runtime = "nodejs";
|
||||
|
||||
export async function GET(): Promise<Response> {
|
||||
const db = getDb();
|
||||
|
||||
const rows = await db<
|
||||
{
|
||||
id: string;
|
||||
gps_lat: number | null;
|
||||
gps_lon: number | null;
|
||||
}[]
|
||||
>`
|
||||
select
|
||||
a.id,
|
||||
a.gps_lat,
|
||||
a.gps_lon
|
||||
from assets a
|
||||
where a.gps_lat is not null
|
||||
and a.gps_lon is not null
|
||||
order by a.capture_ts_utc asc nulls last, a.id asc
|
||||
limit 1000
|
||||
`;
|
||||
|
||||
return Response.json(shapeGeoRows(rows));
|
||||
}
|
||||
19
apps/web/app/api/geo/shape.ts
Normal file
19
apps/web/app/api/geo/shape.ts
Normal file
@@ -0,0 +1,19 @@
|
||||
type GeoRow = {
|
||||
id: string;
|
||||
gps_lat: number | null;
|
||||
gps_lon: number | null;
|
||||
};
|
||||
|
||||
type GeoPoint = {
|
||||
id: string;
|
||||
gps_lat: number | null;
|
||||
gps_lon: number | null;
|
||||
};
|
||||
|
||||
export function shapeGeoRows(rows: GeoRow[]): GeoPoint[] {
|
||||
return rows.map((row) => ({
|
||||
id: row.id,
|
||||
gps_lat: row.gps_lat,
|
||||
gps_lon: row.gps_lon,
|
||||
}));
|
||||
}
|
||||
17
apps/web/src/__tests__/geo-route.test.ts
Normal file
17
apps/web/src/__tests__/geo-route.test.ts
Normal file
@@ -0,0 +1,17 @@
|
||||
import { test, expect } from "bun:test";
|
||||
|
||||
test("shapeGeoRows returns id/lat/lon only", async () => {
|
||||
const { shapeGeoRows } = await import("../../app/api/geo/shape");
|
||||
const rows = [
|
||||
{
|
||||
id: "a",
|
||||
gps_lat: 40.1,
|
||||
gps_lon: -73.9,
|
||||
capture_ts_utc: "2026-02-01T00:00:00.000Z",
|
||||
media_type: "image",
|
||||
},
|
||||
];
|
||||
expect(shapeGeoRows(rows)).toEqual([
|
||||
{ id: "a", gps_lat: 40.1, gps_lon: -73.9 },
|
||||
]);
|
||||
});
|
||||
Reference in New Issue
Block a user