Files
Omika/docs/LOT_SERVEUR_SERVICE_CONNECTION.md
2026-10-23 18:46:50 +02:00

176 lines
7.2 KiB
Markdown

# LOT SERVEUR — CONNEXION PHYSIQUE BASE SERVICE (HFSQL)
## OBJECTIF
Brancher l'implémentation moderne de synchronisation mobile existante sur la
vraie base HFSQL **Service**, via le provider OLE DB `PCSOFT.HFSQL`.
Cette base Service est **distincte** de la base métier Batik/Omika (ODBC), de la
base Licence et de la base technique Sync : elle héberge les tables techniques
du service de synchronisation.
## IMPORTANT
- aucune modification du schéma HFSQL ;
- aucune création/suppression de table ;
- aucune reprise du vieux WebService ;
- les anciennes documentations servent uniquement à connaître les tables,
relations et comportements historiques ;
- les traitements modernes peuvent être différents ;
- les contrats API modernes restent la référence ;
- aucun secret historique ne doit être recopié.
## TOPOLOGIE RÉELLE CONSTATÉE (probes de lecture)
Les probes de lecture réels (via OLEDB `PCSOFT.HFSQL`) ont révélé la topologie
physique suivante sur le serveur HFSQL (`127.0.0.1:4900`) :
| Base réelle | Rôle | Tables techniques |
|-------------|------|-------------------|
| `BATIK.01_BLS` | Base **Service** (service de synchronisation) | `TOSRV`, `TOMOB`, `MOBILES`, `PARAMETRES` |
| `BATIK_TEST` | Base métier Batik (Business) | 44 tables métier |
| `OMIKA_TEST` | Base technique Sync | 54 tables métier |
| `BASE_LICENCES` | Base Licence | tables de backup système uniquement |
### Matrice physique des tables de synchronisation
| Table | Base réelle | Rôle |
|-------|-------------|------|
| `TOSRV` | **`BATIK.01_BLS`** (Service) | File d'entrée des opérations reçues du mobile |
| `MobReception` | **base métier WebService** | File de travail des opérations transférées |
| `MobLog` | **base métier WebService** | Journal des états terminaux |
> **Divergence structurelle** : le `SyncTransferRepository` actuel est
> **mono-connexion** et suppose que `TOSRV`, `MobReception` et `MobLog` sont dans
> la **même** base. Or la topologie réelle répartit ces tables sur **deux** bases
> distinctes (`TOSRV` dans la base Service, `MobReception`/`MobLog` dans la base
> métier WebService). Le repository actuel est donc **insuffisant** pour cette
> topologie.
## CONFIGURATION CENTRALISÉE
La connexion Service est configurée dans la section **`ServiceConnection`** des
fichiers de configuration .NET (appsettings / variables d'environnement /
secrets) :
```json
"ServiceConnection": {
"Server": "127.0.0.1",
"Port": 4900,
"DatabaseName": "BATIK.01_BLS",
"Login": "",
"Password": "",
"FilePasswords": {
"ProtectionStd": null,
"ProtectionPlus": null
}
}
```
- `Server` / `Port` : serveur HFSQL Client/Serveur.
- `DatabaseName` : nom de la base Service (`BATIK.01_BLS`).
- `Login` / `Password` : compte technique serveur (jamais en clair en source).
- `FilePasswords` : mots de passe de fichiers HFSQL (ProtectionStd / ProtectionPlus),
propres à l'installation. Optionnels.
### Mot de passe optionnel
Selon le client, la connexion Service peut être configurée avec un mot de passe
**absent** (`null`), **vide** (`""`) ou **renseigné**. Le validateur et le
constructeur OLEDB acceptent proprement les trois cas. **Aucun mot de passe
fictif n'est jamais inventé** lorsque la valeur est absente.
## OUVERTURE DE LA CONNEXION VIA OLEDB
La connexion Service est enregistrée comme `IHfsqlConnection` **nommée** `"Service"`
(`ServiceConnectionOptions.ConnectionName`), distincte de la connexion métier ODBC
par défaut, de la connexion Licence et de la connexion Sync.
- `ServiceConnectionOptions` : options de connexion (section `ServiceConnection`).
- `ServiceConnectionOptionsValidator` : validation minimale (règle pure, testable).
- `HfSqlConnectionOptionsFactory.CreateForService(...)` : traduction vers les options
OLE DB.
- `ServiceOleDbConnection` : connexion OLE DB réutilisant le contrat `IHfsqlConnection`
(lecture, métadonnées), alimentée par la fabrique OLE DB.
### `ServiceOleDbConnection`
La connexion Service expose :
- `Options` : un `HfsqlOptions` minimal dérivé des options Service (sans secret),
avec `ConnectionName = "Service"`, `DatabaseName`, `Login`.
- `OpenAsync` / `CloseAsync` / `DisposeAsync` : cycle de vie de la connexion.
- `QueryAsync` / `ExecuteScalarAsync` / `ExecuteNonQueryAsync` : lecture/écriture.
- `GetColumnsAsync` : métadonnées des colonnes d'une table.
## BRANCHEMENT DU REPOSITORY — MULTI-CONNEXION IMPLÉMENTÉ
`AddOmikaDataServiceConnection()` (dans `Omika.Data`) :
1. enregistre la configuration `ServiceConnection` (section `ServiceConnection`) ;
2. enregistre le validateur `ServiceConnectionOptionsValidator` ;
3. enregistre la fabrique OLE DB `IHfSqlOleDbConnectionFactory` ;
4. enregistre la connexion `IHfsqlConnection` nommée `"Service"` (Scoped) ;
5. enregistre le wrapper `IServiceHfSqlConnection` (Scoped) autour de la connexion
Service.
> **✅ Implémenté** : le `SyncTransferRepository` est désormais **multi-connexion**.
> Il reçoit deux connexions explicites : `IServiceHfSqlConnection` (base Service,
> table `TOSRV`) et `IWebServiceHfSqlConnection` (base WebService/Business, tables
> `MobReception` et `MobLog`). Le routage des opérations est documenté dans
> `LOT_SERVEUR_SYNC_CONNECTION.md`.
### Rôle de la connexion Service
La connexion Service (`IServiceHfSqlConnection`) est utilisée **uniquement** pour
les opérations sur la table `TOSRV` :
- `InsertToSrvAsync` : insertion d'une opération reçue du mobile.
- `GetStatusAsync` / `GetExistingStateAsync` : recherche d'une opération dans TOSRV.
- `TransferToReceptionAsync` : lecture de TOSRV et suppression après transfert réussi.
Aucune opération `MobReception` / `MobLog` ne passe par la connexion Service.
> **Aucune modification du schéma HFSQL n'a été effectuée.** Aucune table n'a été
> créée, modifiée ou supprimée. Aucune donnée n'a été écrite.
## VALIDATION DE LA BASELINE
| Élément | Résultat |
|---------|----------|
| Build solution | **Vert** (0 erreur) |
| Build Android | **Vert** (0 erreur) |
| Tests unitaires (hors HFSQL environnemental) | **1748/1748** (0 échec) |
### Note sur les tests
Les 10 tests `HfSqlOleDb*IntegrationTests` échouent car ils nécessitent un serveur
HFSQL réel non démarré dans cet environnement (`La connexion au serveur <:0> a
échoué`). Ces tests sont **hors baseline** (tests environnementaux).
Les nouveaux tests ajoutés pour la connexion Service passent tous :
- `ServiceConnectionOptionsValidatorTests` (13 tests) : validation, mot de passe
optionnel, `ToString` sans secret.
- `ServiceOleDbConnectionTests` (12 tests) : cycle de vie, lecture, options,
`CreateForService`.
- `HfSqlOleDbConnectionStringBuilderTests` : construction OLEDB avec mot de passe
optionnel.
- `ServiceCollectionExtensionsTests` : enregistrement DI de la connexion Service.
## PROCHAINES ÉTAPES (LECTURE SEULE D'ABORD)
Avant toute écriture, prouver en lecture seule :
- connexion Service ouverte ;
- tables accessibles (`TOSRV`, `TOMOB`, `MOBILES`, `PARAMETRES`) ;
- colonnes réellement présentes ;
- opération connue / inconnue ;
- état terminal / en attente ;
- mapping JSON cohérent.
**STOP** si le modèle physique diffère des hypothèses du repository actuel. Dans
ce cas fournir : table réelle, colonne réelle, modèle attendu, divergence,
adaptation minimale proposée.