import { Reception } from './classes.reception.js'; import { BillingPlan } from './classes.billingplan.js'; import * as plugins from '../plugins.js'; export class BillingPlanManager { public receptionRef: Reception; public get db() { return this.receptionRef.db.smartdataDb; } public typedrouter = new plugins.typedrequest.TypedRouter(); public CBillingPlan = plugins.smartdata.setDefaultManagerForDoc(this, BillingPlan); constructor(receptionRefArg: Reception) { this.receptionRef = receptionRefArg; this.receptionRef.typedrouter.addTypedRouter(this.typedrouter); this.typedrouter.addTypedHandler(new plugins.typedrequest.TypedHandler('updatePaymentMethod', async reqDataArg => { const user = await this.receptionRef.userManager.getUserByJwt(reqDataArg.jwtString); const organization = await this.receptionRef.organizationmanager.COrganization.getInstance({ id: reqDataArg.orgId, }); const userIsAdmin = await organization.checkIfUserIsAdmin(user); if (!userIsAdmin) { throw new plugins.typedrequest.TypedResponseError('user is not an admin for the organization that the billing plan is for'); } // ok user is admin const newBillingPlan = new this.CBillingPlan(); newBillingPlan.id = plugins.smartunique.shortId(); newBillingPlan.data = { type: 'Paddle', proEnabled: false, organizationId: reqDataArg.orgId, status: 'active', seats: 0, alternativePaymentData: null, billingEvents: [], communications: [], lastProcessed: Date.now(), nextBilling: { items: [], method: 'paddle', ontrack: true, selectedBillingDate: Date.now(), }, paddleData: { checkoutId: reqDataArg.paddle?.checkoutId } } await newBillingPlan.save(); return { billingPlan: { id: newBillingPlan.id, data: { type: newBillingPlan.data.type, organizationId: newBillingPlan.data.organizationId, proEnabled: newBillingPlan.data.proEnabled, nextBilling: newBillingPlan.data.nextBilling, billingEvents: newBillingPlan.data.billingEvents, } } } })); // Paddle configuration endpoint this.typedrouter.addTypedHandler( new plugins.typedrequest.TypedHandler( 'getPaddleConfig', async () => ({ paddleToken: await this.receptionRef.serviceQenv.getEnvVarOnDemand('PADDLE_TOKEN'), paddlePriceId: await this.receptionRef.serviceQenv.getEnvVarOnDemand('PADDLE_PRICE_ID'), }) ) ); } }