// @ts-check import { renderError } from "../src/common/render.js"; import { isLocaleAvailable } from "../src/translations.js"; import { renderGistCard } from "../src/cards/gist.js"; import { fetchGist } from "../src/fetchers/gist.js"; import { CACHE_TTL, resolveCacheSeconds, setCacheHeaders, setErrorCacheHeaders, } from "../src/common/cache.js"; import { guardAccess } from "../src/common/access.js"; import { MissingParamError, retrieveSecondaryMessage, } from "../src/common/error.js"; import { parseBoolean } from "../src/common/ops.js"; // @ts-ignore export default async (req, res) => { const { id, title_color, icon_color, text_color, bg_color, theme, cache_seconds, locale, border_radius, border_color, show_owner, hide_border, } = req.query; res.setHeader("Content-Type", "image/svg+xml"); const access = guardAccess({ res, id, type: "gist", colors: { title_color, text_color, bg_color, border_color, theme, }, }); if (!access.isPassed) { return access.result; } if (locale && !isLocaleAvailable(locale)) { return res.send( renderError({ message: "Something went wrong", secondaryMessage: "Language not found", renderOptions: { title_color, text_color, bg_color, border_color, theme, }, }), ); } try { const gistData = await fetchGist(id); const cacheSeconds = resolveCacheSeconds({ requested: parseInt(cache_seconds, 10), def: CACHE_TTL.GIST_CARD.DEFAULT, min: CACHE_TTL.GIST_CARD.MIN, max: CACHE_TTL.GIST_CARD.MAX, }); setCacheHeaders(res, cacheSeconds); return res.send( renderGistCard(gistData, { title_color, icon_color, text_color, bg_color, theme, border_radius, border_color, locale: locale ? locale.toLowerCase() : null, show_owner: parseBoolean(show_owner), hide_border: parseBoolean(hide_border), }), ); } catch (err) { setErrorCacheHeaders(res); if (err instanceof Error) { return res.send( renderError({ message: err.message, secondaryMessage: retrieveSecondaryMessage(err), renderOptions: { title_color, text_color, bg_color, border_color, theme, show_repo_link: !(err instanceof MissingParamError), }, }), ); } return res.send( renderError({ message: "An unknown error occurred", renderOptions: { title_color, text_color, bg_color, border_color, theme, }, }), ); } };