# manager-service Backend ASP.NET Core 8 de la solution MyInfoMate. API REST consommée par toutes les apps. ## Stack - .NET 8 / ASP.NET Core Web API - PostgreSQL + Entity Framework Core 9 (Npgsql) - Hangfire (jobs planifiés, dashboard sur `/hangfire`) - MQTT (MQTTnet) pour la communication temps réel avec les devices - Firebase Admin (push notifications) - Gemini 2.5-Flash-Lite via endpoint compatible OpenAI (AssistantService) - NSwag pour la génération OpenAPI/Swagger ## Structure ``` ManagerService/ ├── Controllers/ # 16 contrôleurs REST (un par domaine) ├── DTOs/ # Objets de transfert, incluant RemoteEventAgendaDTO (APIs PHP externes) ├── Data/ # Modèles EF + MyInfoMateDbContext │ └── SubSection/ # 13 sous-types de Section (SectionEvent, SectionMap, SectionQuiz, etc.) ├── Services/ # Logique métier (DatabaseService par entité, SectionFactory, AssistantService) ├── Helpers/ # Utilitaires (PasswordUtils, ImageHelper, GeometryMapper...) ├── Extensions/ # DI et config (MqttClientService, AppSettingsProvider...) ├── Security/ # Auth JWT + API Key, policies (ContentEditor, SuperAdmin...) └── Migrations/ # Migrations EF Core ``` `Manager.Framework/` et `Manager.Interfaces/` sont des packages NuGet compilés, pas de source dans ce repo. ## Base de données - PostgreSQL, base `my_info_mate` - JSONB pour le contenu multilingue (`List` pour Title, Description) - Héritage TPH (Table Per Hierarchy) pour les types de Section (discriminateur sur la colonne `Discriminator`) - NetTopologySuite pour les données géospatiales (cartes, annotations) - Migrations : `dotnet ef migrations add ` puis `dotnet ef database update` ## Auth & sécurité - JWT Bearer pour les apps manager - API Key (`X-Api-Key` header) pour les apps mobiles visiteurs - Rôles : SuperAdmin, InstanceAdmin, ContentEditor, Viewer - Langues supportées : FR, NL, EN, DE, IT, ES, PL, CN, AR, UK ## APIs PHP externes Certaines APIs tierces (agendas en ligne) retournent du JSON PHP-style : - Champs en `snake_case` - `false` à la place d'un objet ou `null` → géré par `FalseToNullConverter` dans `DTOs/RemoteEventAgendaDTO.cs` - Dates au format `YYYYMMDD` (ex: `"20260327"`) → parsées dans `RemoteEventAgendaDTO.GetDateFrom()` - Désérialisation tolérante aux erreurs via `RemoteAgendaJsonSettings.Lenient` ## Docker - Multi-stage build, image finale `aspnet:8.0`, port 80 - `docker-compose.yml` avec Traefik, SSL Let's Encrypt - Domaine API : `api.mymuseum.be` - Config via fichier `.env` et volume `/etc/managerservice` ## Commandes utiles ```bash dotnet run # Lancer en local dotnet ef migrations add # Nouvelle migration dotnet ef database update # Appliquer les migrations docker compose up -d # Lancer via Docker ```