Files
automatisch/packages/backend/src/helpers/billing/webhooks.ee.ts
2023-04-06 13:08:49 +00:00

81 lines
2.4 KiB
TypeScript

import { IRequest } from '@automatisch/types';
import Subscription from '../../models/subscription.ee';
import Billing from './index.ee';
const handleSubscriptionCreated = async (request: IRequest) => {
const subscription = await Subscription.query().insertAndFetch(formatSubscription(request));
await subscription.$relatedQuery('usageData').insert(formatUsageData(request));
};
const handleSubscriptionUpdated = async (request: IRequest) => {
await Subscription
.query()
.findOne({
paddle_subscription_id: request.body.subscription_id,
})
.patch(formatSubscription(request));
};
const handleSubscriptionCancelled = async (request: IRequest) => {
const subscription = await Subscription
.query()
.findOne({
paddle_subscription_id: request.body.subscription_id,
})
.patchAndFetch(formatSubscription(request));
if (request.body.status === 'deleted') {
await subscription.$query().delete();
}
};
const handleSubscriptionPaymentSucceeded = async (request: IRequest) => {
const subscription = await Subscription.query()
.findOne({
paddle_subscription_id: request.body.subscription_id,
})
.throwIfNotFound();
const remoteSubscription = await Billing.paddleClient.getSubscription(
Number(subscription.paddleSubscriptionId)
);
await subscription.$query().patch({
nextBillAmount: remoteSubscription.next_payment.amount.toFixed(2),
nextBillDate: remoteSubscription.next_payment.date,
lastBillDate: remoteSubscription.last_payment.date,
});
await subscription.$relatedQuery('usageData').insert(formatUsageData(request));
};
const formatSubscription = (request: IRequest) => {
return {
userId: JSON.parse(request.body.passthrough).id,
paddleSubscriptionId: request.body.subscription_id,
paddlePlanId: request.body.subscription_plan_id,
cancelUrl: request.body.cancel_url,
updateUrl: request.body.update_url,
status: request.body.status,
nextBillDate: request.body.next_bill_date,
nextBillAmount: request.body.unit_price,
};
};
const formatUsageData = (request: IRequest) => {
return {
userId: JSON.parse(request.body.passthrough).id,
consumedTaskCount: 0,
nextResetAt: request.body.next_bill_date,
};
};
const webhooks = {
handleSubscriptionCreated,
handleSubscriptionUpdated,
handleSubscriptionCancelled,
handleSubscriptionPaymentSucceeded,
};
export default webhooks;