Piège rencontré sur la publication d'annonce : ad/post/group/chat-message
lisent ctx.request.files.<attribut> directement. Envoyer files.<attribut>
n'échoue pas, les fichiers sont simplement ignorés.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Règle apprise en corrigeant les commentaires invisibles sur la page de
détail d'une publication (0.13.16) : le sanitizer de l'API REST retire
sans erreur les relations peuplées vers un content-type non lisible par
le rôle. Les controllers custom qui répondent via ctx.send() ne passent
pas par ce sanitizer et masquent le problème.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Les commentaires n'apparaissaient pas sur la page de détail d'une
publication, alors qu'ils s'affichent dans le fil.
`comment` n'avait aucune permission déclarée. Le fil passe par le
controller custom `feed`, qui renvoie ses résultats via ctx.send() sans
sanitizer d'API ; la page de détail passe par l'API REST standard, dont
le sanitizer retire les relations peuplées vers un content-type que le
rôle n'a pas le droit de lire.
Lecture seule : l'écriture reste passée par `post.addComment`, qui
contrôle l'auteur.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
`configuration.privacy.profileVisibility` n'avait pas de valeur par
défaut : un composant `privacy` créé sans choix explicite laissait le
champ nul, que la recherche d'utilisateurs traitait comme non-public.
L'écran de confidentialité du front affiche « public » dans ce cas —
le schéma s'aligne.
Ne rétroagit pas sur les utilisateurs existants, qui n'ont aucun
composant `privacy` : c'est le front (0.18.3) qui les traite comme
publics.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Tous les uploads échouaient depuis mai 2026 sur « Credential access key
has length 5, should be 32 ».
config/env/production/plugins.ts surchargeait l'upload avec l'ancien
MinIO auto-hébergé (accessKeyId "admin", 5 caractères, endpoint
container.harmonylab.ovh aujourd'hui injoignable). Strapi fusionnant les
surcharges d'environnement en profondeur, la config effective en prod
n'était ni l'une ni l'autre : endpoint R2 hérité de config/plugins.ts,
mais identifiants MinIO, le provider lisant s3Options.credentials en
priorité sur les options à plat.
- surcharge production supprimée : une seule config plugins, les
différences d'environnement passent par les variables d'environnement
- upload en forme s3Options attendue par @strapi/provider-upload-aws-s3 5.x
(à plat, le provider n'accepte plus qu'au prix d'une dépréciation)
- secrets R2 et SMTP sortis du fichier vers env(), .env.example à jour
- CSP de production : les médias étaient autorisés depuis
container.harmonylab.ovh et 192.168.0.211:9000, jamais depuis le domaine
R2 — l'hôte est désormais dérivé de R2_PUBLIC_URL
- la surcharge production des middlewares réduisait strapi::body à sa forme
par défaut, perdant includeUnparsed nécessaire au webhook Stripe
⚠️ Déploiement : poser R2_* et SMTP_PASSWORD dans Dokploy AVANT de
déployer. Les clés historiques restent dans l'historique git : rotation
R2 et ZeptoMail à faire.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- webhook : crédite maxChoirs selon le plan (pro=1, premium=5), écrit
uniquement des champs existants du schéma (isPremium supprimé,
subscriptionId -> stripeSubscriptionId)
- schéma user : ajout stripeCustomerId / stripeSubscriptionId (private)
- controller choral.create : contrôle du crédit côté serveur + décrément
après création
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>