From cb30d5e324ee0b19f24b8325526b79daf7f7ce72 Mon Sep 17 00:00:00 2001 From: Nevo David Date: Tue, 13 Aug 2024 12:42:19 +0700 Subject: [PATCH] feat: add subscription --- .../src/api/routes/billing.controller.ts | 16 +++++- .../src/components/layout/impersonate.tsx | 49 ++++++++++++++++++- .../subscriptions/subscription.repository.ts | 11 +++++ .../subscriptions/subscription.service.ts | 26 ++++++++-- 4 files changed, 97 insertions(+), 5 deletions(-) diff --git a/apps/backend/src/api/routes/billing.controller.ts b/apps/backend/src/api/routes/billing.controller.ts index 32afd36b..988eabc1 100644 --- a/apps/backend/src/api/routes/billing.controller.ts +++ b/apps/backend/src/api/routes/billing.controller.ts @@ -2,9 +2,10 @@ import { Body, Controller, Get, Param, Post } from '@nestjs/common'; import { SubscriptionService } from '@gitroom/nestjs-libraries/database/prisma/subscriptions/subscription.service'; import { StripeService } from '@gitroom/nestjs-libraries/services/stripe.service'; import { GetOrgFromRequest } from '@gitroom/nestjs-libraries/user/org.from.request'; -import { Organization } from '@prisma/client'; +import { Organization, User } from '@prisma/client'; import { BillingSubscribeDto } from '@gitroom/nestjs-libraries/dtos/billing/billing.subscribe.dto'; import { ApiTags } from '@nestjs/swagger'; +import { GetUserFromRequest } from '@gitroom/nestjs-libraries/user/user.from.request'; @ApiTags('Billing') @Controller('/billing') @@ -71,4 +72,17 @@ export class BillingController { ) { return this._stripeService.lifetimeDeal(org.id, body.code); } + + @Post('/add-subscription') + async addSubscription( + @Body() body: { subscription: string }, + @GetUserFromRequest() user: User, + @GetOrgFromRequest() org: Organization + ) { + if (!user.isSuperAdmin) { + throw new Error('Unauthorized'); + } + + await this._subscriptionService.addSubscription(org.id, user.id, body.subscription); + } } diff --git a/apps/frontend/src/components/layout/impersonate.tsx b/apps/frontend/src/components/layout/impersonate.tsx index b8252b78..f13ad7b0 100644 --- a/apps/frontend/src/components/layout/impersonate.tsx +++ b/apps/frontend/src/components/layout/impersonate.tsx @@ -1,9 +1,55 @@ import { Input } from '@gitroom/react/form/input'; -import { useCallback, useMemo, useState } from 'react'; +import { ChangeEventHandler, useCallback, useMemo, useState } from 'react'; import useSWR from 'swr'; import { useFetch } from '@gitroom/helpers/utils/custom.fetch'; import { useUser } from '@gitroom/frontend/components/layout/user.context'; +import { Select } from '@gitroom/react/form/select'; +import { pricing } from '@gitroom/nestjs-libraries/database/prisma/subscriptions/pricing'; +import { deleteDialog } from '@gitroom/react/helpers/delete.dialog'; +export const Subscription = () => { + const fetch = useFetch(); + const addSubscription: ChangeEventHandler = useCallback( + async (e) => { + const value = e.target.value; + if ( + await deleteDialog( + 'Are you sure you want to add a user subscription?', + 'Add' + ) + ) { + await fetch('/billing/add-subscription', { + method: 'POST', + body: JSON.stringify({ subscription: value }), + }); + + window.location.reload(); + } + }, + [] + ); + + return ( + + ); +}; export const Impersonate = () => { const fetch = useFetch(); const [name, setName] = useState(''); @@ -76,6 +122,7 @@ export const Impersonate = () => { X + {user?.tier?.current === 'FREE' && } ) : (