import { publicProcedure, router } from "@/server/trpc" import { getCacheClient } from "@/services/dataCache" import { jobylonFeedSchema } from "./output" import { getJobylonFeedCounter, getJobylonFeedFailCounter, getJobylonFeedSuccessCounter, } from "./telemetry" export const TWENTYFOUR_HOURS = 60 * 60 * 24 // The URL for the Jobylon feed including the hash for the specific feed. // The URL and hash are generated by Jobylon. Documentation: https://developer.jobylon.com/feed-api const feedUrl = "https://feed.jobylon.com/feeds/cc04ba19-f0bd-4412-8b9b-d1d1fcbf0800" export const jobylonQueryRouter = router({ feed: router({ get: publicProcedure.query(async function () { const url = new URL(feedUrl) url.search = new URLSearchParams({ format: "json", }).toString() const urlString = url.toString() getJobylonFeedCounter.add(1, { url: urlString }) console.info( "jobylon.feed start", JSON.stringify({ query: { url: urlString } }) ) const cacheClient = await getCacheClient() return await cacheClient.cacheOrGet( "jobylon:feed", async () => { const response = await fetch(url, { cache: "no-cache", }) if (!response.ok) { const text = await response.text() const error = { status: response.status, statusText: response.statusText, text, } getJobylonFeedFailCounter.add(1, { url: urlString, error_type: "http_error", error: JSON.stringify(error), }) console.error( "jobylon.feed error", JSON.stringify({ query: { url: urlString }, error, }) ) throw new Error( `Failed to fetch Jobylon feed: ${JSON.stringify(error)}` ) } const responseJson = await response.json() const validatedResponse = jobylonFeedSchema.safeParse(responseJson) if (!validatedResponse.success) { getJobylonFeedFailCounter.add(1, { urlString, error_type: "validation_error", error: JSON.stringify(validatedResponse.error), }) const errorData = JSON.stringify({ query: { url: urlString }, error: validatedResponse.error, }) console.error("jobylon.feed error", errorData) throw new Error( `Failed to parse Jobylon feed: ${JSON.stringify(errorData)}` ) } getJobylonFeedSuccessCounter.add(1, { url: urlString, }) console.info( "jobylon.feed success", JSON.stringify({ query: { url: urlString }, }) ) return validatedResponse.data }, "1d" ) }), }), })