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) :
- Charge
appsettings.local.jsonen surcouche si Development. CreateUmbracoBuilder().AddBackOffice().AddWebsite().AddDeliveryApi().AddComposers()puis enregistre les handlers de notification :SetStateNameHandler(ContentSavingNotification) : recopie le nom de l'state(canton) pointe dans la proprietestateName.JemaScheduleChangeNotificationHandler: valide le format de nom des noeuds jour/creneau JEMA et derivedate/timestampStart/timestampEnd(en ticks).JemaDurationCalculationHandler: calcul de durees JEMA a la sauvegarde.
- Active la Razor Runtime Compilation en
#if DEBUG. - Branche Sentry uniquement en Staging/Production si
SentryUrlest non vide (profiling en staging). - Bind les options via
Configure<T>:SmtpOpions,JemaSmtpOptions,DomainOptions,NewsletterOptions,DashboardSecurityOptions. - Enregistre un
HttpClientnommeNewsletterOptIn(base address depuisNewsletterOptions). - Enregistre les services :
IEmailService -> EmailService(Scoped),IDashboardEncryptionService -> DashboardEncryptionService(Singleton),IDashboardService -> DashboardService(Scoped),ImagePreloadService(Scoped),JemaReminderService(Scoped). - Configure Quartz : le job
JemaEmailReminderJobavec un trigger cron0 0 9 * * ?(tous les jours a 09:00). - 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)
- Umbraco resout le contenu publie a partir de l'URL (routing Umbraco standard, sites multilingues par culture).
- Le rendu utilise la vue Razor correspondant au document type (
src/Web/Views/<DocType>.cshtml), avec un modele ModelsBuilder type (Web.umbraco.Models.*). - Les vues composent leur contenu via le BlockGrid (blocs/elements dans
Views/Partials/blockgrid/) et des sections (Views/Partials/sections/). - Si aucun contenu n'est trouve,
NotFoundContentFindercherche la page 404 (notFoundPage) sous la racine du site correspondant au domaine de la requete. - POST de formulaire : un
SurfaceController(souvent viaFormSurfaceController<TModel>) valide, envoie le mail (IEmailService) et redirige (TempData["FormSuccess"]). - Inscription JEMA :
JemaRegistrationControllerrecoit 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
| Couche | Emplacement | Role |
|---|---|---|
| Controllers | Controllers/ | SurfaceControllers (forms, JEMA, newsletter), UmbracoApiControllers (import, blog, jema trash), Dashboard, erreurs, sitemap/robots |
| Services | Services/ | EmailService, JemaReminderService, DashboardService + DashboardEncryptionService, ImagePreloadService, UmbracoUserAppAuthenticator |
| Notifications | Notifications/ | Handlers ContentSaving (etat, validation/derivation JEMA) |
| Jobs | Jobs/ | JemaEmailReminderJob (Quartz) |
| Options | Options/ | Classes d'options IOptions<T> |
| Mailing | Mailing/ | Templates Razor embarques + modeles d'email |
| ViewModels / Models | ViewModels/, Models/ | View models de formulaire + records (inscription, newsletter, ...) |
| Helpers / Extensions | Helpers/, Extensions/ | SEO (SeoHelpers), image, CSS critique + extensions IPublishedContent/string/date |
| ContentFinders | ContentFinders/ | 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 viaIContentService. - Import :
ImportApiController(marque[Obsolete]) lit des CSV depuisImportCsvSrc/(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 viaGetDictionaryValue/IDictionaryItemService.TranslateAsync. - SEO :
SeoHelpersconstruit des meta-titres (Nom – Suffixe) et des meta-descriptions de fallback (strip HTML, troncature au mot). Voir aussi les branches featureseo-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
| Sujet | Fichier |
|---|---|
| Composition / DI | src/Web/Program.cs |
| Composer (404, TwoFactor) | src/Web/SiteComposer.cs |
| Base surface controller forms | src/Web/Controllers/FormSurfaceController.cs |
| Inscription JEMA | src/Web/Controllers/JemaRegistrationController.cs |
| Envoi de mail | src/Web/Services/EmailService.cs |
| Validation/derivation noeuds JEMA | src/Web/Notifications/JemaScheduleChangeNotificationHandler.cs |
| 404 par site | src/Web/ContentFinders/NotFoundContentFinder.cs |
Contributors
No contributors
Changelog
No recent changes

