Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 0 additions & 5 deletions .env.e2e.example
Original file line number Diff line number Diff line change
@@ -1,14 +1,9 @@
NODE_ENV=development
SERVER_PORT=8003
MONGO_URI=mongodb://admin:password@payments-mongo:27018/payments
STORAGE_GATEWAY_SECRET=
STORAGE_GATEWAY_URL=
STRIPE_SECRET_KEY=get_it_from_stripe_dev_section
STRIPE_WEBHOOK_KEY=
JWT_SECRET=38FTANE5LY90NHYZ
DRIVE_GATEWAY_URL=localhost:3000
DRIVE_GATEWAY_USER=user
DRIVE_GATEWAY_PASSWORD=gatewaypass
REDIS_HOST=payments-redis:6379
REDIS_PASSWORD=
DRIVE_NEW_GATEWAY_URL=http://drive-server-wip:3004/api
Expand Down
7 changes: 0 additions & 7 deletions .env.template
Original file line number Diff line number Diff line change
@@ -1,17 +1,11 @@
NODE_ENV=development
SERVER_PORT=8003
MONGO_URI=mongodb://admin:password@payments-database:27017/payments
STORAGE_GATEWAY_SECRET=gateway_secret
STORAGE_GATEWAY_URL=gateway_url
STRIPE_SECRET_KEY=get_it_from_stripe_dev_section
STRIPE_WEBHOOK_KEY=webhook_key
JWT_SECRET=38FTANE5LY90NHYZ
DRIVE_GATEWAY_URL=http://drive-server:8000
DRIVE_GATEWAY_USER=user
DRIVE_GATEWAY_PASSWORD=gatewaypass
REDIS_HOST=payments-cache
REDIS_PASSWORD=
COMEBACK_COUPON_CODE=
DRIVE_NEW_GATEWAY_URL=http://drive-server-wip:3004/api
DRIVE_NEW_GATEWAY_SECRET=LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlFcFFJQkFBS0NBUUVBNG5lZS9GOTgvME4yYWxTSkNyZzB5bzJRRysydzR5SGk3ZXVDT3JYYUhENzFmN0NrClhMVnR5cVkxUUVjRVZxbkJuUFJ1aUdRL0pJc1pCSlV4aEE5TmdwdUpIbVY0aytnMEorRGcxeS9wd3k4L0lNM0EKYU5zbVlqeHNDWUFGQUloalA2TWZQbFUzU2FncnpFUTZJRVNzeHBzT1JhRXd3WUZIWm42TU50b0FGbktMb3VlMQpaa1FaUkpVcDRmUkpTL3Bja3VTUjY2RXIxSzI4WHJKYnhhOXpCNG9SbFJMb0ExQ2cvTFN6ZEFQc2lVMzlSOWtlCmpsQSsxTjJMS1VhazVSdzljeU5DNDd5R0t2YnErdk0zWGlBZk43Wk1teTdkY09aeXcyZW9idFFUVzVtTmR1WEkKVjh4VnllMzJKcmNwbmFlamw5VDBuU1hiRFhPTldnejdJVnJqNFFJREFRQUJBb0lCQVFDeXBqQzUzODNvUkZ5KwpobzlROEgxY3FBM2Rxa1RXK0YxZTJHRDBWWTZJcDdYY2xBa2t4VTZtQlRXT3pqY0M4b2swZXJKVFQ5bHJ4M3JsCjNaZWhHTDFKWWM3cU5wdkcrZTlpNGdnY1dNU3NYN0lKKzZWa1VqVFdXOW5TS0xaSmRFM3Uzb3lBREpNL3ZMVkkKUHk0blZHV0Rpci9ZZDg3UloxMWU0a2RUNGVjZHpLUnlWSlp0d2txTENWeWVkMTgrOUlxdDdmSzZOaHhQM1ZldApQMGl2K1NvWjZ2L3Z4K1ppSVZia05YUHVVZWdnc2lTRitXT01xeHY0RkFvcFVkY2lQU0JZendrME8vekpRTkV4Ckk5RDlaUy9NZjVtZjhLYnU5Q3RCaENhOEtNdnlxM2pzTGxQOEl0QTdrdS9lZWh3SFVlM2tucU5ZTDlRUjNkMHEKU1MrMHpJQVJBb0dCQVBsV2VOeW9UZ2pxVHY1YlZQOSs4Z2ZUbyt3N1N5cWNVcDZrVjFEaTJWaVNPb3FtWGp3aQo0amYwdS9lV1AvZVFtMkMvSnBLSW1VK2RxdWZsMmpxSElLNVJOTGI3V3d2QXdjTU03eThsNFAxTGdMY3hJWG5DCm9GWTJiVHBwbmhwL3I2VnVaQm5tak5hU1B0M1M1TjRYTUpCTkxuTFBCRHdBU2tyNjQ4T0d3RzFsQW9HQkFPaUUKdFpmbHRJcDhWU2ZiZzlBQVYvRWxQRWJLK2lSM2ZNUDF1MjJ2MXMrakZZTmlGUVEreXdNOWpzR0t4bXoxaEhDNgo5VUpZV0pEamxTcVJZUFIxK2oweVNSZ09OTWRhazdQSmNuWFF4akMwaDZ4SW55b042bzJGY0k2bW1hbzZZWU5CCjA2QisrR1hsdU5BblhXYll5YnZUaUorY1Q1OG01cEJxVkpSaWZvTE5Bb0dBSUpNTmd6Wnh5M1JoRVpYNUN0QVkKNnJEWnI1a25mcytoYzV4ZzArNXZHc1V2NU1GTGVtdk1SaWN4RDIyUHVkWW9sb0VpbHU1RnFVTWQrdUhxbXM3ZwpsQ1dEejR3VEh2djExSGV5SCtUQStoYU5JR0hJejlGL2hRUGpUVWhUSVg4aEFXbmtwZ1dhek1XYWRQeUNiZ2wxCmpNU29sdE00NkdYWlR1WnNMelZCbW9rQ2dZRUFodm5pNEpaN3c1aUJabTNMaXNkb1JaZ3o4WFNLMlBoeitOMkIKUEI5RE42MllJM2lnY3FKdy95U1E1bEZFOXFOZmlvRTlOcEpLZDNGbGVoeUNoK2FrcVRtenJMOHliRGRzWG9XbQphRFlWbHRoMW1kRmVjKzg0SlljODI5SmlpYXJ5U0Z2Q0dmMGEvU3ZwcVF2dzhHOFFUSFJ6YnhReU5GVkVxcmpPCitJUmtwRkVDZ1lFQXRodTR4YTloWDZVK2hNZm9ZeWRrMTFibnU3OTNuM211eW42M1lmSDZtb2REbWtqbzJBdzYKYWR1RTViakx2UUlWMHNUR1JRdktKbzBBVFlqU1NnZFhNY0xwY25ZWm1IN21Yd2Q1c0k4cytTVXl3aUpleFhoegpjR2lJUWU0bUxFYmVoclVRRXNZb2xJZ1RWYSt2MmVrWHQvUDRuYWtxMitMMnZrbW9zeFdCclZnPQotLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQ==
PAYMENTS_GATEWAY_SECRET=LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQpNSUlKS1FJQkFBS0NBZ0VBejFzaEhZbDcrY2lnWVZGYjZRU3FjKy91NGFNeUYrN292N3lNbXMwRm5udWVwaldoCnVTU1h4dHpENHNNcW9ldzR6dmpta0hSYVppSTR3VFhKMitaVWlROFJmOXVnaE5FUG5WckFlVlNSb0dzN2xqcnQKZzdaOENBOUN1ZWY5a0xzbGlKbHcvY2hTRE8xOWNYeUE0aVd6VHh6aDRpMUpkaEZJRVRiQW9wSGF5VUVYUnFOTQpTSWpZcG01bzA4TUh2SWFVNmFEanBUc0FyQnNhLzA4VGE0R1dyWnVEUFovVVhnMTBVcEZTb3RTS3B4MHp4UHRxCklSR0F3V3R1a21hSUMvbDNsTW5YWUxLMGhiczUxOVlFV0p6cjRncFE5UXVMaDNWaDZOQzYwUGdWTW50NkliS3YKMTI2SkdtN1BKNWJSdVJDSTgzYlVHZGFKd0dQaTRvQm03WlZnNGRFaGw4cWhwRzVMcWp1NEQwWnF4SHBaek9zdgp5K0Y4eWloNTdFTFA5dWVIZTQ1NEhrQXI5NjJGaGFMRTJ2MkRyM3VubjNhYWNoNjBMcDM2cERBVEljakVFL0FNCjdHYklwV0RiWTFQYTV4YTQ1Q3VDMkFsL3RlNUh2blUwMnNwcjM3OHJMdnpMeGJRZXkvL2N4RkMzc094MzIrU1gKR3NFUkxPOUo4U09YREJhSmFIZ0djSnZKZ2NkVVpUbmlDMDBISlZKZm5MUGpTa2M5QmFYZ2swaW4wWStOY2NaRQo2VU41RmF0My9jb0lWVmJ0UnErVkdPT2tRR3JSYk9sZEVHNVRLaGNraGxkbFBZWktDUTFDejRYUzBwMlFCMWZjCnhzcGI1MVJEUHZ1ckZCTFRaUTUzYnVNMVdKN1dwNm55Sm1oM0ZMUzdlWnhjbjBUTzkxSzAvUjcrZUowQ0F3RUEKQVFLQ0FnQkhSVzFtZDZFVFEvQk1RdWl5ZVJZVmIzek9OWWU4VGpQVjQzcjRva3V5STQ5dVZiVFdyRXMyNFI2NwpUSlhVdmhyd21RQzIyaWRRUDZiK1VmeW1Cczg3cE9CQThENkdLRTJUcW1QSjBGV1ZyQVg1Snh3SVQ2cm1Ja2l2CkdaeEFLUE5IdG1YdDlQS3UydHBwTFlBbk93b2N3VEtxeVNJYzRPZkNjdTFYYzRhZDhpK0w2Z2tJVFhFYUU0MFkKYkVxMmRCT3ZFY3Z0T1JDTUYyejZJRFh1bDhZd3Vla3NQMG1CWW1KL0Z0QXVnNXQ4d1Q3UUVCSjBkMDJvTGNMOQpzeHhEOFdVMjBRR2tqUWdiaHpUa2lQMUpiL1pyNVZ2YVBqT2hSYWwzbW5iNzZLbHdocHgrQktzSUEwaEF1NkdjClcreU9EYTdrOEEwTExJQ0FqbFNud2JhZkp0NzdZSFl1VGUzdW5ISFY0dS95alIxSDdsMEFOUGVHZkY3aUowVG4KTlVpck1WN3RlKzZGcWQ4b01QOVJrd1NXRjIrMHVnZCs5YjBicEkwTEpQVElNb2NRT2VSSmVvc3ArYld6RkpzbAorY2ZUUFFBVHBVSDZ4MC8za0RCVnhPUUhiKzVjS1h3ajB4czRabTlXMThTU1p6aFh1ZngrUkE3WTgydHpLNHVaCk1LOHRvMGxjb0JRYzBqbkgyM2FUV0kvUDlRNkpEUjF4SzFLY09lMUhDbElvZDM2UHZId2dWbnZmMUpoNUhOMnAKSk96elVpSUpkcHBIZ1BhOWJXaWRsZTV3V1crTzRTZlR4Wnd4U2E5b0xoUWJmdDJsRTZaSFlxNjBYcnFaY0pZYgpmYmtTNDRpT09MVGQ0SVdnZHRWdG1TeStQUXhEQ1pLV1V5ZUorNjRySWgxaXBGc3NnUUtDQVFFQTlQQWJHcjFqCnEwT21VdHhRcWJqdzVOQ3lpL1FJYXd3cU5ST09YTkd5cUJ6NUhSVzFKUG1tV0dsV0U0Ykt2anQ3RDdzd2ZIQ3oKOFhoQmlCMnBQRVhUaDVzZmFkSzErYTY5SjdabGlzK05HYTFpKzd3REdxQ0puL1AzOTFvYlJRUU1SbWJiR2tSKwpyZ3lqQmFXMHR1MWpLK0NZQXpwc0xJc0dOL3BmQWxkbk9XbUJuL2pSeUwvSlYzRkRjS2Zzay9oSjJJOEZETlFmCitSR2gwR0Y2bUZMTzV5M0RIUVpvUnZOeFhmRXlXQTkyZ2h2UnVFMUZyQ2h5RjFsOUtXZXBmS25KeFR1K0o0N3cKcklXNkhPcVBsZHBtVng2cGVhVmtFbTZMSEM3Qk5heTRSaXVDTXB2ZDFLbjZvVU1OM1R1dGxVWHhCK3o4MS95NQpEblc0Nm43UktleHVEUUtDQVFFQTJMaURXSE1JUUthcGRnSllRQUdwb1VEWEVpbFdGeXA1N0VZS1VoaGF1ZjVtCk9lRWhodmd5dkxGcmVGb3F2OUdJaGVDOVNjNUR0eFJWekp1SGtFZGdTbTE5dTBzQTd5bHg2ZTRwWkd5Tm1PaFAKOW1tSEVoSXE2dTduT3doY3NkSW5FbVFJRVlzZjBkRzdFWlppdVdBZjI2NkRyTmcvNklFVGJpakRlTklFV0IvSwpBY0RKQVk3WVQrYjJ5c0pyOG5kMHo4VjVlMnZuNkRCVmZ4RHJLbjJGMFFtN3hOdWE2a29wbmgybUhmYXZoUFJyClRIa09OVFU2SVI5bEJ0blozVjJNT1k3bVd1TUV0WkxyVEtyM2EzMjdHNzNvTzZmSzhFNjdDRDF5MTdGN0xvTC8KMHdhKzR0R2lpVzVkZzhWR2dUT2plOVJJMVdhQUpOaG5xRk0yRFZNZzBRS0NBUUFhZ1hFdGI1azlpMUNRWHU4TApyc3ZDdHlMYktrbE83RDRWQ0V5N2xxV3lzNC94cWN1MGVKK2JxYXA2Nm5jK0pzbW1aaWRWRUEwbzhFNkhJRTZVCkN5cGMzbGlENXgxeUs0cWtwWVJQaFM1THZRdWRHamRyeGp1ZVo1UkozQ0pmVVpUU2VZYjBUTDA0c0gxanV3N1gKVE5FU2luZG93Z1c2dkVDc0JoZ0o5Tk5penh3TDU2MHNBRFVWbFZncTlNRVJNaWtybWk1OXVPYk0yUytka1M3bgpGTzcyN1dqVDEwR3BpK2FVdCtrdXhsMllydEgvRTcyYVo3WVErTW9tbE9VdWJHRTlTcjNGSWg3QlRLZGJRYmJRCkRKWk9qeTdmenhvSk5KVXhNNDRNOU9mc0VBRkM0TU1jcEZoTzR5YTQ3aUJXcXY3dVVLTDc3SWxLRzBzcmRSWEYKWjZSeEFvSUJBUUNQVHd3RHpDVno0d0dDT0xDMHVxUzZMZzlLUWkxY3FranZkYTFUZGlsZ2ZwcUl3WmVURWNNegpSYnRFWFpPUlBuU2gydWd3eXdXNkplZEtvcm8xTFEyK2ljS3Z2RHhFNmtvYW45T2RSYThvb3M1bHFvaVg2WTJaCnh4cit6VnZHZHFwQm5nWTcyNXpSK1hkVGZQZVJqNy9oVy9oVXJyY3IvMWFpN0srOTBGcnhEeXhjbG1nVThLbVgKeEtvRGtDY2pzZHg3bkNEbC9ZZmY0VDVZQlE4TkRPNFZPZk9CakpwWFBXMWgwa2RMM3hsWHVPelBKK20rUTVGSgozK0hGY3Y5L1EySDdtY1EzNjVEc3BOZVYzaVE0WDI4QVBFYzZVNDE5OVFIMncvT1NNQm05dXdDQ1FoNnVER1FICnJ3U0ZvMGtwSE1XSmwrb0Z1MzhYWGtiRlp5a0NES3RSQW9JQkFRQ2NraHBGQ0thRWpHZE9rWEtkUDdlai90ZDkKSXFGTEV1YWgzaExkTEMyYlBrVXFlc2ZvY2JBSzZPV2t4MFk3c0h0VUxFanBYSUVuSXhwYXVQZXJlTUdzZ204dwo2azJjWXMxemVLL3RHR0RlcDZZb0tVVCtrblNLV0g5cG5SNVBnb0lrK1JGVkZuU3hpWEd3MVdhODBINzRYdFdTCjFKV2hLVUM1bVpobUZ2NFBSWjZ2a0Z1UmtkckZ5cmxFbjhva1dpemZYNWtiMmN1ZGk2cUllcThyeDhFejlLdmEKUGIwL0JMR3YzWlVaOGMrUnk1RVNzL0laZGtqOG9KeEpJMUpLWmE4cEJDYVUwU2xyTHVPWDdhNDJ0SmNWMzFMdQpna2lTelNUZjk2YWhyRm5lQTF3Y2tYckROZWtGM09mMXFxQVU4QUFIWURDSlBVQXNiOWF0K25nM21FK3IKLS0tLS1FTkQgUlNBIFBSSVZBVEUgS0VZLS0tLS0K
Expand All @@ -23,6 +17,5 @@ CRYPTO_PAYMENTS_PROCESSOR_SECRET_KEY=secret-key
CRYPTO_PAYMENTS_PROCESSOR_API_KEY=api-key
CRYPTO_PAYMENTS_PROCESSOR_API_URL=https://api-url.com
VPN_URL=https://api-url.com
PC_CLOUD_TRIAL_CODE=your_code
DRIVE_WEB_URL=
CHART_API_URL=
1 change: 0 additions & 1 deletion .github/workflows/sonarcloud-analysis.yml
Original file line number Diff line number Diff line change
Expand Up @@ -37,7 +37,6 @@ jobs:
- run: echo PAYMENTS_GATEWAY_PUBLIC_SECRET=${{secrets.PAYMENTS_GATEWAY_PUBLIC_SECRET}} >> ./.env
- run: echo KLAVIYO_BASE_URL=test_klaviyo_key_123 >> ./.env
- run: echo KLAVIYO_API_KEY=test_klaviyo_key_123 >> ./.env
- run: echo PC_CLOUD_TRIAL_CODE=my_code >> ./.env

- run: echo "registry=https://registry.yarnpkg.com/" > .npmrc
- run: echo "@internxt:registry=https://npm.pkg.github.com" >> .npmrc
Expand Down
1 change: 0 additions & 1 deletion .github/workflows/tests.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,6 @@ jobs:
- run: echo CHART_API_URL=api_url >> ./.env
- run: echo PAYMENTS_GATEWAY_SECRET=${{secrets.PAYMENTS_GATEWAY_SECRET}} >> ./.env
- run: echo PAYMENTS_GATEWAY_PUBLIC_SECRET=${{secrets.PAYMENTS_GATEWAY_PUBLIC_SECRET}} >> ./.env
- run: echo PC_CLOUD_TRIAL_CODE=my_code >> ./.env
- run: echo KLAVIYO_BASE_URL=test_klaviyo_url >> ./.env
- run: echo KLAVIYO_API_KEY=test_klaviyo_key_123 >> ./.env

Expand Down
6 changes: 0 additions & 6 deletions src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,9 @@ const BASE_REQUIRED_VARIABLES = [
'NODE_ENV',
'SERVER_PORT',
'MONGO_URI',
'STORAGE_GATEWAY_SECRET',
'STORAGE_GATEWAY_URL',
'STRIPE_SECRET_KEY',
'STRIPE_WEBHOOK_KEY',
'JWT_SECRET',
'DRIVE_GATEWAY_URL',
'DRIVE_GATEWAY_USER',
'DRIVE_GATEWAY_PASSWORD',
'DRIVE_NEW_GATEWAY_URL',
'DRIVE_NEW_GATEWAY_SECRET',
'PAYMENTS_GATEWAY_PUBLIC_SECRET',
Expand All @@ -22,7 +17,6 @@ const BASE_REQUIRED_VARIABLES = [
'CRYPTO_PAYMENTS_PROCESSOR_SECRET_KEY',
'CRYPTO_PAYMENTS_PROCESSOR_API_KEY',
'VPN_URL',
'PC_CLOUD_TRIAL_CODE',
'CHART_API_URL',
'DRIVE_WEB_URL',
'RECAPTCHA_V3_ENDPOINT',
Expand Down
205 changes: 0 additions & 205 deletions src/controller/payments.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,9 @@ import jwt from 'jsonwebtoken';
import { type AppConfig } from '../config';
import { UsersService } from '../services/users.service';
import {
CouponCodeError,
IncompatibleSubscriptionTypesError,
InvalidSeatNumberError,
ExistingSubscriptionError,
MissingParametersError,
NotFoundPlanByIdError,
NotFoundPromoCodeByNameError,
PromoCodeIsNotValidError,
} from '../errors/PaymentErrors';
Expand Down Expand Up @@ -133,132 +130,6 @@ export function paymentsController(
},
);

fastify.post<{
Querystring: { trialToken: string };
Body: {
customerId: string;
priceId: string;
currency: string;
token: string;
trialCode: string;
};
}>(
'/create-subscription-with-trial',
{
schema: {
body: {
type: 'object',
required: ['customerId', 'priceId'],
properties: {
customerId: {
type: 'string',
},
priceId: {
type: 'string',
},
token: {
type: 'string',
},
currency: {
type: 'string',
},
trialCode: {
type: 'string',
},
},
},
},
},
async (req, res) => {
const { customerId, priceId, currency, token } = req.body;

if (!customerId || !priceId) {
throw new MissingParametersError(['customerId', 'priceId']);
}

try {
const payload = jwt.verify(token, config.JWT_SECRET) as {
customerId: string;
};
const tokenCustomerId = payload.customerId;

if (customerId !== tokenCustomerId) {
return res.status(403).send();
}
} catch (error) {
return res.status(403).send();
}

const { trialToken } = req.query;

if (!trialToken) {
return res.status(403).send('Invalid trial token');
}

try {
const payload = jwt.verify(trialToken, config.JWT_SECRET) as { trial?: string };
if (!payload.trial || payload.trial !== 'pc-cloud-25') {
throw new Error('Invalid trial token');
}
} catch {
return res.status(403).send('Invalid trial token');
}

try {
const subscriptionSetup = await paymentService.createSubscriptionWithTrial(
{
customerId,
priceId,
currency,
},
{
name: 'pc-cloud-25',
},
);

return res.send(subscriptionSetup);
} catch (err) {
const error = err as Error;
req.log.error(`[ERROR CREATING SUBSCRIPTION WITH TRIAL]: ${error.stack ?? error.message}`);

if (error instanceof MissingParametersError) {
return res.status(400).send({
message: error.message,
});
} else if (error instanceof PromoCodeIsNotValidError) {
return res
.status(422)
.send({ message: 'The promotion code is not applicable under the current conditions' });
} else if (error instanceof ExistingSubscriptionError) {
return res.status(409).send({
message: error.message,
});
}

return res.status(500).send({
message: 'Internal Server Error',
});
}
},
);

fastify.get<{
Querystring: { code: string };
}>('/trial-for-subscription', async (req, rep) => {
const { code } = req.query;
if (!code || code !== process.env.PC_CLOUD_TRIAL_CODE) {
return rep.status(400).send();
}

return jwt.sign({ trial: 'pc-cloud-25' }, config.JWT_SECRET);
});

fastify.get('/users/exists', async (req, rep) => {
await assertUser(req, rep, usersService);

return rep.status(200).send();
});

fastify.get<{
Querystring: { limit: number; starting_after?: string; userType?: UserType; subscription?: string };
}>(
Expand Down Expand Up @@ -566,82 +437,6 @@ export function paymentsController(
},
);

fastify.get('/request-prevent-cancellation', async (req) => {
const { uuid } = req.user.payload;
try {
const user = await usersService.findUserByUuid(uuid);

return paymentService.isUserElegibleForTrial(user, {
name: 'prevent-cancellation',
});
} catch (err) {
const error = err as Error;
req.log.error(
`[REQUEST-PREVENT-CANCELLATION/ERROR]: Error for user ${uuid} ${error.message}. ${error.stack || 'NO STACK'}`,
);
throw err;
}
});

fastify.put('/prevent-cancellation', async (req, rep) => {
const { uuid } = req.user.payload;
const user = await usersService.findUserByUuid(uuid);

try {
await paymentService.applyFreeTrialToUser(user, {
name: 'prevent-cancellation',
});
return rep.status(200).send({ message: 'Coupon applied' });
} catch (err) {
if (err instanceof CouponCodeError) {
return rep.status(403).send({ message: err.message });
} else {
req.log.error(err);
return rep.status(500).send({ message: 'Internal server error' });
}
}
});

fastify.get<{
Querystring: { planId: string; currency?: string };
schema: {
querystring: {
type: 'object';
properties: { planId: { type: 'string' }; currency: { type: 'string' } };
};
};
config: {
rateLimit: {
max: 5;
timeWindow: '1 minute';
};
};
}>(
'/plan-by-id',
{
config: {
skipAuth: true,
},
},
async (req, rep) => {
const { planId, currency } = req.query;

try {
const planObject = await paymentService.getPlanById(planId, currency);

return rep.status(200).send(planObject);
} catch (error) {
const err = error as Error;
if (err instanceof NotFoundPlanByIdError) {
return rep.status(404).send(err.message);
}

req.log.error(`[ERROR WHILE FETCHING PLAN BY ID]: ${err.message}. STACK ${err.stack ?? 'NO STACK'}`);
return rep.status(500).send({ message: 'Internal Server Error' });
}
},
);

fastify.get<{
Querystring: { priceId: string; promotionCode: string };
schema: {
Expand Down
6 changes: 0 additions & 6 deletions src/errors/Errors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,6 @@ export class ForbiddenError extends HttpError {
}
}

export class GoneError extends HttpError {
constructor(message = 'Gone') {
super(message, 410);
}
}

export class InternalServerError extends HttpError {
constructor(message = 'Internal Server Error') {
super(message, 500);
Expand Down
6 changes: 0 additions & 6 deletions src/errors/PaymentErrors.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,12 +6,6 @@ export class NotFoundSubscriptionError extends NotFoundError {
}
}

export class CouponCodeError extends BadRequestError {
constructor(message: string) {
super(message);
}
}

export class InvalidSeatNumberError extends BadRequestError {
constructor(message: string) {
super(message);
Expand Down
Loading
Loading