Skip to content

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. MemoryCache active (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).
  • Notifications/ est vide.
  • Logs : Serilog vers la console (sink configure dans appsettings.json) -> visibles via docker logs. Pas de Sentry (retire en juillet 2026).

Services (DI dans Program.cs)

ServiceInterfaceLifetimeRole
HeadlessCmsApiServiceIHeadlessCmsApiServiceTransientFacade : orchestre tous les appels headless
HeadlessArticleServiceIHeadlessArticleServiceHttpClient (scoped)Articles via Delivery API + cache + converters
HeadlessMultimediaServiceIHeadlessMultimediaServiceHttpClientMultimedia (audio/video/galeries)
HeadlessAuthorServiceIHeadlessAuthorServiceHttpClientAuteurs
SearchServiceISearchServiceScopedRecherche full-text sur les articles headless
NewsletterOptInServiceINewsletterOptInServiceScopedInscription newsletter (multi-providers)
PdfGeneratorServiceIPdfGeneratorServiceScopedGeneration PDF (itext + Fluid)
HeadlessElementFactoryIHeadlessElementFactoryScopedReconstruit IPublishedElement depuis le JSON
PublishedTypeResolver(classe)ScopedResout les alias de content type

Options bindees (singleton) : HeadlessCmsApiOptions (BaseUrl, ApiKey, DomainUrl, cache, WebhookSecret), NewsletterOptInOptions, InfomaniakSmtpOptions.

Flux general d'une page article

  1. La requete arrive ; un content finder (BlogContentFinder) resout le slug en key d'article (en interrogeant le headless GetArticleIdFromSlug), stocke l'id resolu dans HttpContext.Items.
  2. Le controller (ex. ArticlePageController) recupere le detail via HeadlessCmsApiService.GetArticleDetailsFromDeliveryApiAsync(id).
  3. Le JSON est deserialise avec les converters custom -> IPublishedElement reconstruits par HeadlessElementFactory.
  4. La vue est choisie selon le skin (ArticlePage / ArticlePage--icogne / ArticlePage--linfo) et le layout via GetLayoutPath().
  5. Le rendu des blocks utilise les helpers Umbraco standards (Html.GetBlockGridHtmlAsync, partials de block) grace a AsModel<T>.

Detail dans headless-consumption.md et multi-site-skins.md.

Contributors

No contributors

Changelog

No recent changes