diff --git a/.helm b/.helm index 3deb512e412..3f3dd3b2ec6 160000 --- a/.helm +++ b/.helm @@ -1 +1 @@ -Subproject commit 3deb512e412a8e3ee12903870a34a7b0751139dc +Subproject commit 3f3dd3b2ec6529a5fcc76a97b75161b1adc63774 diff --git a/apps/condo/domains/common/constants/webhooks.js b/apps/condo/domains/common/constants/webhooks.js index 366e7333790..b84aea8f4e7 100644 --- a/apps/condo/domains/common/constants/webhooks.js +++ b/apps/condo/domains/common/constants/webhooks.js @@ -1,10 +1,13 @@ const WEBHOOK_EVENT_PAYMENT_STATUS_UPDATED = 'payment.status.updated' +const WEBHOOK_EVENT_SUBSCRIPTION_ACTIVATED = 'subscription.activated' const WEBHOOK_EVENTS = [ WEBHOOK_EVENT_PAYMENT_STATUS_UPDATED, + WEBHOOK_EVENT_SUBSCRIPTION_ACTIVATED, ] module.exports = { WEBHOOK_EVENT_PAYMENT_STATUS_UPDATED, + WEBHOOK_EVENT_SUBSCRIPTION_ACTIVATED, WEBHOOK_EVENTS, } diff --git a/apps/condo/domains/subscription/schema/ActivateSubscriptionContextService.js b/apps/condo/domains/subscription/schema/ActivateSubscriptionContextService.js index bc4822bf800..d90f5915a15 100644 --- a/apps/condo/domains/subscription/schema/ActivateSubscriptionContextService.js +++ b/apps/condo/domains/subscription/schema/ActivateSubscriptionContextService.js @@ -2,14 +2,17 @@ * Generated by `createservice subscription.ActivateSubscriptionContextService --type mutations` */ +const conf = require('@open-condo/config') const { GQLError, GQLErrorCode: { BAD_USER_INPUT } } = require('@open-condo/keystone/errors') const { getLogger } = require('@open-condo/keystone/logging') -const { GQLCustomSchema, find, getById, itemsQuery } = require('@open-condo/keystone/schema') +const { GQLCustomSchema, find, getById, getSchemaCtx, itemsQuery } = require('@open-condo/keystone/schema') +const { queueWebhookPayload } = require('@open-condo/webhooks/utils/queueWebhookPayload') const { PAYMENT_DONE_STATUS, } = require('@condo/domains/acquiring/constants/payment') const { freezePaymentInfo } = require('@condo/domains/acquiring/utils/billingFridge') +const { WEBHOOK_EVENT_SUBSCRIPTION_ACTIVATED } = require('@condo/domains/common/constants/webhooks') const { INVOICE_STATUS_PAID } = require('@condo/domains/marketplace/constants') const access = require('@condo/domains/subscription/access/ActivateSubscriptionContextService') const { SUBSCRIPTION_CONTEXT_STATUS } = require('@condo/domains/subscription/constants') @@ -170,6 +173,48 @@ const ActivateSubscriptionContextService = new GQLCustomSchema('ActivateSubscrip frozenPaymentInfo, }) + const webhookUrl = conf['SUBSCRIPTION_ACTIVATED_WEBHOOK_URL'] + const webhookSecret = conf['SUBSCRIPTION_ACTIVATED_WEBHOOK_SECRET'] + if (webhookUrl && webhookSecret) { + try { + const { keystone: internalContext } = getSchemaCtx('WebhookPayload') + const payerOrg = await getById('Organization', invoice.payerOrganization) + if (!payerOrg) { + throw new Error(`Organization not found: ${invoice.payerOrganization}`) + } + const createdByUser = invoice.createdBy + ? await getById('User', invoice.createdBy) + : null + await queueWebhookPayload(internalContext, { + url: webhookUrl, + secret: webhookSecret, + eventType: WEBHOOK_EVENT_SUBSCRIPTION_ACTIVATED, + modelName: 'SubscriptionContext', + itemId: subscriptionContext.id, + payload: { + invoiceId: invoice.id, + paidAt: invoice.paidAt, + toPay: invoice.toPay, + planName: invoice.rows?.[0]?.name, + organization: { + id: payerOrg.id, + name: payerOrg.name, + tin: payerOrg.tin, + }, + ...(createdByUser && { + user: { + id: createdByUser.id, + name: createdByUser.name, + }, + }), + }, + sender: { dv: 1, fingerprint: 'activateSubscriptionContext' }, + }) + } catch (err) { + logger.error({ msg: 'Failed to queue subscription webhook', err, data: { subscriptionContextId: subscriptionContext.id } }) + } + } + const updatedSubscriptionContext = await getById('SubscriptionContext', subscriptionContext.id) logger.info({ msg: 'Subscription context activated successfully', data: { subscriptionContextId: subscriptionContext.id, status: updatedSubscriptionContext.status, bindingId: updatedSubscriptionContext.bindingId } }) diff --git a/apps/condo/schema.graphql b/apps/condo/schema.graphql index f6cb4c53019..85274d18322 100644 --- a/apps/condo/schema.graphql +++ b/apps/condo/schema.graphql @@ -91911,7 +91911,7 @@ type WebhookPayload { """ secret: String - """ Type of event that triggered this webhook. Custom events: payment.status.updated. Auto-generated events from models with webHooked() plugin: ModelName.created, ModelName.updated, ModelName.deleted (e.g., Payment.created, Ticket.updated). + """ Type of event that triggered this webhook. Custom events: payment.status.updated, subscription.activated. Auto-generated events from models with webHooked() plugin: ModelName.created, ModelName.updated, ModelName.deleted (e.g., Payment.created, Ticket.updated). """ eventType: String diff --git a/apps/condo/schema.ts b/apps/condo/schema.ts index f7f10631351..25dcd43cbfe 100644 --- a/apps/condo/schema.ts +++ b/apps/condo/schema.ts @@ -120089,7 +120089,7 @@ export type WebhookPayload = { deletedAt?: Maybe; /** Data structure Version */ dv?: Maybe; - /** Type of event that triggered this webhook. Custom events: payment.status.updated. Auto-generated events from models with webHooked() plugin: ModelName.created, ModelName.updated, ModelName.deleted (e.g., Payment.created, Ticket.updated). */ + /** Type of event that triggered this webhook. Custom events: payment.status.updated, subscription.activated. Auto-generated events from models with webHooked() plugin: ModelName.created, ModelName.updated, ModelName.deleted (e.g., Payment.created, Ticket.updated). */ eventType?: Maybe; /** Timestamp after which no more send attempts will be made */ expiresAt?: Maybe;