0.13.13 : fix Stripe entitlement loop (maxChoirs never credited)
Build release Docker image / Build Docker Images (push) Successful in 7m32s
Build release Docker image / Build Docker Images (push) Successful in 7m32s
- 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>
This commit is contained in:
@@ -8,6 +8,18 @@ export default factories.createCoreController(
|
||||
"api::choral.choral",
|
||||
({ strapi }) => ({
|
||||
async create(ctx) {
|
||||
// Contrôle du crédit de création côté serveur (le front bloque aussi,
|
||||
// mais seul ce contrôle fait foi).
|
||||
const user = ctx.state.user;
|
||||
if (!user) {
|
||||
return ctx.unauthorized();
|
||||
}
|
||||
if (!user.maxChoirs || user.maxChoirs <= 0) {
|
||||
return ctx.forbidden(
|
||||
"Plus de crédit de création de chorale. Mettez à jour votre abonnement.",
|
||||
);
|
||||
}
|
||||
|
||||
const data = JSON.parse(ctx.request.body.data);
|
||||
|
||||
if (ctx.request.files.coverImage) {
|
||||
@@ -31,6 +43,13 @@ export default factories.createCoreController(
|
||||
|
||||
ctx.request.body = { data };
|
||||
const result = await super.create(ctx);
|
||||
|
||||
// Décrémente le crédit de création une fois la chorale créée.
|
||||
await strapi.db.query("plugin::users-permissions.user").update({
|
||||
where: { id: user.id },
|
||||
data: { maxChoirs: user.maxChoirs - 1 },
|
||||
});
|
||||
|
||||
return result;
|
||||
},
|
||||
}),
|
||||
|
||||
@@ -34,6 +34,14 @@ export default factories.createCoreController(
|
||||
| "pro"
|
||||
| "premium";
|
||||
|
||||
// Capacité de création de chorales par plan (cf. offres du front,
|
||||
// UserSubscriptionTab : pro = "1 chorale", premium = "5 chorales").
|
||||
const PLAN_MAX_CHOIRS: Record<string, number> = {
|
||||
free: 0,
|
||||
pro: 1,
|
||||
premium: 5,
|
||||
};
|
||||
|
||||
if (userId) {
|
||||
try {
|
||||
// Création de la commande
|
||||
@@ -46,19 +54,20 @@ export default factories.createCoreController(
|
||||
},
|
||||
});
|
||||
|
||||
// Mise à jour de l'utilisateur
|
||||
// Mise à jour de l'utilisateur : plan + crédit de création de
|
||||
// chorales + identifiants Stripe (résiliation/portail client).
|
||||
await strapi.documents("plugin::users-permissions.user").update({
|
||||
documentId: userId,
|
||||
data: {
|
||||
isPremium: true,
|
||||
subscriptionPlan: planType,
|
||||
maxChoirs: PLAN_MAX_CHOIRS[planType] ?? 0,
|
||||
stripeCustomerId: session.customer as string,
|
||||
subscriptionId: session.subscription as string,
|
||||
stripeSubscriptionId: session.subscription as string,
|
||||
trialStartedAt: null,
|
||||
},
|
||||
});
|
||||
strapi.log.info(
|
||||
`✅ Droits mis à jour pour l'utilisateur ${userId}`,
|
||||
`✅ Droits mis à jour pour l'utilisateur ${userId} : plan ${planType}, maxChoirs ${PLAN_MAX_CHOIRS[planType] ?? 0}`,
|
||||
);
|
||||
} catch (dbError) {
|
||||
strapi.log.error(`❌ Erreur base de données : ${dbError.message}`);
|
||||
|
||||
@@ -267,6 +267,14 @@
|
||||
},
|
||||
"smartTags": {
|
||||
"type": "json"
|
||||
},
|
||||
"stripeCustomerId": {
|
||||
"type": "string",
|
||||
"private": true
|
||||
},
|
||||
"stripeSubscriptionId": {
|
||||
"type": "string",
|
||||
"private": true
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user