feat: add office membership control on services (#48)

solve this ticket:
https://app.ora.pm/p/fb56ed95daa7456b888d266a050b9afa?v=86662&s=29352&t=k&c=54838982e3184e9da6c457f7e37b5dd5

- add office membership control on deed, deed types, documents, document
types, files, folders, office roles and users
This commit is contained in:
Arnaud D. Natali 2023-07-04 14:06:40 +02:00 committed by GitHub
commit eb7f981606
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
60 changed files with 859 additions and 299 deletions

View File

@ -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);
});

View File

@ -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<Customer>(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"];

View File

@ -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<DeedType>(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"];

View File

@ -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<Deed>(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);

View File

@ -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<DocumentType>(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<DocumentType>(new DocumentType(), documentTypeEntity, { strategy: "excludeAll" });
const user = ObjectHydrate.hydrate<DocumentType>(new DocumentType(), documentTypeEntity!, { strategy: "excludeAll" });
//success
this.httpSuccess(response, user);

View File

@ -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<Document>(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<Document>(req.body);
const documentEntity = Document.hydrate<Document>(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"];

View File

@ -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<File>(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"];

View File

@ -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<OfficeFolder>(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<OfficeFolder>(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"];

View File

@ -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"];

View File

@ -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"];

View File

@ -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"];

View File

@ -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<Rule>(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"];

View File

@ -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<User>(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"];

View File

@ -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
*/

View File

@ -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();
});
}

View File

@ -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()
})
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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();
}

View File

@ -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!");

View File

@ -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;

View File

@ -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");

View File

@ -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");

View File

@ -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;
}

View File

@ -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<DeedTypes & {document_types: DocumentTypes[]}> {
public async update(uid: string, deedType: DeedType): Promise<DeedTypes & { document_types: DocumentTypes[] }> {
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 },
});
}
}

View File

@ -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 } },
},
});
}
}

View File

@ -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 },
});
}
}

View File

@ -27,7 +27,7 @@ export default class DocumentsRepository extends BaseRepository {
/**
* @description : Create a document
*/
public async create(document: Document): Promise<Documents & {document_type: DocumentTypes}> {
public async create(document: Document): Promise<Documents & { document_type: DocumentTypes }> {
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 } } },
});
}
}

View File

@ -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<Files & {document: Documents}> {
public async create(file: File, key: string): Promise<Files & { document: Documents }> {
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<Files& {document: Documents}> {
public async update(uid: string, file: File, key: string): Promise<Files & { document: Documents }> {
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<Files& {document: Documents}> {
public async deleteKeyAndArchive(uid: string): Promise<Files & { document: Documents }> {
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 } } } } },
});
}
}

View File

@ -27,7 +27,7 @@ export default class OfficeFoldersRepository extends BaseRepository {
/**
* @description : Create new office folder with stakeholders
*/
public async create(officeFolder: OfficeFolder): Promise<OfficeFolders & { stakeholders: Users[]}> {
public async create(officeFolder: OfficeFolder): Promise<OfficeFolders & { stakeholders: Users[] }> {
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
*/

View File

@ -27,7 +27,7 @@ export default class OfficeRolesRepository extends BaseRepository {
/**
* @description : Create new officeRole with rules
*/
public async create(officeRole: OfficeRole): Promise<OfficeRoles & {rules: Rules[]}> {
public async create(officeRole: OfficeRole): Promise<OfficeRoles & { rules: Rules[] }> {
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<OfficeRoles & {rules: Rules[]}> {
public async update(officeRole: OfficeRole): Promise<OfficeRoles & { rules: Rules[] }> {
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
*/

View File

@ -30,10 +30,10 @@ export default class RulesRepository extends BaseRepository {
public async create(rule: Rule): Promise<Rules> {
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);
}

View File

@ -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,
},
});

View File

@ -21,10 +21,10 @@ export type OpenIdConfig = {
scopes_supported: string[];
issuer: string;
jwks_uri: string;
}
};
export default interface OpenIdInterface {
getOpenIdConfig(): Promise<OpenIdConfig>
getOpenIdConfig(): Promise<OpenIdConfig>;
verifyIdToken(signingKey: string): Promise<Payload>;
getSigningKeys(jwksUri: string): Promise<string[]>;
}

View File

@ -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,
});

View File

@ -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,
};

View File

@ -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

View File

@ -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<Files[]> {
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<Files | null> {
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<Files> {
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<Files> {
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);
}
}

View File

@ -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 } });
}
/**

View File

@ -20,7 +20,7 @@ export type OpenIdConfig = {
scopes_supported: string[];
issuer: string;
jwks_uri: string;
}
};
@Service()
export default class OpenIdService extends BaseService {

View File

@ -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<Documents> {
public async update(uid: string, document: Document): Promise<Documents> {
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<Documents> {
public async delete(uid: string): Promise<Documents> {
return this.documentsRepository.delete(uid);
}

View File

@ -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<DeedTypes[]> {
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<DeedTypes | null> {
public async getByUid(uid: string, query?: Prisma.DeedTypesInclude): Promise<DeedTypes | null> {
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);
}
}

View File

@ -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<Deeds | null> {
public async getByUid(uid: string, query?: Prisma.DeedsInclude) {
return this.deedRepository.findOneByUid(uid, query);
}
public async getOneByUidWithOffice(uid: string) {
return this.deedRepository.findOneByUidWithOffice(uid);
}
}

View File

@ -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<DocumentTypes[]> {
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<DocumentTypes | null> {
public async getByUid(uid: string, query?: Prisma.DocumentTypesInclude): Promise<DocumentTypes | null> {
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);
}
}

View File

@ -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<Document>, refused_reason?: string): Promise<Documents> {
public async update(uid: string, document: Partial<Document>, refused_reason?: string): Promise<Documents> {
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<Documents> {
const documentEntity = await this.documentsRepository.findOneByUid(uid, { files: true });
if(!documentEntity) throw new Error("document not found");
public async delete(uid: string): Promise<Documents> {
const documentEntity = await this.documentsRepository.findOneByUid(uid, { files: true });
if (!documentEntity) throw new Error("document not found");
const document = Document.hydrate<Document>(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<Documents | null> {
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);
}
}

View File

@ -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<OfficeFolders[]> {
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<OfficeFolders> {
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<OfficeFolders | null> {
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<OfficeFolders> {
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<OfficeFolder>(officeFolderEntity, { strategy: "excludeAll" });
if (officeFolder.customers?.length) {
throw new Error("This folder is used by customers");
}

View File

@ -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<OfficeRoles[]> {
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<OfficeRoles | null> {
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);
}
}

View File

@ -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 {

View File

@ -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 {

View File

@ -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<Users | null> {
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

View File

@ -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

View File

@ -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);

View File

@ -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);

View File

@ -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);