|
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