This commit is contained in:
@@ -641,6 +641,10 @@ graph LR
|
||||
C3["product:cache:{id}<br/>TTL: 1h"]
|
||||
end
|
||||
|
||||
subgraph Notifs["🔔 Notifications"]
|
||||
N1["notifications:{username}<br/>TTL: 1h"]
|
||||
end
|
||||
|
||||
subgraph PubSub["�� Pub/Sub Channels"]
|
||||
PS1["channel:position_updates"]
|
||||
PS2["channel:order_status"]
|
||||
@@ -652,6 +656,7 @@ graph LR
|
||||
REDIS --- Positions
|
||||
REDIS --- Queues
|
||||
REDIS --- Cache
|
||||
REDIS --- Notifs
|
||||
REDIS --- PubSub
|
||||
```
|
||||
|
||||
@@ -3101,6 +3106,19 @@ Le système tente d'abord toutes les clés disponibles en rotation, puis bascule
|
||||
|
||||
## 📋 Changelog
|
||||
|
||||
### v5.6.0 — 2026-07-11
|
||||
|
||||
- **Fix — ETA introuvable pour l'annulation tardive (`CheckCommandETAExistsAndValid`)** : la fonction lisait la clé Redis `command:eta:{id}` (un *hash*) avec `Redis.Get` (string), ce qui provoquait systématiquement une erreur `WRONGTYPE` silencieuse. Une ETA valide n'était donc jamais détectée par ce chemin, et un client pouvait annuler sans pénalité juste après l'assignation d'un livreur (avant le passage au statut `en_route`). Corrigé en `Redis.HGetAll`.
|
||||
- **Fix — position livreur introuvable (`GetDeliverymanLocationForCommand`)** : même bug `WRONGTYPE` (`Redis.Get` sur un hash) empêchant l'affichage de la position temps réel sur certains suivis de commande. Corrigé en `Redis.HGetAll`.
|
||||
- **Fix — ETA absente des notifications/app mobile/site web** : trois fonctions qui écrivent l'ETA dans Redis utilisaient des noms de champ incohérents (`eta_minutes` vs `total_eta_minutes`) alors que les clients ne lisent que `eta_minutes`. Les trois writers écrivent désormais les deux champs de façon cohérente.
|
||||
- **Fix — boucle infinie de géocodage (`ResolveAddress` ↔ `GeocodeAddress`)** : la correction d'adresse mal écrite et le géocodage se rappelaient mutuellement sans condition de sortie pour toute adresse échouant au géocodage direct (le cas d'usage même de la correction), provoquant un blocage. `ResolveAddress` appelle désormais directement le cache/Nominatim sans repasser par `GeocodeAddress`.
|
||||
- **Fix — récompenses par points non atomiques** : `ClaimPoolReward` (consommation des points) et `AddRewardsToBasket` (ajout du produit au panier) étaient deux étapes séparées ; un produit récompense supprimé/introuvable faisait perdre la récompense au client sans qu'il reçoive rien. Fusionnées dans `ClaimPoolRewardAndAddToBasket`, exécutée dans une seule transaction.
|
||||
- **Fix — annulation admin non atomique** : `UpdateCommandStatusAdmin` pouvait rembourser deux fois le stock en cas d'appels concurrents. Bascule sur `CancelCommandByAdminAtomic` (transaction + verrou `FOR UPDATE`).
|
||||
- **Fix — proratisation du chiffre d'affaires (stats)** : les commandes avec `referral_used` n'étaient pas correctement proratisées dans les statistiques de revenu.
|
||||
- **Notifications — durée de rétention réduite à 1h** : les notifications stockées dans Redis passent d'un TTL de 7 jours à 1 heure (cohérent avec leur usage temps réel, évite l'accumulation inutile).
|
||||
- **Suppression de code mort supplémentaire** : nettoyage dans `CreateCommand` et `DeleteCommandItem` (rendu atomique).
|
||||
- **Tests unitaires** : ajout de suites complètes couvrant la gestion de stock (checkout/annulation/items), les statistiques, le géocodage et la correction d'adresses mal écrites (algorithme pur + intégration réseau réelle rate-limitée), les calculs de temps/ETA de commande, les récompenses par points (déduction de stock, atomicité), et l'annulation de commande avec pénalité de retard (barème, cumul concurrentiel, détection via statut ou ETA, flux "client absent").
|
||||
|
||||
### v5.5.0 — 2026-07-08
|
||||
|
||||
- **Fix — amende annulation livreur (`ApplyCancellationPenalty`)** : l'amende appliquée quand un livreur marque le client absent écrasait le montant existant au lieu de l'additionner, et n'était pas protégée par un verrou (`FOR UPDATE`). Elle est désormais cumulative et transactionnelle, cohérente avec le chemin d'annulation client (`CancelAtomic`).
|
||||
@@ -3134,8 +3152,8 @@ Le système tente d'abord toutes les clés disponibles en rotation, puis bascule
|
||||
|
||||
---
|
||||
|
||||
**Documentation mise à jour le :** 2026-07-08
|
||||
**Version API :** 5.5.0
|
||||
**Documentation mise à jour le :** 2026-07-11
|
||||
**Version API :** 5.6.0
|
||||
**Technologies :** Go 1.24, Gin, PostgreSQL 16, Redis 7, React 19, Expo 54, TomTom API, ModSecurity WAF
|
||||
**Déploiement :** Docker Compose · Nginx + ModSecurity OWASP CRS · TLS 1.2/1.3
|
||||
**Base URL prod :** `https://mln-uber.club`
|
||||
|
||||
Reference in New Issue
Block a user