manager-service/CLAUDE.md

63 lines
2.9 KiB
Markdown

# 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<TranslationDTO>` 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 <Nom>` 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 <Nom> # Nouvelle migration
dotnet ef database update # Appliquer les migrations
docker compose up -d # Lancer via Docker
```