all repos — caroster @ 711e096e465403cc87ebe6dee546bd8c28f5e643

[Octree] Group carpool to your event https://caroster.io

backend/src/api/stripe/services/stripe.ts (view raw)

 1import type { Stripe } from "stripe";
 2
 3export default () => ({
 4  async enableModule(stripeEvent: Stripe.CheckoutSessionCompletedEvent) {
 5    const eventUuid = stripeEvent.data.object.client_reference_id;
 6    if (!eventUuid) {
 7      strapi.log.error(
 8        `Can't retrieve event UUID in Stripe webhook. Webhook ID: ${stripeEvent.id}`
 9      );
10      return;
11    }
12
13    if (stripeEvent.data.object.payment_status !== "paid") {
14      strapi.log.error(
15        `Can't enable module for event UUID ${eventUuid} as payment status is not 'paid'. Webhook ID: ${stripeEvent.id}`
16      );
17      return;
18    }
19
20    const paymentLink = stripeEvent.data.object.payment_link as string;
21    const moduleProduct = await getModuleProduct(paymentLink);
22    if (!moduleProduct) {
23      strapi.log.error(
24        `Can't retrieve product/module in Stripe webhook. Is module enabled ? Webhook ID: ${stripeEvent.id}`
25      );
26      return;
27    }
28
29    const event = await strapi.db.query("api::event.event").findOne({
30      where: { uuid: eventUuid },
31    });
32    if (!event) {
33      strapi.log.error(
34        `Can't retrieve event with UUID ${eventUuid}. Webhook ID: ${stripeEvent.id}`
35      );
36      return;
37    }
38
39    try {
40      const enabledModules = event.enabled_modules
41        ? [...event.enabled_modules, moduleProduct]
42        : [moduleProduct];
43      await strapi.db.query("api::event.event").update({
44        where: { uuid: eventUuid },
45        data: { enabled_modules: enabledModules },
46      });
47      strapi.log.info(
48        `Module '${moduleProduct}' enabled for event ${eventUuid}`
49      );
50    } catch (error) {
51      strapi.log.error(
52        `Can't enable module ${moduleProduct} for event ${eventUuid}: ${error}`
53      );
54    }
55  },
56});
57
58const getModuleProduct = async (paymentLink: string) => {
59  const modulesConfig = await strapi.entityService.findOne(
60    "api::module.module",
61    1
62  );
63  const modules = [];
64  if (modulesConfig.caroster_plus_enabled) {
65    modules.push([
66      modulesConfig.caroster_plus_payment_link_id,
67      "caroster-plus",
68    ]);
69  }
70  return Object.fromEntries(modules)[paymentLink];
71};