|
1 | 1 | import type Express from "express"; |
2 | 2 | import { Router } from "express"; |
| 3 | +import { getQiitaApiInstance } from "../../lib/get-qiita-api-instance"; |
3 | 4 |
|
4 | 5 | const redirectToArticleCss = async ( |
5 | 6 | req: Express.Request, |
6 | 7 | res: Express.Response, |
7 | 8 | ) => { |
8 | | - const url = |
9 | | - process.env.QIITA_ASSETS_ARTICLE_CSS || |
10 | | - (await resolveAssetsUrl("public/article.css")); |
| 9 | + const url = await resolveAssetsUrl("article_css_url"); |
11 | 10 | res.redirect(url); |
12 | 11 | }; |
13 | 12 |
|
14 | 13 | const redirectToEmbedInitJs = async ( |
15 | 14 | req: Express.Request, |
16 | 15 | res: Express.Response, |
17 | 16 | ) => { |
18 | | - const url = |
19 | | - process.env.QIITA_ASSETS_EMBED_INIT_JS || |
20 | | - (await resolveAssetsUrl("public/v3-embed-init.js")); |
| 17 | + const url = await resolveAssetsUrl("v3_embed_init_js_url"); |
21 | 18 | res.redirect(url); |
22 | 19 | }; |
23 | 20 |
|
24 | 21 | const redirectToFavicon = async ( |
25 | 22 | req: Express.Request, |
26 | 23 | res: Express.Response, |
27 | 24 | ) => { |
28 | | - const url = |
29 | | - process.env.QIITA_ASSETS_FAVICON || |
30 | | - (await resolveAssetsUrl("favicons/public/production.ico")); |
| 25 | + const url = await resolveAssetsUrl("favicon_url"); |
31 | 26 | res.redirect(url); |
32 | 27 | }; |
33 | 28 |
|
34 | | -const resolveAssetsUrl = async (key: string) => { |
35 | | - const latest_manifest_url = |
36 | | - "https://qiita.com/assets/.latest_client_manifest_name_production"; |
| 29 | +const resolveAssetsUrl = (() => { |
| 30 | + let cachedAssetUrls: { [key: string]: string } | null = null; |
37 | 31 |
|
38 | | - const cdnAssetsUrl = "https://cdn.qiita.com/assets"; |
| 32 | + return async (key: string) => { |
| 33 | + if (cachedAssetUrls === null) { |
| 34 | + const qiitaApi = await getQiitaApiInstance(); |
| 35 | + const assetUrls = await qiitaApi.getAssetUrls(); |
39 | 36 |
|
40 | | - const clientManifestFileName = await ( |
41 | | - await fetch(latest_manifest_url) |
42 | | - ).text(); |
43 | | - const json = await ( |
44 | | - await fetch(`${cdnAssetsUrl}/${clientManifestFileName}`) |
45 | | - ).json(); |
| 37 | + cachedAssetUrls = assetUrls; |
| 38 | + } |
46 | 39 |
|
47 | | - const filename = json[key]; |
48 | | - if (filename === undefined) { |
49 | | - throw new Error(`Asset not found: ${key}`); |
50 | | - } |
| 40 | + const url = cachedAssetUrls[key]; |
| 41 | + if (!url) { |
| 42 | + throw new Error(`Asset not found: ${key}`); |
| 43 | + } |
51 | 44 |
|
52 | | - return `${cdnAssetsUrl}/${filename}`; |
53 | | -}; |
| 45 | + return url; |
| 46 | + }; |
| 47 | +})(); |
54 | 48 |
|
55 | 49 | export const AssetsRouter = Router() |
56 | 50 | .get("/article.css", redirectToArticleCss) |
|
0 commit comments