import { getUrlWithProxiedParams } from '../../../runtime'; import type { IStripcashModel, IStripcashModelsResponse } from '../../../types'; type BlockResponse = { items: IStripcashModel[]; total: number; byLanguages: Record; }; /** * Данные блока вебкамов ОДНИМ запросом: модели онлайн и счётчики онлайна * (всего + по языкам). У провайдера это две ручки * (`/v2/stripcash/online-models-list` и `online-models-count`), но клиенту знать * про это незачем — оркестрация здесь, поэтому блок делает один вызов. * * Счётчики просим параллельно со списком и не роняем блок, если счётчики не * ответили: заголовок просто останется без плашек. * * Ниша и язык уходят заголовками `X-Niche` / `X-Language` — так требует ручка * (без них выдача пустая); клиент передаёт их query-параметрами `niche` и `lang`, * потому что своих заголовков до BFF он не проставляет. * * Цель стримера (`goalMessage`, `neededForGoal`, `earnedForGoal`) в swagger не * описана, но ручка её отдаёт — поля проходят насквозь как есть. */ export default defineEventHandler(async (event): Promise => { const apiUrl = process.env.NUXT_PUBLIC_API_DOMAIN; const query = getQuery(event); const listUrl = getUrlWithProxiedParams(`${apiUrl}/v2/stripcash/online-models-list`, event); const countUrl = `${apiUrl}/v2/stripcash/online-models-count`; // заголовки провайдера кладём во входящий запрос: `cachedApiFetch` форвардит // их дальше и попутно даёт минутный кэш с дедупом — SSR и клиент получают // одинаковую выдачу, хотя провайдер отдаёт модели в случайном порядке event.node.req.headers['x-niche'] = String(query.niche || ''); event.node.req.headers['x-language'] = String(query.lang || event.node.req.headers['x-language'] || 'en'); const [list, counts] = await Promise.all([ cachedApiFetch(listUrl, event, 60), cachedApiFetch<{ total?: number, by_languages?: Record }>(countUrl, event, 60).catch(() => null), ]); return { items: list?.items || [], total: counts?.total || 0, byLanguages: counts?.by_languages || {}, }; });