Licences et projets
Le statut d'une licence d'après son abonnement, le quota, les projets du client, leurs identifiants, la synchronisation et la révocation.
Une licence est ce qu'un abonnement donne au client : le droit d'avoir un certain nombre de projets, et un identifiant actif pour chacun. Cette page décrit comment la licence suit son abonnement, et ce que le client et l'administration font de ses projets.
Le statut suit l'abonnement
| Statut | Libellé | Ce qu'il signifie | Identifiants |
|---|---|---|---|
pending | En attente du paiement | Souscrit, la première facture n'est pas payée. | Coupés |
active | Active | Abonnement payé, ou en essai. | Actifs |
grace | Paiement en retard | Le renouvellement est impayé, le délai de grâce court. | Actifs |
suspended | Suspendue | L'abonnement a pris fin. Les projets sont gardés. | Coupés |
revoked | Révoquée | Suspendue trop longtemps, ou révoquée par l'administration. | Révoqués |
Le module écoute les événements de Facturation, dans leur transaction :
| Événement de Facturation | Effet sur la licence |
|---|---|
subscription.created | Crée la licence : active pour un essai, pending sinon. |
subscription.activated, subscription.renewed | active. Les identifiants coupés sont rétablis. |
subscription.past_due | grace, avec la fin de la grâce. Rien n'est coupé. |
subscription.ended | suspended, quelle que soit la raison de la fin. |
subscription.plan_changed | Une fois effectif : la nouvelle offre et son quota. Une descente programmée pour le renouvellement n'est d'abord qu'inscrite à l'historique. |
subscription.cancel_scheduled, subscription.resumed | Historique seulement : la licence reste active jusqu'à la fin de la période payée. |
Chaque événement n'est appliqué qu'une fois : son identifiant est gardé sur la ligne d'historique qu'il produit, et un événement déjà vu est ignoré. Un gestionnaire qui échoue annule le changement de Facturation avec lui : le paiement d'un webhook Stripe est alors refusé, et Stripe le relivre.
Le client qui revient
Un client dont l'abonnement a pris fin retrouve sa licence suspendue en souscrivant de nouveau : elle passe sur le nouvel abonnement, avec ses projets et leurs identifiants. Tant que le premier paiement n'est pas reçu, elle reste pending, et ses identifiants restent coupés. Le délai de révocation ne repart qu'au paiement. Une licence révoquée n'est jamais reprise : le client repart d'une licence vide.
Le quota
Le quota est celui de l'offre de la licence, réglé dans Quotas. Seuls les projets actifs comptent.
- Un projet de plus que le quota est refusé (
quota_reached). Le client retire un projet, ou passe à une offre supérieure. - Une montée (vers une offre plus chère) est immédiate, au paiement de sa facture : le nouveau quota s'applique tout de suite.
- Une descente est programmée pour le renouvellement. D'ici là, la section « Projets » prévient le client du nouveau quota et de la date. Au renouvellement qui l'applique, s'il reste plus de projets actifs que le nouveau quota, les plus récents passent
suspended. Rien n'est retiré : un projet suspendu revient quand une place se libère, ou avec une offre supérieure. - Changer le quota d'une offre dans Quotas ne touche à aucun projet existant : un quota plus bas refuse seulement les nouveaux.
- Une offre retirée des quotas ne donne plus aucun projet aux licences qui l'auraient encore. Le retrait est refusé tant qu'une licence non révoquée l'utilise (
plan_has_licenses).
Usage raisonnable. Une licence qui dépasse le seuil de son offre déclenche une notification aux détenteurs de licenses.manage, une seule fois par licence. Rien n'est bloqué.
Les projets
Le client gère ses projets depuis la section « Projets » de son espace client. Pour chaque licence : l'offre et son statut, le quota (« 12 / 30 projets actifs », ou « 12 projets, sans limite ») avec sa barre de remplissage, le bouton « Nouveau projet », puis le tableau des projets : nom, identifiant, date de création, dernière utilisation, statut, et un menu « … » par ligne. Les avis de paiement en retard, d'abonnement terminé, d'attente du premier paiement et de descente programmée s'affichent sous l'en-tête.
L'adresse ?nouveau=1 (/compte/projets?nouveau=1 par défaut) ouvre le formulaire de création à l'arrivée, sur la première licence qui peut encore recevoir un projet. Le paramètre est ensuite retiré de l'adresse, pour qu'un rechargement ne rouvre pas le formulaire.
| Action | Effet |
|---|---|
| Nouveau projet | Un nom, de 1 à 100 caractères. Le projet reçoit un identifiant chez le fournisseur. Avec Verdaccio, sa clé fzk_… et les lignes à coller dans le .npmrc du projet s'affichent une seule fois. |
| Régénérer la clé | Une nouvelle clé remplace l'ancienne, qui est révoquée tout de suite. La nouvelle s'affiche une fois, et le client remplace la ligne de son .npmrc. |
| Retirer le projet | Définitif : le projet ne compte plus, sa clé est révoquée. |
La colonne « Identifiant » donne l'identifiant du projet au registre, fz-… avec Verdaccio : c'est ce que répond npm whoami, et ce que le support demande. Régénérer la clé et retirer le projet passent par le menu « … » de la ligne, puis par une fenêtre de confirmation. La création est refusée hors des statuts active et grace (license_inactive).
La clé tout juste créée s'affiche dans une carte au-dessus du tableau : l'avertissement « Cette clé n'est affichée qu'une fois. », les lignes du .npmrc et un bouton « Copier ». La carte se ferme sur « J'ai copié la clé », et la clé n'est plus lisible nulle part.
La carte de l'accueil du compte
La section déclare un Summary : sur l'accueil de l'espace client, une carte « Projets » montre l'offre et le statut de la licence principale, le quota en usage avec sa barre (en teinte de danger une fois le quota atteint), une ligne d'alerte pour une licence en retard de paiement, suspendue ou en attente du paiement, puis les liens « Créer un projet » (vers ?nouveau=1, seulement si la licence peut recevoir un projet) et « Voir les projets ». La licence principale est la première de la section : une licence active ou en retard avant les autres, puis la plus récente. Un compte sans licence n'a pas de carte.
Pour une page du projet qui veut ces chiffres sans la carte, getAccountLicenseSummary(userId) de ./server les donne. Voir API.
Chaque action passe par la fiche de facturation liée au compte connecté : un projet d'un autre client répond 404, comme un projet qui n'existe pas.
Depuis l'admin, sur la page d'une licence : suspendre un projet (il ne compte plus, sa clé est coupée), le rétablir dans la limite du quota, le retirer, ou régénérer sa clé. Une clé régénérée par l'administration n'est montrée à personne : à réserver à une clé compromise, le client en régénère ensuite une depuis son espace.
Les identifiants
Chaque projet a au plus un identifiant en service. Avec Verdaccio, c'est un nom au registre, fz-…, et une clé, fzk_…. Son état voulu se déduit, à un seul endroit du code, du statut de la licence et de celui du projet :
| Licence | Projet | État voulu |
|---|---|---|
active, grace | active | active |
pending, suspended | quel qu'il soit, sauf retiré | suspended |
| quelle qu'elle soit | suspended | suspended |
revoked | quel qu'il soit | revoked |
| quelle qu'elle soit | revoked | revoked |
Un identifiant remplacé par une régénération est révoqué pour de bon, quoi que fasse la licence ensuite.
La base ne garde que le SHA-256 du secret, la clé avec Verdaccio : il est aléatoire et long, un hachage lent n'ajouterait rien. Le registre retrouve une clé par ce hachage. Une copie de la base n'ouvre aucun projet.
La synchronisation
Les événements et les actions n'écrivent que l'état voulu. La tâche licenses-sync, chaque minute, appelle le connecteur qui a créé l'identifiant pour appliquer cet état, et note l'état appliqué. Un appel qui échoue garde son erreur sur la ligne, visible dans l'admin, et la tâche le reprend de moins en moins souvent : après 2, 4, 8 minutes, puis toutes les heures au plus. « Synchroniser maintenant », dans l'admin, ignore cette attente.
Aucun appel au connecteur n'a lieu dans une transaction : un fournisseur lent ne tient aucun verrou, ni du module, ni de Facturation.
Avec le connecteur verdaccio, il n'y a rien à pousser : le registre lit l'état voulu à chaque vérification. Voir Connecteurs et Verdaccio.
La révocation
Une licence suspendue garde ses projets, pour le client qui revient. La tâche de nuit la révoque après FRAZA_MODULE_LICENSES_REVOKE_AFTER_DAYS jours de suspension (365 par défaut) : la licence, ses projets et leurs identifiants passent revoked, et la section « Projets » du client ne la montre plus. L'administration peut aussi révoquer tout de suite une licence suspendue, depuis sa page.