Skip to content

Appliquer les parcours Premium, le déblocage à l'unité et la limite anti-spam dans l'API #66

Closed

Description

@IlanAMG

Contexte

Epic : #11
Maquette : E-17, E-05 · validées le 2026-09-29 (D-072 à D-074)
Compte-et-Monetisation · API · Ecrans › E-05 · D-002, D-014
Requalifié par D-014 : les « parcours signature » deviennent des parcours Premium. Premium = routes.access = premium, réservé aux abonnés, quel que soit le créateur ; Signature = parcours de l'équipe Widoo (is_official), sans effet sur l'accès. Les deux se cumulent.
À trancher par Ilan : la règle d'attribution de Premium, c'est-à-dire quels parcours deviennent Premium et qui en décide au-delà du rôle editor.
Requalifié par D-023 : freemium recentré, tout est gratuit et sans limite, favoris et programmations compris, sauf les parcours Premium.
Révisé par D-073 (décision d'Ilan du 2026-09-28, Compte-et-Monetisation › Freemium) : la création est gratuite et sans limite ; l'ancienne règle free.max_routes (premier parcours offert) et le 402 create_limit sont abandonnés. Seule limite : l'anti-spam max_pending_routes.

Comportement attendu

  • Limite anti-spam dans settings : max_pending_routes (3 parcours en attente de modération au plus par compte), réglable sans déploiement ; au-delà, POST /routes/:id/submit répond 429 rate_limited (D-073). Aucune clé free.max_routes.
  • Plus aucun quota de favoris ni de programmations : PUT /me/favorites/:id et POST /me/planned n'ont plus de limite, et le code quota_exceeded disparaît. POST /me/planned sur un parcours access = premium renvoie toujours 402 premium_required.
  • POST /routes n'a aucune limite de création, compte gratuit ou Premium ; details.reason = create_limit n'est plus émis.
  • GET /me expose plan et planExpiresAt. canCreateRoute sort du périmètre de ce ticket : la page API le décrit encore selon l'ancienne règle, son sort est à trancher par DESIGN (Aligner Modele-de-Donnees et API sur la création sans limite (D-073) #383).
  • routes.access modifiable par le rôle editor ; RouteCard expose séparément Signature (is_official) et Premium (access).
  • Même règle de réduction côté serveur que GET /routes/:id (Exposer GET /routes/:id et /routes/:id/timeline, stocker computed #36) pour un non-abonné sur un parcours Premium.
  • Un abonné qui repasse en gratuit garde tous ses parcours, publiés ou non, et continue d'en créer ; les parcours Premium redeviennent verrouillés.
  • Le commentaire de packages/shared/src/schemas/route.ts (l. 47) décrit encore premium comme « signature route » : le corriger selon D-014.
  • Go d'un parcours Premium sans abonnement : comportement dessiné avec la planche 2 de Design — E-07 et E-15 journée en cours et fin de parcours #74, à reprendre ici une fois validée (D-029).
  • Sortie d'un parcours Premium (D-033) : si l'abonnement prend fin pendant la sortie, elle continue sans interruption ; relancer ensuite un parcours Premium sans abonnement ouvre E-17.

Critères d'acceptation

  • Tests : un compte gratuit crée plusieurs parcours sans 402 ; un compte qui a 3 parcours en attente de modération reçoit 429 rate_limited à la quatrième soumission ; un parcours sorti de l'attente libère la place
  • Le seuil max_pending_routes change sans redéploiement
  • Favoris et programmations sans limite pour tous ; plus aucune occurrence de quota_exceeded dans l'API, packages/shared et l'app
  • Pass 7 jours et déblocage à l'unité entrent dans la règle de droit au parcours, calculée en un seul endroit (livrée par Retirer les coordonnées des étapes d'un parcours Premium de la recherche #161) et partagée par la recherche et la fiche : tests, pour un pass actif et pour un parcours débloqué à l'unité, card de /routes/search déverrouillée (isLocked: false, toutes les étapes) et fiche /routes/:id complète ; pass terminé → card verrouillée et fiche réduite (D-075)

Activity

  1. added this to the v0.4 milestone on Sep 21, 2026
  2. changed the title [-]Appliquer les quotas gratuits et les parcours signature dans l'API[/-] [+]Appliquer les quotas gratuits et les parcours Premium dans l'API[/+] on Sep 23, 2026
  3. changed the title [-]Appliquer les quotas gratuits et les parcours Premium dans l'API[/-] [+]Appliquer la limite de création et les parcours Premium dans l'API[/+] on Sep 24, 2026
  4. IlanAMG commented on Sep 25, 2026

    @IlanAMG
    MemberAuthor

    D-044 (https://github.com/Inprogress-Agency/widoo-app/wiki/Design-Changelog) : débloquer le parcours dès le webhook RevenueCat, y compris après un achat d'abord en attente de validation.

  5. changed the title [-]Appliquer la limite de création et les parcours Premium dans l'API[/-] [+]Appliquer les parcours Premium, le déblocage à l'unité et la limite anti-spam dans l'API[/+] on Sep 28, 2026
  6. IlanAMG commented on Sep 28, 2026

    @IlanAMG
    MemberAuthor

    Révision du 2026-09-28 (décision d'Ilan, https://github.com/Inprogress-Agency/widoo-app/wiki/Compte-et-Monetisation#freemium-mvp) :

  7. IlanAMG commented on Sep 28, 2026

    @IlanAMG
    MemberAuthor

    Règle d'attribution Premium (décision d'Ilan du 2026-09-28, https://github.com/Inprogress-Agency/widoo-app/wiki/Compte-et-Monetisation#freemium-mvp) : automatique, access = premium si 4 étapes ou plus, ou au moins 50 avis avec une note moyenne > 4,5 ; seuils dans settings (premium.min_steps, premium.min_ratings, premium.min_rating), recalcul à la publication et chaque nuit ; une sortie déjà programmée garde l'accès si le parcours devient Premium.

  8. IlanAMG commented on Sep 29, 2026

    @IlanAMG
    MemberAuthor

    D-072 (https://github.com/Inprogress-Agency/widoo-app/wiki/Design-Changelog) :

    • fin du pass à la minute (plan_expires_at = achat + 7 jours exactement) ;
    • parcours débloqué complet pour son acheteur (route_unlocks) ;
    • achats faits sans compte rattachés au compte à la connexion (identifiant RevenueCat anonyme puis logIn).
      Points techniques à trancher ici : type de produit du déblocage (un seul produit à 1,99 € rattaché au parcours côté serveur, consommable, ou un non consommable par parcours, impossible à l'échelle) ; restauration du pass et des déblocages sans compte (reçus du store via RevenueCat).
  9. IlanAMG commented on Sep 29, 2026

    @IlanAMG
    MemberAuthor

    D-073 (https://github.com/Inprogress-Agency/widoo-app/wiki/Design-Changelog) :

    • prolongation du pass : plan_expires_at += 7 jours (au bout du pass en cours, pas depuis l'achat)
    • liste des parcours débloqués de l'utilisateur (page « Parcours débloqués »)
    • rattachement au compte des achats faits sans compte : identifiant anonyme RevenueCat vers users.id à la connexion ; les déblocages ne sont pas restaurables par le store, ils suivent le compte
    • 429 rate_limited à la soumission au-delà de 3 parcours en relecture
  10. PaulThiberville commented on Sep 29, 2026

    @PaulThiberville
    Collaborator

    📋 Report de D-075 (2026-09-29, correction de D-066 sur la card de recherche Premium, décision de Paul au nom d'Ilan ; voir #161) : critère ajouté au corps. Le pass 7 jours et le déblocage à l'unité entrent dans la règle de droit au parcours livrée par #161, calculée en un seul endroit et partagée par /routes/search et /routes/:id.

  11. IlanAMG commented on Sep 29, 2026

    @IlanAMG
    MemberAuthor

    Décision d'Ilan (2026-09-29) sur le rattachement des achats faits sans compte :

    • comportement par défaut de RevenueCat : à la connexion (logIn), les achats de l'identifiant anonyme passent au compte connecté, y compris si ce compte n'est pas celui de l'acheteur (téléphone partagé) ;
    • les lignes route_unlocks de l'identifiant anonyme sont transférées vers users.id au même moment ;
    • sans compte, une réinstallation ou un nouveau téléphone perd les déblocages à l'unité (le pass et l'abonnement se restaurent via le store) : c'est assumé, la feuille « pour le garder » après un déblocage couvre ce cas.
  12. PaulThiberville commented on Oct 13, 2026

    @PaulThiberville
    Collaborator

    📋 Amendement MANAGER du 2026-10-13, suite à la découverte de CODE sur l'Inbox : le corps reprend enfin la révision du 2026-09-28 (D-073, Compte-et-Monetisation › Freemium), déjà annoncée en commentaire mais jamais reportée dans le corps.

    • Retiré : la clé free.max_routes, le 402 create_limit sur POST /routes, les critères « le deuxième parcours reçoit 402 create_limit » et « le seuil free.max_routes change sans redéploiement », et « ne peut plus en créer » après la fin de l'abonnement.
    • Ajouté : la limite anti-spam max_pending_routes (3, 429 rate_limited sur submit), avec ses critères.
    • canCreateRoute de GET /me sort du périmètre : la page API le décrit selon l'ancienne règle, DESIGN tranche dans Aligner Modele-de-Donnees et API sur la création sans limite (D-073) #383.
      Le ticket reste status:ready : tout son périmètre restant est spécifié et validé.
  13. PaulThiberville commented on Oct 14, 2026

    @PaulThiberville
    Collaborator

    🔨 Démarrage — plan, sur la branche issue/66-premium-access-anti-spam :

    1. Table route_unlocks (migration additive 0007, Modele-de-Donnees › route_unlocks) et droit au parcours étendu au déblocage à l'unité dans canAccessRoute, seul endroit de la règle, lu par la recherche (cards) et par la programmation (POST et PATCH /me/planned). Le pass 7 jours passe par users.plan et plan_expires_at, déjà lus par la règle : tests d'intégration ajoutés pour un pass en cours, un pass terminé et un parcours débloqué à l'unité.
    2. Limite anti-spam max_pending_routes (3 par défaut, lue dans settings à chaque soumission) : règle dans packages/shared, contrôle côté API qui répond 429 rate_limited, testé contre la base. POST /routes/:id/submit n'existe pas encore (Gérer PUT /routes/:id/steps, submit, statuts et lien privé #48) : le contrôle est livré prêt à brancher dans sa transaction.
    3. Retrait de quota_exceeded de packages/shared et de l'API, correction du commentaire « signature route » de route.ts (D-014).

    Hors de cette PR, et signalé dans le rapport : canCreateRoute (attend DESIGN dans #383, comportement actuel conservé : le champ n'existe pas dans GET /me), GET /routes/:id (#36), le webhook RevenueCat (#67), l'édition de routes.access par editor (aucune route d'édition n'existe encore).

  14. PaulThiberville commented on Oct 14, 2026

    @PaulThiberville
    Collaborator

    ✅ Vérifié en staging le 2026-10-14 vers 11:20Z (vérification en lecture par l'orchestrateur, consignée par MANAGER) : deploy-staging.yml vert sur 4d2f320 (PR #410), exécution widoo-api-migrate-74s7z réussie à 11:10:14Z (migration 0007, route_unlocks), révision Cloud Run widoo-api-00156-yaj, /v1/health ok. Status du Project → Terminés.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions