Merge remote-tracking branch 'origin/dev' into dev

This commit is contained in:
Maxime Lalo 2024-04-18 11:48:22 +02:00
commit c026e35525
4 changed files with 65 additions and 5 deletions

View File

@ -0,0 +1,30 @@
-- CreateTable
CREATE TABLE "rules_groups" (
"uid" TEXT NOT NULL,
"name" VARCHAR(255) NOT NULL,
"created_at" TIMESTAMP(3) DEFAULT CURRENT_TIMESTAMP,
"updated_at" TIMESTAMP(3),
CONSTRAINT "rules_groups_pkey" PRIMARY KEY ("uid")
);
-- CreateTable
CREATE TABLE "_RulesGroupsHasRules" (
"A" TEXT NOT NULL,
"B" TEXT NOT NULL
);
-- CreateIndex
CREATE UNIQUE INDEX "rules_groups_uid_key" ON "rules_groups"("uid");
-- CreateIndex
CREATE UNIQUE INDEX "_RulesGroupsHasRules_AB_unique" ON "_RulesGroupsHasRules"("A", "B");
-- CreateIndex
CREATE INDEX "_RulesGroupsHasRules_B_index" ON "_RulesGroupsHasRules"("B");
-- AddForeignKey
ALTER TABLE "_RulesGroupsHasRules" ADD CONSTRAINT "_RulesGroupsHasRules_A_fkey" FOREIGN KEY ("A") REFERENCES "rules"("uid") ON DELETE CASCADE ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE "_RulesGroupsHasRules" ADD CONSTRAINT "_RulesGroupsHasRules_B_fkey" FOREIGN KEY ("B") REFERENCES "rules_groups"("uid") ON DELETE CASCADE ON UPDATE CASCADE;

View File

@ -323,9 +323,19 @@ model Rules {
role Roles[] @relation("RolesHasRules") role Roles[] @relation("RolesHasRules")
office_roles OfficeRoles[] @relation("OfficeRolesHasRules") office_roles OfficeRoles[] @relation("OfficeRolesHasRules")
namespace String @db.VarChar(255) @default("notary") namespace String @db.VarChar(255) @default("notary")
groups RulesGroups[] @relation("RulesGroupsHasRules")
@@map("rules") @@map("rules")
} }
model RulesGroups {
uid String @id @unique @default(uuid())
name String @db.VarChar(255)
created_at DateTime? @default(now())
updated_at DateTime? @updatedAt
rules Rules[] @relation("RulesGroupsHasRules")
@@map("rules_groups")
}
model Emails { model Emails {
uid String @id @unique @default(uuid()) uid String @id @unique @default(uuid())
templateName String @db.VarChar(255) templateName String @db.VarChar(255)

View File

@ -24,10 +24,14 @@ export default class StripeWebhooks extends ApiController {
const event = req.body; const event = req.body;
switch (event.type) { switch (event.type) {
case "invoice.payment_succeeded": //Manage plan switch + recurring payment
if (event.data.object.billing_reason !== "subscription_update") break; case "invoice.payment_succeeded":
if (event.data.object.billing_reason !== "subscription_update" && event.data.object.billing_reason !== "subscription_cycle") break;
const stripeSubscription = await this.stripeService.getClient().subscriptions.retrieve(event.data.object.subscription); const stripeSubscription = await this.stripeService.getClient().subscriptions.retrieve(event.data.object.subscription);
if(stripeSubscription.metadata['env'] !== this.backendVariables.ENV) break;
const existingSubscription = await this.subscriptionsService.get({where : {stripe_subscription_id : stripeSubscription.id}}); const existingSubscription = await this.subscriptionsService.get({where : {stripe_subscription_id : stripeSubscription.id}});
if(!existingSubscription[0]) break; if(!existingSubscription[0]) break;
const subscriptionUpdate: any = {}; const subscriptionUpdate: any = {};
@ -42,19 +46,30 @@ export default class StripeWebhooks extends ApiController {
subscriptionUpdate.type = "UNLIMITED"; subscriptionUpdate.type = "UNLIMITED";
} }
const subscriptionEntityUpdate = Subscription.hydrate<Subscription>(subscriptionUpdate); const subscriptionEntityUpdate = Subscription.hydrate<Subscription>(subscriptionUpdate);
await validateOrReject(subscriptionEntityUpdate, { groups: ["updateSubscription"], forbidUnknownValues: false }); await validateOrReject(subscriptionEntityUpdate, { groups: ["updateSubscription"], forbidUnknownValues: false });
await this.subscriptionsService.update(existingSubscription[0].uid ,subscriptionEntityUpdate); await this.subscriptionsService.update(existingSubscription[0].uid ,subscriptionEntityUpdate);
//Manage subscription creation and first payment
case "checkout.session.completed": case "checkout.session.completed":
if (event.data.object.status !== "complete") break; if (event.data.object.status !== "complete") break;
const subscription = JSON.parse(event.data.object.metadata.subscription); const subscription = JSON.parse(event.data.object.metadata.subscription);
const env = event.data.object.metadata.env;
if (env !== this.backendVariables.ENV) break;
subscription.stripe_subscription_id = event.data.object.subscription; subscription.stripe_subscription_id = event.data.object.subscription;
await this.stripeService.getClient().subscriptions.update(subscription.stripe_subscription_id, {
metadata: {
env: env,
},
}
)
const subscriptionInfo = await this.stripeService const subscriptionInfo = await this.stripeService
.getClient() .getClient()
.subscriptions.retrieve(subscription.stripe_subscription_id); .subscriptions.retrieve(subscription.stripe_subscription_id);
@ -65,10 +80,14 @@ export default class StripeWebhooks extends ApiController {
const subscriptionEntity = Subscription.hydrate<Subscription>(subscription); const subscriptionEntity = Subscription.hydrate<Subscription>(subscription);
await validateOrReject(subscriptionEntity, { groups: ["createSubscription"], forbidUnknownValues: false }); await validateOrReject(subscriptionEntity, { groups: ["createSubscription"], forbidUnknownValues: false });
await this.subscriptionsService.create(subscriptionEntity); await this.subscriptionsService.create(subscriptionEntity);
break; break;
//Manage plan expiration
case "customer.subscription.deleted": case "customer.subscription.deleted":
const currentSubscription = await this.stripeService.getClient().subscriptions.retrieve(event.data.object.id);
if(currentSubscription.metadata['env'] !== this.backendVariables.ENV) break;
const subscriptionToDelete = await this.subscriptionsService.get({where : {stripe_subscription_id : event.data.object.id}}); const subscriptionToDelete = await this.subscriptionsService.get({where : {stripe_subscription_id : event.data.object.id}});
if(!subscriptionToDelete[0]) break; if(!subscriptionToDelete[0]) break;
await this.subscriptionsService.delete(subscriptionToDelete[0].uid); await this.subscriptionsService.delete(subscriptionToDelete[0].uid);

View File

@ -30,6 +30,7 @@ export default class StripeService {
cancel_url: this.variables.APP_HOST + "/subscription/error", cancel_url: this.variables.APP_HOST + "/subscription/error",
metadata: { metadata: {
subscription: JSON.stringify(subscription), subscription: JSON.stringify(subscription),
env: this.variables.ENV,
}, },
}); });