import { Observable } from 'rxjs'; import { ArticleMetadata } from '../../components/organisms/article/types'; import { ContentDocument, ContentDocumentType, ContentLoadOptions } from './types'; import * as i0 from "@angular/core"; /** * Servicio de la plataforma de contenido (ADR-020 §2.5). * * Une dos orígenes (**híbrido**): * - **Estático** — `staticSources` lazy por locale, generadas build-time. * - **Backend** — DynamoDB + API (`/v2/content*`), publicación sin redeploy. * * Reglas de merge: * - `list()` une ambos orígenes por `type`. Colisión de `slug` → **estático * gana** (contenido curado). Ordena por `publishedAt` desc (sin fecha al final). * - `load()` resuelve estático primero, con **fallback** al backend. * * Render: `toArticle(doc)` convierte `doc.body` (Markdown) a `ArticleMetadata` * vía el `markdown-article-parser` existente — la page hace ``. * * Requiere `provideValtechContent({ apiUrl, appId, staticSources? })` en `main.ts`. * Sin provider, el servicio queda inerte (`isConfigured() === false`). */ export declare class ContentService { private readonly config; private readonly http; private readonly parser; private readonly auth; /** `true` si `provideValtechContent()` fue llamado en el bootstrap. */ readonly isConfigured: import("@angular/core").WritableSignal; /** Cache de las promesas de cada factory estática, keyed por locale. */ private readonly staticCache; constructor(); /** * Lista los documentos publicados de un `type`, uniendo estático + backend. * Colisión de `slug` → estático gana. Ordenados por `publishedAt` desc. * * @param type - Tipo de contenido (`'blog'`, `'news'`, …). * @param options - `{ locale }` (default `'es'`). */ list(type: ContentDocumentType, options?: ContentLoadOptions): Observable; /** * Carga un documento por `slug`: estático primero, fallback al backend. * * @param type - Tipo de contenido. * @param slug - Slug del documento. * @param options - `{ locale }` (default `'es'`). */ load(type: ContentDocumentType, slug: string, options?: ContentLoadOptions): Observable; /** * Convierte el `body` (Markdown) de un documento en `ArticleMetadata` para * renderizar con ``. Usa el parser existente. * * @param doc - Documento de contenido a renderizar. * @param config - Override parcial de la `ArticleMetadata` resultante. */ toArticle(doc: ContentDocument, config?: Partial): ArticleMetadata; /** Limpia la cache de fuentes estáticas. Llamar al cambiar de locale en runtime. */ invalidate(): void; /** * Lista los documentos publicados de la org activa del usuario autenticado. * * Requiere sesión activa (`AuthService.isAuthenticated()`). El interceptor de * auth agrega automáticamente `Authorization: Bearer {token}` a la request. * * @param type - Tipo de contenido (`'blog'`, `'news'`, …). * @param options - `{ locale }` (default `'es'`). * @returns Documentos de la org o `[]` si no hay config/sesión. */ listForOrg(type: ContentDocumentType, options?: ContentLoadOptions): Observable; /** * Carga un documento de la org activa del usuario autenticado por `slug`. * * Requiere sesión activa. El interceptor de auth agrega el Bearer token. * * @param type - Tipo de contenido. * @param slug - Slug del documento. * @param options - `{ locale }` (default `'es'`). * @returns El documento o error si no se encuentra / no hay sesión. */ loadForOrg(type: ContentDocumentType, slug: string, options?: ContentLoadOptions): Observable; /** Une estático + backend: estático gana por slug; orden por publishedAt desc. */ private merge; /** Comparador: más reciente primero; sin `publishedAt` al final. */ private byPublishedDesc; /** Carga (y cachea) los documentos estáticos de un locale, si hay factory. */ private loadStatic; /** GET `{apiUrl}/v2/content?type=&locale=` — solo publicados. */ private listBackend; /** GET `{apiUrl}/v2/content/{type}/{locale}/{slug}` — detalle publicado. */ private loadBackend; /** * GET `{apiUrl}/v2/content/org?type=&locale=` — publicados de la org activa. * El Bearer token lo añade el interceptor de auth automáticamente. */ private listBackendOrg; /** * GET `{apiUrl}/v2/content/org/{type}/{locale}/{slug}` — detalle de la org activa. * El Bearer token lo añade el interceptor de auth automáticamente. */ private loadBackendOrg; static ɵfac: i0.ɵɵFactoryDeclaration; static ɵprov: i0.ɵɵInjectableDeclaration; }