2026-02-22 20:59:19 +00:00
|
|
|
import type { Context, Hono } from "hono"
|
|
|
|
|
|
|
|
|
|
import { type } from "arktype"
|
|
|
|
|
import { createMiddleware } from "hono/factory"
|
|
|
|
|
|
2026-03-16 01:30:02 +00:00
|
|
|
import type { AuthSessionMiddleware } from "../auth/session-middleware.ts"
|
2026-02-22 20:59:19 +00:00
|
|
|
import type { UserSessionManager } from "../session/index.ts"
|
|
|
|
|
|
|
|
|
|
type Env = { Variables: { sessionManager: UserSessionManager } }
|
|
|
|
|
|
|
|
|
|
const locationInput = type({
|
|
|
|
|
lat: "number",
|
|
|
|
|
lng: "number",
|
|
|
|
|
accuracy: "number",
|
|
|
|
|
timestamp: "string.date.iso",
|
|
|
|
|
})
|
|
|
|
|
|
2026-03-16 01:30:02 +00:00
|
|
|
interface LocationHttpHandlersDeps {
|
|
|
|
|
sessionManager: UserSessionManager
|
|
|
|
|
authSessionMiddleware: AuthSessionMiddleware
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-22 20:59:19 +00:00
|
|
|
export function registerLocationHttpHandlers(
|
|
|
|
|
app: Hono,
|
2026-03-16 01:30:02 +00:00
|
|
|
{ sessionManager, authSessionMiddleware }: LocationHttpHandlersDeps,
|
2026-02-22 20:59:19 +00:00
|
|
|
) {
|
|
|
|
|
const inject = createMiddleware<Env>(async (c, next) => {
|
|
|
|
|
c.set("sessionManager", sessionManager)
|
|
|
|
|
await next()
|
|
|
|
|
})
|
|
|
|
|
|
2026-03-16 01:30:02 +00:00
|
|
|
app.post("/api/location", inject, authSessionMiddleware, handleUpdateLocation)
|
2026-02-22 20:59:19 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async function handleUpdateLocation(c: Context<Env>) {
|
2026-02-22 21:03:58 +00:00
|
|
|
let body: unknown
|
|
|
|
|
try {
|
|
|
|
|
body = await c.req.json()
|
|
|
|
|
} catch {
|
|
|
|
|
return c.json({ error: "Invalid JSON" }, 400)
|
|
|
|
|
}
|
|
|
|
|
|
2026-02-22 20:59:19 +00:00
|
|
|
const result = locationInput(body)
|
|
|
|
|
|
|
|
|
|
if (result instanceof type.errors) {
|
|
|
|
|
return c.json({ error: result.summary }, 400)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const user = c.get("user")!
|
|
|
|
|
const sessionManager = c.get("sessionManager")
|
2026-03-15 22:57:19 +00:00
|
|
|
|
|
|
|
|
let session
|
|
|
|
|
try {
|
|
|
|
|
session = await sessionManager.getOrCreate(user.id)
|
|
|
|
|
} catch (err) {
|
|
|
|
|
console.error("[handleUpdateLocation] Failed to create session:", err)
|
|
|
|
|
return c.json({ error: "Service unavailable" }, 503)
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-10 19:19:23 +00:00
|
|
|
await session.engine.executeAction("aelis.location", "update-location", {
|
2026-02-22 20:59:19 +00:00
|
|
|
lat: result.lat,
|
|
|
|
|
lng: result.lng,
|
|
|
|
|
accuracy: result.accuracy,
|
|
|
|
|
timestamp: new Date(result.timestamp),
|
|
|
|
|
})
|
|
|
|
|
|
2026-02-22 21:02:44 +00:00
|
|
|
return c.body(null, 204)
|
2026-02-22 20:59:19 +00:00
|
|
|
}
|