add office membership control on services

This commit is contained in:
OxSaitama 2023-07-03 16:17:20 +02:00
parent c01fdfdaad
commit c2856de59a
37 changed files with 618 additions and 91 deletions

View File

@ -49,6 +49,7 @@ export default class UserController extends ApiController {
//success
this.httpSuccess(response, { accessToken, refreshToken });
} catch (error) {
console.log(error);
this.httpInternalError(response);
return;
}

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()
@ -25,6 +26,10 @@ export default class DeedTypesController extends ApiController {
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"];
@ -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()
@ -25,6 +26,10 @@ export default class DeedsController extends ApiController {
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"];

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()
@ -25,6 +26,9 @@ export default class DocumentTypesController extends ApiController {
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"];
@ -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()
@ -25,9 +26,12 @@ export default class DocumentsController extends ApiController {
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"];
@ -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/FileHandler";
@Controller()
@Service()
@ -26,7 +27,9 @@ export default class FilesController extends ApiController {
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
@ -114,7 +117,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 +155,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 +193,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()
@ -24,7 +25,9 @@ export default class OfficeFoldersController extends ApiController {
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);
@ -43,26 +46,13 @@ 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;
}
//call service to get prisma entity
const officeFolderEntity = await this.officeFoldersService.create(officeFolderRessource);
//Hydrate ressource with prisma entity
@ -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()
@ -24,6 +25,9 @@ export default class OfficeRolesController extends ApiController {
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

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

View File

@ -0,0 +1,35 @@
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";
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;
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) {
documentTypes.forEach((documentType) => {
if (documentType.office?.uid != officeId) {
response.sendStatus(HttpCodes.UNAUTHORIZED);
return;
}
});
}
next();
}

View File

@ -0,0 +1,43 @@
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";
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) {
documentTypes.forEach((documentType) => {
if (documentType.office?.uid != officeId) {
response.sendStatus(HttpCodes.UNAUTHORIZED);
return;
}
});
}
next();
}

View File

@ -0,0 +1,40 @@
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";
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 && folder.office?.uid != officeId) {
response.sendStatus(HttpCodes.UNAUTHORIZED);
return;
}
if (documentType && documentType.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,35 @@
import HttpCodes from "@Common/system/controller-pattern/HttpCodes";
import { NextFunction, Request, Response } from "express";
import Container from "typedi";
import { OfficeFolder } from "le-coffre-resources/dist/SuperAdmin";
import FilesService from "@Services/common/FilesService/FilesService";
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 folder: OfficeFolder = req.body.document.folder;
if (folder && folder.office?.uid != officeId) {
response.sendStatus(HttpCodes.UNAUTHORIZED);
return;
}
if(!uid) 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,57 @@
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

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

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

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

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

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

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

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

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

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

@ -7,7 +7,7 @@ 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 { Files, Prisma } from "@prisma/client";
import fetch from "node-fetch";
@ -26,7 +26,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 +34,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);
}
/**

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";
@ -16,7 +16,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 +40,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);
}
@ -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

@ -5,6 +5,7 @@ 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()
@ -21,7 +22,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);
}
@ -50,10 +51,18 @@ 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

View File

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

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