/* Copyright (C) 2019 Cloudbase Solutions SRL This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ import express from "express"; import path from "path"; import fs from "fs"; const getModJsonProviders = (jsonPath: string) => { const jsonContent: any = fs.readFileSync(jsonPath); const json = JSON.parse(jsonContent); if (!json.providers) { throw new Error(); } return json.providers; }; const getOptimalLogoHeightKey = ( availableHeightKeys: string[], requestedHeight: number, style?: string | null, ): string => { let heightKeys = availableHeightKeys; if (style) { const styledKeys = heightKeys.filter(k => style ? k.indexOf(style) > -1 : false, ); if (styledKeys.length) { heightKeys = styledKeys; } } const optimal = heightKeys.reduce((prev, curr) => { let prevHeight: any = /d+/.exec(prev); let currHeight: any = /d+/.exec(curr); prevHeight = prevHeight ? Number(prevHeight[0]) : 0; currHeight = currHeight ? Number(currHeight[0]) : 0; return Math.abs(currHeight - requestedHeight) < Math.abs(prevHeight - requestedHeight) ? curr : prev; }); return optimal; }; export default (router: express.Router) => { router.get("/logos/:provider/:size{/:style}", (req, res) => { const SIZES = [32, 42, 64, 128]; const STYLES = ["white", "disabled"]; const { provider, style } = req.params; const size = Number(req.params.size); if (SIZES.indexOf(size) === -1) { res .status(400) .json({ error: { message: `Valid sizes are: ${SIZES.join(", ")}` } }); return; } if (style && STYLES.indexOf(style) === -1) { res .status(400) .json({ error: { message: `Valid styles are: ${STYLES.join(", ")}` } }); return; } const logoBase = path.join(__dirname, "/resources/providerLogos"); let logoPath = `${logoBase}/${provider}-${size}`; logoPath = style ? `${logoPath}-${style}.svg` : `${logoPath}.svg`; const modJsonPath: string | null | undefined = process.env.MOD_JSON; if (!modJsonPath) { res.sendFile(logoPath); return; } try { const providersJson = getModJsonProviders(modJsonPath); const providerJson = providersJson[provider]; if (!providerJson) { res.sendFile(logoPath); return; } const providerLogosJson = providerJson.logos; if (!providerLogosJson) { console.log( `No logos specified in MOD_JSON file for '${provider}' provider`, ); res.sendFile(logoPath); return; } const providerLogosKeys = Object.keys(providerLogosJson); if (!providerLogosKeys.length) { console.log( `No logo heights specified in MOD_JSON file for '${provider}' provider`, ); res.sendFile(logoPath); return; } const optimalHeightKey = getOptimalLogoHeightKey( providerLogosKeys, size, style, ); const modLogoPath = providerLogosJson[optimalHeightKey].path; if (!modLogoPath) { console.log( `No logo path specified in MOD_JSON file for '${provider}' provider`, ); res.sendFile(logoPath); return; } res.sendFile(modLogoPath); } catch (err) { console.error(err); res.status(400).json({ error: { message: "Invalid Mod JSON file" } }); } }); };