diff options
| author | Adam Soltys <[email protected]> | 2026-02-27 10:09:25 -0800 |
|---|---|---|
| committer | Adam Soltys <[email protected]> | 2026-02-27 10:09:25 -0800 |
| commit | fd8f286e22f4f8b6a24123937c24c52b9c1407ba (patch) | |
| tree | 13aaf05b65dc510e05f7e5e53ce2de1de67d2d15 | |
| parent | f3c7e821f12f55044689204ff2c4571be791bb9f (diff) | |
| download | coinos-server-fd8f286e22f4f8b6a24123937c24c52b9c1407ba.tar.gz coinos-server-fd8f286e22f4f8b6a24123937c24c52b9c1407ba.zip | |
map updates
| -rw-r--r-- | index.ts | 1 | ||||
| -rw-r--r-- | lib/locations.ts | 13 | ||||
| -rw-r--r-- | routes/locations.ts | 38 |
3 files changed, 49 insertions, 3 deletions
@@ -66,6 +66,7 @@ app.get("/rate", rates.last); app.get("/rates", rates.index); app.get("/locations", locations.list); +app.get("/locations/nearby", locations.nearby); app.get("/invoice/:id", invoices.get); app.get("/invoices", auth, invoices.list); diff --git a/lib/locations.ts b/lib/locations.ts index 91bc4599..734cd027 100644 --- a/lib/locations.ts +++ b/lib/locations.ts @@ -1,4 +1,4 @@ -import { g, s } from "$lib/db"; +import { db, g, s } from "$lib/db"; import { err } from "$lib/logging"; import { fields, getUser } from "$lib/utils"; import got from "got"; @@ -49,8 +49,17 @@ export const getLocations = async () => { locations.push(...previous); - await s("locations", dedup(locations)); + const dedupedLocations = dedup(locations); + await s("locations", dedupedLocations); await s("locations:since", `${new Date().toISOString().split(".")[0]}Z`); + + for (const loc of dedupedLocations) { + if (loc.deleted_at) continue; + const { lat, lon } = loc.osm_json; + if (!(lat && lon)) continue; + await db.geoAdd("locations:geo", { longitude: lon, latitude: lat, member: String(loc.id) }); + await s(`location:${loc.id}`, loc); + } } catch (e) { console.log(e); err("problem fetching locations", e); diff --git a/routes/locations.ts b/routes/locations.ts index d7a5b636..23b0f3b4 100644 --- a/routes/locations.ts +++ b/routes/locations.ts @@ -1,8 +1,44 @@ -import { g } from "$lib/db"; +import { db, g } from "$lib/db"; export default { async list(_, res) { const locations = await g("locations"); res.send({ locations }); }, + + async nearby(req, res) { + const lat = parseFloat(req.query.lat); + const lon = parseFloat(req.query.lon); + const radius = parseFloat(req.query.radius) || 50; + const count = parseInt(req.query.count) || 50; + + if (isNaN(lat) || isNaN(lon)) { + return res.status(400).send({ error: "lat and lon required" }); + } + + try { + const ids = await db.geoSearch("locations:geo", { + longitude: lon, + latitude: lat, + }, { + radius, + unit: "km", + }, { + COUNT: count, + SORT: "ASC", + }); + + const locations = []; + for (const id of ids) { + const loc = await g(`location:${id}`); + if (loc) locations.push(loc); + } + + res.send({ locations }); + } catch (e) { + console.log("nearby search failed", e); + const locations = await g("locations"); + res.send({ locations }); + } + }, }; |
