import { Response, Request } from "express"; 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, 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() export default class DeedsController extends ApiController { constructor(private deedsService: DeedsService) { super(); } /** * @description Get all deeds * @returns Deed[] list of deeds */ @Get("/api/v1/super-admin/deeds", [authHandler, ruleHandler]) protected async get(req: Request, response: Response) { try { //get query let query: Prisma.DeedsFindManyArgs = {}; if (req.query["q"]) { 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); //Hydrate ressource with prisma entity const deeds = Deed.hydrateArray(deedEntities, { strategy: "excludeAll" }); //success this.httpSuccess(response, deeds); } catch (error) { this.httpInternalError(response, error); return; } } /** * @description Get a specific deed by uid * @returns Deed */ @Get("/api/v1/super-admin/deeds/:uid", [authHandler, ruleHandler, deedHandler]) protected async getOneByUid(req: Request, response: Response) { try { const uid = req.params["uid"]; if (!uid) { this.httpBadRequest(response, "No uid provided"); return; } let query = {}; if (req.query["q"]) { query = JSON.parse(req.query["q"] as string); } const deedEntity = await this.deedsService.getByUid(uid, query); if (!deedEntity) { this.httpNotFoundRequest(response, "deed not found"); return; } //Hydrate ressource with prisma entity const deed = Deed.hydrate(deedEntity, { strategy: "excludeAll" }); //success this.httpSuccess(response, deed); } catch (error) { this.httpInternalError(response, error); return; } } /** * @description Modify a specific deed by uid */ @Put("/api/v1/super-admin/deeds/:uid", [authHandler, ruleHandler, deedHandler]) protected async put(req: Request, response: Response) { try { const uid = req.params["uid"]; if (!uid) { this.httpBadRequest(response, "No uid provided"); return; } const deedFound = await this.deedsService.getByUid(uid); if (!deedFound) { this.httpNotFoundRequest(response, "deed not found"); return; } //init OfficeFolder resource with request body values const deedEntity = Deed.hydrate(req.body); //validate folder await validateOrReject(deedEntity, { groups: ["updateDeed"], forbidUnknownValues: false }); //call service to get prisma entity const deedEntityUpdated = await this.deedsService.update(uid, deedEntity); //Hydrate ressource with prisma entity const deed = Deed.hydrate(deedEntityUpdated, { strategy: "excludeAll", }); //success this.httpSuccess(response, deed); } catch (error) { this.httpInternalError(response, error); return; } } }