Architecture - vue d'ensemble
Principe
Site Umbraco 13 multi-sites (Crans-Montana/accm, Icogne, L-Info). Contenu local (pages, accueils) gere dans cette instance ; articles et auteurs consommes depuis un CMS headless distinct via la Content Delivery API v2.
Composition
Program.cs: bootstrap Umbraco standard + DI.MemoryCacheactive (cache des articles headless).SiteComposer.cs:- Content finders :
BlogContentFinder(routage des articles de blog par slug, multi-sites),NotFoundContentFinder(404 multi-sites). - Workflow Forms :
SendEmailViaInfomaniak(envoi via SMTP Infomaniak au lieu du SMTP global). - 2FA :
UmbracoUserAppAuthenticator(Google Authenticator).
- Content finders :
Notifications/est vide.- Logs : Serilog vers la console (sink configure dans
appsettings.json) -> visibles viadocker logs. Pas de Sentry (retire en juillet 2026).
Services (DI dans Program.cs)
| Service | Interface | Lifetime | Role |
|---|---|---|---|
| HeadlessCmsApiService | IHeadlessCmsApiService | Transient | Facade : orchestre tous les appels headless |
| HeadlessArticleService | IHeadlessArticleService | HttpClient (scoped) | Articles via Delivery API + cache + converters |
| HeadlessMultimediaService | IHeadlessMultimediaService | HttpClient | Multimedia (audio/video/galeries) |
| HeadlessAuthorService | IHeadlessAuthorService | HttpClient | Auteurs |
| SearchService | ISearchService | Scoped | Recherche full-text sur les articles headless |
| NewsletterOptInService | INewsletterOptInService | Scoped | Inscription newsletter (multi-providers) |
| PdfGeneratorService | IPdfGeneratorService | Scoped | Generation PDF (itext + Fluid) |
| HeadlessElementFactory | IHeadlessElementFactory | Scoped | Reconstruit IPublishedElement depuis le JSON |
| PublishedTypeResolver | (classe) | Scoped | Resout les alias de content type |
Options bindees (singleton) : HeadlessCmsApiOptions (BaseUrl, ApiKey, DomainUrl, cache, WebhookSecret), NewsletterOptInOptions, InfomaniakSmtpOptions.
Flux general d'une page article
- La requete arrive ; un content finder (
BlogContentFinder) resout le slug enkeyd'article (en interrogeant le headlessGetArticleIdFromSlug), stocke l'id resolu dansHttpContext.Items. - Le controller (ex.
ArticlePageController) recupere le detail viaHeadlessCmsApiService.GetArticleDetailsFromDeliveryApiAsync(id). - Le JSON est deserialise avec les converters custom ->
IPublishedElementreconstruits parHeadlessElementFactory. - La vue est choisie selon le skin (
ArticlePage/ArticlePage--icogne/ArticlePage--linfo) et le layout viaGetLayoutPath(). - Le rendu des blocks utilise les helpers Umbraco standards (
Html.GetBlockGridHtmlAsync, partials de block) grace aAsModel<T>.
Detail dans headless-consumption.md et multi-site-skins.md.
Contributors
No contributors
Changelog
No recent changes

