TickPick Code Review
import { Context, Hono } from "hono";
type DMA = {
city: string; // e.g. "New York"
dma_code: number; // e.g. 501
latitude: number; // e.g. 40.714269100000003
longitude: number; // e.g. -74.005972900000003
region: string; // e.g. "NY"
slug: string; // e.g. "new-york-ny"
};
const dma = new Hono();
dma.get("*", MapLatLongToDma, async (ctx: Context): Promise<Response> => {
const { req, env } = ctx;
const reqUrl = new URL(req.url);
const dma: DMA | undefined = ctx.get("dma");
if (dma) {
reqUrl.searchParams.set("lat", dma.latitude.toString());
reqUrl.searchParams.set("long", dma.longitude.toString());
reqUrl.searchParams.set("dmaSlug", dma.slug);
}
reqUrl.pathname = reqUrl.pathname
.replace("/workers/dma", "")
.replace("1.0", "");
const path = `${env.API_BASEURL}/${
reqUrl.pathname
}?${reqUrl.searchParams.toString()}`;
const originReq = new Request(path, req);
const originRes = await fetch(originReq);
const originResBody = await originRes.text();
return new Response(originResBody, originRes);
});
async function MapLatLongToDma(
c: Context,
next: () => Promise<any>
): Promise<Response> {
const { lat, long } = c.req.query();
const latFloat = parseFloat(lat);
const longFloat = parseFloat(long);
let dmaMatch: DMA | null = null;
let shortestDistance = Number.MAX_SAFE_INTEGER;
for (const dma of major_cities) {
const currDistance = Math.pow(
Math.pow(dma.latitude - coords.lat, 2) +
Math.pow(dma.longitude - coords.long, 2),
0.5
);
if (currDistance < shortestDistance) {
shortestDistance = currDistance;
dmaMatch = dma;
}
}
if (dmaMatch) {
c.set("dma", dma);
}
return await next();
}
export default dma;