diff --git a/package.json b/package.json index a02ba03..2aa8949 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "v3.accords-library.com", - "version": "3.0.0-beta.3", + "version": "3.0.0-beta.4", "scripts": { "dev": "astro dev", "start": "astro dev", diff --git a/src/middleware.ts b/src/middleware.ts index e5bbab9..4ef242b 100644 --- a/src/middleware.ts +++ b/src/middleware.ts @@ -151,6 +151,15 @@ const addContentLanguageResponseHeader = defineMiddleware(async ({ url }, next) return response; }); +const addCacheControlHeaders = defineMiddleware(async (_, next) => { + const response = await next(); + if (response.ok) { + response.headers.set("Cache-Control", "max-age=60, stale-while-revalidate=60"); + response.headers.set("Vary", "Cookie") + } + return response; +}); + const provideLocalsToRequest = defineMiddleware(async ({ url, locals, cookies }, next) => { locals.currentLocale = getCurrentLocale(url.pathname) ?? "en"; locals.currentCurrency = getCookieCurrency(cookies) ?? "USD"; @@ -170,6 +179,7 @@ export const onRequest = sequence( handleActionsSearchParams, refreshCookiesMaxAge, localeNegotiator, + addCacheControlHeaders, provideLocalsToRequest, analytics ); diff --git a/src/pages/[locale]/api/pages/partial.astro b/src/pages/[locale]/api/pages/partial.astro index 6d6c520..40cf426 100644 --- a/src/pages/[locale]/api/pages/partial.astro +++ b/src/pages/[locale]/api/pages/partial.astro @@ -25,7 +25,7 @@ const reqUrl = new URL(Astro.request.url); const lang = Astro.props.lang ?? reqUrl.searchParams.get("lang")!; const slug = Astro.props.slug ?? reqUrl.searchParams.get("slug")!; const { translations, thumbnail, createdAt, updatedAt, updatedBy, attributes } = - Astro.props.page ?? (await payload.getPage(slug)); + Astro.props.page ?? (await payload.getPage(slug)).data; const { getLocalizedUrl, t, formatDate } = await getI18n(Astro.locals.currentLocale); const { getLocalizedMatch } = await getI18n(lang); diff --git a/src/pages/[locale]/audios/[id].astro b/src/pages/[locale]/audios/[id].astro index 7316175..f86dcda 100644 --- a/src/pages/[locale]/audios/[id].astro +++ b/src/pages/[locale]/audios/[id].astro @@ -12,7 +12,7 @@ import { formatInlineTitle, formatRichTextToString } from "src/utils/format"; import { fetchOr404 } from "src/utils/responses"; const id = Astro.params.id!; -const audio = await fetchOr404(() => payload.getAudioByID(id)); +const audio = await fetchOr404(Astro, () => payload.getAudioByID(id)); if (audio instanceof Response) { return audio; } diff --git a/src/pages/[locale]/collectibles/[slug]/gallery/[index].astro b/src/pages/[locale]/collectibles/[slug]/gallery/[index].astro index beb72ea..69660a0 100644 --- a/src/pages/[locale]/collectibles/[slug]/gallery/[index].astro +++ b/src/pages/[locale]/collectibles/[slug]/gallery/[index].astro @@ -12,7 +12,7 @@ const { getLocalizedUrl, getLocalizedMatch, t, formatDate } = await getI18n( Astro.locals.currentLocale ); -const galleryImage = await fetchOr404(() => payload.getCollectibleGalleryImage(slug, index)); +const galleryImage = await fetchOr404(Astro, () => payload.getCollectibleGalleryImage(slug, index)); if (galleryImage instanceof Response) { return galleryImage; } diff --git a/src/pages/[locale]/collectibles/[slug]/gallery/index.astro b/src/pages/[locale]/collectibles/[slug]/gallery/index.astro index f85e08b..46be388 100644 --- a/src/pages/[locale]/collectibles/[slug]/gallery/index.astro +++ b/src/pages/[locale]/collectibles/[slug]/gallery/index.astro @@ -11,7 +11,7 @@ import RichText from "components/RichText/RichText.astro"; const slug = Astro.params.slug!; const { getLocalizedMatch, getLocalizedUrl, t } = await getI18n(Astro.locals.currentLocale); -const gallery = await fetchOr404(() => payload.getCollectibleGallery(slug)); +const gallery = await fetchOr404(Astro, () => payload.getCollectibleGallery(slug)); if (gallery instanceof Response) { return gallery; } diff --git a/src/pages/[locale]/collectibles/[slug]/index.astro b/src/pages/[locale]/collectibles/[slug]/index.astro index e439f62..5cb814a 100644 --- a/src/pages/[locale]/collectibles/[slug]/index.astro +++ b/src/pages/[locale]/collectibles/[slug]/index.astro @@ -25,7 +25,7 @@ const { getLocalizedMatch, getLocalizedUrl, t, formatDate, formatPrice } = await Astro.locals.currentLocale ); -const collectible = await fetchOr404(() => payload.getCollectible(slug)); +const collectible = await fetchOr404(Astro, () => payload.getCollectible(slug)); if (collectible instanceof Response) { return collectible; } diff --git a/src/pages/[locale]/collectibles/[slug]/scans/[index].astro b/src/pages/[locale]/collectibles/[slug]/scans/[index].astro index 4125158..14cddf8 100644 --- a/src/pages/[locale]/collectibles/[slug]/scans/[index].astro +++ b/src/pages/[locale]/collectibles/[slug]/scans/[index].astro @@ -12,7 +12,7 @@ const { formatScanIndexShort, getLocalizedMatch, getLocalizedUrl } = await getI1 Astro.locals.currentLocale ); -const scanPage = await fetchOr404(() => payload.getCollectibleScanPage(slug, index)); +const scanPage = await fetchOr404(Astro, () => payload.getCollectibleScanPage(slug, index)); if (scanPage instanceof Response) { return scanPage; } diff --git a/src/pages/[locale]/collectibles/[slug]/scans/index.astro b/src/pages/[locale]/collectibles/[slug]/scans/index.astro index 0d7a9f6..2938e81 100644 --- a/src/pages/[locale]/collectibles/[slug]/scans/index.astro +++ b/src/pages/[locale]/collectibles/[slug]/scans/index.astro @@ -12,7 +12,7 @@ import RichText from "components/RichText/RichText.astro"; const slug = Astro.params.slug!; const { getLocalizedMatch, t } = await getI18n(Astro.locals.currentLocale); -const scans = await fetchOr404(() => payload.getCollectibleScans(slug)); +const scans = await fetchOr404(Astro, () => payload.getCollectibleScans(slug)); if (scans instanceof Response) { return scans; } diff --git a/src/pages/[locale]/folders/[slug].astro b/src/pages/[locale]/folders/[slug].astro index b5dc059..1304193 100644 --- a/src/pages/[locale]/folders/[slug].astro +++ b/src/pages/[locale]/folders/[slug].astro @@ -17,7 +17,7 @@ import RichText from "components/RichText/RichText.astro"; const slug = Astro.params.slug!; -const folder = await fetchOr404(() => payload.getFolder(slug)); +const folder = await fetchOr404(Astro, () => payload.getFolder(slug)); if (folder instanceof Response) { return folder; } diff --git a/src/pages/[locale]/images/[id].astro b/src/pages/[locale]/images/[id].astro index 5e85450..b9b0ee5 100644 --- a/src/pages/[locale]/images/[id].astro +++ b/src/pages/[locale]/images/[id].astro @@ -7,7 +7,7 @@ import { formatInlineTitle, formatRichTextToString } from "src/utils/format"; import { fetchOr404 } from "src/utils/responses"; const id = Astro.params.id!; -const image = await fetchOr404(() => payload.getImageByID(id)); +const image = await fetchOr404(Astro, () => payload.getImageByID(id)); if (image instanceof Response) { return image; } diff --git a/src/pages/[locale]/pages/[slug].astro b/src/pages/[locale]/pages/[slug].astro index 6266f5a..02eae77 100644 --- a/src/pages/[locale]/pages/[slug].astro +++ b/src/pages/[locale]/pages/[slug].astro @@ -8,7 +8,7 @@ import { fetchOr404 } from "src/utils/responses"; const slug = Astro.params.slug!; -const page = await fetchOr404(() => payload.getPage(slug)); +const page = await fetchOr404(Astro, () => payload.getPage(slug)); if (page instanceof Response) { return page; } diff --git a/src/pages/[locale]/recorders/[id].astro b/src/pages/[locale]/recorders/[id].astro index b9b5a24..c490df2 100644 --- a/src/pages/[locale]/recorders/[id].astro +++ b/src/pages/[locale]/recorders/[id].astro @@ -12,7 +12,7 @@ import { fetchOr404 } from "src/utils/responses"; import { sizesToSrcset } from "src/utils/img"; const id = Astro.params.id!; -const recorder = await fetchOr404(() => payload.getRecorderByID(id)); +const recorder = await fetchOr404(Astro, () => payload.getRecorderByID(id)); if (recorder instanceof Response) { return recorder; } diff --git a/src/pages/[locale]/timeline/index.astro b/src/pages/[locale]/timeline/index.astro index 83c2b74..db833a2 100644 --- a/src/pages/[locale]/timeline/index.astro +++ b/src/pages/[locale]/timeline/index.astro @@ -8,8 +8,13 @@ import Card from "components/Card.astro"; import { getI18n } from "src/i18n/i18n"; import { cache } from "src/utils/payload"; import type { WordingKey } from "src/i18n/wordings-keys"; +import { fetchOr404 } from "src/utils/responses"; + +const events = await fetchOr404(Astro, payload.getChronologyEvents); +if (events instanceof Response) { + return events; +} -const events = await payload.getChronologyEvents(); const groupedEvents = groupBy(events, (event) => event.date.year); const { getLocalizedUrl, t, formatTimelineDate } = await getI18n(Astro.locals.currentLocale); --- diff --git a/src/pages/[locale]/videos/[id].astro b/src/pages/[locale]/videos/[id].astro index 2c52a62..5936e80 100644 --- a/src/pages/[locale]/videos/[id].astro +++ b/src/pages/[locale]/videos/[id].astro @@ -12,7 +12,7 @@ import { formatInlineTitle, formatRichTextToString } from "src/utils/format"; import { fetchOr404 } from "src/utils/responses"; const id = Astro.params.id!; -const video = await fetchOr404(() => payload.getVideoByID(id)); +const video = await fetchOr404(Astro, () => payload.getVideoByID(id)); if (video instanceof Response) { return video; } diff --git a/src/shared/openExchange/rates.json b/src/shared/openExchange/rates.json index 4c18be1..c20cf4f 100644 --- a/src/shared/openExchange/rates.json +++ b/src/shared/openExchange/rates.json @@ -1,177 +1,177 @@ { "disclaimer": "Usage subject to terms: https://openexchangerates.org/terms", "license": "https://openexchangerates.org/license", - "timestamp": 1717740000, + "timestamp": 1718308800, "base": "USD", "rates": { - "AED": 3.673, - "AFN": 70.453638, - "ALL": 91.912021, - "AMD": 387.678915, - "ANG": 1.79986, - "AOA": 854.407667, - "ARS": 898.5413, - "AUD": 1.498617, - "AWG": 1.8, + "AED": 3.67305, + "AFN": 70.500002, + "ALL": 92.875, + "AMD": 388.38664, + "ANG": 1.806289, + "AOA": 855, + "ARS": 902.25, + "AUD": 1.506865, + "AWG": 1.8025, "AZN": 1.7, - "BAM": 1.795869, + "BAM": 1.815928, "BBD": 2, - "BDT": 117.294372, - "BGN": 1.79491, - "BHD": 0.376872, - "BIF": 2869.308172, + "BDT": 117.778138, + "BGN": 1.821445, + "BHD": 0.376882, + "BIF": 2879, "BMD": 1, - "BND": 1.345362, - "BOB": 6.901365, - "BRL": 5.258701, + "BND": 1.352522, + "BOB": 6.925559, + "BRL": 5.3671, "BSD": 1, - "BTC": 0.000014026029, - "BTN": 83.367902, - "BWP": 13.755584, - "BYN": 3.268278, - "BZD": 2.013085, - "CAD": 1.366955, - "CDF": 2822.733026, - "CHF": 0.89004, - "CLF": 0.032927, - "CLP": 908.55, - "CNH": 7.255147, - "CNY": 7.2447, - "COP": 3927.880338, - "CRC": 527.874933, + "BTC": 0.000015006774, + "BTN": 83.726029, + "BWP": 13.635836, + "BYN": 3.279777, + "BZD": 2.020138, + "CAD": 1.373867, + "CDF": 2845, + "CHF": 0.893783, + "CLF": 0.033281, + "CLP": 918.33, + "CNH": 7.270265, + "CNY": 7.2526, + "COP": 4064.333563, + "CRC": 528.390438, "CUC": 1, "CUP": 25.75, - "CVE": 101.249236, - "CZK": 22.552099, - "DJF": 177.811501, - "DKK": 6.849959, - "DOP": 59.242392, - "DZD": 134.471532, - "EGP": 47.5129, + "CVE": 103.1, + "CZK": 23.0107, + "DJF": 177, + "DKK": 6.9455, + "DOP": 59.4, + "DZD": 134.851507, + "EGP": 47.708, "ERN": 15, - "ETB": 57.42215, - "EUR": 0.918217, - "FJD": 2.25895, - "FKP": 0.782189, - "GBP": 0.782189, - "GEL": 2.785, - "GGP": 0.782189, - "GHS": 14.880927, - "GIP": 0.782189, + "ETB": 57.5, + "EUR": 0.931055, + "FJD": 2.2337, + "FKP": 0.783387, + "GBP": 0.783387, + "GEL": 2.86, + "GGP": 0.783387, + "GHS": 15.04, + "GIP": 0.783387, "GMD": 67.775, - "GNF": 8600.013522, - "GTQ": 7.76001, - "GYD": 209.061081, - "HKD": 7.809645, - "HNL": 24.673005, - "HRK": 6.918151, - "HTG": 132.552876, - "HUF": 358.085123, - "IDR": 16216.760923, - "ILS": 3.720825, - "IMP": 0.782189, - "INR": 83.458757, - "IQD": 1308.290714, + "GNF": 8605, + "GTQ": 7.785371, + "GYD": 209.587622, + "HKD": 7.81073, + "HNL": 24.799999, + "HRK": 7.01418, + "HTG": 133.038665, + "HUF": 369.590851, + "IDR": 16286.77334, + "ILS": 3.715655, + "IMP": 0.783387, + "INR": 83.540593, + "IQD": 1310, "IRR": 42100, - "ISK": 137.46, - "JEP": 0.782189, - "JMD": 155.295453, - "JOD": 0.7088, - "JPY": 155.5174, - "KES": 130, - "KGS": 87.3013, - "KHR": 4101.618815, - "KMF": 452.450119, + "ISK": 139.01, + "JEP": 0.783387, + "JMD": 156.002299, + "JOD": 0.7089, + "JPY": 157.063125, + "KES": 128.5, + "KGS": 87.1182, + "KHR": 4119, + "KMF": 455.500241, "KPW": 900, - "KRW": 1367.937913, - "KWD": 0.306384, - "KYD": 0.832281, - "KZT": 446.221602, - "LAK": 21498.895118, - "LBP": 89418.618549, - "LKR": 302.314319, - "LRD": 193.950039, - "LSL": 18.953322, - "LYD": 4.829787, - "MAD": 9.877784, - "MDL": 17.619678, - "MGA": 4467.052458, - "MKD": 56.57657, - "MMK": 2101.212378, + "KRW": 1376.539507, + "KWD": 0.306419, + "KYD": 0.835233, + "KZT": 451.97877, + "LAK": 21780, + "LBP": 89550, + "LKR": 304.586904, + "LRD": 193.999927, + "LSL": 18.4, + "LYD": 4.85, + "MAD": 9.9465, + "MDL": 17.699209, + "MGA": 4470, + "MKD": 57.263542, + "MMK": 2201.379322, "MNT": 3450, - "MOP": 8.033479, - "MRU": 39.126423, - "MUR": 46.32, - "MVR": 15.4, - "MWK": 1731.539932, - "MXN": 17.987572, - "MYR": 4.6955, - "MZN": 63.92499, - "NAD": 18.953497, - "NGN": 1485.31, - "NIO": 36.764809, - "NOK": 10.558218, - "NPR": 133.383523, - "NZD": 1.613954, - "OMR": 0.384963, + "MOP": 8.063005, + "MRU": 39.45, + "MUR": 46.637189, + "MVR": 15.41, + "MWK": 1733.5, + "MXN": 18.468878, + "MYR": 4.71875, + "MZN": 63.850001, + "NAD": 18.4, + "NGN": 1505, + "NIO": 36.8, + "NOK": 10.64482, + "NPR": 133.959461, + "NZD": 1.62071, + "OMR": 0.384946, "PAB": 1, - "PEN": 3.738103, - "PGK": 3.887667, - "PHP": 58.519502, - "PKR": 278.529362, - "PLN": 3.932408, - "PYG": 7514.698541, - "QAR": 3.642917, - "RON": 4.569, - "RSD": 107.495, - "RUB": 89.173363, - "RWF": 1298.427641, - "SAR": 3.750551, - "SBD": 8.482503, - "SCR": 13.845723, + "PEN": 3.771, + "PGK": 3.904201, + "PHP": 58.6695, + "PKR": 278.575, + "PLN": 4.046857, + "PYG": 7533.486837, + "QAR": 3.641, + "RON": 4.6339, + "RSD": 108.997, + "RUB": 88.381576, + "RWF": 1320, + "SAR": 3.751693, + "SBD": 8.457605, + "SCR": 13.855402, "SDG": 586, - "SEK": 10.38479, - "SGD": 1.34481, - "SHP": 0.782189, + "SEK": 10.472668, + "SGD": 1.3506, + "SHP": 0.783387, "SLL": 20969.5, - "SOS": 570.753969, - "SRD": 31.7645, + "SOS": 571, + "SRD": 31.627, "SSP": 130.26, "STD": 22281.8, - "STN": 22.496155, - "SVC": 8.738769, + "STN": 22.9, + "SVC": 8.769202, "SYP": 2512.53, - "SZL": 18.948934, - "THB": 36.351667, - "TJS": 10.696062, - "TMT": 3.51, - "TND": 3.10175, - "TOP": 2.352606, - "TRY": 32.310647, - "TTD": 6.757172, - "TWD": 32.282, - "TZS": 2615, - "UAH": 40.094667, - "UGX": 3788.628608, + "SZL": 18.4, + "THB": 36.78, + "TJS": 10.798706, + "TMT": 3.5, + "TND": 3.113, + "TOP": 2.354259, + "TRY": 32.291698, + "TTD": 6.811102, + "TWD": 32.359801, + "TZS": 2621.947791, + "UAH": 40.510836, + "UGX": 3738.089071, "USD": 1, - "UYU": 38.896466, - "UZS": 12659.755435, - "VES": 36.442787, - "VND": 25422.651993, + "UYU": 39.198992, + "UZS": 12635, + "VES": 36.383822, + "VND": 25442.5, "VUV": 118.722, "WST": 2.8, - "XAF": 602.310759, - "XAG": 0.03205488, - "XAU": 0.0004209, + "XAF": 610.732275, + "XAG": 0.03455545, + "XAU": 0.00043413, "XCD": 2.70255, - "XDR": 0.75467, - "XOF": 602.310759, - "XPD": 0.00108737, - "XPF": 109.572414, - "XPT": 0.00099467, - "YER": 250.425029, - "ZAR": 18.932716, - "ZMW": 26.240618, + "XDR": 0.760342, + "XOF": 610.732275, + "XPD": 0.00113637, + "XPF": 111.104457, + "XPT": 0.00105291, + "YER": 250.350066, + "ZAR": 18.430643, + "ZMW": 26.433191, "ZWL": 322 } } \ No newline at end of file diff --git a/src/shared/payload/payload-sdk.ts b/src/shared/payload/payload-sdk.ts index cb70b66..43a12de 100644 --- a/src/shared/payload/payload-sdk.ts +++ b/src/shared/payload/payload-sdk.ts @@ -1953,23 +1953,30 @@ type GetPayloadSDKParams = { apiURL: string; email: string; password: string; - tokenCache?: TokenCache; - responseCache?: ResponseCache; + tokenCache?: { + set: (token: string, expirationTimestamp: number) => void; + get: () => string | undefined; + }; + responseCache?: { + set: (url: string, response: any) => void; + get: (url: string) => any | undefined; + }; }; -type TokenCache = { - set: (token: string, expirationTimestamp: number) => void; - get: () => string | undefined; -}; - -type ResponseCache = { - set: (url: string, response: any) => void; - get: (url: string) => any | undefined; +export type PayloadResponse = { + data: T; + timestamp: Date; }; const logResponse = (res: Response) => console.log(res.status, res.statusText, res.url); -export const getPayloadSDK = ({ apiURL, email, password, tokenCache, responseCache }: GetPayloadSDKParams) => { +export const getPayloadSDK = ({ + apiURL, + email, + password, + tokenCache, + responseCache, +}: GetPayloadSDKParams) => { const refreshToken = async () => { const loginUrl = payloadApiUrl(Collections.Recorders, "login"); const loginResult = await fetch(loginUrl, { @@ -1994,8 +2001,8 @@ export const getPayloadSDK = ({ apiURL, email, password, tokenCache, responseCac const payloadApiUrl = (collection: Collections, endpoint?: string, isGlobal?: boolean): string => `${apiURL}/${isGlobal === undefined ? "" : "globals/"}${collection}${endpoint === undefined ? "" : `/${endpoint}`}`; - const request = async (url: string): Promise => { - const cachedResponse = responseCache?.get(url) + const request = async (url: string): Promise> => { + const cachedResponse = responseCache?.get(url); if (cachedResponse) { return cachedResponse; } @@ -2011,56 +2018,58 @@ export const getPayloadSDK = ({ apiURL, email, password, tokenCache, responseCac throw new Error("Unhandled fetch error"); } - const data = await result.json() - responseCache?.set(url, data); + const data = { data: await result.json(), timestamp: new Date() }; + responseCache?.set(url, data); return data; }; return { - getConfig: async (): Promise => + getConfig: async (): Promise> => await request(payloadApiUrl(Collections.WebsiteConfig, `config`, true)), - getFolder: async (slug: string): Promise => + getFolder: async (slug: string): Promise> => await request(payloadApiUrl(Collections.Folders, `slug/${slug}`)), - getLanguages: async (): Promise => + getLanguages: async (): Promise> => await request(payloadApiUrl(Collections.Languages, `all`)), - getCurrencies: async (): Promise => + getCurrencies: async (): Promise> => await request(payloadApiUrl(Collections.Currencies, `all`)), - getWordings: async (): Promise => + getWordings: async (): Promise> => await request(payloadApiUrl(Collections.Wordings, `all`)), - getPage: async (slug: string): Promise => + getPage: async (slug: string): Promise> => await request(payloadApiUrl(Collections.Pages, `slug/${slug}`)), - getCollectible: async (slug: string): Promise => + getCollectible: async (slug: string): Promise> => await request(payloadApiUrl(Collections.Collectibles, `slug/${slug}`)), - getCollectibleScans: async (slug: string): Promise => + getCollectibleScans: async ( + slug: string + ): Promise> => await request(payloadApiUrl(Collections.Collectibles, `slug/${slug}/scans`)), getCollectibleScanPage: async ( slug: string, index: string - ): Promise => - - await request(payloadApiUrl(Collections.Collectibles, `slug/${slug}/scans/${index}`)) - , - getCollectibleGallery: async (slug: string): Promise => + ): Promise> => + await request(payloadApiUrl(Collections.Collectibles, `slug/${slug}/scans/${index}`)), + getCollectibleGallery: async ( + slug: string + ): Promise> => await request(payloadApiUrl(Collections.Collectibles, `slug/${slug}/gallery`)), getCollectibleGalleryImage: async ( slug: string, index: string - ): Promise => - - await request(payloadApiUrl(Collections.Collectibles, `slug/${slug}/gallery/${index}`)) - , - getChronologyEvents: async (): Promise => + ): Promise> => + await request(payloadApiUrl(Collections.Collectibles, `slug/${slug}/gallery/${index}`)), + getChronologyEvents: async (): Promise> => await request(payloadApiUrl(Collections.ChronologyEvents, `all`)), - getChronologyEventByID: async (id: string): Promise => + getChronologyEventByID: async ( + id: string + ): Promise> => await request(payloadApiUrl(Collections.ChronologyEvents, `id/${id}`)), - getImageByID: async (id: string): Promise => + getImageByID: async (id: string): Promise> => await request(payloadApiUrl(Collections.Images, `id/${id}`)), - getAudioByID: async (id: string): Promise => + getAudioByID: async (id: string): Promise> => await request(payloadApiUrl(Collections.Audios, `id/${id}`)), - getVideoByID: async (id: string): Promise => + getVideoByID: async (id: string): Promise> => await request(payloadApiUrl(Collections.Videos, `id/${id}`)), - getRecorderByID: async (id: string): Promise => + getRecorderByID: async (id: string): Promise> => await request(payloadApiUrl(Collections.Recorders, `id/${id}`)), }; }; diff --git a/src/utils/payload.ts b/src/utils/payload.ts index 645bde5..2f1554f 100644 --- a/src/utils/payload.ts +++ b/src/utils/payload.ts @@ -57,26 +57,26 @@ type Cache = { }; const fetchNewData = async (): Promise => ({ - locales: await payload.getLanguages(), - currencies: (await payload.getCurrencies()).map(({ id }) => id), - wordings: await payload.getWordings(), - config: await payload.getConfig(), + locales: (await payload.getLanguages()).data, + currencies: (await payload.getCurrencies()).data.map(({ id }) => id), + wordings: (await payload.getWordings()).data, + config: (await payload.getConfig()).data, }); export let cache = await fetchNewData(); export const refreshWordings = async () => { - cache.wordings = await payload.getWordings(); + cache.wordings = (await payload.getWordings()).data; }; export const refreshCurrencies = async () => { - cache.currencies = (await payload.getCurrencies()).map(({ id }) => id); + cache.currencies = (await payload.getCurrencies()).data.map(({ id }) => id); }; export const refreshLocales = async () => { - cache.locales = await payload.getLanguages(); + cache.locales = (await payload.getLanguages()).data; }; export const refreshWebsiteConfig = async () => { - cache.config = await payload.getConfig(); + cache.config = (await payload.getConfig()).data; }; diff --git a/src/utils/responses.ts b/src/utils/responses.ts index 6ae3e65..1bf7648 100644 --- a/src/utils/responses.ts +++ b/src/utils/responses.ts @@ -1,6 +1,39 @@ -export const fetchOr404 = async (promise: () => Promise): Promise => { +import type { PayloadResponse } from "src/shared/payload/payload-sdk"; + +export const fetchOr404 = async ( + { + request, + response, + }: { + request: Request; + response: { + headers: Headers; + }; + }, + promise: () => Promise> +): Promise => { try { - return await promise(); + const { data, timestamp } = await promise(); + const lastModified = timestamp.toUTCString(); + + if (request.headers.get("If-Modified-Since") === lastModified) { + return new Response(null, { + status: 304, + statusText: "Not Modified", + }); + } + + // const userEtag = Astro.request.headers.get("If-None-Match"); + // if (userEtag === collectible.etag) { + // return new Response(null, { + // status: 304, + // statusText: "Not Modified", + // }); + // } + + response.headers.set("Last-Modified", lastModified); + + return data; } catch { return new Response(null, { status: 404,