diff --git a/src/app/api/idnot/UserController.ts b/src/app/api/idnot/UserController.ts index 24863fff..2dd2029a 100644 --- a/src/app/api/idnot/UserController.ts +++ b/src/app/api/idnot/UserController.ts @@ -24,13 +24,13 @@ export default class UserController extends ApiController { try { const code = req.params["code"]; if (!code) throw new Error("code is required"); - const token = await fetch('https://qual-connexion.idnot.fr/IdPOAuth2/token/idnot_idp_v1', {method: 'POST'}); + const token = await fetch("https://qual-connexion.idnot.fr/IdPOAuth2/token/idnot_idp_v1", { method: "POST" }); console.log(token); //const user = await this.authService.getUserFromIdNotTokens(code!); //success this.httpSuccess(response); } catch (error) { - console.log(error) + console.log(error); this.httpInternalError(response); return; } @@ -46,7 +46,7 @@ export default class UserController extends ApiController { const accessToken = this.authService.generateAccessToken(payload); const refreshToken = this.authService.generateRefreshToken(payload); - //success + //success this.httpSuccess(response, { accessToken, refreshToken }); } catch (error) { this.httpInternalError(response); @@ -72,9 +72,9 @@ export default class UserController extends ApiController { return; } - const user = userPayload as JwtPayload; - delete user.iat; - delete user!.exp; + const user = userPayload as JwtPayload; + delete user.iat; + delete user!.exp; accessToken = this.authService.generateAccessToken(user); }); diff --git a/src/app/api/super-admin/CustomersController.ts b/src/app/api/super-admin/CustomersController.ts index 440de50b..ca108b25 100644 --- a/src/app/api/super-admin/CustomersController.ts +++ b/src/app/api/super-admin/CustomersController.ts @@ -19,7 +19,7 @@ export default class CustomersController extends ApiController { /** * @description Get all customers */ - @Get("/api/v1/super-admin/customers", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/customers", [authHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -42,7 +42,7 @@ export default class CustomersController extends ApiController { /** * @description Create a new customer */ - @Post("/api/v1/super-admin/customers", [authHandler,ruleHandler]) + @Post("/api/v1/super-admin/customers", [authHandler, ruleHandler]) protected async post(req: Request, response: Response) { try { //init IUser resource with request body values @@ -68,7 +68,7 @@ export default class CustomersController extends ApiController { /** * @description Modify a specific customer by uid */ - @Put("/api/v1/super-admin/customers/:uid", [authHandler,ruleHandler]) + @Put("/api/v1/super-admin/customers/:uid", [authHandler, ruleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -86,7 +86,7 @@ export default class CustomersController extends ApiController { //init IUser resource with request body values const customerEntity = Customer.hydrate(req.body); - + //validate user await validateOrReject(customerEntity, { groups: ["updateCustomer"], forbidUnknownValues: false }); @@ -109,7 +109,7 @@ export default class CustomersController extends ApiController { /** * @description Get a specific customer by uid */ - @Get("/api/v1/super-admin/customers/:uid", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/customers/:uid", [authHandler, ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/DeedTypesController.ts b/src/app/api/super-admin/DeedTypesController.ts index d890bc2c..40de058e 100644 --- a/src/app/api/super-admin/DeedTypesController.ts +++ b/src/app/api/super-admin/DeedTypesController.ts @@ -3,11 +3,12 @@ import { Controller, Get, Post, Put } from "@ControllerPattern/index"; import ApiController from "@Common/system/controller-pattern/ApiController"; import { Service } from "typedi"; import DeedTypesService from "@Services/super-admin/DeedTypesService/DeedTypesService"; -import { DeedTypes } from "@prisma/client"; +import { DeedTypes, Prisma } from "@prisma/client"; import { DeedType } from "le-coffre-resources/dist/SuperAdmin"; import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; +import deedTypeHandler from "@App/middlewares/OfficeMembershipHandlers/DeedTypeHandler"; @Controller() @Service() @@ -20,11 +21,15 @@ export default class DeedTypesController extends ApiController { * @description Get all deedtypes * @returns Deedtype[] list of deedtypes */ - @Get("/api/v1/super-admin/deed-types", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/deed-types", [authHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query const query = JSON.parse(req.query["q"] as string); + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.DeedTypesWhereInput = { office: { uid: officeId } }; + query.where = officeWhereInput; + //call service to get prisma entity const deedTypeEntities: DeedTypes[] = await this.deedTypesService.get(query); @@ -43,7 +48,7 @@ export default class DeedTypesController extends ApiController { * @description Create a new deedtype * @returns Deedtype created */ - @Post("/api/v1/super-admin/deed-types", [authHandler,ruleHandler]) + @Post("/api/v1/super-admin/deed-types", [authHandler, ruleHandler, deedTypeHandler]) protected async post(req: Request, response: Response) { try { //init DeedType resource with request body values @@ -72,7 +77,7 @@ export default class DeedTypesController extends ApiController { * @description Modify a specific deedtype by uid * @returns Deedtype modified */ - @Put("/api/v1/super-admin/deed-types/:uid", [authHandler,ruleHandler]) + @Put("/api/v1/super-admin/deed-types/:uid", [authHandler, ruleHandler, deedTypeHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -87,7 +92,7 @@ export default class DeedTypesController extends ApiController { this.httpNotFoundRequest(response, "deed type not found"); return; } - + //init DeedType resource with request body values const deedTypeEntity = DeedType.hydrate(req.body); @@ -114,7 +119,7 @@ export default class DeedTypesController extends ApiController { * @description Get a specific deedtype by uid * @returns IDeedtype */ - @Get("/api/v1/super-admin/deed-types/:uid", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/deed-types/:uid", [authHandler, ruleHandler, deedTypeHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/DeedsController.ts b/src/app/api/super-admin/DeedsController.ts index 2dd94592..a2d8eb2e 100644 --- a/src/app/api/super-admin/DeedsController.ts +++ b/src/app/api/super-admin/DeedsController.ts @@ -3,11 +3,12 @@ import { Controller, Get, Put } from "@ControllerPattern/index"; import ApiController from "@Common/system/controller-pattern/ApiController"; import DeedsService from "@Services/super-admin/DeedsService/DeedsService"; import { Service } from "typedi"; -import { Deeds } from "@prisma/client"; +import { Deeds, Prisma } from "@prisma/client"; import { Deed } from "le-coffre-resources/dist/SuperAdmin"; import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; +import deedHandler from "@App/middlewares/OfficeMembershipHandlers/DeedHandler"; @Controller() @Service() @@ -20,11 +21,15 @@ export default class DeedsController extends ApiController { * @description Get all deeds * @returns Deed[] list of deeds */ - @Get("/api/v1/super-admin/deeds", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/deeds", [authHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query const query = JSON.parse(req.query["q"] as string); + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.DeedsWhereInput = { deed_type: { office: { uid: officeId } } }; + query.where = officeWhereInput; + //call service to get prisma entity const deedEntities: Deeds[] = await this.deedsService.get(query); @@ -43,7 +48,7 @@ export default class DeedsController extends ApiController { * @description Get a specific deed by uid * @returns Deed */ - @Get("/api/v1/super-admin/deeds/:uid", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/deeds/:uid", [authHandler, ruleHandler, deedHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -81,7 +86,7 @@ export default class DeedsController extends ApiController { /** * @description Modify a specific deed by uid */ - @Put("/api/v1/super-admin/deeds/:uid", [authHandler,ruleHandler]) + @Put("/api/v1/super-admin/deeds/:uid", [authHandler, ruleHandler, deedHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -99,9 +104,9 @@ export default class DeedsController extends ApiController { //init OfficeFolder resource with request body values const deedEntity = Deed.hydrate(req.body); - + //validate folder - await validateOrReject(deedEntity, { groups: ["updateDeed"], forbidUnknownValues: false }); + await validateOrReject(deedEntity, { groups: ["updateDeed"], forbidUnknownValues: false }); //call service to get prisma entity const deedEntityUpdated = await this.deedsService.update(uid, deedEntity); diff --git a/src/app/api/super-admin/DocumentTypesController.ts b/src/app/api/super-admin/DocumentTypesController.ts index 99cef9ac..5690a57a 100644 --- a/src/app/api/super-admin/DocumentTypesController.ts +++ b/src/app/api/super-admin/DocumentTypesController.ts @@ -3,12 +3,13 @@ import { Controller, Get, Post, Put } from "@ControllerPattern/index"; import ApiController from "@Common/system/controller-pattern/ApiController"; import { Service } from "typedi"; import DocumentTypesService from "@Services/super-admin/DocumentTypesService/DocumentTypesService"; -import { DocumentTypes } from "@prisma/client"; +import { DocumentTypes, Prisma } from "@prisma/client"; import ObjectHydrate from "@Common/helpers/ObjectHydrate"; import { DocumentType } from "le-coffre-resources/dist/SuperAdmin"; import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; +import documentTypeHandler from "@App/middlewares/OfficeMembershipHandlers/DocumentTypeHandler"; @Controller() @Service() @@ -20,11 +21,14 @@ export default class DocumentTypesController extends ApiController { /** * @description Get all document-types */ - @Get("/api/v1/super-admin/document-types", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/document-types", [authHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query const query = JSON.parse(req.query["q"] as string); + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.DocumentTypesWhereInput = { office: { uid: officeId } }; + query.where = officeWhereInput; //call service to get prisma entity const documentTypeEntities: DocumentTypes[] = await this.documentTypesService.get(query); @@ -45,7 +49,7 @@ export default class DocumentTypesController extends ApiController { /** * @description Create a new documentType */ - @Post("/api/v1/super-admin/document-types", [authHandler,ruleHandler]) + @Post("/api/v1/super-admin/document-types", [authHandler, ruleHandler, documentTypeHandler]) protected async post(req: Request, response: Response) { try { //init DocumentType resource with request body values @@ -69,7 +73,7 @@ export default class DocumentTypesController extends ApiController { /** * @description Modify a specific documentType by uid */ - @Put("/api/v1/super-admin/document-types/:uid", [authHandler,ruleHandler]) + @Put("/api/v1/super-admin/document-types/:uid", [authHandler, ruleHandler, documentTypeHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -88,7 +92,7 @@ export default class DocumentTypesController extends ApiController { const documentTypeEntity = DocumentType.hydrate(req.body); //validate user - await validateOrReject(documentTypeEntity, { groups: ["update"] }); + await validateOrReject(documentTypeEntity, { groups: ["updateDocumentType"] }); //call service to get prisma entity const documentTypeEntityUpdated = await this.documentTypesService.update(uid, documentTypeEntity); @@ -109,7 +113,7 @@ export default class DocumentTypesController extends ApiController { /** * @description Get a specific documentType by uid */ - @Get("/api/v1/super-admin/document-types/:uid", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/document-types/:uid", [authHandler, ruleHandler, documentTypeHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -128,13 +132,8 @@ export default class DocumentTypesController extends ApiController { documentTypeEntity = await this.documentTypesService.getByUid(uid); } - if (!documentTypeEntity) { - this.httpNotFoundRequest(response, "document not found"); - return; - } - //Hydrate ressource with prisma entity - const user = ObjectHydrate.hydrate(new DocumentType(), documentTypeEntity, { strategy: "excludeAll" }); + const user = ObjectHydrate.hydrate(new DocumentType(), documentTypeEntity!, { strategy: "excludeAll" }); //success this.httpSuccess(response, user); diff --git a/src/app/api/super-admin/DocumentsController.ts b/src/app/api/super-admin/DocumentsController.ts index cfc5bb2f..e9644829 100644 --- a/src/app/api/super-admin/DocumentsController.ts +++ b/src/app/api/super-admin/DocumentsController.ts @@ -3,11 +3,12 @@ import { Controller, Delete, Get, Post, Put } from "@ControllerPattern/index"; import ApiController from "@Common/system/controller-pattern/ApiController"; import { Service } from "typedi"; import DocumentsService from "@Services/super-admin/DocumentsService/DocumentsService"; -import { Documents } from "@prisma/client"; +import { Documents, Prisma } from "@prisma/client"; import { Document } from "le-coffre-resources/dist/SuperAdmin"; import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; +import documentHandler from "@App/middlewares/OfficeMembershipHandlers/DocumentHandler"; @Controller() @Service() @@ -20,14 +21,17 @@ export default class DocumentsController extends ApiController { * @description Get all documents * @returns IDocument[] list of documents */ - @Get("/api/v1/super-admin/documents", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/documents", [authHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query const query = JSON.parse(req.query["q"] as string); + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.DocumentsWhereInput = { document_type: { office: { uid: officeId } } }; + query.where = officeWhereInput; //call service to get prisma entity - const documentEntities: Documents[] = await this.documentsService.get(query); + const documentEntities = await this.documentsService.get(query); //Hydrate ressource with prisma entity const documents = Document.hydrateArray(documentEntities, { strategy: "excludeAll" }); @@ -44,7 +48,7 @@ export default class DocumentsController extends ApiController { * @description Create a new document * @returns IDocument created */ - @Post("/api/v1/super-admin/documents", [authHandler,ruleHandler]) + @Post("/api/v1/super-admin/documents", [authHandler, ruleHandler, documentHandler]) protected async post(req: Request, response: Response) { try { //init Document resource with request body values @@ -72,7 +76,7 @@ export default class DocumentsController extends ApiController { /** * @description Update a specific document */ - @Put("/api/v1/super-admin/documents/:uid", [authHandler,ruleHandler]) + @Put("/api/v1/super-admin/documents/:uid", [authHandler, ruleHandler, documentHandler]) protected async update(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -80,7 +84,7 @@ export default class DocumentsController extends ApiController { this.httpBadRequest(response, "No uid provided"); return; } - + const documentFound = await this.documentsService.getByUid(uid); if (!documentFound) { @@ -89,7 +93,7 @@ export default class DocumentsController extends ApiController { } //init Document resource with request body values - const documentEntity = Document.hydrate(req.body); + const documentEntity = Document.hydrate(req.body); //validate document await validateOrReject(documentEntity, { groups: ["updateDocument"] }); @@ -111,7 +115,7 @@ export default class DocumentsController extends ApiController { /** * @description Delete a specific document */ - @Delete("/api/v1/super-admin/documents/:uid", [authHandler,ruleHandler]) + @Delete("/api/v1/super-admin/documents/:uid", [authHandler, ruleHandler, documentHandler]) protected async delete(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -144,7 +148,7 @@ export default class DocumentsController extends ApiController { /** * @description Get a specific document by uid */ - @Get("/api/v1/super-admin/documents/:uid", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/documents/:uid", [authHandler, ruleHandler, documentHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/FilesController.ts b/src/app/api/super-admin/FilesController.ts index 465e684f..33611649 100644 --- a/src/app/api/super-admin/FilesController.ts +++ b/src/app/api/super-admin/FilesController.ts @@ -3,12 +3,13 @@ import { Controller, Delete, Get, Post, Put } from "@ControllerPattern/index"; import ApiController from "@Common/system/controller-pattern/ApiController"; import { Service } from "typedi"; import FilesService from "@Services/common/FilesService/FilesService"; -import { Files } from "@prisma/client"; +import { Files, Prisma } from "@prisma/client"; import { File } from "le-coffre-resources/dist/SuperAdmin"; import { validateOrReject } from "class-validator"; import DocumentsService from "@Services/super-admin/DocumentsService/DocumentsService"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; +import fileHandler from "@App/middlewares/OfficeMembershipHandlers/FileHandler"; @Controller() @Service() @@ -21,12 +22,14 @@ export default class FilesController extends ApiController { * @description Get all Files * @returns File[] list of Files */ - @Get("/api/v1/super-admin/files", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/files", [authHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query const query = JSON.parse(req.query["q"] as string); - + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.FilesWhereInput = { document: { folder: { office: { uid: officeId } } } }; + query.where = officeWhereInput; //call service to get prisma entity const fileEntities = await this.filesService.get(query); @@ -44,7 +47,7 @@ export default class FilesController extends ApiController { /** * @description Get a specific File by uid */ - @Get("/api/v1/super-admin/files/download/:uid", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/files/download/:uid", [authHandler, ruleHandler, fileHandler]) protected async download(req: Request, response: Response) { const uid = req.params["uid"]; if (!uid) { @@ -73,7 +76,7 @@ export default class FilesController extends ApiController { * @description Create a new File * @returns File created */ - @Post("/api/v1/super-admin/files", [authHandler,ruleHandler]) + @Post("/api/v1/super-admin/files", [authHandler, ruleHandler, fileHandler]) protected async post(req: Request, response: Response) { try { //get file @@ -90,13 +93,8 @@ export default class FilesController extends ApiController { const document = await this.documentService.getByUid(fileEntity.document!.uid!); - if(!document){ - this.httpNotFoundRequest(response, "document not found"); - return; - } - - document.document_status = "DEPOSITED"; - await this.documentService.update(document.uid!, document); + document!.document_status = "DEPOSITED"; + await this.documentService.update(document!.uid!, document!); //Hydrate ressource with prisma entity const fileEntityHydrated = File.hydrate(fileEntityCreated, { @@ -114,7 +112,7 @@ export default class FilesController extends ApiController { /** * @description Update a specific file */ - @Put("/api/v1/super-admin/files/:uid", [authHandler,ruleHandler]) + @Put("/api/v1/super-admin/files/:uid", [authHandler, ruleHandler, fileHandler]) protected async update(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -152,7 +150,7 @@ export default class FilesController extends ApiController { /** * @description Delete a specific File */ - @Delete("/api/v1/super-admin/files/:uid", [authHandler,ruleHandler]) + @Delete("/api/v1/super-admin/files/:uid", [authHandler, ruleHandler, fileHandler]) protected async delete(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -190,7 +188,7 @@ export default class FilesController extends ApiController { /** * @description Get a specific File by uid */ - @Get("/api/v1/super-admin/files/:uid", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/files/:uid", [authHandler, ruleHandler, fileHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/OfficeFoldersController.ts b/src/app/api/super-admin/OfficeFoldersController.ts index 6999e03b..259250a4 100644 --- a/src/app/api/super-admin/OfficeFoldersController.ts +++ b/src/app/api/super-admin/OfficeFoldersController.ts @@ -3,11 +3,12 @@ import { Controller, Delete, Get, Post, Put } from "@ControllerPattern/index"; import ApiController from "@Common/system/controller-pattern/ApiController"; import OfficeFoldersService from "@Services/super-admin/OfficeFoldersService/OfficeFoldersService"; import { Service } from "typedi"; -import { OfficeFolders } from "@prisma/client"; +import { OfficeFolders, Prisma } from "@prisma/client"; import { OfficeFolder } from "le-coffre-resources/dist/SuperAdmin"; import { validateOrReject } from "class-validator"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; +import folderHandler from "@App/middlewares/OfficeMembershipHandlers/FolderHandler"; @Controller() @Service() @@ -19,15 +20,17 @@ export default class OfficeFoldersController extends ApiController { /** * @description Get all folders */ - @Get("/api/v1/super-admin/folders", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/folders", [authHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query const query = JSON.parse(req.query["q"] as string); - + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.OfficeFoldersWhereInput = { office: { uid: officeId } }; + query.where = officeWhereInput; //call service to get prisma entity const officeFolderEntities: OfficeFolders[] = await this.officeFoldersService.get(query); - + //Hydrate ressource with prisma entity const officeFolders = OfficeFolder.hydrateArray(officeFolderEntities, { strategy: "excludeAll", @@ -43,25 +46,12 @@ export default class OfficeFoldersController extends ApiController { /** * @description Create a new folder */ - @Post("/api/v1/super-admin/folders", [authHandler,ruleHandler]) + @Post("/api/v1/super-admin/folders", [authHandler, ruleHandler, folderHandler]) protected async post(req: Request, response: Response) { try { //init OfficeFolder resource with request body values const officeFolderRessource = OfficeFolder.hydrate(req.body); - await officeFolderRessource.validateOrReject?.({ groups: ["createFolder"] , forbidUnknownValues: false }); - - const officeFolderNumberExist = await this.officeFoldersService.get({where: {folder_number: officeFolderRessource.folder_number}}); - - - if (officeFolderNumberExist.length > 0) { - this.httpValidationError(response, [{ - property: "folder_number", - constraints: { - unique: "folder_number must be unique", - }, - }]); - return; - } + await officeFolderRessource.validateOrReject?.({ groups: ["createFolder"], forbidUnknownValues: false }); //call service to get prisma entity const officeFolderEntity = await this.officeFoldersService.create(officeFolderRessource); @@ -80,7 +70,7 @@ export default class OfficeFoldersController extends ApiController { /** * @description Modify a specific folder by uid */ - @Put("/api/v1/super-admin/folders/:uid", [authHandler,ruleHandler]) + @Put("/api/v1/super-admin/folders/:uid", [authHandler, ruleHandler, folderHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -122,7 +112,7 @@ export default class OfficeFoldersController extends ApiController { * @description Get a specific folder by uid * @returns IFolder */ - @Get("/api/v1/super-admin/folders/:uid", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/folders/:uid", [authHandler, ruleHandler, folderHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -161,7 +151,7 @@ export default class OfficeFoldersController extends ApiController { /** * @description Delete a specific folder */ - @Delete("/api/v1/super-admin/folders/:uid", [authHandler,ruleHandler]) + @Delete("/api/v1/super-admin/folders/:uid", [authHandler, ruleHandler, folderHandler]) protected async delete(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/OfficeRolesController.ts b/src/app/api/super-admin/OfficeRolesController.ts index dd7de7a0..7adff4a8 100644 --- a/src/app/api/super-admin/OfficeRolesController.ts +++ b/src/app/api/super-admin/OfficeRolesController.ts @@ -5,9 +5,10 @@ import OfficeRolesService from "@Services/super-admin/OfficeRolesService/OfficeR import { Service } from "typedi"; import { validateOrReject } from "class-validator"; import { OfficeRole } from "le-coffre-resources/dist/Notary"; -import { OfficeRoles } from "@prisma/client"; +import { OfficeRoles, Prisma } from "@prisma/client"; import authHandler from "@App/middlewares/AuthHandler"; import ruleHandler from "@App/middlewares/RulesHandler"; +import officeRoleHandler from "@App/middlewares/OfficeMembershipHandlers/OfficeRoleHandler"; @Controller() @Service() @@ -19,11 +20,14 @@ export default class OfficeRolesController extends ApiController { /** * @description Get all officeRoles */ - @Get("/api/v1/super-admin/officeRoles", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/officeRoles", [authHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query const query = JSON.parse(req.query["q"] as string); + const officeId: string = req.body.user.office_Id; + const officeWhereInput: Prisma.OfficeRolesWhereInput = { office: { uid: officeId } }; + query.where = officeWhereInput; //call service to get prisma entity const officeRolesEntities = await this.officeRolesService.get(query); @@ -42,7 +46,7 @@ export default class OfficeRolesController extends ApiController { /** * @description Create a new officeRole */ - @Post("/api/v1/super-admin/office-roles", [authHandler,ruleHandler]) + @Post("/api/v1/super-admin/office-roles", [authHandler, ruleHandler, officeRoleHandler]) protected async getAddresses(req: Request, response: Response) { try { //init IOfficeRole resource with request body values @@ -70,7 +74,7 @@ export default class OfficeRolesController extends ApiController { /** * @description Modify a specific officeRole by uid */ - @Put("/api/v1/super-admin/office-roles/:uid", [authHandler,ruleHandler]) + @Put("/api/v1/super-admin/office-roles/:uid", [authHandler, ruleHandler, officeRoleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -111,7 +115,7 @@ export default class OfficeRolesController extends ApiController { /** * @description Get a specific officeRole by uid */ - @Get("/api/v1/super-admin/office-roles/:uid", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/office-roles/:uid", [authHandler, ruleHandler, officeRoleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/OfficesController.ts b/src/app/api/super-admin/OfficesController.ts index 2ec24cc1..9a282bfd 100644 --- a/src/app/api/super-admin/OfficesController.ts +++ b/src/app/api/super-admin/OfficesController.ts @@ -37,7 +37,7 @@ export default class OfficesController extends ApiController { /** * @description Create a new office */ - @Post("/api/v1/super-admin/offices", [authHandler,ruleHandler]) + @Post("/api/v1/super-admin/offices", [authHandler, ruleHandler]) protected async post(req: Request, response: Response) { try { //init IUser resource with request body values @@ -60,7 +60,7 @@ export default class OfficesController extends ApiController { /** * @description Modify a specific office by uid */ - @Put("/api/v1/super-admin/offices/:uid", [authHandler,ruleHandler]) + @Put("/api/v1/super-admin/offices/:uid", [authHandler, ruleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -95,7 +95,7 @@ export default class OfficesController extends ApiController { /** * @description Get a specific office by uid */ - @Get("/api/v1/super-admin/offices/:uid", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/offices/:uid", [authHandler, ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/RolesController.ts b/src/app/api/super-admin/RolesController.ts index c4ac55af..a8afcf27 100644 --- a/src/app/api/super-admin/RolesController.ts +++ b/src/app/api/super-admin/RolesController.ts @@ -19,7 +19,7 @@ export default class RolesController extends ApiController { /** * @description Get all roles */ - @Get("/api/v1/super-admin/roles", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/roles", [authHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -42,7 +42,7 @@ export default class RolesController extends ApiController { /** * @description Create a new role */ - @Post("/api/v1/super-admin/roles", [authHandler,ruleHandler]) + @Post("/api/v1/super-admin/roles", [authHandler, ruleHandler]) protected async getAddresses(req: Request, response: Response) { try { //init IRole resource with request body values @@ -70,7 +70,7 @@ export default class RolesController extends ApiController { /** * @description Modify a specific role by uid */ - @Put("/api/v1/super-admin/roles/:uid", [authHandler,ruleHandler]) + @Put("/api/v1/super-admin/roles/:uid", [authHandler, ruleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -111,7 +111,7 @@ export default class RolesController extends ApiController { /** * @description Get a specific role by uid */ - @Get("/api/v1/super-admin/roles/:uid", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/roles/:uid", [authHandler, ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/RulesController.ts b/src/app/api/super-admin/RulesController.ts index 84038796..6dd93840 100644 --- a/src/app/api/super-admin/RulesController.ts +++ b/src/app/api/super-admin/RulesController.ts @@ -19,7 +19,7 @@ export default class RulesController extends ApiController { /** * @description Get all rules */ - @Get("/api/v1/super-admin/rules", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/rules", [authHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -42,15 +42,15 @@ export default class RulesController extends ApiController { /** * @description Create a new rule */ - @Post("/api/v1/super-admin/rules", [authHandler,ruleHandler]) + @Post("/api/v1/super-admin/rules", [authHandler, ruleHandler]) protected async getAddresses(req: Request, response: Response) { try { //init IRule resource with request body values const ruleEntity = Rule.hydrate(req.body); //validate rule - await validateOrReject(ruleEntity, {groups: ["createRule"]}); - + await validateOrReject(ruleEntity, { groups: ["createRule"] }); + //call service to get prisma entity const ruleEntityCreated = await this.rulesService.create(ruleEntity); @@ -70,7 +70,7 @@ export default class RulesController extends ApiController { /** * @description Modify a specific rule by uid */ - @Put("/api/v1/super-admin/rules/:uid", [authHandler,ruleHandler]) + @Put("/api/v1/super-admin/rules/:uid", [authHandler, ruleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -111,7 +111,7 @@ export default class RulesController extends ApiController { /** * @description Get a specific rule by uid */ - @Get("/api/v1/super-admin/rules/:uid", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/rules/:uid", [authHandler, ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/api/super-admin/UsersController.ts b/src/app/api/super-admin/UsersController.ts index aa2de89c..ca058591 100644 --- a/src/app/api/super-admin/UsersController.ts +++ b/src/app/api/super-admin/UsersController.ts @@ -19,7 +19,7 @@ export default class UsersController extends ApiController { /** * @description Get all users */ - @Get("/api/v1/super-admin/users", [authHandler,ruleHandler]) + @Get("/api/v1/super-admin/users", [authHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query @@ -43,7 +43,7 @@ export default class UsersController extends ApiController { * @description Create a new user */ @Post("/api/v1/super-admin/users", [authHandler, ruleHandler]) - protected async getAddresses(req: Request, response: Response) { + protected async create(req: Request, response: Response) { try { //init IUser resource with request body values const userEntity = User.hydrate(req.body); @@ -70,7 +70,7 @@ export default class UsersController extends ApiController { /** * @description Modify a specific user by uid */ - @Put("/api/v1/super-admin/users/:uid", [authHandler,ruleHandler]) + @Put("/api/v1/super-admin/users/:uid", [authHandler, ruleHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; @@ -111,7 +111,7 @@ export default class UsersController extends ApiController { /** * @description Get a specific user by uid */ - @Get("/api/v1/super-admin/users/:uid",[authHandler,ruleHandler]) + @Get("/api/v1/super-admin/users/:uid", [authHandler, ruleHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; diff --git a/src/app/index.ts b/src/app/index.ts index 9848d5c1..94124553 100644 --- a/src/app/index.ts +++ b/src/app/index.ts @@ -14,7 +14,6 @@ import FilesController from "./api/super-admin/FilesController"; import RulesController from "./api/super-admin/RulesController"; import RolesController from "./api/super-admin/RolesController"; - /** * @description This allow to declare all controllers used in the application */ diff --git a/src/app/middlewares/AuthHandler.ts b/src/app/middlewares/AuthHandler.ts index 3ab26600..6d7116bc 100644 --- a/src/app/middlewares/AuthHandler.ts +++ b/src/app/middlewares/AuthHandler.ts @@ -4,22 +4,21 @@ import { NextFunction, Request, Response } from "express"; import Container from "typedi"; export default function authHandler(req: Request, response: Response, next: NextFunction) { - const authHeader = req.headers['authorization']; - const token = authHeader && authHeader.split(' ')[1]; + const authHeader = req.headers["authorization"]; + const token = authHeader && authHeader.split(" ")[1]; - if (!token) { - response.sendStatus(HttpCodes.UNAUTHORIZED) - return; - } + if (!token) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } - const authService = Container.get(AuthService); - authService.verifyAccessToken(token, (err, userPayload) => { - if (err) { - response.sendStatus(HttpCodes.UNAUTHORIZED); - return; - } - req.body.user = userPayload - next(); - }); + const authService = Container.get(AuthService); + authService.verifyAccessToken(token, (err, userPayload) => { + if (err) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + req.body.user = userPayload; + next(); + }); } - diff --git a/src/app/middlewares/FileHandler.ts b/src/app/middlewares/FileHandler.ts deleted file mode 100644 index 3a6138ac..00000000 --- a/src/app/middlewares/FileHandler.ts +++ /dev/null @@ -1,22 +0,0 @@ -import { NextFunction, Request, Response } from "express"; -import multer from "multer"; - -export default function fileHandler(req: Request, response: Response, next: NextFunction) { - const storage = multer.memoryStorage() - const upload = multer({storage:storage}).single('file'); - - // Here call the upload middleware of multer - upload(req, response, function (err) { - if (err instanceof multer.MulterError) { - // A Multer error occurred when uploading. - const err = new Error('Multer error'); - return next(err) - } else if (err) { - // An unknown error occurred when uploading. - const err = new Error('Server Error') - return next(err) - } - next() - }) -} - diff --git a/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts new file mode 100644 index 00000000..a9f227ea --- /dev/null +++ b/src/app/middlewares/OfficeMembershipHandlers/DeedHandler.ts @@ -0,0 +1,44 @@ +import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; +import DeedsService from "@Services/super-admin/DeedsService/DeedsService"; +import { DocumentType } from "le-coffre-resources/dist/SuperAdmin"; +import { NextFunction, Request, Response } from "express"; +import Container from "typedi"; +import DocumentTypesService from "@Services/super-admin/DocumentTypesService/DocumentTypesService"; + +export default async function deedHandler(req: Request, response: Response, next: NextFunction) { + const officeId = req.body.user.office_Id; + const uid = req.path && req.path.split("/")[5]; + const documentTypes: DocumentType[] = req.body.document_types; + + if (uid) { + const deedService = Container.get(DeedsService); + const deed = await deedService.getOneByUidWithOffice(uid); + + if (!deed) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + + if (deed.deed_type.office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + } + + if (documentTypes) { + const documentTypeService = Container.get(DocumentTypesService); + documentTypes.forEach(async (documentType) => { + const deedTypeWithOffice = await documentTypeService.getByUidWithOffice(documentType.uid!); + if (!deedTypeWithOffice) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + if (deedTypeWithOffice.office?.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + }); + } + + next(); +} diff --git a/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts new file mode 100644 index 00000000..e1513793 --- /dev/null +++ b/src/app/middlewares/OfficeMembershipHandlers/DeedTypeHandler.ts @@ -0,0 +1,50 @@ +import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; +import DeedTypesService from "@Services/super-admin/DeedTypesService/DeedTypesService"; +import { DocumentType } from "le-coffre-resources/dist/SuperAdmin"; +import { NextFunction, Request, Response } from "express"; +import Container from "typedi"; +import DocumentTypesService from "@Services/super-admin/DocumentTypesService/DocumentTypesService"; + +export default async function deedTypeHandler(req: Request, response: Response, next: NextFunction) { + const officeId = req.body.user.office_Id; + const uid = req.path && req.path.split("/")[5]; + const documentTypes: DocumentType[] = req.body.document_types; + const office = req.body.office; + + if (office && office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + + if (uid) { + const deedTypeService = Container.get(DeedTypesService); + const deedType = await deedTypeService.getByUidWithOffice(uid!); + + if (!deedType) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + + if (deedType.office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + } + + if (documentTypes) { + const documentTypeService = Container.get(DocumentTypesService); + documentTypes.forEach(async (documentType) => { + const documentTypeWithOffice = await documentTypeService.getByUidWithOffice(documentType.uid!); + if (!documentTypeWithOffice) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + if (documentTypeWithOffice.office?.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + }); + } + + next(); +} diff --git a/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts new file mode 100644 index 00000000..163bf374 --- /dev/null +++ b/src/app/middlewares/OfficeMembershipHandlers/DocumentHandler.ts @@ -0,0 +1,58 @@ +import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; +import { DocumentType } from "le-coffre-resources/dist/SuperAdmin"; +import { NextFunction, Request, Response } from "express"; +import Container from "typedi"; +import { OfficeFolder } from "le-coffre-resources/dist/SuperAdmin"; +import DocumentsService from "@Services/super-admin/DocumentsService/DocumentsService"; +import DocumentTypesService from "@Services/super-admin/DocumentTypesService/DocumentTypesService"; +import OfficeFoldersService from "@Services/super-admin/OfficeFoldersService/OfficeFoldersService"; + +export default async function documentHandler(req: Request, response: Response, next: NextFunction) { + const officeId = req.body.user.office_Id; + const uid = req.path && req.path.split("/")[5]; + const documentType: DocumentType = req.body.document_type; + const folder: OfficeFolder = req.body.folder; + + if (folder) { + const officeFolderService = Container.get(OfficeFoldersService); + const officeFolderWithOffice = await officeFolderService.getByUidWithOffice(folder.uid!); + if (!officeFolderWithOffice) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + if (officeFolderWithOffice.office?.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + } + + if (documentType) { + const documentTypeService = Container.get(DocumentTypesService); + const documentTypeWithOffice = await documentTypeService.getByUidWithOffice(documentType.uid!); + if (!documentTypeWithOffice) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + if (documentTypeWithOffice.office?.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + } + + if (uid) { + const documentService = Container.get(DocumentsService); + const document = await documentService.getByUidWithOffice(uid!); + + if (!document) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + + if (document.document_type.office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + } + + next(); +} diff --git a/src/app/middlewares/OfficeMembershipHandlers/DocumentTypeHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/DocumentTypeHandler.ts new file mode 100644 index 00000000..991ea796 --- /dev/null +++ b/src/app/middlewares/OfficeMembershipHandlers/DocumentTypeHandler.ts @@ -0,0 +1,32 @@ +import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; +import { NextFunction, Request, Response } from "express"; +import Container from "typedi"; +import DocumentTypesService from "@Services/super-admin/DocumentTypesService/DocumentTypesService"; + +export default async function documentTypeHandler(req: Request, response: Response, next: NextFunction) { + const officeId = req.body.user.office_Id; + const uid = req.path && req.path.split("/")[5]; + const office = req.body.office; + + if (office && office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + + if (uid) { + const documentTypeService = Container.get(DocumentTypesService); + const documentType = await documentTypeService.getByUidWithOffice(uid!); + + if (!documentType) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + + if (documentType.office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + } + + next(); +} diff --git a/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts new file mode 100644 index 00000000..387c50bf --- /dev/null +++ b/src/app/middlewares/OfficeMembershipHandlers/FileHandler.ts @@ -0,0 +1,42 @@ +import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; +import { NextFunction, Request, Response } from "express"; +import Container from "typedi"; +import FilesService from "@Services/common/FilesService/FilesService"; +import DocumentsService from "@Services/super-admin/DocumentsService/DocumentsService"; + +export default async function fileHandler(req: Request, response: Response, next: NextFunction) { + 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!); + if (!documentWithOffice) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + if (documentWithOffice.folder.office?.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + 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.sendStatus(HttpCodes.NOT_FOUND); + return; + } + if (file.document.folder.office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + } + + next(); +} diff --git a/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts new file mode 100644 index 00000000..9f2f7f57 --- /dev/null +++ b/src/app/middlewares/OfficeMembershipHandlers/FolderHandler.ts @@ -0,0 +1,59 @@ +import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; +import { NextFunction, Request, Response } from "express"; +import Container from "typedi"; +import OfficeFoldersService from "@Services/super-admin/OfficeFoldersService/OfficeFoldersService"; +import DeedTypesService from "@Services/super-admin/DeedTypesService/DeedTypesService"; + +export default async function folderHandler(req: Request, response: Response, next: NextFunction) { + const officeId = req.body.user.office_Id; + const uid = req.path && req.path.split("/")[5]; + const office = req.body.office; + const officeFolderNumber = req.body.folder_number; + const deedType = req.body.deed.deed_type; + + if (office && office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + + if (deedType) { + const deedTypeService = Container.get(DeedTypesService); + const deedTypeWithOffice = await deedTypeService.getByUidWithOffice(deedType.uid!); + if (!deedTypeWithOffice) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + if (deedTypeWithOffice.office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + } + + const officeFolderService = Container.get(OfficeFoldersService); + + if (officeFolderNumber) { + const officeFoldersWithSameNumber = await officeFolderService.get({ + where: { folder_number: officeFolderNumber, office: { uid: officeId } }, + }); + if (officeFoldersWithSameNumber.length) { + response.sendStatus(HttpCodes.BAD_REQUEST); + return; + } + } + + if (uid) { + const officeFolder = await officeFolderService.getByUidWithOffice(uid!); + + if (!officeFolder) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + + if (officeFolder.office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + } + + next(); +} diff --git a/src/app/middlewares/OfficeMembershipHandlers/OfficeRoleHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/OfficeRoleHandler.ts new file mode 100644 index 00000000..961c11f7 --- /dev/null +++ b/src/app/middlewares/OfficeMembershipHandlers/OfficeRoleHandler.ts @@ -0,0 +1,32 @@ +import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; +import { NextFunction, Request, Response } from "express"; +import Container from "typedi"; +import OfficeRolesService from "@Services/super-admin/OfficeRolesService/OfficeRolesService"; + +export default async function officeRoleHandler(req: Request, response: Response, next: NextFunction) { + const officeId = req.body.user.office_Id; + const uid = req.path && req.path.split("/")[5]; + const office = req.body.office; + + if (office && office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + + if (uid) { + const officeRoleService = Container.get(OfficeRolesService); + const officeRole = await officeRoleService.getByUidWithOffice(uid!); + + if (!officeRole) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + + if (officeRole.office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + } + + next(); +} diff --git a/src/app/middlewares/OfficeMembershipHandlers/UserHandler.ts b/src/app/middlewares/OfficeMembershipHandlers/UserHandler.ts new file mode 100644 index 00000000..21b6c8eb --- /dev/null +++ b/src/app/middlewares/OfficeMembershipHandlers/UserHandler.ts @@ -0,0 +1,32 @@ +import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; +import { NextFunction, Request, Response } from "express"; +import Container from "typedi"; +import UsersService from "@Services/super-admin/UsersService/UsersService"; + +export default async function userHandler(req: Request, response: Response, next: NextFunction) { + const officeId = req.body.user.office_Id; + const uid = req.path && req.path.split("/")[5]; + const office = req.body.office_membership; + + if (office && office.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + + if (uid) { + const userService = Container.get(UsersService); + const user = await userService.getByUidWithOffice(uid!); + + if (!user) { + response.sendStatus(HttpCodes.NOT_FOUND); + return; + } + + if (user.office_membership.uid != officeId) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } + } + + next(); +} diff --git a/src/app/middlewares/RulesHandler.ts b/src/app/middlewares/RulesHandler.ts index c1a4d6e6..36e36099 100644 --- a/src/app/middlewares/RulesHandler.ts +++ b/src/app/middlewares/RulesHandler.ts @@ -2,21 +2,20 @@ import HttpCodes from "@Common/system/controller-pattern/HttpCodes"; import { NextFunction, Request, Response } from "express"; export default async function ruleHandler(req: Request, response: Response, next: NextFunction) { - const rules = req.body.user.rules; - const service = req.path && req.path.split('/')[4]; - const namespace = req.path && req.path.split('/')[3]; - const role = req.body.user.role; + const rules = req.body.user.rules; + const service = req.path && req.path.split("/")[4]; + const namespace = req.path && req.path.split("/")[3]; + const role = req.body.user.role; - if(namespace != 'notary' && role != namespace) { - response.sendStatus(HttpCodes.UNAUTHORIZED); - return; - } + if (namespace != "notary" && role != namespace) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } - if(!rules.includes(req.method + ' ' + service)) { - response.sendStatus(HttpCodes.UNAUTHORIZED); - return; - } + if (!rules.includes(req.method + " " + service)) { + response.sendStatus(HttpCodes.UNAUTHORIZED); + return; + } - next(); + next(); } - diff --git a/src/common/config/variables/Variables.ts b/src/common/config/variables/Variables.ts index 95a8a427..41ee2912 100644 --- a/src/common/config/variables/Variables.ts +++ b/src/common/config/variables/Variables.ts @@ -86,9 +86,8 @@ export class BackendVariables { try { await validateOrReject(this, validationOptions); - } - catch(error) { - if(process.env["NODE_ENV"] === "development") { + } catch (error) { + if (process.env["NODE_ENV"] === "development") { throw error; } throw new Error("Some env variables are required!"); diff --git a/src/common/databases/migrations/20230703120600_v9/migration.sql b/src/common/databases/migrations/20230703120600_v9/migration.sql new file mode 100644 index 00000000..720264aa --- /dev/null +++ b/src/common/databases/migrations/20230703120600_v9/migration.sql @@ -0,0 +1,23 @@ +-- DropForeignKey +ALTER TABLE "users" DROP CONSTRAINT "users_contact_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "users" DROP CONSTRAINT "users_office_role_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "users" DROP CONSTRAINT "users_office_uid_fkey"; + +-- DropForeignKey +ALTER TABLE "users" DROP CONSTRAINT "users_roles_uid_fkey"; + +-- AddForeignKey +ALTER TABLE "users" ADD CONSTRAINT "users_contact_uid_fkey" FOREIGN KEY ("contact_uid") REFERENCES "contacts"("uid") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "users" ADD CONSTRAINT "users_roles_uid_fkey" FOREIGN KEY ("roles_uid") REFERENCES "roles"("uid") ON DELETE RESTRICT ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "users" ADD CONSTRAINT "users_office_role_uid_fkey" FOREIGN KEY ("office_role_uid") REFERENCES "office_roles"("uid") ON DELETE SET NULL ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "users" ADD CONSTRAINT "users_office_uid_fkey" FOREIGN KEY ("office_uid") REFERENCES "offices"("uid") ON DELETE RESTRICT ON UPDATE CASCADE; diff --git a/src/common/databases/migrations/20230703122557_v10/migration.sql b/src/common/databases/migrations/20230703122557_v10/migration.sql new file mode 100644 index 00000000..8d7c8594 --- /dev/null +++ b/src/common/databases/migrations/20230703122557_v10/migration.sql @@ -0,0 +1,15 @@ +/* + Warnings: + + - A unique constraint covering the columns `[idNot,uid]` on the table `users` will be added. If there are existing duplicate values, this will fail. + - A unique constraint covering the columns `[contact_uid,uid]` on the table `users` will be added. If there are existing duplicate values, this will fail. + +*/ +-- DropIndex +DROP INDEX "users_idNot_key"; + +-- CreateIndex +CREATE UNIQUE INDEX "users_idNot_uid_key" ON "users"("idNot", "uid"); + +-- CreateIndex +CREATE UNIQUE INDEX "users_contact_uid_uid_key" ON "users"("contact_uid", "uid"); diff --git a/src/common/databases/migrations/20230703123246_v11/migration.sql b/src/common/databases/migrations/20230703123246_v11/migration.sql new file mode 100644 index 00000000..842ec44e --- /dev/null +++ b/src/common/databases/migrations/20230703123246_v11/migration.sql @@ -0,0 +1,14 @@ +/* + Warnings: + + - A unique constraint covering the columns `[idNot]` on the table `users` will be added. If there are existing duplicate values, this will fail. + +*/ +-- DropIndex +DROP INDEX "users_contact_uid_uid_key"; + +-- DropIndex +DROP INDEX "users_idNot_uid_key"; + +-- CreateIndex +CREATE UNIQUE INDEX "users_idNot_key" ON "users"("idNot"); diff --git a/src/common/databases/seeders/seeder.ts b/src/common/databases/seeders/seeder.ts index a64ab0b5..25fb518c 100644 --- a/src/common/databases/seeders/seeder.ts +++ b/src/common/databases/seeders/seeder.ts @@ -1,4 +1,4 @@ -import 'module-alias/register'; +import "module-alias/register"; import { EFolderStatus, EOfficeStatus, ECivility, ECustomerStatus, PrismaClient, Prisma } from "@prisma/client"; import User, { Address, @@ -16,7 +16,6 @@ import User, { export default async function main() { const prisma = new PrismaClient(); - const randomString = () => { const chars = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"; @@ -824,7 +823,6 @@ export default async function main() { created_at: new Date(), updated_at: new Date(), }, - ]; const roles: Role[] = [ @@ -838,20 +836,20 @@ export default async function main() { name: "admin", created_at: new Date(), updated_at: new Date(), - rules: rules.slice(0,33), + rules: rules.slice(0, 33), }, { name: "notary", created_at: new Date(), updated_at: new Date(), - rules: rules.slice(0,22), + rules: rules.slice(0, 22), }, { name: "default", created_at: new Date(), updated_at: new Date(), - rules: rules.slice(0,11), - } + rules: rules.slice(0, 11), + }, ]; const officeRoles: OfficeRole[] = [ @@ -860,29 +858,29 @@ export default async function main() { created_at: new Date(), updated_at: new Date(), office: offices[0]!, - rules: rules.slice(0,40), + rules: rules.slice(0, 40), }, { name: "notary", created_at: new Date(), updated_at: new Date(), office: offices[0]!, - rules: rules.slice(0,33), + rules: rules.slice(0, 33), }, { name: "deputy", created_at: new Date(), updated_at: new Date(), office: offices[0]!, - rules: rules.slice(0,22), + rules: rules.slice(0, 22), }, { name: "listener", created_at: new Date(), updated_at: new Date(), office: offices[0]!, - rules: rules.slice(0,11), - } + rules: rules.slice(0, 11), + }, ]; const users: User[] = [ @@ -1385,12 +1383,12 @@ export default async function main() { office_status: EOfficeStatus.DESACTIVATED, }, }); -; office.uid = officeCreated.uid; + office.uid = officeCreated.uid; } for (const rule of rules) { const ruleCreated = await prisma.rules.create({ data: { - name: rule.name + name: rule.name, }, }); rule.uid = ruleCreated.uid; @@ -1607,8 +1605,8 @@ export default async function main() { connect: officeFolder.stakeholders?.map((stakeholder) => ({ uid: stakeholder.uid!, })), - } - } + }, + }, }); officeFolder.uid = officeFolderCreated.uid; } diff --git a/src/common/repositories/DeedTypesRepository.ts b/src/common/repositories/DeedTypesRepository.ts index 3004726a..62059131 100644 --- a/src/common/repositories/DeedTypesRepository.ts +++ b/src/common/repositories/DeedTypesRepository.ts @@ -46,13 +46,13 @@ export default class DeedTypesRepository extends BaseRepository { })), }; } - return this.model.create({...createArgs, include: { document_types: true }}); + return this.model.create({ ...createArgs, include: { document_types: true } }); } /** * @description : Update data of a deed type */ - public async update(uid: string, deedType: DeedType): Promise { + public async update(uid: string, deedType: DeedType): Promise { const updateArgs: Prisma.DeedTypesUpdateArgs = { where: { uid: uid, @@ -69,12 +69,12 @@ export default class DeedTypesRepository extends BaseRepository { document_types: { set: deedType.document_types?.map((documentType) => ({ uid: documentType.uid!, - })) - } + })), + }, }, }; - - return this.model.update({...updateArgs, include: { document_types: true }}); + + return this.model.update({ ...updateArgs, include: { document_types: true } }); } /** @@ -88,4 +88,16 @@ export default class DeedTypesRepository extends BaseRepository { include: query, }); } + + /** + * @description : Find unique deed type with relations + */ + public async findOneByUidWithOffice(uid: string) { + return this.model.findUnique({ + where: { + uid: uid, + }, + include: { office: true }, + }); + } } diff --git a/src/common/repositories/DeedsRepository.ts b/src/common/repositories/DeedsRepository.ts index 80fbe59a..becc4d55 100644 --- a/src/common/repositories/DeedsRepository.ts +++ b/src/common/repositories/DeedsRepository.ts @@ -90,4 +90,19 @@ export default class DeedsRepository extends BaseRepository { include: query, }); } + + /** + * @description : Find unique deed + */ + public async findOneByUidWithOffice(uid: string) { + return this.model.findUnique({ + where: { + uid: uid, + }, + include: { + deed_type: { include: { office: true } }, + document_types: { include: { office: true } }, + }, + }); + } } diff --git a/src/common/repositories/DocumentTypesRepository.ts b/src/common/repositories/DocumentTypesRepository.ts index 0a0eab32..f395bc91 100644 --- a/src/common/repositories/DocumentTypesRepository.ts +++ b/src/common/repositories/DocumentTypesRepository.ts @@ -61,7 +61,7 @@ export default class DocumentTypesRepository extends BaseRepository { uid: documentType.office!.uid, }, }, - } + }, }; return this.model.update(updateArgs); @@ -78,4 +78,16 @@ export default class DocumentTypesRepository extends BaseRepository { include: query, }); } + + /** + * @description : Find unique document type with relations + */ + public async findOneByUidWithOffice(uid: string) { + return this.model.findUnique({ + where: { + uid: uid, + }, + include: { office: true }, + }); + } } diff --git a/src/common/repositories/DocumentsRepository.ts b/src/common/repositories/DocumentsRepository.ts index 2f1f08d6..5a81d7ca 100644 --- a/src/common/repositories/DocumentsRepository.ts +++ b/src/common/repositories/DocumentsRepository.ts @@ -27,7 +27,7 @@ export default class DocumentsRepository extends BaseRepository { /** * @description : Create a document */ - public async create(document: Document): Promise { + public async create(document: Document): Promise { const createArgs: Prisma.DocumentsCreateArgs = { data: { folder: { @@ -48,7 +48,7 @@ export default class DocumentsRepository extends BaseRepository { }, }; - const documentCreated = await this.model.create({...createArgs, include: {document_type: true}}); + const documentCreated = await this.model.create({ ...createArgs, include: { document_type: true } }); await this.instanceDb.documentHistory.create({ data: { @@ -78,7 +78,7 @@ export default class DocumentsRepository extends BaseRepository { const batchPayload = await this.model.createMany(createArgs); - const documentsCreated = await this.model.findMany({orderBy: {created_at: 'desc'}, take: batchPayload.count}); + const documentsCreated = await this.model.findMany({ orderBy: { created_at: "desc" }, take: batchPayload.count }); const createHistoryArgs: Prisma.DocumentHistoryCreateManyArgs = { data: documentsCreated.map((document) => ({ @@ -106,7 +106,7 @@ export default class DocumentsRepository extends BaseRepository { document_status: EDocumentStatus[document.document_status as keyof typeof EDocumentStatus], refused_reason: refusedReason, }, - } + }, }, }); } @@ -133,4 +133,16 @@ export default class DocumentsRepository extends BaseRepository { include: query, }); } + + /** + * @description : Find unique document with relations + */ + public async findOneByUidWithOffice(uid: string) { + return this.model.findUnique({ + where: { + uid: uid, + }, + include: { folder: { include: { office: true } }, document_type: { include: { office: true } } }, + }); + } } diff --git a/src/common/repositories/FilesRepository.ts b/src/common/repositories/FilesRepository.ts index d7998b54..100e10a2 100644 --- a/src/common/repositories/FilesRepository.ts +++ b/src/common/repositories/FilesRepository.ts @@ -27,7 +27,7 @@ export default class FilesRepository extends BaseRepository { /** * @description : Create a file linked to a document */ - public async create(file: File, key: string): Promise { + public async create(file: File, key: string): Promise { const createArgs: Prisma.FilesCreateArgs = { data: { document: { @@ -39,16 +39,16 @@ export default class FilesRepository extends BaseRepository { file_path: file.file_path, mimetype: file.mimetype, size: file.size, - key: key - } + key: key, + }, }; - return this.model.create({...createArgs, include: { document: true }}); + return this.model.create({ ...createArgs, include: { document: true } }); } /** * @description : Update data of a file */ - public async update(uid: string, file: File, key: string): Promise { + public async update(uid: string, file: File, key: string): Promise { const updateArgs: Prisma.FilesUpdateArgs = { where: { uid: uid, @@ -58,26 +58,26 @@ export default class FilesRepository extends BaseRepository { file_path: file.file_path, mimetype: file.mimetype, size: file.size, - key: key - } + key: key, + }, }; - return this.model.update({...updateArgs, include: { document: true }}); + return this.model.update({ ...updateArgs, include: { document: true } }); } /** * @description : Delete a file key and archive */ - public async deleteKeyAndArchive(uid: string): Promise { + public async deleteKeyAndArchive(uid: string): Promise { const updateArgs: Prisma.FilesUpdateArgs = { where: { uid: uid, }, data: { key: null, - archived_at: new Date(Date.now()) - } + archived_at: new Date(Date.now()), + }, }; - return this.model.update({...updateArgs, include: { document: true }}); + return this.model.update({ ...updateArgs, include: { document: true } }); } /** @@ -91,4 +91,16 @@ export default class FilesRepository extends BaseRepository { include: query, }); } + + /** + * @description : Find unique file with office + */ + public async findOneByUidWithOffice(uid: string) { + return this.model.findUnique({ + where: { + uid: uid, + }, + include: { document: { include: { folder: { include: { office: true } } } } }, + }); + } } diff --git a/src/common/repositories/OfficeFoldersRepository.ts b/src/common/repositories/OfficeFoldersRepository.ts index 70530560..e36d2b36 100644 --- a/src/common/repositories/OfficeFoldersRepository.ts +++ b/src/common/repositories/OfficeFoldersRepository.ts @@ -27,7 +27,7 @@ export default class OfficeFoldersRepository extends BaseRepository { /** * @description : Create new office folder with stakeholders */ - public async create(officeFolder: OfficeFolder): Promise { + public async create(officeFolder: OfficeFolder): Promise { const createArgs: Prisma.OfficeFoldersCreateArgs = { data: { folder_number: officeFolder.folder_number, @@ -48,11 +48,11 @@ export default class OfficeFoldersRepository extends BaseRepository { connect: officeFolder.stakeholders?.map((stakeholder) => ({ uid: stakeholder.uid!, })), - } - } + }, + }, }; - - return this.model.create({...createArgs, include: {stakeholders: true}}); + + return this.model.create({ ...createArgs, include: { stakeholders: true } }); } /** @@ -112,6 +112,18 @@ export default class OfficeFoldersRepository extends BaseRepository { }); } + /** + * @description : Find one office folder + */ + public async findOneByUidWithOffice(uid: string) { + return this.model.findUnique({ + where: { + uid: uid, + }, + include: { office: true }, + }); + } + /** * @description : Delete a folder */ diff --git a/src/common/repositories/OfficeRolesRepository.ts b/src/common/repositories/OfficeRolesRepository.ts index 781920ef..940c9bc4 100644 --- a/src/common/repositories/OfficeRolesRepository.ts +++ b/src/common/repositories/OfficeRolesRepository.ts @@ -27,7 +27,7 @@ export default class OfficeRolesRepository extends BaseRepository { /** * @description : Create new officeRole with rules */ - public async create(officeRole: OfficeRole): Promise { + public async create(officeRole: OfficeRole): Promise { const createArgs: Prisma.OfficeRolesCreateArgs = { data: { name: officeRole.name, @@ -44,13 +44,13 @@ export default class OfficeRolesRepository extends BaseRepository { }, }; - return this.model.create({...createArgs, include: {rules: true}}); + return this.model.create({ ...createArgs, include: { rules: true } }); } /** * @description : Update data of a officeRole with rules */ - public async update(officeRole: OfficeRole): Promise { + public async update(officeRole: OfficeRole): Promise { const updateArgs: Prisma.OfficeRolesUpdateArgs = { where: { uid: officeRole.uid, @@ -65,7 +65,7 @@ export default class OfficeRolesRepository extends BaseRepository { }, }; - return this.model.update({...updateArgs, include: {rules: true}}); + return this.model.update({ ...updateArgs, include: { rules: true } }); } /** @@ -80,6 +80,18 @@ export default class OfficeRolesRepository extends BaseRepository { }); } + /** + * @description : Find one officeRole with office + */ + public async findOneByUidWithOffice(uid: string) { + return this.model.findUnique({ + where: { + uid: uid, + }, + include: { office: true }, + }); + } + /** * @description : Delete a officeRole */ diff --git a/src/common/repositories/RulesRepository.ts b/src/common/repositories/RulesRepository.ts index 431d2cc7..7781290b 100644 --- a/src/common/repositories/RulesRepository.ts +++ b/src/common/repositories/RulesRepository.ts @@ -30,10 +30,10 @@ export default class RulesRepository extends BaseRepository { public async create(rule: Rule): Promise { const createArgs: Prisma.RulesCreateArgs = { data: { - name: rule.name + name: rule.name, }, }; - + return this.model.create(createArgs); } @@ -46,10 +46,10 @@ export default class RulesRepository extends BaseRepository { uid: rule.uid, }, data: { - name: rule.name + name: rule.name, }, }; - + return this.model.update(updateArgs); } diff --git a/src/common/repositories/UsersRepository.ts b/src/common/repositories/UsersRepository.ts index a2f89268..7f98728b 100644 --- a/src/common/repositories/UsersRepository.ts +++ b/src/common/repositories/UsersRepository.ts @@ -55,10 +55,9 @@ export default class UsersRepository extends BaseRepository { first_name: user.contact!.first_name, last_name: user.contact!.last_name, email: user.contact!.email, - phone_number: user.contact!.phone_number, + phone_number: user.contact?.phone_number, cell_phone_number: user.contact!.cell_phone_number, - civility: ECivility[user.contact!.civility as keyof typeof ECivility], - address: {}, + civility: ECivility[user.contact?.civility as keyof typeof ECivility], }, }, role: { @@ -82,7 +81,7 @@ export default class UsersRepository extends BaseRepository { }, }; } - return this.model.create({ ...createArgs, include: { contact: true, office_membership: { include: { address: true } } } }); + return this.model.create(createArgs); } /** @@ -129,19 +128,18 @@ export default class UsersRepository extends BaseRepository { first_name: user.contact!.first_name, last_name: user.contact!.last_name, email: user.contact!.email, - phone_number: user.contact!.phone_number, - cell_phone_number: user.contact!.cell_phone_number, - civility: ECivility[user.contact!.civility as keyof typeof ECivility], - address: {}, + phone_number: user.contact?.phone_number, + cell_phone_number: user.contact?.cell_phone_number, + civility: ECivility[user.contact?.civility as keyof typeof ECivility], }, }, }, }; - if (user.contact!.address) { + if (user.contact?.address) { updateArgs.data.contact!.update!.address!.update = { - address: user.contact!.address!.address, - zip_code: user.contact!.address!.zip_code, - city: user.contact!.address!.city, + address: user.contact?.address?.address, + zip_code: user.contact?.address?.zip_code, + city: user.contact?.address?.city, }; } if (user.office_role) { @@ -157,7 +155,7 @@ export default class UsersRepository extends BaseRepository { /** * @description : Find one user */ - public async findOneByUid(uid: string, query?: Prisma.UsersInclude){ + public async findOneByUid(uid: string, query?: Prisma.UsersInclude) { return this.model.findUnique({ where: { uid: uid, @@ -166,6 +164,18 @@ export default class UsersRepository extends BaseRepository { }); } + /** + * @description : Find one user with office + */ + public async findOneByUidWithOffice(uid: string) { + return this.model.findUnique({ + where: { + uid: uid, + }, + include: { office_membership: true }, + }); + } + /** * @description : Find one user */ @@ -173,8 +183,8 @@ export default class UsersRepository extends BaseRepository { return this.model.findUnique({ where: { [providerName]: id }, include: { - role: { include: { rules: true } } , - office_role: { include: { rules: true } } , + role: { include: { rules: true } }, + office_role: { include: { rules: true } }, office_membership: true, }, }); diff --git a/src/common/system/OpenIdInterface.ts b/src/common/system/OpenIdInterface.ts index 62700e63..997a903e 100644 --- a/src/common/system/OpenIdInterface.ts +++ b/src/common/system/OpenIdInterface.ts @@ -21,10 +21,10 @@ export type OpenIdConfig = { scopes_supported: string[]; issuer: string; jwks_uri: string; -} +}; export default interface OpenIdInterface { - getOpenIdConfig(): Promise + getOpenIdConfig(): Promise; verifyIdToken(signingKey: string): Promise; getSigningKeys(jwksUri: string): Promise; } diff --git a/src/entries/App.ts b/src/entries/App.ts index f500c7f6..85468296 100644 --- a/src/entries/App.ts +++ b/src/entries/App.ts @@ -9,8 +9,7 @@ import errorHandler from "@App/middlewares/ErrorHandler"; import { BackendVariables } from "@Common/config/variables/Variables"; import multer from "multer"; - -const storage = multer.memoryStorage(); +const storage = multer.memoryStorage(); (async () => { try { @@ -24,7 +23,12 @@ const storage = multer.memoryStorage(); label, port: parseInt(port), rootUrl, - middlwares: [cors({ origin: "*" }), multer({storage:storage}).single('file'), bodyParser.urlencoded({ extended: true }), bodyParser.json()], + middlwares: [ + cors({ origin: "*" }), + multer({ storage: storage }).single("file"), + bodyParser.urlencoded({ extended: true }), + bodyParser.json(), + ], errorHandler, }); diff --git a/src/services/common/AuthService/AuthService.ts b/src/services/common/AuthService/AuthService.ts index 0a6088a7..4c496cf0 100644 --- a/src/services/common/AuthService/AuthService.ts +++ b/src/services/common/AuthService/AuthService.ts @@ -14,7 +14,7 @@ interface IJwtPayload { providerName: PROVIDER_OPENID; userId: string | number; }; - office_IdNot_Id: string; + office_Id: string; role: string; rules: string[]; } @@ -38,7 +38,7 @@ export default class AuthService extends BaseService { return { userId: user.uid, openId: { providerName: providerName, userId: user.idNot }, - office_IdNot_Id: user.office_membership.idNot, + office_Id: user.office_membership.uid, role: user.role.name, rules: rules, }; @@ -50,7 +50,7 @@ export default class AuthService extends BaseService { return { userId: user.uid, openId: { providerName: providerName, userId: user.idNot }, - office_IdNot_Id: user.office_membership.idNot, + office_Id: user.office_membership.uid, role: user.role.name, rules: rules, }; diff --git a/src/services/common/CryptoService/CryptoService.ts b/src/services/common/CryptoService/CryptoService.ts index 5ac62af1..893f62c5 100644 --- a/src/services/common/CryptoService/CryptoService.ts +++ b/src/services/common/CryptoService/CryptoService.ts @@ -5,7 +5,6 @@ import crypto from "crypto"; @Service() export default class CryptoService extends BaseService { - private static readonly CRYPTO_ALGORITHM = "aes-256-ctr"; constructor(protected variables: BackendVariables) { @@ -13,7 +12,7 @@ export default class CryptoService extends BaseService { } private getKey(key: string) { - return crypto.createHash('sha256').update(String(key)).digest('base64').slice(0, 32); + return crypto.createHash("sha256").update(String(key)).digest("base64").slice(0, 32); } /** @@ -29,7 +28,7 @@ export default class CryptoService extends BaseService { const result = Buffer.concat([iv, cipher.update(buffer), cipher.final()]); return result; } - + /** * @description : decrypt data with an initialization vector * @throws {Error} If data cannot be decrypted diff --git a/src/services/common/FilesService/FilesService.ts b/src/services/common/FilesService/FilesService.ts index 6118a4eb..0f13bc9d 100644 --- a/src/services/common/FilesService/FilesService.ts +++ b/src/services/common/FilesService/FilesService.ts @@ -6,11 +6,10 @@ import CryptoService from "../CryptoService/CryptoService"; import IpfsService from "../IpfsService/IpfsService"; import { BackendVariables } from "@Common/config/variables/Variables"; import { Readable } from "stream"; -import {v4} from "uuid"; -import { Files } from "@prisma/client"; +import { v4 } from "uuid"; +import { Files, Prisma } from "@prisma/client"; import fetch from "node-fetch"; - @Service() export default class FilesService extends BaseService { constructor( @@ -26,7 +25,7 @@ export default class FilesService extends BaseService { * @description : Get all files * @throws {Error} If files cannot be ge */ - public async get(query: any): Promise { + public async get(query: Prisma.FilesFindManyArgs) { return this.filesRepository.findMany(query); } @@ -34,8 +33,16 @@ export default class FilesService extends BaseService { * @description : Get a file by uid * @throws {Error} If project cannot be created */ - public async getByUid(uid: string): Promise { - return this.filesRepository.findOneByUid(uid); + public async getByUid(uid: string, query?: Prisma.FilesInclude) { + return this.filesRepository.findOneByUid(uid, query); + } + + /** + * @description : Get a file by uid with office + * @throws {Error} If project cannot be created + */ + public async getByUidWithOffice(uid: string) { + return this.filesRepository.findOneByUidWithOffice(uid); } /** @@ -47,7 +54,7 @@ export default class FilesService extends BaseService { if (!file?.key) return null; const fileResult = await fetch(file.file_path); const fileArrayBuffer = await fileResult.arrayBuffer(); - return {file: file, buffer: await this.cryptoService.decrypt(Buffer.from(fileArrayBuffer), file.key)}; + return { file: file, buffer: await this.cryptoService.decrypt(Buffer.from(fileArrayBuffer), file.key) }; } /** @@ -55,14 +62,15 @@ export default class FilesService extends BaseService { * @throws {Error} If file cannot be created */ public async create(file: File, fileData: Express.Multer.File) { - const key = v4(); + const key = v4(); const encryptedFile = await this.cryptoService.encrypt(fileData.buffer, key); const upload = await this.ipfsService.pinFile(Readable.from(encryptedFile), fileData.originalname); - const fileToCreate: File = file; + let fileToCreate: File = file; fileToCreate.file_name = fileData.originalname; fileToCreate.file_path = this.variables.PINATA_GATEWAY.concat(upload.IpfsHash); fileToCreate.mimetype = fileData.mimetype; fileToCreate.size = fileData.size; + fileToCreate.archived_at = null; return this.filesRepository.create(fileToCreate, key); } @@ -72,7 +80,7 @@ export default class FilesService extends BaseService { * @throws {Error} If file cannot be modified */ public async update(uid: string, file: File): Promise { - const key = v4(); + const key = v4(); return this.filesRepository.update(uid, file, key); } @@ -83,13 +91,13 @@ export default class FilesService extends BaseService { public async deleteKeyAndArchive(uid: string): Promise { try { const fileToUnpin = await this.filesRepository.findOneByUid(uid); - if(!fileToUnpin) throw new Error("file not found"); + if (!fileToUnpin) throw new Error("file not found"); const fileHash = fileToUnpin.file_path.substring(this.variables.PINATA_GATEWAY.length); await this.ipfsService.unpinFile(fileHash); - } catch(error) { + } catch (error) { console.error(error); } - + return this.filesRepository.deleteKeyAndArchive(uid); } } diff --git a/src/services/common/IpfsService/IpfsService.ts b/src/services/common/IpfsService/IpfsService.ts index cc0f3df7..87a77b56 100644 --- a/src/services/common/IpfsService/IpfsService.ts +++ b/src/services/common/IpfsService/IpfsService.ts @@ -9,7 +9,7 @@ export default class FilesService extends BaseService { private ipfsClient: pinataSDK; constructor(protected variables: BackendVariables) { super(); - this.ipfsClient = new pinataSDK({ pinataApiKey: variables.PINATA_API_KEY, pinataSecretApiKey: variables.PINATA_API_SECRET }) + this.ipfsClient = new pinataSDK({ pinataApiKey: variables.PINATA_API_KEY, pinataSecretApiKey: variables.PINATA_API_SECRET }); } /** @@ -17,7 +17,7 @@ export default class FilesService extends BaseService { * @throws {Error} If file cannot be pinned */ public async pinFile(stream: Readable, fileName: string) { - return this.ipfsClient.pinFileToIPFS(stream, {pinataMetadata : {name: fileName}}); + return this.ipfsClient.pinFileToIPFS(stream, { pinataMetadata: { name: fileName } }); } /** diff --git a/src/services/common/OpenIdService/OpenIdService.ts b/src/services/common/OpenIdService/OpenIdService.ts index c6785c83..6f34bc58 100644 --- a/src/services/common/OpenIdService/OpenIdService.ts +++ b/src/services/common/OpenIdService/OpenIdService.ts @@ -20,7 +20,7 @@ export type OpenIdConfig = { scopes_supported: string[]; issuer: string; jwks_uri: string; -} +}; @Service() export default class OpenIdService extends BaseService { diff --git a/src/services/customer/DocumentsService/DocumentsService.ts b/src/services/customer/DocumentsService/DocumentsService.ts index e04a1864..a3cc2e16 100644 --- a/src/services/customer/DocumentsService/DocumentsService.ts +++ b/src/services/customer/DocumentsService/DocumentsService.ts @@ -38,7 +38,7 @@ export default class DocumentsService extends BaseService { * @description : Modify a document * @throws {Error} If document cannot be modified */ - public async update(uid: string, document: Document): Promise { + public async update(uid: string, document: Document): Promise { return this.documentsRepository.update(uid, document); } @@ -46,7 +46,7 @@ export default class DocumentsService extends BaseService { * @description : Delete a document * @throws {Error} If document cannot be deleted */ - public async delete(uid: string): Promise { + public async delete(uid: string): Promise { return this.documentsRepository.delete(uid); } diff --git a/src/services/super-admin/DeedTypesService/DeedTypesService.ts b/src/services/super-admin/DeedTypesService/DeedTypesService.ts index 7bb48f09..4c94017e 100644 --- a/src/services/super-admin/DeedTypesService/DeedTypesService.ts +++ b/src/services/super-admin/DeedTypesService/DeedTypesService.ts @@ -1,4 +1,4 @@ -import { DeedTypes } from "@prisma/client"; +import { DeedTypes, Prisma } from "@prisma/client"; import DeedTypesRepository from "@Repositories/DeedTypesRepository"; import BaseService from "@Services/BaseService"; import { DeedType } from "le-coffre-resources/dist/SuperAdmin"; @@ -6,9 +6,7 @@ import { Service } from "typedi"; @Service() export default class DeedTypesService extends BaseService { - constructor( - private deedTypeRepository: DeedTypesRepository, - ) { + constructor(private deedTypeRepository: DeedTypesRepository) { super(); } @@ -16,7 +14,7 @@ export default class DeedTypesService extends BaseService { * @description : Get all deed-types * @throws {Error} If deed-types cannot be get */ - public async get(query: any): Promise { + public async get(query: Prisma.DeedTypesFindManyArgs) { return this.deedTypeRepository.findMany(query); } @@ -40,7 +38,15 @@ export default class DeedTypesService extends BaseService { * @description : Get a deedtype by uid * @throws {Error} If deed-type cannot be get by uid */ - public async getByUid(uid: string, query?: any): Promise { + public async getByUid(uid: string, query?: Prisma.DeedTypesInclude): Promise { return this.deedTypeRepository.findOneByUid(uid, query); } + + /** + * @description : Get a deedtype by uid + * @throws {Error} If deed-type cannot be get by uid + */ + public async getByUidWithOffice(uid: string) { + return this.deedTypeRepository.findOneByUidWithOffice(uid); + } } diff --git a/src/services/super-admin/DeedsService/DeedsService.ts b/src/services/super-admin/DeedsService/DeedsService.ts index 055d24cf..cc7acfe4 100644 --- a/src/services/super-admin/DeedsService/DeedsService.ts +++ b/src/services/super-admin/DeedsService/DeedsService.ts @@ -1,4 +1,4 @@ -import { Deeds } from "@prisma/client"; +import { Deeds, Prisma } from "@prisma/client"; import DeedsRepository from "@Repositories/DeedsRepository"; import BaseService from "@Services/BaseService"; import { Deed } from "le-coffre-resources/dist/SuperAdmin"; @@ -14,7 +14,7 @@ export default class DeedsService extends BaseService { * @description : Get all deeds * @throws {Error} If deeds cannot be get */ - public async get(query: any) { + public async get(query: Prisma.DeedsFindManyArgs) { return this.deedRepository.findMany(query); } @@ -38,7 +38,11 @@ export default class DeedsService extends BaseService { * @description : Get a deed by uid * @throws {Error} If deed-type cannot be get by uid */ - public async getByUid(uid: string, query?: any): Promise { + public async getByUid(uid: string, query?: Prisma.DeedsInclude) { return this.deedRepository.findOneByUid(uid, query); } + + public async getOneByUidWithOffice(uid: string) { + return this.deedRepository.findOneByUidWithOffice(uid); + } } diff --git a/src/services/super-admin/DocumentTypesService/DocumentTypesService.ts b/src/services/super-admin/DocumentTypesService/DocumentTypesService.ts index 0f93d721..835c3485 100644 --- a/src/services/super-admin/DocumentTypesService/DocumentTypesService.ts +++ b/src/services/super-admin/DocumentTypesService/DocumentTypesService.ts @@ -1,4 +1,4 @@ -import { DocumentTypes } from "@prisma/client"; +import { DocumentTypes, Prisma } from "@prisma/client"; import DocumentTypesRepository from "@Repositories/DocumentTypesRepository"; import BaseService from "@Services/BaseService"; import { DocumentType } from "le-coffre-resources/dist/SuperAdmin"; @@ -14,7 +14,7 @@ export default class DocumentTypesService extends BaseService { * @description : Get all document-types * @throws {Error} If document-types cannot be get */ - public async get(query: any): Promise { + public async get(query: Prisma.DocumentTypesFindManyArgs) { return this.documentTypeRepository.findMany(query); } @@ -38,7 +38,15 @@ export default class DocumentTypesService extends BaseService { * @description : Get a document-type by uid * @throws {Error} If document-type is not found */ - public async getByUid(uid: string, query?: any): Promise { + public async getByUid(uid: string, query?: Prisma.DocumentTypesInclude): Promise { return this.documentTypeRepository.findOneByUid(uid, query); } + + /** + * @description : Get a document-type by uid with relations + * @throws {Error} If document-type is not found + */ + public async getByUidWithOffice(uid: string) { + return this.documentTypeRepository.findOneByUidWithOffice(uid); + } } diff --git a/src/services/super-admin/DocumentsService/DocumentsService.ts b/src/services/super-admin/DocumentsService/DocumentsService.ts index 5310e5bb..c86fcb0f 100644 --- a/src/services/super-admin/DocumentsService/DocumentsService.ts +++ b/src/services/super-admin/DocumentsService/DocumentsService.ts @@ -1,4 +1,4 @@ -import { Documents } from "@prisma/client"; +import { Documents, Prisma } from "@prisma/client"; import { Document } from "le-coffre-resources/dist/SuperAdmin"; import DocumentsRepository from "@Repositories/DocumentsRepository"; import BaseService from "@Services/BaseService"; @@ -14,7 +14,7 @@ export default class DocumentsService extends BaseService { * @description : Get all documents * @throws {Error} If documents cannot be get */ - public async get(query: any) { + public async get(query: Prisma.DocumentsFindManyArgs) { return this.documentsRepository.findMany(query); } @@ -38,7 +38,7 @@ export default class DocumentsService extends BaseService { * @description : Modify a document * @throws {Error} If document cannot be modified */ - public async update(uid: string, document: Partial, refused_reason?: string): Promise { + public async update(uid: string, document: Partial, refused_reason?: string): Promise { return this.documentsRepository.update(uid, document, refused_reason); } @@ -46,11 +46,11 @@ export default class DocumentsService extends BaseService { * @description : Delete a document * @throws {Error} If document cannot be deleted */ - public async delete(uid: string): Promise { - const documentEntity = await this.documentsRepository.findOneByUid(uid, { files: true }); - if(!documentEntity) throw new Error("document not found"); + public async delete(uid: string): Promise { + const documentEntity = await this.documentsRepository.findOneByUid(uid, { files: true }); + if (!documentEntity) throw new Error("document not found"); const document = Document.hydrate(documentEntity, { strategy: "excludeAll" }); - + if (document.files && document.files.length !== 0) { throw new Error("Can't delete a document with file"); } @@ -61,7 +61,15 @@ export default class DocumentsService extends BaseService { * @description : Get a document by uid * @throws {Error} If document cannot be get by uid */ - public async getByUid(uid: string, query?: any): Promise { + public async getByUid(uid: string, query?: Prisma.DocumentsInclude) { return this.documentsRepository.findOneByUid(uid, query); } + + /** + * @description : Get a document by uid + * @throws {Error} If document cannot be get by uid + */ + public async getByUidWithOffice(uid: string) { + return this.documentsRepository.findOneByUidWithOffice(uid); + } } diff --git a/src/services/super-admin/OfficeFoldersService/OfficeFoldersService.ts b/src/services/super-admin/OfficeFoldersService/OfficeFoldersService.ts index 6de0e5dc..846a5982 100644 --- a/src/services/super-admin/OfficeFoldersService/OfficeFoldersService.ts +++ b/src/services/super-admin/OfficeFoldersService/OfficeFoldersService.ts @@ -1,18 +1,18 @@ -import { OfficeFolders } from ".prisma/client"; +import { OfficeFolders } from ".prisma/client"; import OfficeFoldersRepository from "@Repositories/OfficeFoldersRepository"; import BaseService from "@Services/BaseService"; import { OfficeFolder } from "le-coffre-resources/dist/SuperAdmin"; import { Service } from "typedi"; import DeedTypesService from "../DeedTypesService/DeedTypesService"; import DeedsRepository from "@Repositories/DeedsRepository"; - +import { Prisma } from "@prisma/client"; @Service() export default class OfficeFoldersService extends BaseService { constructor( private officeFoldersRepository: OfficeFoldersRepository, private deedTypeService: DeedTypesService, - private deedRepository: DeedsRepository + private deedRepository: DeedsRepository, ) { super(); } @@ -21,7 +21,7 @@ export default class OfficeFoldersService extends BaseService { * @description : Get all folders * @throws {Error} If folders cannot be get */ - public async get(query: any): Promise { + public async get(query: Prisma.OfficeFoldersFindManyArgs) { return this.officeFoldersRepository.findMany(query); } @@ -31,8 +31,8 @@ export default class OfficeFoldersService extends BaseService { */ public async create(officeFolderEntity: OfficeFolder): Promise { const deedType = await this.deedTypeService.getByUid(officeFolderEntity.deed!.deed_type!.uid!); - if(!deedType) throw new Error('deed type not found'); - if(deedType.archived_at) throw new Error('deed type is archived'); + if (!deedType) throw new Error("deed type not found"); + if (deedType.archived_at) throw new Error("deed type is archived"); const deed = await this.deedRepository.create(officeFolderEntity.deed!); officeFolderEntity.deed!.uid = deed.uid; return this.officeFoldersRepository.create(officeFolderEntity); @@ -50,19 +50,27 @@ export default class OfficeFoldersService extends BaseService { * @description : Get a folder by uid * @throws {Error} If folder cannot be get by uid */ - public async getByUid(uid: string, query?: any): Promise { + public async getByUid(uid: string, query?: Prisma.OfficeFoldersInclude) { return this.officeFoldersRepository.findOneByUid(uid, query); } + /** + * @description : Get a folder by uid + * @throws {Error} If folder cannot be get by uid + */ + public async getByUidWithOffice(uid: string) { + return this.officeFoldersRepository.findOneByUidWithOffice(uid); + } + /** * @description : Delete a folder * @throws {Error} If document cannot be deleted */ public async delete(uid: string): Promise { const officeFolderEntity = await this.officeFoldersRepository.findOneByUid(uid, { customers: true }); - if(!officeFolderEntity) throw new Error('office folder not found'); + if (!officeFolderEntity) throw new Error("office folder not found"); const officeFolder = OfficeFolder.hydrate(officeFolderEntity, { strategy: "excludeAll" }); - + if (officeFolder.customers?.length) { throw new Error("This folder is used by customers"); } diff --git a/src/services/super-admin/OfficeRolesService/OfficeRolesService.ts b/src/services/super-admin/OfficeRolesService/OfficeRolesService.ts index e50ac7e4..b352b412 100644 --- a/src/services/super-admin/OfficeRolesService/OfficeRolesService.ts +++ b/src/services/super-admin/OfficeRolesService/OfficeRolesService.ts @@ -2,7 +2,7 @@ import BaseService from "@Services/BaseService"; import { Service } from "typedi"; import OfficeRolesRepository from "@Repositories/OfficeRolesRepository"; import { OfficeRole } from "le-coffre-resources/dist/SuperAdmin"; -import {Prisma, OfficeRoles } from "@prisma/client"; +import { Prisma, OfficeRoles } from "@prisma/client"; @Service() export default class OfficeRolesService extends BaseService { @@ -14,7 +14,7 @@ export default class OfficeRolesService extends BaseService { * @description : Get all officeRoles * @throws {Error} If officeRoles cannot be get */ - public get(query: Prisma.OfficeRolesFindManyArgs): Promise { + public get(query: Prisma.OfficeRolesFindManyArgs) { return this.officeRoleRepository.findMany(query); } @@ -38,7 +38,15 @@ export default class OfficeRolesService extends BaseService { * @description : Get a officeRole by uid * @throws {Error} If officeRole cannot be get by uid */ - public getByUid(uid: string, query?: any): Promise { + public getByUid(uid: string, query?: Prisma.OfficeRolesInclude) { return this.officeRoleRepository.findOneByUid(uid, query); } + + /** + * @description : Get a officeRole by uid + * @throws {Error} If officeRole cannot be get by uid + */ + public getByUidWithOffice(uid: string) { + return this.officeRoleRepository.findOneByUidWithOffice(uid); + } } diff --git a/src/services/super-admin/RolesService/RolesService.ts b/src/services/super-admin/RolesService/RolesService.ts index bbe52248..b26dd317 100644 --- a/src/services/super-admin/RolesService/RolesService.ts +++ b/src/services/super-admin/RolesService/RolesService.ts @@ -3,7 +3,7 @@ import "reflect-metadata"; import { Service } from "typedi"; import RolesRepository from "@Repositories/RolesRepository"; import { Role } from "le-coffre-resources/dist/SuperAdmin"; -import {Prisma, Roles } from "@prisma/client"; +import { Prisma, Roles } from "@prisma/client"; @Service() export default class RolesService extends BaseService { diff --git a/src/services/super-admin/RulesService/RulesService.ts b/src/services/super-admin/RulesService/RulesService.ts index edc4ce64..053c2cce 100644 --- a/src/services/super-admin/RulesService/RulesService.ts +++ b/src/services/super-admin/RulesService/RulesService.ts @@ -3,7 +3,7 @@ import "reflect-metadata"; import { Service } from "typedi"; import RulesRepository from "@Repositories/RulesRepository"; import { Rule } from "le-coffre-resources/dist/SuperAdmin"; -import {Prisma, Rules } from "@prisma/client"; +import { Prisma, Rules } from "@prisma/client"; @Service() export default class RulesService extends BaseService { diff --git a/src/services/super-admin/UsersService/UsersService.ts b/src/services/super-admin/UsersService/UsersService.ts index 4c2a27b3..da350fea 100644 --- a/src/services/super-admin/UsersService/UsersService.ts +++ b/src/services/super-admin/UsersService/UsersService.ts @@ -3,7 +3,7 @@ import "reflect-metadata"; import { Service } from "typedi"; import UsersRepository from "@Repositories/UsersRepository"; import User from "le-coffre-resources/dist/SuperAdmin"; -import {Prisma, Users } from "@prisma/client"; +import { Prisma, Users } from "@prisma/client"; @Service() export default class UsersService extends BaseService { @@ -39,10 +39,18 @@ export default class UsersService extends BaseService { * @description : Get a user by uid * @throws {Error} If user cannot be get by uid */ - public getByUid(uid: string, query?: any): Promise { + public getByUid(uid: string, query?: Prisma.UsersInclude) { return this.userRepository.findOneByUid(uid, query); } + /** + * @description : Get a user by uid with office + * @throws {Error} If user cannot be get by uid + */ + public getByUidWithOffice(uid: string) { + return this.userRepository.findOneByUidWithOffice(uid); + } + /** * @description : Get a user by uid * @throws {Error} If user cannot be get by uid diff --git a/src/test/services/super-admin/CustomersService.test.ts b/src/test/services/super-admin/CustomersService.test.ts index 7ea5944c..4b3f383e 100644 --- a/src/test/services/super-admin/CustomersService.test.ts +++ b/src/test/services/super-admin/CustomersService.test.ts @@ -151,7 +151,7 @@ describe("test update function", () => { describe("test get function", () => { it("should return an array of Customers", async () => { - const req = {} + const req = {}; const customers = await CustomersServiceTest.get(req); // verify result typing diff --git a/src/test/services/super-admin/DeedTypesService.test.ts b/src/test/services/super-admin/DeedTypesService.test.ts index 57ea73d9..8e66eb54 100644 --- a/src/test/services/super-admin/DeedTypesService.test.ts +++ b/src/test/services/super-admin/DeedTypesService.test.ts @@ -269,7 +269,7 @@ describe("test get function", () => { }); it("should return an array of DeedTypes per offices", async () => { - const deedTypesForFirstOffice = await DeedTypeServiceTest.get({ where: { office: {uid: office.uid} }, orderBy: { name: "asc" } }); + const deedTypesForFirstOffice = await DeedTypeServiceTest.get({ where: { office: { uid: office.uid } }, orderBy: { name: "asc" } }); expect(deedTypesForFirstOffice.length).toEqual(1); @@ -279,7 +279,10 @@ describe("test get function", () => { expect(deedTypesForFirstOffice[0]?.archived_at).toBeNull(); expect(deedTypesForFirstOffice[0]?.office_uid).toEqual(office.uid); - const deedTypesForSecondOffice = await DeedTypeServiceTest.get({ where: { office: {uid: office_.uid} }, orderBy: { name: "asc" } }); + const deedTypesForSecondOffice = await DeedTypeServiceTest.get({ + where: { office: { uid: office_.uid } }, + orderBy: { name: "asc" }, + }); expect(deedTypesForSecondOffice.length).toEqual(2); diff --git a/src/test/services/super-admin/DocumentTypesService.test.ts b/src/test/services/super-admin/DocumentTypesService.test.ts index b6d98045..821a455f 100644 --- a/src/test/services/super-admin/DocumentTypesService.test.ts +++ b/src/test/services/super-admin/DocumentTypesService.test.ts @@ -241,7 +241,10 @@ describe("test get function", () => { }); it("should return an array of DocumentTypes per offices", async () => { - const documentTypesForFirstOffice = await DocumentTypesServiceTest.get({ where: { office: {uid : office.uid }}, orderBy: { name: "asc" } }); + const documentTypesForFirstOffice = await DocumentTypesServiceTest.get({ + where: { office: { uid: office.uid } }, + orderBy: { name: "asc" }, + }); expect(documentTypesForFirstOffice.length).toEqual(1); @@ -252,7 +255,10 @@ describe("test get function", () => { expect(documentTypesForFirstOffice[0]?.archived_at).toBeNull(); expect(documentTypesForFirstOffice[0]?.office_uid).toEqual(office.uid); - const documentTypesForSecondOffice = await DocumentTypesServiceTest.get({ where: { office: {uid : office_.uid }}, orderBy: { name: "asc" } }); + const documentTypesForSecondOffice = await DocumentTypesServiceTest.get({ + where: { office: { uid: office_.uid } }, + orderBy: { name: "asc" }, + }); expect(documentTypesForSecondOffice.length).toEqual(2); diff --git a/src/test/services/super-admin/OfficeFolderService.test.ts b/src/test/services/super-admin/OfficeFolderService.test.ts index 78ea6f54..909a6ddd 100644 --- a/src/test/services/super-admin/OfficeFolderService.test.ts +++ b/src/test/services/super-admin/OfficeFolderService.test.ts @@ -1,7 +1,18 @@ import "module-alias/register"; import "reflect-metadata"; import { PrismaClient } from "prisma/prisma-client"; -import { customer, customer_, deedType, documentType, documentType_, office, officeFolder, officeFolder_, user, user_ } from "@Test/config/MockedData"; +import { + customer, + customer_, + deedType, + documentType, + documentType_, + office, + officeFolder, + officeFolder_, + user, + user_, +} from "@Test/config/MockedData"; import Container from "typedi"; import OfficeFoldersRepository from "@Repositories/OfficeFoldersRepository"; import OfficeFolderService from "@Services/super-admin/OfficeFoldersService/OfficeFoldersService"; @@ -12,7 +23,11 @@ import DeedsRepository from "@Repositories/DeedsRepository"; const prisma = new PrismaClient(); -const OfficeFolderServiceTest = new OfficeFolderService(Container.get(OfficeFoldersRepository), Container.get(DeedTypesService), Container.get(DeedsRepository)); +const OfficeFolderServiceTest = new OfficeFolderService( + Container.get(OfficeFoldersRepository), + Container.get(DeedTypesService), + Container.get(DeedsRepository), +); beforeAll(async () => { office.uid = (await initOffice(office)).uid; @@ -48,7 +63,7 @@ describe("test create function", () => { }); it("should not create a new office folder if deed type is archived", async () => { - let officeFolderWithArchivatedDeedType: OfficeFolder = JSON.parse(JSON.stringify(officeFolder)); + let officeFolderWithArchivatedDeedType: OfficeFolder = JSON.parse(JSON.stringify(officeFolder)); // try to create a new deed with unknown deed type async function createOfficeFolderWithArchivedDeedType() { await OfficeFolderServiceTest.create(officeFolderWithArchivatedDeedType);