// @ts-check import { renderRepoCard } from "../src/cards/repo.js"; import { guardAccess } from "../src/common/access.js"; import { CACHE_TTL, resolveCacheSeconds, setCacheHeaders, setErrorCacheHeaders, } from "../src/common/cache.js"; import { MissingParamError, retrieveSecondaryMessage, } from "../src/common/error.js"; import { parseBoolean } from "../src/common/ops.js"; import { renderError } from "../src/common/render.js"; import { fetchRepo } from "../src/fetchers/repo.js"; import { isLocaleAvailable } from "../src/translations.js"; // @ts-ignore export default async (req, res) => { const { username, repo, hide_border, title_color, icon_color, text_color, bg_color, theme, show_owner, cache_seconds, locale, border_radius, border_color, description_lines_count, } = req.query; res.setHeader("Content-Type", "image/svg+xml"); const access = guardAccess({ res, id: username, type: "username", 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 repoData = await fetchRepo(username, repo); const cacheSeconds = resolveCacheSeconds({ requested: parseInt(cache_seconds, 10), def: CACHE_TTL.PIN_CARD.DEFAULT, min: CACHE_TTL.PIN_CARD.MIN, max: CACHE_TTL.PIN_CARD.MAX, }); setCacheHeaders(res, cacheSeconds); return res.send( renderRepoCard(repoData, { hide_border: parseBoolean(hide_border), title_color, icon_color, text_color, bg_color, theme, border_radius, border_color, show_owner: parseBoolean(show_owner), locale: locale ? locale.toLowerCase() : null, description_lines_count, }), ); } 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, }, }), ); } };