Compare commits

...

2 commits

Author SHA1 Message Date
d82cd842f6 add reset password by admin & super_admin
All checks were successful
Build & Deploy on Dev / build (push) Successful in 1m10s
2026-04-28 15:14:47 +07:00
3833901bea fixed #2436 add link in noti request idp 2026-04-28 14:57:51 +07:00
2 changed files with 70 additions and 5 deletions

View file

@ -814,6 +814,68 @@ export class KeycloakController extends Controller {
if (!result) throw new Error("Failed. Cannot remove group to user.");
}
@Post("user/reset-password")
@Security("bearerAuth", ["admin"])
async resetUserPassword(@Request() req: RequestWithUser, @Body() body: { profileId: string }) {
if (!req.user.role.includes("ADMIN") && !req.user.role.includes("SUPER_ADMIN")) {
throw new HttpError(HttpStatus.FORBIDDEN, "ไม่มีสิทธิ์ดำเนินการ");
}
let profile: Profile | ProfileEmployee | null = await this.profileRepo.findOne({
where: { id: body.profileId },
select: ["id", "keycloak", "birthDate", "firstName", "lastName", "citizenId"],
});
let isEmployee = false;
if (!profile) {
profile = await this.profileEmpRepo.findOne({
where: { id: body.profileId, employeeClass: "PERM" },
select: ["id", "keycloak", "birthDate", "firstName", "lastName", "citizenId"],
});
isEmployee = true;
}
if (!profile) {
throw new HttpError(HttpStatus.NOT_FOUND, "ไม่พบข้อมูลผู้ใช้");
}
if (!profile.keycloak) {
throw new HttpError(HttpStatus.BAD_REQUEST, "ผู้ใช้ไม่ได้เชื่อมต่อกับ Keycloak");
}
let newPassword: string;
const isProduction = process.env.NODE_ENV === "production";
if (isProduction && profile.birthDate) {
const _date = new Date(profile.birthDate.toDateString())
.getDate()
.toString()
.padStart(2, "0");
const _month = (new Date(profile.birthDate.toDateString()).getMonth() + 1)
.toString()
.padStart(2, "0");
const _year = new Date(profile.birthDate.toDateString()).getFullYear() + 543;
newPassword = `${_date}${_month}${_year}`;
} else {
newPassword = "P@ssw0rd";
}
const result = await changeUserPassword(profile.keycloak, newPassword);
if (!result) {
throw new HttpError(HttpStatus.INTERNAL_SERVER_ERROR, "ไม่สามารถรีเซ็ตรหัสผ่านได้");
}
addLogSequence(req, {
action: "reset-password",
status: "success",
description: `รีเซ็ตรหัสผ่านสำหรับ ${profile.firstName} ${profile.lastName} (${profile.citizenId})`,
});
const response = new HttpSuccess();
response.message = "รีเซ็ตรหัสผ่านสำเร็จ";
return response;
}
@Get("user/role/{id}")
async getRoleUser(@Request() req: RequestWithUser, @Path("id") id: string) {
const profile = await this.profileRepo.findOne({

View file

@ -238,12 +238,15 @@ export class WorkflowController extends Controller {
);
// add link sysName = REGISTRY_PROFILE or REGISTRY_PROFILE_EMP
let notiLink = '';
if (body.sysName === 'REGISTRY_PROFILE') {
let notiLink = "";
if (body.sysName === "REGISTRY_PROFILE") {
notiLink = `${process.env.VITE_URL_MGT}/registry-officer/request-edit/personal/${body.refId}`;
} else if (body.sysName === 'REGISTRY_PROFILE_EMP') {
} else if (body.sysName === "REGISTRY_PROFILE_EMP") {
notiLink = `${process.env.VITE_URL_MGT}/registry-employee/request-edit/personal/${body.refId}`;
} else if (body.sysName === "REGISTRY_IDP") {
notiLink = `${process.env.VITE_URL_MGT}/registry-officer/request-edit-page/${body.refId}`;
}
const notificationReceivers = stateOperatorUsersToCreate
.filter((user) => firstStateOperators.some((op) => op.operator === user.operator))
.map((user) => ({
@ -911,14 +914,14 @@ export class WorkflowController extends Controller {
const roodIds = [posMasterUser.orgRootId];
const orgRoot = await this.orgRootRepo.findOne({
select: { id: true, isDeputy: true },
where: {
where: {
id: Not(posMasterUser.orgRootId),
isDeputy: true,
orgRevision: { orgRevisionIsCurrent: true, orgRevisionIsDraft: false },
},
});
if (orgRoot && orgRoot.isDeputy) {
roodIds.push(orgRoot.id)
roodIds.push(orgRoot.id);
}
// 2. Pre-calculate conditions - ย้ายออกมาข้างนอก