From 2eee5404a145c8d7e77886e69c36aa7457f3cce8 Mon Sep 17 00:00:00 2001 From: Kittapath Date: Tue, 14 May 2024 15:29:05 +0700 Subject: [PATCH] migrate responsibility --- src/controllers/ProfileAvatarController.ts | 59 ++++++++++++++++++ .../ProfileAvatarEmployeeController.ts | 62 +++++++++++++++++++ src/entities/OrgChild1.ts | 8 +-- src/entities/OrgChild2.ts | 5 +- src/entities/OrgChild3.ts | 4 +- src/entities/OrgChild4.ts | 4 +- src/entities/OrgRoot.ts | 4 +- src/entities/Profile.ts | 57 ++++++++++------- src/entities/ProfileAvatar.ts | 52 ++++++++++++++++ src/entities/ProfileEmployee.ts | 11 ++++ ...27-update_table_node_add_responsibility.ts | 56 +++++++++++++++++ 11 files changed, 285 insertions(+), 37 deletions(-) create mode 100644 src/controllers/ProfileAvatarController.ts create mode 100644 src/controllers/ProfileAvatarEmployeeController.ts create mode 100644 src/entities/ProfileAvatar.ts create mode 100644 src/migration/1715675159227-update_table_node_add_responsibility.ts diff --git a/src/controllers/ProfileAvatarController.ts b/src/controllers/ProfileAvatarController.ts new file mode 100644 index 00000000..6d105a11 --- /dev/null +++ b/src/controllers/ProfileAvatarController.ts @@ -0,0 +1,59 @@ +import { Body, Controller, Delete, Get, Path, Post, Request, Route, Security, Tags } from "tsoa"; +import { AppDataSource } from "../database/data-source"; +import HttpSuccess from "../interfaces/http-success"; +import HttpStatus from "../interfaces/http-status"; +import HttpError from "../interfaces/http-error"; +import { RequestWithUser } from "../middlewares/user"; +import { Profile } from "../entities/Profile"; +import { CreateProfileAvatar, ProfileAvatar } from "../entities/ProfileAvatar"; + +@Route("api/v1/org/profile/avatar") +@Tags("ProfileAvatar") +@Security("bearerAuth") +export class ProfileAvatarController extends Controller { + private profileRepository = AppDataSource.getRepository(Profile); + private avatarRepository = AppDataSource.getRepository(ProfileAvatar); + + @Get("{profileId}") + public async getAvatar(@Path() profileId: string) { + const lists = await this.avatarRepository.find({ + where: { profileId: profileId }, + }); + return new HttpSuccess(lists); + } + + @Post() + public async newAvatar(@Request() req: RequestWithUser, @Body() body: CreateProfileAvatar) { + const profile = await this.profileRepository.findOneBy({ id: body.profileId }); + + if (!profile) { + throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); + } + + const data = new ProfileAvatar(); + + const meta = { + createdUserId: req.user.sub, + createdFullName: req.user.name, + lastUpdateUserId: req.user.sub, + lastUpdateFullName: req.user.name, + }; + + Object.assign(data, { ...body, ...meta }); + + await this.avatarRepository.save(data); + + return new HttpSuccess(); + } + + @Delete("{avatarId}") + public async deleteAvatar(@Path() avatarId: string) { + const result = await this.avatarRepository.delete({ id: avatarId }); + + if (result.affected == undefined || result.affected <= 0) { + throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล"); + } + + return new HttpSuccess(); + } +} diff --git a/src/controllers/ProfileAvatarEmployeeController.ts b/src/controllers/ProfileAvatarEmployeeController.ts new file mode 100644 index 00000000..2cc3ce65 --- /dev/null +++ b/src/controllers/ProfileAvatarEmployeeController.ts @@ -0,0 +1,62 @@ +import { Body, Controller, Delete, Get, Path, Post, Request, Route, Security, Tags } from "tsoa"; +import { AppDataSource } from "../database/data-source"; +import HttpSuccess from "../interfaces/http-success"; +import HttpStatus from "../interfaces/http-status"; +import HttpError from "../interfaces/http-error"; +import { RequestWithUser } from "../middlewares/user"; +import { CreateProfileEmployeeAvatar, ProfileAvatar } from "../entities/ProfileAvatar"; +import { ProfileEmployee } from "../entities/ProfileEmployee"; + +@Route("api/v1/org/profile-employee/avatar") +@Tags("ProfileAvatar") +@Security("bearerAuth") +export class ProfileAvatarController extends Controller { + private profileRepository = AppDataSource.getRepository(ProfileEmployee); + private avatarRepository = AppDataSource.getRepository(ProfileAvatar); + + @Get("{profileId}") + public async getAvatar(@Path() profileId: string) { + const lists = await this.avatarRepository.find({ + where: { profileEmployeeId: profileId }, + }); + return new HttpSuccess(lists); + } + + @Post() + public async newAvatar( + @Request() req: RequestWithUser, + @Body() body: CreateProfileEmployeeAvatar, + ) { + const profile = await this.profileRepository.findOneBy({ id: body.profileEmployeeId }); + + if (!profile) { + throw new HttpError(HttpStatus.BAD_REQUEST, "ไม่พบ profile ดังกล่าว"); + } + + const data = new ProfileAvatar(); + + const meta = { + createdUserId: req.user.sub, + createdFullName: req.user.name, + lastUpdateUserId: req.user.sub, + lastUpdateFullName: req.user.name, + }; + + Object.assign(data, { ...body, ...meta }); + + await this.avatarRepository.save(data); + + return new HttpSuccess(); + } + + @Delete("{avatarId}") + public async deleteAvatar(@Path() avatarId: string) { + const result = await this.avatarRepository.delete({ id: avatarId }); + + if (result.affected == undefined || result.affected <= 0) { + throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูล"); + } + + return new HttpSuccess(); + } +} diff --git a/src/entities/OrgChild1.ts b/src/entities/OrgChild1.ts index cc1b87a0..12b77ba2 100644 --- a/src/entities/OrgChild1.ts +++ b/src/entities/OrgChild1.ts @@ -108,14 +108,13 @@ export class OrgChild1 extends EntityBase { }) ancestorDNA: string; - @Column({ nullable: true, length: 255, comment: "หน้าที่ความรับผิดชอบ", default: null, }) - duty: string; + responsibility: string; @ManyToOne(() => OrgRevision, (orgRevision) => orgRevision.orgChild1s) @JoinColumn({ name: "orgRevisionId" }) @@ -165,10 +164,9 @@ export class CreateOrgChild1 { @Column("uuid") orgRootId: string; - - @Column() - duty?: string; + @Column() + responsibility?: string; } export type UpdateOrgChild1 = Partial & { orgChild1Rank?: OrgChild1Rank }; diff --git a/src/entities/OrgChild2.ts b/src/entities/OrgChild2.ts index bc9b9896..91822992 100644 --- a/src/entities/OrgChild2.ts +++ b/src/entities/OrgChild2.ts @@ -119,7 +119,7 @@ export class OrgChild2 extends EntityBase { comment: "หน้าที่ความรับผิดชอบ", default: null, }) - duty: string; + responsibility: string; @ManyToOne(() => OrgRevision, (orgRevision) => orgRevision.orgChild2s) @JoinColumn({ name: "orgRevisionId" }) @@ -172,7 +172,6 @@ export class CreateOrgChild2 { orgChild1Id: string; @Column() - duty?: string; - + responsibility?: string; } export type UpdateOrgChild2 = Partial & { orgChild2Rank?: OrgChild2Rank }; diff --git a/src/entities/OrgChild3.ts b/src/entities/OrgChild3.ts index 4b6659ba..d49c283b 100644 --- a/src/entities/OrgChild3.ts +++ b/src/entities/OrgChild3.ts @@ -126,7 +126,7 @@ export class OrgChild3 extends EntityBase { comment: "หน้าที่ความรับผิดชอบ", default: null, }) - duty: string; + responsibility: string; @ManyToOne(() => OrgRevision, (orgRevision) => orgRevision.orgChild3s) @JoinColumn({ name: "orgRevisionId" }) @@ -180,7 +180,7 @@ export class CreateOrgChild3 { orgChild2Id: string; @Column() - duty?: string; + responsibility?: string; } export type UpdateOrgChild3 = Partial & { orgChild3Rank?: OrgChild3Rank }; diff --git a/src/entities/OrgChild4.ts b/src/entities/OrgChild4.ts index d1a9fe27..23a34bde 100644 --- a/src/entities/OrgChild4.ts +++ b/src/entities/OrgChild4.ts @@ -131,7 +131,7 @@ export class OrgChild4 extends EntityBase { comment: "หน้าที่ความรับผิดชอบ", default: null, }) - duty: string; + responsibility: string; @ManyToOne(() => OrgRevision, (orgRevision) => orgRevision.orgChild4s) @JoinColumn({ name: "orgRevisionId" }) @@ -186,6 +186,6 @@ export class CreateOrgChild4 { orgChild3Id: string; @Column() - duty?: string; + responsibility?: string; } export type UpdateOrgChild4 = Partial; diff --git a/src/entities/OrgRoot.ts b/src/entities/OrgRoot.ts index 853c865e..e258735c 100644 --- a/src/entities/OrgRoot.ts +++ b/src/entities/OrgRoot.ts @@ -102,7 +102,7 @@ export class OrgRoot extends EntityBase { comment: "หน้าที่ความรับผิดชอบ", default: null, }) - duty: string; + responsibility: string; @Column({ length: 40, @@ -156,7 +156,7 @@ export class CreateOrgRoot { orgRootFax?: string; @Column() - duty?: string; + responsibility?: string; @Column("uuid") orgRevisionId: string; diff --git a/src/entities/Profile.ts b/src/entities/Profile.ts index 744791e5..1d7b8d04 100644 --- a/src/entities/Profile.ts +++ b/src/entities/Profile.ts @@ -21,9 +21,17 @@ import { ProfileGovernment } from "./ProfileGovernment"; import { Province } from "./Province"; import { SubDistrict } from "./SubDistrict"; import { District } from "./District"; +import { ProfileAvatar } from "./ProfileAvatar"; @Entity("profile") export class Profile extends EntityBase { + @Column({ + nullable: true, + comment: "รูปถ่าย", + default: null, + }) + avatar: string; + @Column({ nullable: true, comment: "ยศ", @@ -294,6 +302,9 @@ export class Profile extends EntityBase { @OneToMany(() => ProfileOther, (profileOther) => profileOther.profile) profileOthers: ProfileOther[]; + @OneToMany(() => ProfileAvatar, (profileAvatar) => profileAvatar.profile) + profileAvatars: ProfileAvatar[]; + @OneToMany(() => ProfileFamilyHistory, (profileFamily) => profileFamily.profile) profileFamily: ProfileFamilyHistory[]; @@ -576,35 +587,35 @@ export class CreateProfileAllFields { posLevelId: string | null; posTypeId: string | null; email: string | null; - phone: string | null; + phone: string | null; keycloak: string | null; isProbation: boolean | null; - isLeave : boolean | null; - dateRetire : Date | null; - dateAppoint : Date | null; - dateStart: Date | null; + isLeave: boolean | null; + dateRetire: Date | null; + dateAppoint: Date | null; + dateStart: Date | null; govAgeAbsent: number | null; govAgePlus: number | null; birthDate: Date | null; - reasonSameDate : Date | null; - ethnicity : string | null; - telephoneNumber : string | null; - nationality : string | null; - gender : string | null; - relationship : string | null; - religion : string | null; - bloodGroup : string | null; - registrationAddress : string | null; - registrationProvinceId : string | null; + reasonSameDate: Date | null; + ethnicity: string | null; + telephoneNumber: string | null; + nationality: string | null; + gender: string | null; + relationship: string | null; + religion: string | null; + bloodGroup: string | null; + registrationAddress: string | null; + registrationProvinceId: string | null; registrationDistrictId: string | null; - registrationSubDistrictId : string | null; - registrationZipCode : string | null; - currentAddress : string | null; - currentProvinceId : string | null; - currentDistrictId : string | null; - currentSubDistrictId : string | null; - currentZipCode : string | null; -}; + registrationSubDistrictId: string | null; + registrationZipCode: string | null; + currentAddress: string | null; + currentProvinceId: string | null; + currentDistrictId: string | null; + currentSubDistrictId: string | null; + currentZipCode: string | null; +} export type UpdateProfile = { rank?: string | null; diff --git a/src/entities/ProfileAvatar.ts b/src/entities/ProfileAvatar.ts new file mode 100644 index 00000000..1469a806 --- /dev/null +++ b/src/entities/ProfileAvatar.ts @@ -0,0 +1,52 @@ +import { Entity, Column, ManyToOne, JoinColumn } from "typeorm"; +import { EntityBase } from "./base/Base"; +import { Profile } from "./Profile"; +import { ProfileEmployee } from "./ProfileEmployee"; + +@Entity("profileAvatar") +export class ProfileAvatar extends EntityBase { + @Column({ + nullable: true, + comment: "รูปถ่าย", + default: null, + }) + avatar: string; + + @Column({ + nullable: true, + length: 40, + comment: "คีย์นอก(FK)ของตาราง Profile", + default: null, + }) + profileId: string; + + @Column({ + nullable: true, + length: 40, + comment: "คีย์นอก(FK)ของตาราง ProfileEmployee", + default: null, + }) + profileEmployeeId: string; + + @ManyToOne(() => Profile, (profile) => profile.profileAvatars) + @JoinColumn({ name: "profileId" }) + profile: Profile; + + @ManyToOne(() => ProfileEmployee, (ProfileEmployee) => ProfileEmployee.profileAvatars) + @JoinColumn({ name: "profileEmployeeId" }) + profileEmployee: ProfileEmployee; +} + +export class CreateProfileAvatar { + profileId: string; + avatar: string | null; +} + +export class CreateProfileEmployeeAvatar { + profileEmployeeId: string; + avatar: string | null; +} + +export type UpdateProfileAvatar = { + avatar?: string | null; +}; diff --git a/src/entities/ProfileEmployee.ts b/src/entities/ProfileEmployee.ts index b3ba3146..28533d27 100644 --- a/src/entities/ProfileEmployee.ts +++ b/src/entities/ProfileEmployee.ts @@ -19,8 +19,16 @@ import { ProfileChildren, ProfileFamilyHistory } from "./ProfileFamily"; import { ProfileEducation } from "./ProfileEducation"; import { ProfileAbility } from "./ProfileAbility"; import { ProfileOther } from "./ProfileOther"; +import { ProfileAvatar } from "./ProfileAvatar"; @Entity("profileEmployee") export class ProfileEmployee extends EntityBase { + @Column({ + nullable: true, + comment: "รูปถ่าย", + default: null, + }) + avatar: string; + @Column({ nullable: true, comment: "ประเภทลูกจ้าง (perm->ลูกจ้างประจำ temp->ลูกจ้างชั่วคราว)", @@ -255,6 +263,9 @@ export class ProfileEmployee extends EntityBase { @OneToMany(() => ProfileOther, (v) => v.profileEmployee) profileOthers: ProfileOther[]; + @OneToMany(() => ProfileAvatar, (v) => v.profileEmployee) + profileAvatars: ProfileAvatar[]; + @ManyToOne(() => EmployeePosLevel, (v) => v.profiles) posLevel: EmployeePosLevel; diff --git a/src/migration/1715675159227-update_table_node_add_responsibility.ts b/src/migration/1715675159227-update_table_node_add_responsibility.ts new file mode 100644 index 00000000..b60fc1b7 --- /dev/null +++ b/src/migration/1715675159227-update_table_node_add_responsibility.ts @@ -0,0 +1,56 @@ +import { MigrationInterface, QueryRunner } from "typeorm"; + +export class UpdateTableNodeAddResponsibility1715675159227 implements MigrationInterface { + name = 'UpdateTableNodeAddResponsibility1715675159227' + + public async up(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`orgChild4\` CHANGE \`duty\` \`responsibility\` varchar(255) NULL COMMENT 'หน้าที่ความรับผิดชอบ'`); + await queryRunner.query(`ALTER TABLE \`orgChild3\` CHANGE \`duty\` \`responsibility\` varchar(255) NULL COMMENT 'หน้าที่ความรับผิดชอบ'`); + await queryRunner.query(`ALTER TABLE \`orgChild2\` CHANGE \`duty\` \`responsibility\` varchar(255) NULL COMMENT 'หน้าที่ความรับผิดชอบ'`); + await queryRunner.query(`ALTER TABLE \`orgChild1\` CHANGE \`duty\` \`responsibility\` varchar(255) NULL COMMENT 'หน้าที่ความรับผิดชอบ'`); + await queryRunner.query(`ALTER TABLE \`orgRoot\` CHANGE \`duty\` \`responsibility\` varchar(255) NULL COMMENT 'หน้าที่ความรับผิดชอบ'`); + await queryRunner.query(`CREATE TABLE \`profileAvatar\` (\`id\` varchar(36) NOT NULL, \`createdAt\` datetime(6) NOT NULL COMMENT 'สร้างข้อมูลเมื่อ' DEFAULT CURRENT_TIMESTAMP(6), \`createdUserId\` varchar(40) NOT NULL COMMENT 'User Id ที่สร้างข้อมูล' DEFAULT '00000000-0000-0000-0000-000000000000', \`lastUpdatedAt\` datetime(6) NOT NULL COMMENT 'แก้ไขข้อมูลล่าสุดเมื่อ' DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), \`lastUpdateUserId\` varchar(40) NOT NULL COMMENT 'User Id ที่แก้ไขข้อมูล' DEFAULT '00000000-0000-0000-0000-000000000000', \`createdFullName\` varchar(200) NOT NULL COMMENT 'ชื่อ User ที่สร้างข้อมูล' DEFAULT 'string', \`lastUpdateFullName\` varchar(200) NOT NULL COMMENT 'ชื่อ User ที่แก้ไขข้อมูลล่าสุด' DEFAULT 'string', \`avatar\` varchar(255) NULL COMMENT 'รูปถ่าย', \`profileId\` varchar(40) NULL COMMENT 'คีย์นอก(FK)ของตาราง Profile', \`profileEmployeeId\` varchar(40) NULL COMMENT 'คีย์นอก(FK)ของตาราง ProfileEmployee', PRIMARY KEY (\`id\`)) ENGINE=InnoDB`); + await queryRunner.query(`ALTER TABLE \`profileEmployee\` ADD \`avatar\` varchar(255) NULL COMMENT 'รูปถ่าย'`); + await queryRunner.query(`ALTER TABLE \`profileEmployeeHistory\` ADD \`avatar\` varchar(255) NULL COMMENT 'รูปถ่าย'`); + await queryRunner.query(`ALTER TABLE \`profile\` ADD \`avatar\` varchar(255) NULL COMMENT 'รูปถ่าย'`); + await queryRunner.query(`ALTER TABLE \`profileHistory\` ADD \`avatar\` varchar(255) NULL COMMENT 'รูปถ่าย'`); + await queryRunner.query(`ALTER TABLE \`orgChild4\` DROP COLUMN \`responsibility\``); + await queryRunner.query(`ALTER TABLE \`orgChild4\` ADD \`responsibility\` varchar(255) NULL COMMENT 'หน้าที่ความรับผิดชอบ'`); + await queryRunner.query(`ALTER TABLE \`orgChild3\` DROP COLUMN \`responsibility\``); + await queryRunner.query(`ALTER TABLE \`orgChild3\` ADD \`responsibility\` varchar(255) NULL COMMENT 'หน้าที่ความรับผิดชอบ'`); + await queryRunner.query(`ALTER TABLE \`orgChild2\` DROP COLUMN \`responsibility\``); + await queryRunner.query(`ALTER TABLE \`orgChild2\` ADD \`responsibility\` varchar(255) NULL COMMENT 'หน้าที่ความรับผิดชอบ'`); + await queryRunner.query(`ALTER TABLE \`orgChild1\` DROP COLUMN \`responsibility\``); + await queryRunner.query(`ALTER TABLE \`orgChild1\` ADD \`responsibility\` varchar(255) NULL COMMENT 'หน้าที่ความรับผิดชอบ'`); + await queryRunner.query(`ALTER TABLE \`orgRoot\` DROP COLUMN \`responsibility\``); + await queryRunner.query(`ALTER TABLE \`orgRoot\` ADD \`responsibility\` varchar(255) NULL COMMENT 'หน้าที่ความรับผิดชอบ'`); + await queryRunner.query(`ALTER TABLE \`profileAvatar\` ADD CONSTRAINT \`FK_e0db5c1a2f1facf02f03fbf78ea\` FOREIGN KEY (\`profileId\`) REFERENCES \`profile\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION`); + await queryRunner.query(`ALTER TABLE \`profileAvatar\` ADD CONSTRAINT \`FK_fb52fa49388a6e73b41ba8259a3\` FOREIGN KEY (\`profileEmployeeId\`) REFERENCES \`profileEmployee\`(\`id\`) ON DELETE NO ACTION ON UPDATE NO ACTION`); + } + + public async down(queryRunner: QueryRunner): Promise { + await queryRunner.query(`ALTER TABLE \`profileAvatar\` DROP FOREIGN KEY \`FK_fb52fa49388a6e73b41ba8259a3\``); + await queryRunner.query(`ALTER TABLE \`profileAvatar\` DROP FOREIGN KEY \`FK_e0db5c1a2f1facf02f03fbf78ea\``); + await queryRunner.query(`ALTER TABLE \`orgRoot\` DROP COLUMN \`responsibility\``); + await queryRunner.query(`ALTER TABLE \`orgRoot\` ADD \`responsibility\` varchar(255) NULL COMMENT 'หน้าที่ความรับผิดชอบ'`); + await queryRunner.query(`ALTER TABLE \`orgChild1\` DROP COLUMN \`responsibility\``); + await queryRunner.query(`ALTER TABLE \`orgChild1\` ADD \`responsibility\` varchar(255) NULL COMMENT 'หน้าที่ความรับผิดชอบ'`); + await queryRunner.query(`ALTER TABLE \`orgChild2\` DROP COLUMN \`responsibility\``); + await queryRunner.query(`ALTER TABLE \`orgChild2\` ADD \`responsibility\` varchar(255) NULL COMMENT 'หน้าที่ความรับผิดชอบ'`); + await queryRunner.query(`ALTER TABLE \`orgChild3\` DROP COLUMN \`responsibility\``); + await queryRunner.query(`ALTER TABLE \`orgChild3\` ADD \`responsibility\` varchar(255) NULL COMMENT 'หน้าที่ความรับผิดชอบ'`); + await queryRunner.query(`ALTER TABLE \`orgChild4\` DROP COLUMN \`responsibility\``); + await queryRunner.query(`ALTER TABLE \`orgChild4\` ADD \`responsibility\` varchar(255) NULL COMMENT 'หน้าที่ความรับผิดชอบ'`); + await queryRunner.query(`ALTER TABLE \`profileHistory\` DROP COLUMN \`avatar\``); + await queryRunner.query(`ALTER TABLE \`profile\` DROP COLUMN \`avatar\``); + await queryRunner.query(`ALTER TABLE \`profileEmployeeHistory\` DROP COLUMN \`avatar\``); + await queryRunner.query(`ALTER TABLE \`profileEmployee\` DROP COLUMN \`avatar\``); + await queryRunner.query(`DROP TABLE \`profileAvatar\``); + await queryRunner.query(`ALTER TABLE \`orgRoot\` CHANGE \`responsibility\` \`duty\` varchar(255) NULL COMMENT 'หน้าที่ความรับผิดชอบ'`); + await queryRunner.query(`ALTER TABLE \`orgChild1\` CHANGE \`responsibility\` \`duty\` varchar(255) NULL COMMENT 'หน้าที่ความรับผิดชอบ'`); + await queryRunner.query(`ALTER TABLE \`orgChild2\` CHANGE \`responsibility\` \`duty\` varchar(255) NULL COMMENT 'หน้าที่ความรับผิดชอบ'`); + await queryRunner.query(`ALTER TABLE \`orgChild3\` CHANGE \`responsibility\` \`duty\` varchar(255) NULL COMMENT 'หน้าที่ความรับผิดชอบ'`); + await queryRunner.query(`ALTER TABLE \`orgChild4\` CHANGE \`responsibility\` \`duty\` varchar(255) NULL COMMENT 'หน้าที่ความรับผิดชอบ'`); + } + +}