diff --git a/backend/api-renamed/index.js b/backend/api-renamed/index.js index 7bcdc8eb..468acf57 100644 --- a/backend/api-renamed/index.js +++ b/backend/api-renamed/index.js @@ -1,22 +1,24 @@ // @ts-check import { renderStatsCard } from "../src/cards/stats.js"; -import { blacklist } from "../src/common/blacklist.js"; +import { guardAccess } from "../src/common/access.js"; import { + CACHE_TTL, resolveCacheSeconds, setCacheHeaders, setErrorCacheHeaders, } from "../src/common/cache.js"; -import { whitelist } from "../src/common/envs.js"; -import { parseArray, parseBoolean } from "../src/common/ops.js"; import { - CONSTANTS, - renderError, -} from "../src/common/utils.js"; + MissingParamError, + retrieveSecondaryMessage, +} from "../src/common/error.js"; +import { parseArray, parseBoolean } from "../src/common/ops.js"; +import { renderError } from "../src/common/render.js"; import { fetchStats } from "../src/fetchers/stats.js"; import { isLocaleAvailable } from "../src/translations.js"; import { storeRequest } from "../src/common/database.js"; +// @ts-ignore export default async (req, res) => { const { username, @@ -45,56 +47,42 @@ export default async (req, res) => { disable_animations, border_radius, number_format, - number_precision, role, + number_precision, border_color, rank_icon, show, } = req.query; res.setHeader("Content-Type", "image/svg+xml"); - if (whitelist && !whitelist.includes(username)) { - return res.send( - renderError( - "This username is not whitelisted", - "Please deploy your own instance", - { - title_color, - text_color, - bg_color, - border_color, - theme, - show_repo_link: false, - }, - ), - ); - } - - if (whitelist === undefined && blacklist.includes(username)) { - return res.send( - renderError( - "This username is blacklisted", - "Please deploy your own instance", - { - title_color, - text_color, - bg_color, - border_color, - theme, - show_repo_link: false, - }, - ), - ); + 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("Something went wrong", "Language not found", { - title_color, - text_color, - bg_color, - border_color, - theme, + renderError({ + message: "Something went wrong", + secondaryMessage: "Language not found", + renderOptions: { + title_color, + text_color, + bg_color, + border_color, + theme, + }, }), ); } @@ -134,7 +122,7 @@ export default async (req, res) => { parseBoolean(include_all_commits), parseArray(exclude_repo), showStats.includes("prs_merged") || - showStats.includes("prs_merged_percentage"), + showStats.includes("prs_merged_percentage"), showStats.includes("discussions_started"), showStats.includes("discussions_answered"), parseInt(commits_year, 10), @@ -149,17 +137,15 @@ export default async (req, res) => { ); const cacheSeconds = resolveCacheSeconds({ requested: parseInt(cache_seconds, 10), - def: CONSTANTS.CARD_CACHE_SECONDS, - min: CONSTANTS.FOUR_HOURS, - max: CONSTANTS.TWO_DAY, + def: CACHE_TTL.STATS_CARD.DEFAULT, + min: CACHE_TTL.STATS_CARD.MIN, + max: CACHE_TTL.STATS_CARD.MAX, }); setCacheHeaders(res, cacheSeconds); return res.send( - renderStatsCard( - stats, - { + renderStatsCard(stats, { hide: parseArray(hide), show_icons: parseBoolean(show_icons), hide_title: parseBoolean(hide_title), @@ -193,13 +179,32 @@ export default async (req, res) => { ); } 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(err.message, err.secondaryMessage, { - title_color, - text_color, - bg_color, - border_color, - theme, + renderError({ + message: "An unknown error occurred", + renderOptions: { + title_color, + text_color, + bg_color, + border_color, + theme, + }, }), ); }