From 86fee9a9a0e019b400869ddfc6ac1e02a0d9b073 Mon Sep 17 00:00:00 2001 From: Maxime Lalo Date: Fri, 26 Apr 2024 11:11:12 +0200 Subject: [PATCH 1/5] :sparkles: updating resources --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fa053511..006d18da 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "file-type-checker": "^1.0.8", "fp-ts": "^2.16.1", "jsonwebtoken": "^9.0.0", - "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.134", + "le-coffre-resources": "git@github.com:smart-chain-fr/leCoffre-resources.git#v2.136", "module-alias": "^2.2.2", "monocle-ts": "^2.3.13", "multer": "^1.4.5-lts.1", From bba73644f1476bb850d37ef2e7b3ce6d40e9b3bf Mon Sep 17 00:00:00 2001 From: Maxime Lalo Date: Fri, 26 Apr 2024 11:42:58 +0200 Subject: [PATCH 2/5] :sparkles: add taxes automatic --- .../common/StripeService/StripeService.ts | 67 +++++++++---------- 1 file changed, 31 insertions(+), 36 deletions(-) diff --git a/src/services/common/StripeService/StripeService.ts b/src/services/common/StripeService/StripeService.ts index eabfe670..72774210 100644 --- a/src/services/common/StripeService/StripeService.ts +++ b/src/services/common/StripeService/StripeService.ts @@ -16,45 +16,40 @@ export default class StripeService { } public async createCheckoutSession(subscription: Subscription, frequency: EPaymentFrequency) { - let priceId = this.variables.STRIPE_UNLIMITED_SUBSCRIPTION_PRICE_ID; - if(subscription.type === "STANDARD") { - if(frequency === EPaymentFrequency.Yearly) { - priceId = this.variables.STRIPE_STANDARD_ANNUAL_SUBSCRIPTION_PRICE_ID; - } - else{ - priceId = this.variables.STRIPE_STANDARD_SUBSCRIPTION_PRICE_ID; - } + let priceId = this.variables.STRIPE_UNLIMITED_SUBSCRIPTION_PRICE_ID; + if (subscription.type === "STANDARD") { + if (frequency === EPaymentFrequency.Yearly) { + priceId = this.variables.STRIPE_STANDARD_ANNUAL_SUBSCRIPTION_PRICE_ID; + } else { + priceId = this.variables.STRIPE_STANDARD_SUBSCRIPTION_PRICE_ID; } - else if(subscription.type === "UNLIMITED") { - if(frequency === EPaymentFrequency.Yearly) { - priceId = this.variables.STRIPE_UNLIMITED_ANNUAL_SUBSCRIPTION_PRICE_ID; - } - else{ - priceId = this.variables.STRIPE_UNLIMITED_SUBSCRIPTION_PRICE_ID; - } + } else if (subscription.type === "UNLIMITED") { + if (frequency === EPaymentFrequency.Yearly) { + priceId = this.variables.STRIPE_UNLIMITED_ANNUAL_SUBSCRIPTION_PRICE_ID; + } else { + priceId = this.variables.STRIPE_UNLIMITED_SUBSCRIPTION_PRICE_ID; } - - return this.client.checkout.sessions.create({ - mode: "subscription", - payment_method_types: ["card"], - billing_address_collection: "auto", - line_items: [ - { - price: priceId, - quantity: subscription.type === "STANDARD" ? subscription.nb_seats : 1, - }, - ], - success_url: this.variables.APP_HOST + "/subscription/success", - cancel_url: this.variables.APP_HOST + "/subscription/error", - metadata: { - subscription: JSON.stringify(subscription), - env: this.variables.ENV, - }, - allow_promotion_codes: true, - }); - + } - + return this.client.checkout.sessions.create({ + mode: "subscription", + payment_method_types: ["card"], + billing_address_collection: "auto", + line_items: [ + { + price: priceId, + quantity: subscription.type === "STANDARD" ? subscription.nb_seats : 1, + }, + ], + success_url: this.variables.APP_HOST + "/subscription/success", + cancel_url: this.variables.APP_HOST + "/subscription/error", + metadata: { + subscription: JSON.stringify(subscription), + env: this.variables.ENV, + }, + allow_promotion_codes: true, + automatic_tax: { enabled: true }, + }); } public async getStripeSubscriptionByUid(subscriptionId: string) { From 4f59877fff96d5a7d81c872200e013ec0ed1ae0a Mon Sep 17 00:00:00 2001 From: Maxime Lalo Date: Mon, 29 Apr 2024 15:09:36 +0200 Subject: [PATCH 3/5] :sparkles: remove console logs --- src/app/api/admin/CustomersController.ts | 2 +- src/app/api/customer/AuthController.ts | 12 +-- src/app/api/customer/DocumentsController.ts | 7 +- src/app/api/id360/CustomerController.ts | 10 +-- src/app/api/id360/DocumentController.ts | 16 ++-- src/app/api/idnot/OfficeController.ts | 21 +++-- src/app/api/idnot/UserController.ts | 79 ++++++++++--------- src/app/api/notary/CustomersController.ts | 4 +- .../api/super-admin/CustomersController.ts | 2 +- src/app/middlewares/AuthHandler.ts | 5 +- .../CustomerHandler/DocumentHandler.ts | 4 +- .../CustomerHandler.ts | 7 +- .../OfficeMembershipHandlers/DeedHandler.ts | 3 +- .../DeedTypeHandler.ts | 2 +- .../DocumentHandler.ts | 5 +- .../DocumentTypeHandler.ts | 7 +- .../OfficeMembershipHandlers/FileHandler.ts | 12 +-- .../OfficeMembershipHandlers/FolderHandler.ts | 22 +++--- .../OfficeRoleHandler.ts | 3 +- .../OfficeMembershipHandlers/UserHandler.ts | 2 +- src/app/middlewares/RolesHandler.ts | 6 +- src/app/middlewares/RulesHandler.ts | 3 +- src/common/databases/seeders/prod-seeder.ts | 15 +--- src/common/databases/seeders/seeder.ts | 19 +---- src/common/databases/seeders/seederOld.ts | 19 +---- .../super-admin/UsersService/UsersService.ts | 2 - 26 files changed, 124 insertions(+), 165 deletions(-) diff --git a/src/app/api/admin/CustomersController.ts b/src/app/api/admin/CustomersController.ts index 8a81eaa6..7df166a2 100644 --- a/src/app/api/admin/CustomersController.ts +++ b/src/app/api/admin/CustomersController.ts @@ -169,7 +169,7 @@ export default class CustomersController extends ApiController { //success this.httpSuccess(response, customer); } catch (error) { - console.log(error); + console.error(error); this.httpValidationError(response, error); return; } diff --git a/src/app/api/customer/AuthController.ts b/src/app/api/customer/AuthController.ts index e62ea8b0..cbcdf01f 100644 --- a/src/app/api/customer/AuthController.ts +++ b/src/app/api/customer/AuthController.ts @@ -39,7 +39,7 @@ export default class AuthController extends ApiController { totpCodeUid: res.totpCode.uid, }); } catch (error) { - console.log(error); + console.error(error); this.httpInternalError(response); } } @@ -64,7 +64,7 @@ export default class AuthController extends ApiController { this.httpTooEarlyRequest(response, error.message); return; } - console.log(error); + console.error(error); this.httpInternalError(response); } } @@ -112,7 +112,7 @@ export default class AuthController extends ApiController { return; } - console.log(error); + console.error(error); this.httpInternalError(response); return; } @@ -168,7 +168,7 @@ export default class AuthController extends ApiController { return; } - console.log(error); + console.error(error); this.httpInternalError(response); return; } @@ -203,7 +203,7 @@ export default class AuthController extends ApiController { this.httpUnauthorized(response, error.message); return; } - console.log(error); + console.error(error); this.httpInternalError(response); } } @@ -237,7 +237,7 @@ export default class AuthController extends ApiController { this.httpUnauthorized(response, error.message); return; } - console.log(error); + console.error(error); this.httpInternalError(response); } } diff --git a/src/app/api/customer/DocumentsController.ts b/src/app/api/customer/DocumentsController.ts index ac14ca79..0b3f2baf 100644 --- a/src/app/api/customer/DocumentsController.ts +++ b/src/app/api/customer/DocumentsController.ts @@ -28,7 +28,7 @@ export default class DocumentsController extends ApiController { let query: Prisma.DocumentsFindManyArgs = {}; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); - if(query.where?.uid) { + if (query.where?.uid) { this.httpBadRequest(response, "You can't filter by uid"); return; } @@ -74,7 +74,6 @@ export default class DocumentsController extends ApiController { if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); if (query.folder) delete query.folder; - } const documentEntity = await this.documentsService.getByUid(uid, query); @@ -90,7 +89,7 @@ export default class DocumentsController extends ApiController { //success this.httpSuccess(response, document); } catch (error) { - console.log(error); + console.error(error); this.httpInternalError(response); return; } @@ -126,7 +125,7 @@ export default class DocumentsController extends ApiController { return; } const depositor = folderEntity.customers.find((customer) => customer.contact?.email === email); - + delete documentEntity.depositor; documentEntity.depositor = depositor; diff --git a/src/app/api/id360/CustomerController.ts b/src/app/api/id360/CustomerController.ts index 685d3700..3b1658ba 100644 --- a/src/app/api/id360/CustomerController.ts +++ b/src/app/api/id360/CustomerController.ts @@ -20,7 +20,7 @@ export default class CustomerController extends ApiController { const enrollment = await this.id360Service.createFranceConnectEnrollment(); this.httpSuccess(response, { enrollment }); } catch (error) { - console.log(error); + console.error(error); this.httpInternalError(response); return; } @@ -77,7 +77,7 @@ export default class CustomerController extends ApiController { const refreshToken = this.authService.generateRefreshToken(payload); this.httpSuccess(response, { accessToken, refreshToken }); } catch (error) { - console.log(error); + console.error(error); this.httpInternalError(response); return; } @@ -89,7 +89,7 @@ export default class CustomerController extends ApiController { const token = await this.id360Service.getId360Token(); this.httpSuccess(response, { token }); } catch (error) { - console.log(error); + console.error(error); this.httpInternalError(response); return; } @@ -109,7 +109,7 @@ export default class CustomerController extends ApiController { let accessToken; this.authService.verifyRefreshToken(token, (err, userPayload) => { if (err) { - console.log(err); + console.error(err); this.httpUnauthorized(response); return; } @@ -123,7 +123,7 @@ export default class CustomerController extends ApiController { //success this.httpSuccess(response, { accessToken }); } catch (error) { - console.log(error); + console.error(error); this.httpInternalError(response); return; } diff --git a/src/app/api/id360/DocumentController.ts b/src/app/api/id360/DocumentController.ts index b0285212..76520f27 100644 --- a/src/app/api/id360/DocumentController.ts +++ b/src/app/api/id360/DocumentController.ts @@ -18,11 +18,10 @@ export default class DocumentController extends ApiController { */ @Post("/api/v1/id360/enrollment-callback/") protected async getDocumentVerificationFromId360(req: Request, response: Response) { - try { this.httpSuccess(response); } catch (error) { - console.log(error); + console.error(error); this.httpInternalError(response); return; } @@ -30,29 +29,28 @@ export default class DocumentController extends ApiController { @Post("/api/v1/id360/customer-callback/") protected async getCustomerVerificationFromId360(req: Request, response: Response) { - try { this.httpSuccess(response); } catch (error) { - console.log(error); + console.error(error); this.httpInternalError(response); return; } } - @Post("/api/v1/id360/enrollment/:documentId") + @Post("/api/v1/id360/enrollment/:documentId") protected async createEnrollment(req: Request, response: Response) { try { const documentId = req.params["documentId"]; if (!documentId) { - this.httpBadRequest(response, "Missing document id"); - return; - } + this.httpBadRequest(response, "Missing document id"); + return; + } await this.id360Service.createEnrollment(documentId!); //success this.httpSuccess(response); } catch (error) { - console.log(error); + console.error(error); this.httpInternalError(response); return; } diff --git a/src/app/api/idnot/OfficeController.ts b/src/app/api/idnot/OfficeController.ts index 32afb042..ea4e3591 100644 --- a/src/app/api/idnot/OfficeController.ts +++ b/src/app/api/idnot/OfficeController.ts @@ -9,29 +9,26 @@ import authHandler from "@App/middlewares/AuthHandler"; @Controller() @Service() export default class UserController extends ApiController { - constructor (private idNotService: IdNotService) { + constructor(private idNotService: IdNotService) { super(); } @Get("/api/v1/idnot/office/:uid/office-memberships", [authHandler, userHandler]) protected async getOfficeMemberships(req: Request, response: Response) { - try { - const uid = req.params["uid"]; - if (!uid) { - this.httpBadRequest(response, "uid is required"); - return; - } + try { + const uid = req.params["uid"]; + if (!uid) { + this.httpBadRequest(response, "uid is required"); + return; + } - const officeMemberships = await this.idNotService.getOfficeMemberships(uid); + const officeMemberships = await this.idNotService.getOfficeMemberships(uid); this.httpSuccess(response, officeMemberships); } catch (error) { - console.log(error); + console.error(error); this.httpInternalError(response); return; } } } - - - diff --git a/src/app/api/idnot/UserController.ts b/src/app/api/idnot/UserController.ts index f6440ccc..69227cde 100644 --- a/src/app/api/idnot/UserController.ts +++ b/src/app/api/idnot/UserController.ts @@ -46,7 +46,7 @@ export default class UserController extends ApiController { return; } - const user = await this.idNotService.getOrCreateUser(idNotToken); + const user = await this.idNotService.getOrCreateUser(idNotToken); if (!user) { this.httpUnauthorized(response, "User not found"); @@ -57,18 +57,16 @@ export default class UserController extends ApiController { //Whitelist feature //Get user with contact - const prismaUser = await this.userService.getByUid(user.uid, { contact: true, role: true, office_membership: true}); - console.log(prismaUser); + const prismaUser = await this.userService.getByUid(user.uid, { contact: true, role: true, office_membership: true }); if (!prismaUser) { this.httpNotFoundRequest(response, "user not found"); return; - } - + } + //Hydrate user to be able to use his contact const userHydrated = User.hydrate(prismaUser, { strategy: "excludeAll" }); - console.log(userHydrated); - + if (!userHydrated.contact?.email || userHydrated.contact?.email === "") { this.httpUnauthorized(response, "Email not found"); return; @@ -76,17 +74,12 @@ export default class UserController extends ApiController { let isSubscribed = false; const subscriptions = await this.subscriptionsService.get({ where: { office_uid: userHydrated.office_membership?.uid } }); - console.log(subscriptions); - + if (!subscriptions || subscriptions.length === 0 || subscriptions[0]?.status === ESubscriptionStatus.INACTIVE) { - console.log("No subscription found"); isSubscribed = false; - } - else if (subscriptions[0]?.type === EType.Unlimited) { - console.log("Unlimited subscription found"); + } else if (subscriptions[0]?.type === EType.Unlimited) { isSubscribed = true; } else { - console.log("Standard subscription found"); const hasSeat = await this.subscriptionsService.get({ where: { status: ESubscriptionStatus.ACTIVE, seats: { some: { user_uid: userHydrated.uid } } }, }); @@ -123,29 +116,37 @@ export default class UserController extends ApiController { await this.idNotService.updateOffice(user.office_uid); const payload = await this.authService.getUserJwtPayload(user.idNot); - console.log(payload); - if(!payload) return; - - console.log(isSubscribed, userHydrated.role?.name); - if(!isSubscribed && userHydrated.role?.name === "admin"){ - const manageSubscriptionRulesEntity = await this.rulesGroupsService.get({ where: { uid: "94343601-04c8-44ef-afb9-3047597528a9" }, include: { rules: true } }); - - const manageSubscriptionRules = RulesGroup.hydrateArray(manageSubscriptionRulesEntity, { strategy: "excludeAll" }); - if(!manageSubscriptionRules[0]) return; - - payload.rules = manageSubscriptionRules[0].rules!.map((rule) => rule.name) || []; - - isSubscribed = true; + if (!payload) return; + + if (!isSubscribed && userHydrated.role?.name === "admin") { + const manageSubscriptionRulesEntity = await this.rulesGroupsService.get({ + where: { uid: "94343601-04c8-44ef-afb9-3047597528a9" }, + include: { rules: true }, + }); + + const manageSubscriptionRules = RulesGroup.hydrateArray(manageSubscriptionRulesEntity, { + strategy: "excludeAll", + }); + if (!manageSubscriptionRules[0]) return; + + payload.rules = manageSubscriptionRules[0].rules!.map((rule) => rule.name) || []; + + isSubscribed = true; } - if(!isSubscribed && userHydrated.role?.name === "super-admin"){ - const manageSubscriptionRulesEntity = await this.rulesGroupsService.get({ where: { uid: "94343601-04c8-44ef-afb9-3047597528a9" }, include: { rules: true } }); - - const manageSubscriptionRules = RulesGroup.hydrateArray(manageSubscriptionRulesEntity, { strategy: "excludeAll" }); - if(!manageSubscriptionRules[0]) return; - - payload.rules = manageSubscriptionRules[0].rules!.map((rule) => rule.name) || []; - - isSubscribed = true; + if (!isSubscribed && userHydrated.role?.name === "super-admin") { + const manageSubscriptionRulesEntity = await this.rulesGroupsService.get({ + where: { uid: "94343601-04c8-44ef-afb9-3047597528a9" }, + include: { rules: true }, + }); + + const manageSubscriptionRules = RulesGroup.hydrateArray(manageSubscriptionRulesEntity, { + strategy: "excludeAll", + }); + if (!manageSubscriptionRules[0]) return; + + payload.rules = manageSubscriptionRules[0].rules!.map((rule) => rule.name) || []; + + isSubscribed = true; } if (!isSubscribed) { @@ -158,7 +159,7 @@ export default class UserController extends ApiController { this.httpSuccess(response, { accessToken, refreshToken }); } catch (error) { - console.log(error); + console.error(error); this.httpInternalError(response); return; } @@ -178,7 +179,7 @@ export default class UserController extends ApiController { let accessToken; this.authService.verifyRefreshToken(token, async (err, userPayload) => { if (err) { - console.log(err); + console.error(err); this.httpUnauthorized(response); return; } @@ -195,7 +196,7 @@ export default class UserController extends ApiController { //success } catch (error) { - console.log(error); + console.error(error); this.httpInternalError(response); return; } diff --git a/src/app/api/notary/CustomersController.ts b/src/app/api/notary/CustomersController.ts index ada54166..9de0192c 100644 --- a/src/app/api/notary/CustomersController.ts +++ b/src/app/api/notary/CustomersController.ts @@ -27,7 +27,7 @@ export default class CustomersController extends ApiController { let query: Prisma.CustomersFindManyArgs = {}; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); - if(query.where?.uid) { + if (query.where?.uid) { this.httpBadRequest(response, "You can't filter by uid"); return; } @@ -168,7 +168,7 @@ export default class CustomersController extends ApiController { //success this.httpSuccess(response, customer); } catch (error) { - console.log(error); + console.error(error); this.httpValidationError(response, error); return; } diff --git a/src/app/api/super-admin/CustomersController.ts b/src/app/api/super-admin/CustomersController.ts index 28366c9f..735e2a95 100644 --- a/src/app/api/super-admin/CustomersController.ts +++ b/src/app/api/super-admin/CustomersController.ts @@ -170,7 +170,7 @@ export default class CustomersController extends ApiController { //success this.httpSuccess(response, customer); } catch (error) { - console.log(error); + console.error(error); this.httpValidationError(response, error); return; } diff --git a/src/app/middlewares/AuthHandler.ts b/src/app/middlewares/AuthHandler.ts index 28c1f082..cd017748 100644 --- a/src/app/middlewares/AuthHandler.ts +++ b/src/app/middlewares/AuthHandler.ts @@ -13,7 +13,7 @@ export default function authHandler(req: Request, response: Response, next: Next return; } - const authService = Container.get(AuthService); + const authService = Container.get(AuthService); authService.verifyAccessToken(token, (err, userPayload) => { if (err) { response.status(HttpCodes.UNAUTHORIZED).send("Error while verifying token"); @@ -22,9 +22,8 @@ export default function authHandler(req: Request, response: Response, next: Next req.body.user = userPayload; next(); }); - } catch (error) { - console.log(error); + console.error(error); response.status(HttpCodes.INTERNAL_ERROR).send("Internal server error"); return; } diff --git a/src/app/middlewares/CustomerHandler/DocumentHandler.ts b/src/app/middlewares/CustomerHandler/DocumentHandler.ts index 2bd74e8a..f2dbef28 100644 --- a/src/app/middlewares/CustomerHandler/DocumentHandler.ts +++ b/src/app/middlewares/CustomerHandler/DocumentHandler.ts @@ -24,7 +24,7 @@ export default async function documentHandler(req: Request, response: Response, if (document?.depositor_uid != customerId) { const customerService = Container.get(CustomersService); - const customers = await customerService.get({where: {contact: { email: customerEmail}}}); + const customers = await customerService.get({ where: { contact: { email: customerEmail } } }); if (customers && !customers.find((customer) => customer.uid === document?.depositor_uid)) { response.status(HttpCodes.UNAUTHORIZED).send("Not authorized with this depositor"); return; @@ -66,7 +66,7 @@ export default async function documentHandler(req: Request, response: Response, next(); } catch (error) { - console.log(error); + console.error(error); response.status(HttpCodes.INTERNAL_ERROR).send("Internal server error"); return; } diff --git a/src/app/middlewares/OfficeMembershipHandlers/CustomerHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/CustomerHandler.ts index f0b8b532..508249fa 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/CustomerHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/CustomerHandler.ts @@ -10,7 +10,9 @@ export default async function customerHandler(req: Request, response: Response, if (uid) { const customerService = Container.get(CustomersService); - const customer = await customerService.get({where:{AND: [{uid: uid}, {office_folders: {some: {office_uid: officeId}}}]}}); + const customer = await customerService.get({ + where: { AND: [{ uid: uid }, { office_folders: { some: { office_uid: officeId } } }] }, + }); if (!customer[0]) { response.status(HttpCodes.NOT_FOUND).send("Customer not found"); @@ -19,9 +21,8 @@ export default async function customerHandler(req: Request, response: Response, } next(); - } catch (error) { - console.log(error); + console.error(error); response.status(HttpCodes.INTERNAL_ERROR).send("Internal server error"); return; } diff --git a/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts index f4986dc7..7509d3fb 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts @@ -42,9 +42,8 @@ export default async function deedHandler(req: Request, response: Response, next } next(); - } catch (error) { - console.log(error); + console.error(error); response.status(HttpCodes.INTERNAL_ERROR).send("Internal server error"); return; } diff --git a/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts index 57066861..ae1d252c 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts @@ -61,7 +61,7 @@ export default async function deedTypeHandler(req: Request, response: Response, next(); } catch (error) { - console.log(error); + console.error(error); response.status(HttpCodes.INTERNAL_ERROR).send("Internal server error"); return; } diff --git a/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts index d1d42990..ce7ac2f4 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts @@ -57,16 +57,15 @@ export default async function documentHandler(req: Request, response: Response, return; } - if(!folder?.stakeholders.find(stakeholder => stakeholder.uid === req.body.user.userId)) { + if (!folder?.stakeholders.find((stakeholder) => stakeholder.uid === req.body.user.userId)) { response.sendStatus(HttpCodes.UNAUTHORIZED).send("Unauthorized with this user"); return; } } next(); - } catch (error) { - console.log(error); + console.error(error); response.status(HttpCodes.INTERNAL_ERROR).send("Internal server error"); return; } diff --git a/src/app/middlewares/OfficeMembershipHandlers/DocumentTypeHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DocumentTypeHandler.ts index e5078ba8..5efd2fb2 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/DocumentTypeHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/DocumentTypeHandler.ts @@ -21,7 +21,9 @@ export default async function documentTypeHandler(req: Request, response: Respon where: { AND: [{ name: { equals: name, mode: "insensitive" } }, { office: { uid: officeId } }] }, }); if (documentType[0] && (!uid || documentType[0].uid != uid)) { - response.status(HttpCodes.VALIDATION_ERROR).send([{ property: "name", constraints: { name: "Nom de document déjà utilisé" } }]); + response + .status(HttpCodes.VALIDATION_ERROR) + .send([{ property: "name", constraints: { name: "Nom de document déjà utilisé" } }]); return; } } @@ -42,9 +44,8 @@ export default async function documentTypeHandler(req: Request, response: Respon } next(); - } catch (error) { - console.log(error); + console.error(error); response.status(HttpCodes.INTERNAL_ERROR).send("Internal server error"); return; } diff --git a/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts index 64556871..0abe8786 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts @@ -9,7 +9,7 @@ export default async function fileHandler(req: Request, response: Response, next const officeId = req.body.user.office_Id; let uid = req.path && req.path.split("/")[5]; const document = req.body.document; - + if (document) { const documentService = Container.get(DocumentsService); const documentWithOffice = await documentService.getByUidWithOffice(document.uid!); @@ -22,13 +22,13 @@ export default async function fileHandler(req: Request, response: Response, next return; } } - + if (uid === "download") uid = req.path && req.path.split("/")[6]; - + if (uid) { const fileService = Container.get(FilesService); const file = await fileService.getByUidWithOffice(uid!); - + if (!file) { response.status(HttpCodes.NOT_FOUND).send("File not found"); return; @@ -38,10 +38,10 @@ export default async function fileHandler(req: Request, response: Response, next return; } } - + next(); } catch (error) { - console.log(error); + console.error(error); response.status(HttpCodes.INTERNAL_ERROR).send("Internal server error"); return; } diff --git a/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts index 08856602..dc623c5f 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts @@ -13,26 +13,28 @@ export default async function folderHandler(req: Request, response: Response, ne const deed = req.body.deed; const folderNumber = req.body.folder_number; const stakeHolders = req.body.stakeholders as any[]; - + if (office && office.uid != officeId) { response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this office"); return; } - if(folderNumber) { + if (folderNumber) { const officeFolderService = Container.get(OfficeFoldersService); const sameFolderNumber = await officeFolderService.get({ where: { AND: [{ folder_number: folderNumber }, { office_uid: officeId }] }, }); - if(sameFolderNumber[0] && (!uid || uid != sameFolderNumber[0]?.uid)) { - const error = [{property: "folder_number", constraints: { folder_number: "Numéro de dossier déjà utilisé" } }]; + if (sameFolderNumber[0] && (!uid || uid != sameFolderNumber[0]?.uid)) { + const error = [{ property: "folder_number", constraints: { folder_number: "Numéro de dossier déjà utilisé" } }]; response.status(HttpCodes.VALIDATION_ERROR).send(error); return; } } - if(stakeHolders && stakeHolders.length === 0) { - response.status(HttpCodes.VALIDATION_ERROR).send([{ property: "stakeholders", constraints: { stakeholders: "Au moins un collaborateur est requis" } }]); + if (stakeHolders && stakeHolders.length === 0) { + response + .status(HttpCodes.VALIDATION_ERROR) + .send([{ property: "stakeholders", constraints: { stakeholders: "Au moins un collaborateur est requis" } }]); return; } @@ -43,7 +45,7 @@ export default async function folderHandler(req: Request, response: Response, ne response.status(HttpCodes.NOT_FOUND).send("Deed type not found"); return; } - if(deedTypeWithOffice.archived_at) { + if (deedTypeWithOffice.archived_at) { response.status(HttpCodes.FORBIDDEN).send("Deed type is archived"); return; } @@ -54,7 +56,7 @@ export default async function folderHandler(req: Request, response: Response, ne } if (uid) { - if(uid === "download") { + if (uid === "download") { uid = req.path && req.path.split("/")[6]; } const officeFolderService = Container.get(OfficeFoldersService); @@ -71,7 +73,7 @@ export default async function folderHandler(req: Request, response: Response, ne return; } - if(!officeFolder.stakeholders.find(stakeholder => stakeholder.uid === userId)) { + if (!officeFolder.stakeholders.find((stakeholder) => stakeholder.uid === userId)) { response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized with this user"); return; } @@ -79,7 +81,7 @@ export default async function folderHandler(req: Request, response: Response, ne next(); } catch (error) { - console.log(error); + console.error(error); response.status(HttpCodes.INTERNAL_ERROR).send("Internal server error"); return; } diff --git a/src/app/middlewares/OfficeMembershipHandlers/OfficeRoleHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/OfficeRoleHandler.ts index c0e9f53f..dbe7fd77 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/OfficeRoleHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/OfficeRoleHandler.ts @@ -30,9 +30,8 @@ export default async function officeRoleHandler(req: Request, response: Response } next(); - } catch (error) { - console.log(error); + console.error(error); response.status(HttpCodes.INTERNAL_ERROR).send("Internal server error"); return; } diff --git a/src/app/middlewares/OfficeMembershipHandlers/UserHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/UserHandler.ts index ea05b60d..acf8c531 100644 --- a/src/app/middlewares/OfficeMembershipHandlers/UserHandler.ts +++ b/src/app/middlewares/OfficeMembershipHandlers/UserHandler.ts @@ -31,7 +31,7 @@ export default async function userHandler(req: Request, response: Response, next next(); } catch (error) { - console.log(error); + console.error(error); response.status(HttpCodes.INTERNAL_ERROR).send("Internal server error"); return; } diff --git a/src/app/middlewares/RolesHandler.ts b/src/app/middlewares/RolesHandler.ts index 0a423db8..8236cf79 100644 --- a/src/app/middlewares/RolesHandler.ts +++ b/src/app/middlewares/RolesHandler.ts @@ -3,11 +3,10 @@ import { NextFunction, Request, Response } from "express"; export default async function roleHandler(req: Request, response: Response, next: NextFunction) { try { - const namespace = req.path && req.path.split("/")[3]; const role = req.body.user.role; - if(!role) { + if (!role) { response.status(HttpCodes.UNAUTHORIZED).send("Unauthorized without role"); return; } @@ -18,9 +17,8 @@ export default async function roleHandler(req: Request, response: Response, next } next(); - } catch (error) { - console.log(error); + console.error(error); response.status(HttpCodes.INTERNAL_ERROR).send("Internal server error"); return; } diff --git a/src/app/middlewares/RulesHandler.ts b/src/app/middlewares/RulesHandler.ts index ff677652..806bed73 100644 --- a/src/app/middlewares/RulesHandler.ts +++ b/src/app/middlewares/RulesHandler.ts @@ -17,9 +17,8 @@ export default async function ruleHandler(req: Request, response: Response, next } next(); - } catch (error) { - console.log(error); + console.error(error); response.status(HttpCodes.INTERNAL_ERROR).send("Internal server error"); return; } diff --git a/src/common/databases/seeders/prod-seeder.ts b/src/common/databases/seeders/prod-seeder.ts index 30cfe1af..a5e9d8d2 100644 --- a/src/common/databases/seeders/prod-seeder.ts +++ b/src/common/databases/seeders/prod-seeder.ts @@ -1,14 +1,5 @@ import { EOfficeStatus, Prisma, PrismaClient } from "@prisma/client"; -import { - Address, - Deed, - DeedType, - DocumentType, - Office, - OfficeRole, - Role, - Rule, -} from "le-coffre-resources/dist/SuperAdmin"; +import { Address, Deed, DeedType, DocumentType, Office, OfficeRole, Role, Rule } from "le-coffre-resources/dist/SuperAdmin"; import "module-alias/register"; @@ -1280,7 +1271,7 @@ export default async function main() { const createArgs: Prisma.DeedTypesCreateArgs = { data: { name: deedType.name, - description: deedType.description || "" , + description: deedType.description || "", office: { connect: { uid: deedType.office!.uid, @@ -1329,7 +1320,7 @@ export default async function main() { console.log(">MOCK DATA - Seeding completed!"); } catch (error) { - console.log(error); + console.error(error); console.log("Data already seeded, skiping"); } } diff --git a/src/common/databases/seeders/seeder.ts b/src/common/databases/seeders/seeder.ts index ce7da8bb..15e13e69 100644 --- a/src/common/databases/seeders/seeder.ts +++ b/src/common/databases/seeders/seeder.ts @@ -870,31 +870,20 @@ export default async function main() { "POST document-types", "POST deed-types", "PUT document-types", - ] + ], }, { name: "Gestion de l'abonnement", uid: "94343601-04c8-44ef-afb9-3047597528a9", created_at: new Date(), updated_at: new Date(), - rules : [ - "GET subscriptions", - "POST subscriptions", - "PUT subscriptions", - "GET stripe", - "POST stripe", - ] + rules: ["GET subscriptions", "POST subscriptions", "PUT subscriptions", "GET stripe", "POST stripe"], }, { name: "Intégration du RIB", created_at: new Date(), updated_at: new Date(), - rules : [ - "PUT rib", - "GET rib", - "POST rib", - "DELETE rib", - ] + rules: ["PUT rib", "GET rib", "POST rib", "DELETE rib"], }, ]; @@ -2190,7 +2179,7 @@ export default async function main() { console.log(">MOCK DATA - Seeding completed!"); } catch (error) { - console.log(error); + console.error(error); console.log("Data already seeded, skiping"); } } diff --git a/src/common/databases/seeders/seederOld.ts b/src/common/databases/seeders/seederOld.ts index 160fe314..5ec06f84 100644 --- a/src/common/databases/seeders/seederOld.ts +++ b/src/common/databases/seeders/seederOld.ts @@ -870,30 +870,19 @@ export default async function main() { "POST document-types", "POST deed-types", "PUT document-types", - ] + ], }, { name: "Gestion de l'abonnement", created_at: new Date(), updated_at: new Date(), - rules : [ - "GET subscriptions", - "POST subscriptions", - "PUT subscriptions", - "GET stripe", - "POST stripe", - ] + rules: ["GET subscriptions", "POST subscriptions", "PUT subscriptions", "GET stripe", "POST stripe"], }, { name: "Intégration du RIB", created_at: new Date(), updated_at: new Date(), - rules : [ - "PUT rib", - "GET rib", - "POST rib", - "DELETE rib", - ] + rules: ["PUT rib", "GET rib", "POST rib", "DELETE rib"], }, ]; @@ -2187,7 +2176,7 @@ export default async function main() { console.log(">MOCK DATA - Seeding completed!"); } catch (error) { - console.log(error); + console.error(error); console.log("Data already seeded, skiping"); } } diff --git a/src/services/super-admin/UsersService/UsersService.ts b/src/services/super-admin/UsersService/UsersService.ts index 0781623c..bf7de606 100644 --- a/src/services/super-admin/UsersService/UsersService.ts +++ b/src/services/super-admin/UsersService/UsersService.ts @@ -90,6 +90,4 @@ export default class UsersService extends BaseService { public getUsersToBeChecked() { return this.userRepository.findManyToCheck(); } - - } From f68d527dc1106ce51e38a0f1288c886e641fc22c Mon Sep 17 00:00:00 2001 From: Maxime Lalo Date: Mon, 29 Apr 2024 15:10:17 +0200 Subject: [PATCH 4/5] :sparkles: remove console logs --- src/common/databases/seeders/prod-seeder.ts | 4 ++-- src/common/databases/seeders/seeder.ts | 4 ++-- src/common/databases/seeders/seederOld.ts | 4 ++-- src/entries/Cron.ts | 9 ++++----- src/services/common/Id360Service/Id360Service.ts | 2 +- 5 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/common/databases/seeders/prod-seeder.ts b/src/common/databases/seeders/prod-seeder.ts index a5e9d8d2..7dba4684 100644 --- a/src/common/databases/seeders/prod-seeder.ts +++ b/src/common/databases/seeders/prod-seeder.ts @@ -1318,10 +1318,10 @@ export default async function main() { deed.uid = deedCreated.uid; } - console.log(">MOCK DATA - Seeding completed!"); + console.info(">MOCK DATA - Seeding completed!"); } catch (error) { console.error(error); - console.log("Data already seeded, skiping"); + console.info("Data already seeded, skiping"); } } main(); diff --git a/src/common/databases/seeders/seeder.ts b/src/common/databases/seeders/seeder.ts index 15e13e69..b266bbed 100644 --- a/src/common/databases/seeders/seeder.ts +++ b/src/common/databases/seeders/seeder.ts @@ -2177,10 +2177,10 @@ export default async function main() { officeFolder.uid = officeFolderCreated.uid; } - console.log(">MOCK DATA - Seeding completed!"); + console.info(">MOCK DATA - Seeding completed!"); } catch (error) { console.error(error); - console.log("Data already seeded, skiping"); + console.info("Data already seeded, skiping"); } } main(); diff --git a/src/common/databases/seeders/seederOld.ts b/src/common/databases/seeders/seederOld.ts index 5ec06f84..967a2b81 100644 --- a/src/common/databases/seeders/seederOld.ts +++ b/src/common/databases/seeders/seederOld.ts @@ -2174,10 +2174,10 @@ export default async function main() { officeFolder.uid = officeFolderCreated.uid; } - console.log(">MOCK DATA - Seeding completed!"); + console.info(">MOCK DATA - Seeding completed!"); } catch (error) { console.error(error); - console.log("Data already seeded, skiping"); + console.info("Data already seeded, skiping"); } } main(); diff --git a/src/entries/Cron.ts b/src/entries/Cron.ts index 0b17f5b4..760eaa9c 100644 --- a/src/entries/Cron.ts +++ b/src/entries/Cron.ts @@ -6,19 +6,18 @@ import { BackendVariables } from "@Common/config/variables/Variables"; import CronService from "@Services/common/CronService/CronService"; (async () => { - console.log("Cron started"); - + console.info("Cron started"); + try { const variables = await Container.get(BackendVariables).validate(); Container.get(CronService).archiveFiles(); await Container.get(CronService).updateUsers(); Container.get(CronService).checkDocumentsExpiration(); - if(variables.ENV !== "dev"){ + if (variables.ENV !== "dev") { Container.get(CronService).sendMails(); Container.get(CronService).sendRecapMails(); } - } catch (e) { console.error(e); } -})(); \ No newline at end of file +})(); diff --git a/src/services/common/Id360Service/Id360Service.ts b/src/services/common/Id360Service/Id360Service.ts index 9a98fe39..b05955f4 100644 --- a/src/services/common/Id360Service/Id360Service.ts +++ b/src/services/common/Id360Service/Id360Service.ts @@ -174,7 +174,7 @@ export default class Id360Service extends BaseService { }, ); - console.log(await resRecto.json(), await resVerso.json()); + console.info(await resRecto.json(), await resVerso.json()); await this.finalizeEnrollment(apiKey); } From cb9c98f43fb0280bae0382552d43fdaa22a8bed7 Mon Sep 17 00:00:00 2001 From: Maxime Lalo Date: Mon, 29 Apr 2024 15:23:42 +0200 Subject: [PATCH 5/5] :bug: fix faille refresh token --- src/app/api/idnot/UserController.ts | 80 ++++++------------- .../SubscriptionsService.ts.ts | 42 +++++++++- 2 files changed, 64 insertions(+), 58 deletions(-) diff --git a/src/app/api/idnot/UserController.ts b/src/app/api/idnot/UserController.ts index 69227cde..36d6ed57 100644 --- a/src/app/api/idnot/UserController.ts +++ b/src/app/api/idnot/UserController.ts @@ -8,9 +8,6 @@ import IdNotService from "@Services/common/IdNotService/IdNotService"; import User, { RulesGroup } from "le-coffre-resources/dist/Admin"; import UsersService from "@Services/super-admin/UsersService/UsersService"; import SubscriptionsService from "@Services/admin/SubscriptionsService/SubscriptionsService.ts"; -import { ESubscriptionStatus } from "@prisma/client"; -import SeatsService from "@Services/admin/SeatsService/SeatsService"; -import { EType } from "le-coffre-resources/dist/Admin/Subscription"; import RulesGroupsService from "@Services/admin/RulesGroupsService/RulesGroupsService"; @Controller() @@ -21,7 +18,6 @@ export default class UserController extends ApiController { private idNotService: IdNotService, private userService: UsersService, private subscriptionsService: SubscriptionsService, - private seatsService: SeatsService, private rulesGroupsService: RulesGroupsService, ) { super(); @@ -71,35 +67,7 @@ export default class UserController extends ApiController { this.httpUnauthorized(response, "Email not found"); return; } - let isSubscribed = false; - - const subscriptions = await this.subscriptionsService.get({ where: { office_uid: userHydrated.office_membership?.uid } }); - - if (!subscriptions || subscriptions.length === 0 || subscriptions[0]?.status === ESubscriptionStatus.INACTIVE) { - isSubscribed = false; - } else if (subscriptions[0]?.type === EType.Unlimited) { - isSubscribed = true; - } else { - const hasSeat = await this.subscriptionsService.get({ - where: { status: ESubscriptionStatus.ACTIVE, seats: { some: { user_uid: userHydrated.uid } } }, - }); - - if (hasSeat && hasSeat.length > 0) { - isSubscribed = true; - } else { - const nbMaxSeats = subscriptions[0]!.nb_seats; - - const nbCurrentSeats = await this.seatsService.get({ where: { subscription_uid: subscriptions[0]!.uid } }); - - //if nbMaxSeats < nbCurrentSeats, create a new seat for the user - if (nbMaxSeats > nbCurrentSeats.length) { - const seatAdded = await this.seatsService.create(user.uid, subscriptions[0]!.uid); - if (seatAdded) { - isSubscribed = true; - } - } - } - } + let isSubscribed = await this.subscriptionsService.isUserSubscribed(user.uid, userHydrated.office_membership?.uid!); //Check if user is whitelisted // const isWhitelisted = await this.whitelistService.getByEmail(userHydrated.contact!.email); @@ -118,22 +86,7 @@ export default class UserController extends ApiController { const payload = await this.authService.getUserJwtPayload(user.idNot); if (!payload) return; - if (!isSubscribed && userHydrated.role?.name === "admin") { - const manageSubscriptionRulesEntity = await this.rulesGroupsService.get({ - where: { uid: "94343601-04c8-44ef-afb9-3047597528a9" }, - include: { rules: true }, - }); - - const manageSubscriptionRules = RulesGroup.hydrateArray(manageSubscriptionRulesEntity, { - strategy: "excludeAll", - }); - if (!manageSubscriptionRules[0]) return; - - payload.rules = manageSubscriptionRules[0].rules!.map((rule) => rule.name) || []; - - isSubscribed = true; - } - if (!isSubscribed && userHydrated.role?.name === "super-admin") { + if (!isSubscribed && (userHydrated.role?.name === "admin" || userHydrated.role?.name === "super-admin")) { const manageSubscriptionRulesEntity = await this.rulesGroupsService.get({ where: { uid: "94343601-04c8-44ef-afb9-3047597528a9" }, include: { rules: true }, @@ -186,11 +139,30 @@ export default class UserController extends ApiController { const openId = (userPayload as IUserJwtPayload).openId.userId; if (!openId) return; - const newUserPayload = await this.authService.getUserJwtPayload(openId.toString(), PROVIDER_OPENID.idNot); - const user = newUserPayload as IUserJwtPayload; - delete user.iat; - delete user.exp; - accessToken = this.authService.generateAccessToken(user); + const newUserPayload = (await this.authService.getUserJwtPayload( + openId.toString(), + PROVIDER_OPENID.idNot, + )) as IUserJwtPayload; + let isSubscribed = await this.subscriptionsService.isUserSubscribed(newUserPayload.userId, newUserPayload.office_Id); + + if (!isSubscribed && (newUserPayload.role === "admin" || newUserPayload.role === "super-admin")) { + const manageSubscriptionRulesEntity = await this.rulesGroupsService.get({ + where: { uid: "94343601-04c8-44ef-afb9-3047597528a9" }, + include: { rules: true }, + }); + + const manageSubscriptionRules = RulesGroup.hydrateArray(manageSubscriptionRulesEntity, { + strategy: "excludeAll", + }); + if (!manageSubscriptionRules[0]) return; + + newUserPayload.rules = manageSubscriptionRules[0].rules!.map((rule) => rule.name) || []; + + isSubscribed = true; + } + delete newUserPayload.iat; + delete newUserPayload.exp; + accessToken = this.authService.generateAccessToken(newUserPayload); this.httpSuccess(response, { accessToken }); }); diff --git a/src/services/admin/SubscriptionsService/SubscriptionsService.ts.ts b/src/services/admin/SubscriptionsService/SubscriptionsService.ts.ts index 77120e70..78b1696e 100644 --- a/src/services/admin/SubscriptionsService/SubscriptionsService.ts.ts +++ b/src/services/admin/SubscriptionsService/SubscriptionsService.ts.ts @@ -1,10 +1,11 @@ import BaseService from "@Services/BaseService"; import "reflect-metadata"; import { Service } from "typedi"; -import { Prisma, Subscriptions } from "@prisma/client"; +import { ESubscriptionStatus, Prisma, Subscriptions } from "@prisma/client"; import SubscriptionsRepository from "@Repositories/SubscriptionsRepository"; import { Subscription } from "le-coffre-resources/dist/Admin"; import SeatsService from "../SeatsService/SeatsService"; +import { EType } from "le-coffre-resources/dist/Admin/Subscription"; @Service() export default class SubscriptionsService extends BaseService { @@ -40,9 +41,9 @@ export default class SubscriptionsService extends BaseService { * @description : Modify a subscription * @throws {Error} If subscription cannot be modified */ - public async update(uid: string, subscriptionEntity: Subscription): Promise { - if(subscriptionEntity.type === "STANDARD"){ - const seats = await this.seatsService.get({ where: { subscription: { uid: uid } }, orderBy: {created_at: 'asc'} }); + public async update(uid: string, subscriptionEntity: Subscription): Promise { + if (subscriptionEntity.type === "STANDARD") { + const seats = await this.seatsService.get({ where: { subscription: { uid: uid } }, orderBy: { created_at: "asc" } }); const seatsToKeep = subscriptionEntity.nb_seats; const seatsToDelete = seats.slice(seatsToKeep); @@ -60,4 +61,37 @@ export default class SubscriptionsService extends BaseService { public async delete(uid: string) { return this.subscriptionsRepository.delete(uid); } + + public async isUserSubscribed(userUid: string, officeUid: string): Promise { + let isSubscribed = false; + + const subscriptions = await this.get({ where: { office_uid: officeUid } }); + + if (!subscriptions || subscriptions.length === 0 || subscriptions[0]?.status === ESubscriptionStatus.INACTIVE) { + isSubscribed = false; + } else if (subscriptions[0]?.type === EType.Unlimited) { + isSubscribed = true; + } else { + const hasSeat = await this.get({ + where: { status: ESubscriptionStatus.ACTIVE, seats: { some: { user_uid: userUid } } }, + }); + + if (hasSeat && hasSeat.length > 0) { + isSubscribed = true; + } else { + const nbMaxSeats = subscriptions[0]!.nb_seats; + + const nbCurrentSeats = await this.seatsService.get({ where: { subscription_uid: subscriptions[0]!.uid } }); + + //if nbMaxSeats < nbCurrentSeats, create a new seat for the user + if (nbMaxSeats > nbCurrentSeats.length) { + const seatAdded = await this.seatsService.create(userUid, subscriptions[0]!.uid); + if (seatAdded) { + isSubscribed = true; + } + } + } + } + return isSubscribed; + } }