111 lines
2.6 KiB
TypeScript
111 lines
2.6 KiB
TypeScript
import { DateTime } from 'luxon';
|
|
import { TSubscription } from '@automatisch/types';
|
|
|
|
import Context from '../../types/express/context';
|
|
import Billing from '../../helpers/billing/index.ee';
|
|
import Execution from '../../models/execution';
|
|
import ExecutionStep from '../../models/execution-step';
|
|
import Subscription from '../../models/subscription.ee';
|
|
|
|
const getBillingAndUsage = async (
|
|
_parent: unknown,
|
|
_params: unknown,
|
|
context: Context
|
|
) => {
|
|
const persistedSubscription = await context.currentUser.$relatedQuery(
|
|
'currentSubscription'
|
|
);
|
|
|
|
const subscription = persistedSubscription
|
|
? paidSubscription(persistedSubscription)
|
|
: freeTrialSubscription();
|
|
|
|
return {
|
|
subscription,
|
|
usage: {
|
|
task: executionStepCount(context),
|
|
},
|
|
};
|
|
};
|
|
|
|
const paidSubscription = (subscription: Subscription): TSubscription => {
|
|
const currentPlan = Billing.paddlePlans.find(
|
|
(plan) => plan.productId === subscription.paddlePlanId
|
|
);
|
|
|
|
return {
|
|
status: subscription.status,
|
|
monthlyQuota: {
|
|
title: currentPlan.limit,
|
|
action: {
|
|
type: 'link',
|
|
text: 'Cancel plan',
|
|
src: subscription.cancelUrl,
|
|
},
|
|
},
|
|
nextBillAmount: {
|
|
title: subscription.nextBillAmount
|
|
? '€' + subscription.nextBillAmount
|
|
: '---',
|
|
action: {
|
|
type: 'link',
|
|
text: 'Update payment method',
|
|
src: subscription.updateUrl,
|
|
},
|
|
},
|
|
nextBillDate: {
|
|
title: subscription.nextBillDate ? subscription.nextBillDate : '---',
|
|
action: {
|
|
type: 'text',
|
|
text: '(monthly payment)',
|
|
},
|
|
},
|
|
};
|
|
};
|
|
|
|
const freeTrialSubscription = (): TSubscription => {
|
|
return {
|
|
status: null,
|
|
monthlyQuota: {
|
|
title: 'Free Trial',
|
|
action: {
|
|
type: 'link',
|
|
text: 'Upgrade plan',
|
|
src: '/settings/billing/upgrade',
|
|
},
|
|
},
|
|
nextBillAmount: {
|
|
title: '---',
|
|
action: null,
|
|
},
|
|
nextBillDate: {
|
|
title: '---',
|
|
action: null,
|
|
},
|
|
};
|
|
};
|
|
|
|
const executionIds = async (context: Context) => {
|
|
return (
|
|
await context.currentUser
|
|
.$relatedQuery('executions')
|
|
.select('executions.id')
|
|
).map((execution: Execution) => execution.id);
|
|
};
|
|
|
|
const executionStepCount = async (context: Context) => {
|
|
const executionStepCount = await ExecutionStep.query()
|
|
.whereIn('execution_id', await executionIds(context))
|
|
.andWhere(
|
|
'created_at',
|
|
'>=',
|
|
DateTime.now().minus({ days: 30 }).toISODate()
|
|
)
|
|
.count()
|
|
.first();
|
|
|
|
return executionStepCount.count;
|
|
};
|
|
|
|
export default getBillingAndUsage;
|