mirror of
https://github.com/documenso/documenso.git
synced 2025-11-12 07:43:16 +10:00
## Description Add support for teams which will allow users to collaborate on documents. Teams features allows users to: - Create, manage and transfer teams - Manage team members - Manage team emails - Manage a shared team inbox and documents These changes do NOT include the following, which are planned for a future release: - Team templates - Team API - Search menu integration ## Testing Performed - Added E2E tests for general team management - Added E2E tests to validate document counts ## Checklist - [X] I have tested these changes locally and they work as expected. - [X] I have added/updated tests that prove the effectiveness of these changes. - [ ] I have updated the documentation to reflect these changes, if applicable. - [X] I have followed the project's coding style guidelines.
44 lines
1.3 KiB
TypeScript
44 lines
1.3 KiB
TypeScript
import type Stripe from 'stripe';
|
|
|
|
import { STRIPE_PLAN_TYPE } from '@documenso/lib/constants/billing';
|
|
import { AppError } from '@documenso/lib/errors/app-error';
|
|
|
|
import { getPricesByPlan } from './get-prices-by-plan';
|
|
|
|
export const getTeamPrices = async () => {
|
|
const prices = (await getPricesByPlan(STRIPE_PLAN_TYPE.TEAM)).filter((price) => price.active);
|
|
|
|
const monthlyPrice = prices.find((price) => price.recurring?.interval === 'month');
|
|
const yearlyPrice = prices.find((price) => price.recurring?.interval === 'year');
|
|
const priceIds = prices.map((price) => price.id);
|
|
|
|
if (!monthlyPrice || !yearlyPrice) {
|
|
throw new AppError('INVALID_CONFIG', 'Missing monthly or yearly price');
|
|
}
|
|
|
|
return {
|
|
monthly: {
|
|
friendlyInterval: 'Monthly',
|
|
interval: 'monthly',
|
|
...extractPriceData(monthlyPrice),
|
|
},
|
|
yearly: {
|
|
friendlyInterval: 'Yearly',
|
|
interval: 'yearly',
|
|
...extractPriceData(yearlyPrice),
|
|
},
|
|
priceIds,
|
|
} as const;
|
|
};
|
|
|
|
const extractPriceData = (price: Stripe.Price) => {
|
|
const product =
|
|
typeof price.product !== 'string' && !price.product.deleted ? price.product : null;
|
|
|
|
return {
|
|
priceId: price.id,
|
|
description: product?.description ?? '',
|
|
features: product?.features ?? [],
|
|
};
|
|
};
|