Skip to content

Architecture - vue d'ensemble

Principe general

Application Umbraco CMS 17 / .NET 10 mono-site. Contrairement a d'autres projets Spektrum, il n'y a pas de framework maison : tout le code custom vit dans un unique projet src/Web (le .sln contient Web + deux projets de tests). Umbraco fournit le CMS, le routing, le rendu Razor et l'acces aux donnees ; le code custom ajoute des controllers (formulaires, inscriptions JEMA, dashboard, import), des services (mail, rappels, dashboard), des handlers de notification et le pipeline frontend.

Le schema et le contenu sont versionnes via uSync (src/Web/uSync/v17/).

Composition & DI (src/Web/Program.cs + SiteComposer.cs)

Program.cs (top-level statements) :

  1. Charge appsettings.local.json en surcouche si Development.
  2. CreateUmbracoBuilder().AddBackOffice().AddWebsite().AddDeliveryApi().AddComposers() puis enregistre les handlers de notification :
    • SetStateNameHandler (ContentSavingNotification) : recopie le nom de l'state (canton) pointe dans la propriete stateName.
    • JemaScheduleChangeNotificationHandler : valide le format de nom des noeuds jour/creneau JEMA et derive date / timestampStart / timestampEnd (en ticks).
    • JemaDurationCalculationHandler : calcul de durees JEMA a la sauvegarde.
  3. Active la Razor Runtime Compilation en #if DEBUG.
  4. Branche Sentry uniquement en Staging/Production si SentryUrl est non vide (profiling en staging).
  5. Bind les options via Configure<T> : SmtpOpions, JemaSmtpOptions, DomainOptions, NewsletterOptions, DashboardSecurityOptions.
  6. Enregistre un HttpClient nomme NewsletterOptIn (base address depuis NewsletterOptions).
  7. Enregistre les services : IEmailService -> EmailService (Scoped), IDashboardEncryptionService -> DashboardEncryptionService (Singleton), IDashboardService -> DashboardService (Scoped), ImagePreloadService (Scoped), JemaReminderService (Scoped).
  8. Configure Quartz : le job JemaEmailReminderJob avec un trigger cron 0 0 9 * * ? (tous les jours a 09:00).
  9. Applique l'URL rewrite (rewriteRules.xml) en Staging/Production, puis boot Umbraco et map back-office + website (middleware + endpoints).

SiteComposer.cs (IComposer) :

  • SetContentLastChanceFinder<NotFoundContentFinder>() (page 404 par site/culture).
  • Ajoute le provider TwoFactor backoffice UmbracoUserAppAuthenticator (Google Authenticator / TOTP).

Flux de requete (rendu de page)

  1. Umbraco resout le contenu publie a partir de l'URL (routing Umbraco standard, sites multilingues par culture).
  2. Le rendu utilise la vue Razor correspondant au document type (src/Web/Views/<DocType>.cshtml), avec un modele ModelsBuilder type (Web.umbraco.Models.*).
  3. Les vues composent leur contenu via le BlockGrid (blocs/elements dans Views/Partials/blockgrid/) et des sections (Views/Partials/sections/).
  4. Si aucun contenu n'est trouve, NotFoundContentFinder cherche la page 404 (notFoundPage) sous la racine du site correspondant au domaine de la requete.
  5. POST de formulaire : un SurfaceController (souvent via FormSurfaceController<TModel>) valide, envoie le mail (IEmailService) et redirige (TempData["FormSuccess"]).
  6. Inscription JEMA : JemaRegistrationController recoit un POST JSON, cree/retrouve les noeuds jour/creneau/participant, controle la capacite et envoie les mails de confirmation (voir ../modules/jema.md).

Couches et responsabilites

CoucheEmplacementRole
ControllersControllers/SurfaceControllers (forms, JEMA, newsletter), UmbracoApiControllers (import, blog, jema trash), Dashboard, erreurs, sitemap/robots
ServicesServices/EmailService, JemaReminderService, DashboardService + DashboardEncryptionService, ImagePreloadService, UmbracoUserAppAuthenticator
NotificationsNotifications/Handlers ContentSaving (etat, validation/derivation JEMA)
JobsJobs/JemaEmailReminderJob (Quartz)
OptionsOptions/Classes d'options IOptions<T>
MailingMailing/Templates Razor embarques + modeles d'email
ViewModels / ModelsViewModels/, Models/View models de formulaire + records (inscription, newsletter, ...)
Helpers / ExtensionsHelpers/, Extensions/SEO (SeoHelpers), image, CSS critique + extensions IPublishedContent/string/date
ContentFindersContentFinders/NotFoundContentFinder (404)

Acces aux donnees

  • Contenu editorial : API Umbraco (IPublishedContentQuery, IContentService, modeles ModelsBuilder). Les inscriptions JEMA sont stockees comme noeuds de contenu (pas de table custom) : jours, creneaux et participants sont crees programmatiquement via IContentService.
  • Import : ImportApiController (marque [Obsolete]) lit des CSV depuis ImportCsvSrc/ (copies a la sortie) via CsvHelper et cree des noeuds. Outillage interne uniquement.
  • Pas de NPoco ni de table SQL custom applicative cote code.

Preoccupations transverses

  • i18n : dictionnaire Umbraco (uSync/v17/Dictionary/), 4 langues, resolu via GetDictionaryValue/IDictionaryItemService.TranslateAsync.
  • SEO : SeoHelpers construit des meta-titres (Nom – Suffixe) et des meta-descriptions de fallback (strip HTML, troncature au mot). Voir aussi les branches feature seo-fallback-artisan-metier.
  • Securite : provider TwoFactor backoffice (TOTP), politique de mot de passe stricte (15 caracteres) dans appsettings.json, dashboard JEMA protege par token chiffre.
  • Observabilite : Serilog (config par defaut Umbraco) + Sentry en staging/prod.

Fichiers cles

SujetFichier
Composition / DIsrc/Web/Program.cs
Composer (404, TwoFactor)src/Web/SiteComposer.cs
Base surface controller formssrc/Web/Controllers/FormSurfaceController.cs
Inscription JEMAsrc/Web/Controllers/JemaRegistrationController.cs
Envoi de mailsrc/Web/Services/EmailService.cs
Validation/derivation noeuds JEMAsrc/Web/Notifications/JemaScheduleChangeNotificationHandler.cs
404 par sitesrc/Web/ContentFinders/NotFoundContentFinder.cs

Contributors

No contributors

Changelog

No recent changes