From f06fcf4716bc9491d8772e4e04c5c4606d82d70e Mon Sep 17 00:00:00 2001 From: capJavert Date: Tue, 16 Dec 2025 17:13:01 +0100 Subject: [PATCH 1/2] feat: save plan and batch size on recruiter sub creation --- src/common/paddle/recruiter/processing.ts | 32 +++++++++++++++++++++-- src/common/paddle/recruiter/types.ts | 4 +++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/common/paddle/recruiter/processing.ts b/src/common/paddle/recruiter/processing.ts index bb46e51399..15b447667a 100644 --- a/src/common/paddle/recruiter/processing.ts +++ b/src/common/paddle/recruiter/processing.ts @@ -12,12 +12,18 @@ import { } from '../../plus/subscription'; import { logger } from '../../../logger'; import { OpportunityJob } from '../../../entity/opportunities/OpportunityJob'; -import { recruiterPaddleCustomDataSchema } from './types'; +import { + recruiterPaddleCustomDataSchema, + recruiterPaddlePricingCustomDataSchema, +} from './types'; import { ensureOpportunityPermissions, OpportunityPermissions, } from '../../opportunity/accessControl'; -import { updateRecruiterSubscriptionFlags } from '../../utils'; +import { + updateFlagsStatement, + updateRecruiterSubscriptionFlags, +} from '../../utils'; import { OpportunityState } from '@dailydotdev/schema'; import { Organization } from '../../../entity/Organization'; @@ -84,6 +90,24 @@ export const createOpportunitySubscription = async ({ permission: OpportunityPermissions.Edit, }); + if (data.items.length > 1) { + throw new Error( + 'Multiple recruiter subscription items not supported on creation, check payment manually', + ); + } + + const price = event.data?.items?.[0]?.price; + + if (!price) { + throw new Error( + 'Price information missing from recruiter subscription data', + ); + } + + const priceCustomData = recruiterPaddlePricingCustomDataSchema.parse( + price.customData, + ); + await con.transaction(async (entityManager) => { await entityManager.getRepository(Organization).update( { @@ -114,6 +138,10 @@ export const createOpportunitySubscription = async ({ }, { state: OpportunityState.IN_REVIEW, + flags: updateFlagsStatement({ + batchSize: priceCustomData.batch_size, + plan: price.id, + }), }, ); }); diff --git a/src/common/paddle/recruiter/types.ts b/src/common/paddle/recruiter/types.ts index 0ce05c792e..cadfb6a662 100644 --- a/src/common/paddle/recruiter/types.ts +++ b/src/common/paddle/recruiter/types.ts @@ -4,3 +4,7 @@ export const recruiterPaddleCustomDataSchema = z.object({ user_id: z.string(), opportunity_id: z.uuid(), }); + +export const recruiterPaddlePricingCustomDataSchema = z.object({ + batch_size: z.coerce.number().nonnegative().max(10_000), +}); From 0f8904de444f7bfbffc238b0c1c84d2e189656d0 Mon Sep 17 00:00:00 2001 From: capJavert Date: Tue, 16 Dec 2025 17:44:56 +0100 Subject: [PATCH 2/2] feat: small adjust --- src/common/paddle/recruiter/processing.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/paddle/recruiter/processing.ts b/src/common/paddle/recruiter/processing.ts index 15b447667a..28ea8df024 100644 --- a/src/common/paddle/recruiter/processing.ts +++ b/src/common/paddle/recruiter/processing.ts @@ -90,7 +90,7 @@ export const createOpportunitySubscription = async ({ permission: OpportunityPermissions.Edit, }); - if (data.items.length > 1) { + if (event.data?.items?.length > 1) { throw new Error( 'Multiple recruiter subscription items not supported on creation, check payment manually', );