import { Controller, Get, Post, Put, Delete, Patch, Route, Security, Tags, Body, Path, Request, Example, SuccessResponse, Response, } from "tsoa"; import { CreateOrgRevision, OrgRevision } from "../entities/OrgRevision"; import { AppDataSource } from "../database/data-source"; import HttpSuccess from "../interfaces/http-success"; import { CreateOrgChild1, OrgChild1 } from "../entities/OrgChild1"; import HttpError from "../interfaces/http-error"; import HttpStatusCode from "../interfaces/http-status"; import { In, Not } from "typeorm"; import { OrgRoot } from "../entities/OrgRoot"; import { OrgChild2 } from "../entities/OrgChild2"; import { OrgChild3 } from "../entities/OrgChild3"; import { OrgChild4 } from "../entities/OrgChild4"; @Route("api/v1/org") @Tags("Organization") @Security("bearerAuth") @Response( HttpStatusCode.INTERNAL_SERVER_ERROR, "เกิดข้อผิดพลาด ไม่สามารถแสดงรายการได้ กรุณาลองใหม่ในภายหลัง", ) @SuccessResponse(HttpStatusCode.OK, "สำเร็จ") export class OrganizationController extends Controller { private orgRevisionRepository = AppDataSource.getRepository(OrgRevision); private orgRootRepository = AppDataSource.getRepository(OrgRoot); private child1Repository = AppDataSource.getRepository(OrgChild1); private child2Repository = AppDataSource.getRepository(OrgChild2); private child3Repository = AppDataSource.getRepository(OrgChild3); private child4Repository = AppDataSource.getRepository(OrgChild4); /** * API รายการประวัติโครงสร้าง * * @summary ORG_020 - รายการประวัติโครงสร้าง #21 * */ @Get("history") async GetHistory() { try { const orgRevision = await this.orgRevisionRepository.find({ select: [ "id", "orgRevisionName", "orgRevisionIsCurrent", "orgRevisionCreatedAt", "orgRevisionIsDraft", ], order: { orgRevisionCreatedAt: "DESC" }, }); if (!orgRevision) { return new HttpSuccess([]); } const mapOrgRevisions = orgRevision.map((revision) => ({ orgRevisionId: revision.id, orgRevisionName: revision.orgRevisionName, orgRevisionIsCurrent: revision.orgRevisionIsCurrent, orgRevisionCreatedAt: revision.orgRevisionCreatedAt, orgRevisionIsDraft: revision.orgRevisionIsDraft, })); return new HttpSuccess(mapOrgRevisions); } catch (error) { return error; } } /** * API โครงสร้างปัจจุบันที่ใช้อยู่ * * @summary ORG_021 - โครงสร้างปัจจุบันที่ใช้อยู่ #22 * */ @Get("active") async GetActive() { try { const orgRevisionActive = await this.orgRevisionRepository.findOne({ where: { orgRevisionIsCurrent: true, orgRevisionIsDraft: false }, }); const orgRevisionDraf = await this.orgRevisionRepository.findOne({ where: { orgRevisionIsCurrent: false, orgRevisionIsDraft: true }, }); const mapData = { activeId: orgRevisionActive == null ? null : orgRevisionActive.id, activeName: orgRevisionActive == null ? null : orgRevisionActive.orgRevisionName, draftId: orgRevisionDraf == null ? null : orgRevisionDraf.id, draftName: orgRevisionDraf == null ? null : orgRevisionDraf.orgRevisionName, }; return new HttpSuccess(mapData); } catch (error) { return error; } } /** * API สร้างโครงสร้างระดับ4 * * @summary ORG_022 - สร้างโครงสร้างใหม่ #23 (ยังไม่เสร็จ) * */ @Post("draft") async CreateOrgRevision( @Body() requestBody: CreateOrgRevision, @Request() request: { user: Record }, ) { try { const revision = Object.assign(new OrgRevision(), requestBody) as OrgRevision; revision.orgRevisionIsDraft = true; revision.orgRevisionIsCurrent = false; revision.createdUserId = request.user.sub; revision.createdFullName = request.user.name; revision.lastUpdateUserId = request.user.sub; revision.lastUpdateFullName = request.user.name; await this.orgRevisionRepository.save(revision); if (requestBody.typeDraft.toUpperCase() == "ORG") { if (requestBody.orgRevisionId == null) throw new HttpError(HttpStatusCode.NOT_FOUND, "not found."); const _revision = await this.orgRevisionRepository.findOne({ where: { id: requestBody.orgRevisionId }, }); if (!_revision) throw new HttpError(HttpStatusCode.NOT_FOUND, "not found."); //clone data const orgRoot = await this.orgRootRepository.find({ where: { orgRevisionId: requestBody.orgRevisionId }, }); const _orgRoot = orgRoot.map((x) => ({ ...x, isAncestorDNA: x.isAncestorDNA == null || x.isAncestorDNA == "00000000-0000-0000-0000-000000000000" ? x.id : x.isAncestorDNA, })); await this.orgRootRepository.save(_orgRoot); _orgRoot.forEach(async (x: any) => { delete x.id; const data = Object.assign(new OrgRoot(), x); data.orgRevisionId = revision.id; data.createdUserId = request.user.sub; data.createdFullName = request.user.name; data.createdAt = new Date(); data.lastUpdateUserId = request.user.sub; data.lastUpdateFullName = request.user.name; data.lastUpdatedAt = new Date(); await this.orgRootRepository.save(data); }); //clone data const orgChild1 = await this.child1Repository.find({ where: { orgRevisionId: requestBody.orgRevisionId }, }); const _orgChild1 = orgChild1.map((x) => ({ ...x, isAncestorDNA: x.isAncestorDNA == null || x.isAncestorDNA == "00000000-0000-0000-0000-000000000000" ? x.id : x.isAncestorDNA, })); await this.child1Repository.save(_orgChild1); _orgChild1.forEach(async (x: any) => { delete x.id; const data = Object.assign(new OrgChild1(), x); data.orgRevisionId = revision.id; data.createdUserId = request.user.sub; data.createdFullName = request.user.name; data.createdAt = new Date(); data.lastUpdateUserId = request.user.sub; data.lastUpdateFullName = request.user.name; data.lastUpdatedAt = new Date(); await this.child1Repository.save(data); }); //clone data const orgChild2 = await this.child2Repository.find({ where: { orgRevisionId: requestBody.orgRevisionId }, }); const _orgChild2 = orgChild2.map((x) => ({ ...x, isAncestorDNA: x.isAncestorDNA == null || x.isAncestorDNA == "00000000-0000-0000-0000-000000000000" ? x.id : x.isAncestorDNA, })); await this.child2Repository.save(_orgChild2); _orgChild2.forEach(async (x: any) => { delete x.id; const data = Object.assign(new OrgChild2(), x); data.orgRevisionId = revision.id; data.createdUserId = request.user.sub; data.createdFullName = request.user.name; data.createdAt = new Date(); data.lastUpdateUserId = request.user.sub; data.lastUpdateFullName = request.user.name; data.lastUpdatedAt = new Date(); await this.child2Repository.save(data); }); //clone data const orgChild3 = await this.child3Repository.find({ where: { orgRevisionId: requestBody.orgRevisionId }, }); const _orgChild3 = orgChild3.map((x) => ({ ...x, isAncestorDNA: x.isAncestorDNA == null || x.isAncestorDNA == "00000000-0000-0000-0000-000000000000" ? x.id : x.isAncestorDNA, })); await this.child3Repository.save(_orgChild3); _orgChild3.forEach(async (x: any) => { delete x.id; const data = Object.assign(new OrgChild3(), x); data.orgRevisionId = revision.id; data.createdUserId = request.user.sub; data.createdFullName = request.user.name; data.createdAt = new Date(); data.lastUpdateUserId = request.user.sub; data.lastUpdateFullName = request.user.name; data.lastUpdatedAt = new Date(); await this.child3Repository.save(data); }); //clone data const orgChild4 = await this.child4Repository.find({ where: { orgRevisionId: requestBody.orgRevisionId }, }); const _orgChild4 = orgChild4.map((x) => ({ ...x, isAncestorDNA: x.isAncestorDNA == null || x.isAncestorDNA == "00000000-0000-0000-0000-000000000000" ? x.id : x.isAncestorDNA, })); await this.child4Repository.save(_orgChild4); _orgChild4.forEach(async (x: any) => { delete x.id; const data = Object.assign(new OrgChild4(), x); data.orgRevisionId = revision.id; data.createdUserId = request.user.sub; data.createdFullName = request.user.name; data.createdAt = new Date(); data.lastUpdateUserId = request.user.sub; data.lastUpdateFullName = request.user.name; data.lastUpdatedAt = new Date(); await this.child4Repository.save(data); }); } else if (requestBody.typeDraft.toUpperCase() == "ORG_POSITION") { } else if (requestBody.typeDraft.toUpperCase() == "ORG_POSITION_PERSON") { } const orgRevisions = await this.orgRevisionRepository.find({ where: [{ orgRevisionIsDraft: true, id: Not(revision.id) }], }); await this.child4Repository.delete({ orgRevisionId: In(orgRevisions.map((x) => x.id)) }); await this.child3Repository.delete({ orgRevisionId: In(orgRevisions.map((x) => x.id)) }); await this.child2Repository.delete({ orgRevisionId: In(orgRevisions.map((x) => x.id)) }); await this.child1Repository.delete({ orgRevisionId: In(orgRevisions.map((x) => x.id)) }); await this.orgRootRepository.delete({ orgRevisionId: In(orgRevisions.map((x) => x.id)) }); await this.orgRevisionRepository.remove(orgRevisions); return new HttpSuccess(revision); } catch (error) { return error; } } /** * API รายละเอียดโครงสร้าง * * @summary ORG_023 - รายละเอียดโครงสร้าง (ADMIN) #25 * */ @Get("{id}") async detail(@Path() id: string) { try { const orgRevisionData = await AppDataSource.getRepository(OrgRevision) .createQueryBuilder("orgRevision") // .leftJoin("orgRevision.orgRoots", "orgRoot") // .leftJoin("orgRoot.orgChild1s", "orgChild1") // .leftJoin("orgChild1.orgChild2s", "orgChild2") // .leftJoin("orgChild2.orgChild3s", "orgChild3") // .leftJoin("orgChild3.orgChild4s", "orgChild4") .where("orgRevision.id = :id", { id }) // .select([ // "orgRoot.id", // "orgRoot.orgRootName", // "orgRoot.orgRootShortName", // "orgRoot.orgRootCode", // "orgRoot.orgRootOrder", // "orgChild1.id", // "orgChild1.orgChild1Name", // "orgChild1.orgChild1ShortName", // "orgChild1.orgChild1Code", // "orgChild1.orgChild1Order", // "orgChild2.id", // "orgChild2.orgChild2Name", // "orgChild2.orgChild2ShortName", // "orgChild2.orgChild2Code", // "orgChild2.orgChild2Order", // "orgChild3.id", // "orgChild3.orgChild3Name", // "orgChild3.orgChild3ShortName", // "orgChild3.orgChild3Code", // "orgChild3.orgChild3Order", // "orgChild4.id", // "orgChild4.orgChild4Name", // "orgChild4.orgChild4ShortName", // "orgChild4.orgChild4Code", // "orgChild4.orgChild4Order", // ]) .getOne(); return new HttpSuccess(orgRevisionData); } catch (error) { return error; } } /** * API ตั้งเวลาเผยแพร่ * * @summary ORG_025 - ตั้งเวลาเผยแพร่ (ADMIN) #27 * * @param {string} id Id root */ @Put("/set/publish/{id}") async Edit( @Path() id: string, @Body() requestBody: {"orgPublishDate": Date}, @Request() request: { user: Record }, ) { try { const rootIdExits = await this.orgRootRepository.findOne({ where: { id: id }, }); if (!rootIdExits) { throw new HttpError(HttpStatusCode.NOT_FOUND, "not found. RootId"); } const orgRevision = await this.orgRevisionRepository.findOne({ where: { id: rootIdExits.orgRevisionId, orgRevisionIsDraft: true, orgRevisionIsCurrent: false } }); if (!orgRevision) { throw new HttpError(HttpStatusCode.NOT_FOUND, "not found. RevisionId"); } orgRevision.lastUpdateUserId = request.user.sub; orgRevision.lastUpdateFullName = request.user.name; orgRevision.lastUpdatedAt = new Date(); orgRevision.orgPublishDate = requestBody.orgPublishDate this.orgRevisionRepository.merge(orgRevision, requestBody); await this.orgRevisionRepository.save(orgRevision); return new HttpSuccess(); } catch (error) { return error; } } } function ANY(arg0: OrgRevision[]): string | import("typeorm").FindOperator | undefined { throw new Error("Function not implemented."); }