api web service add join for show name
This commit is contained in:
parent
b071bc2d92
commit
44793fbfbb
3 changed files with 290 additions and 31 deletions
|
|
@ -69,6 +69,28 @@ export class ApiWebServiceController extends Controller {
|
|||
},
|
||||
};
|
||||
|
||||
// การแทนที่ฟิลด์ ID ด้วยฟิลด์ Name สำหรับ Position entity
|
||||
private readonly POSITION_FIELD_REPLACEMENTS: Record<
|
||||
string,
|
||||
{ propertyName: string; joinRelation: string; joinField: string }
|
||||
> = {
|
||||
posTypeName: {
|
||||
propertyName: "posTypeId",
|
||||
joinRelation: "posType",
|
||||
joinField: "posTypeName",
|
||||
},
|
||||
posLevelName: {
|
||||
propertyName: "posLevelId",
|
||||
joinRelation: "posLevel",
|
||||
joinField: "posLevelName",
|
||||
},
|
||||
posExecutiveName: {
|
||||
propertyName: "posExecutiveId",
|
||||
joinRelation: "posExecutive",
|
||||
joinField: "posExecutiveName",
|
||||
},
|
||||
};
|
||||
|
||||
/**
|
||||
* build posMaster permission condition
|
||||
* @summary สร้างเงื่อนไขการกรองข้อมูลตามสิทธิ์การเข้าถึง
|
||||
|
|
@ -82,6 +104,7 @@ export class ApiWebServiceController extends Controller {
|
|||
dnaChild3Id?: string | null;
|
||||
dnaChild4Id?: string | null;
|
||||
},
|
||||
tableAlias: string = "posMaster",
|
||||
): string {
|
||||
// ALL - no filtering
|
||||
if (accessType === "ALL") {
|
||||
|
|
@ -94,49 +117,49 @@ export class ApiWebServiceController extends Controller {
|
|||
if (accessType === "ROOT" && dnaIds.dnaRootId) {
|
||||
// All organizations under this root
|
||||
conditions.push(
|
||||
`posMaster.orgRootId IN (SELECT id FROM orgRoot WHERE orgRevisionId = "${this.currentRevisionId}" AND ancestorDNA LIKE "${dnaIds.dnaRootId}%")`,
|
||||
`${tableAlias}.orgRootId IN (SELECT id FROM orgRoot WHERE orgRevisionId = "${this.currentRevisionId}" AND ancestorDNA LIKE "${dnaIds.dnaRootId}%")`,
|
||||
);
|
||||
} else if (accessType === "CHILD" || accessType === "NORMAL") {
|
||||
// Build conditions based on which DNA level is specified
|
||||
if (dnaIds.dnaChild4Id) {
|
||||
conditions.push(
|
||||
`posMaster.orgChild4Id IN (SELECT id FROM orgChild4 WHERE orgRevisionId = "${this.currentRevisionId}" AND ancestorDNA = "${dnaIds.dnaChild4Id}")`,
|
||||
`${tableAlias}.orgChild4Id IN (SELECT id FROM orgChild4 WHERE orgRevisionId = "${this.currentRevisionId}" AND ancestorDNA = "${dnaIds.dnaChild4Id}")`,
|
||||
);
|
||||
} else if (dnaIds.dnaChild3Id) {
|
||||
conditions.push(
|
||||
`posMaster.orgChild3Id IN (SELECT id FROM orgChild3 WHERE orgRevisionId = "${this.currentRevisionId}" AND ancestorDNA = "${dnaIds.dnaChild3Id}")`,
|
||||
`${tableAlias}.orgChild3Id IN (SELECT id FROM orgChild3 WHERE orgRevisionId = "${this.currentRevisionId}" AND ancestorDNA = "${dnaIds.dnaChild3Id}")`,
|
||||
);
|
||||
// For CHILD type, include all descendants
|
||||
if (accessType === "CHILD") {
|
||||
conditions.push(
|
||||
`(posMaster.orgChild3Id IN (SELECT id FROM orgChild3 WHERE orgRevisionId = "${this.currentRevisionId}" AND ancestorDNA LIKE "${dnaIds.dnaChild3Id}%") OR posMaster.orgChild4Id IS NOT NULL)`,
|
||||
`(${tableAlias}.orgChild3Id IN (SELECT id FROM orgChild3 WHERE orgRevisionId = "${this.currentRevisionId}" AND ancestorDNA LIKE "${dnaIds.dnaChild3Id}%") OR ${tableAlias}.orgChild4Id IS NOT NULL)`,
|
||||
);
|
||||
}
|
||||
} else if (dnaIds.dnaChild2Id) {
|
||||
conditions.push(
|
||||
`posMaster.orgChild2Id IN (SELECT id FROM orgChild2 WHERE orgRevisionId = "${this.currentRevisionId}" AND ancestorDNA = "${dnaIds.dnaChild2Id}")`,
|
||||
`${tableAlias}.orgChild2Id IN (SELECT id FROM orgChild2 WHERE orgRevisionId = "${this.currentRevisionId}" AND ancestorDNA = "${dnaIds.dnaChild2Id}")`,
|
||||
);
|
||||
if (accessType === "CHILD") {
|
||||
conditions.push(
|
||||
`(posMaster.orgChild2Id IN (SELECT id FROM orgChild2 WHERE orgRevisionId = "${this.currentRevisionId}" AND ancestorDNA LIKE "${dnaIds.dnaChild2Id}%") OR posMaster.orgChild3Id IS NOT NULL)`,
|
||||
`(${tableAlias}.orgChild2Id IN (SELECT id FROM orgChild2 WHERE orgRevisionId = "${this.currentRevisionId}" AND ancestorDNA LIKE "${dnaIds.dnaChild2Id}%") OR ${tableAlias}.orgChild3Id IS NOT NULL)`,
|
||||
);
|
||||
}
|
||||
} else if (dnaIds.dnaChild1Id) {
|
||||
conditions.push(
|
||||
`posMaster.orgChild1Id IN (SELECT id FROM orgChild1 WHERE orgRevisionId = "${this.currentRevisionId}" AND ancestorDNA = "${dnaIds.dnaChild1Id}")`,
|
||||
`${tableAlias}.orgChild1Id IN (SELECT id FROM orgChild1 WHERE orgRevisionId = "${this.currentRevisionId}" AND ancestorDNA = "${dnaIds.dnaChild1Id}")`,
|
||||
);
|
||||
if (accessType === "CHILD") {
|
||||
conditions.push(
|
||||
`(posMaster.orgChild1Id IN (SELECT id FROM orgChild1 WHERE orgRevisionId = "${this.currentRevisionId}" AND ancestorDNA LIKE "${dnaIds.dnaChild1Id}%") OR posMaster.orgChild2Id IS NOT NULL)`,
|
||||
`(${tableAlias}.orgChild1Id IN (SELECT id FROM orgChild1 WHERE orgRevisionId = "${this.currentRevisionId}" AND ancestorDNA LIKE "${dnaIds.dnaChild1Id}%") OR ${tableAlias}.orgChild2Id IS NOT NULL)`,
|
||||
);
|
||||
}
|
||||
} else if (dnaIds.dnaRootId) {
|
||||
conditions.push(
|
||||
`posMaster.orgRootId IN (SELECT id FROM orgRoot WHERE orgRevisionId = "${this.currentRevisionId}" AND ancestorDNA = "${dnaIds.dnaRootId}")`,
|
||||
`${tableAlias}.orgRootId IN (SELECT id FROM orgRoot WHERE orgRevisionId = "${this.currentRevisionId}" AND ancestorDNA = "${dnaIds.dnaRootId}")`,
|
||||
);
|
||||
if (accessType === "CHILD") {
|
||||
conditions.push(
|
||||
`(posMaster.orgRootId IN (SELECT id FROM orgRoot WHERE orgRevisionId = "${this.currentRevisionId}" AND ancestorDNA LIKE "${dnaIds.dnaRootId}%") OR posMaster.orgChild1Id IS NOT NULL)`,
|
||||
`(${tableAlias}.orgRootId IN (SELECT id FROM orgRoot WHERE orgRevisionId = "${this.currentRevisionId}" AND ancestorDNA LIKE "${dnaIds.dnaRootId}%") OR ${tableAlias}.orgChild1Id IS NOT NULL)`,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
@ -203,8 +226,9 @@ export class ApiWebServiceController extends Controller {
|
|||
}
|
||||
|
||||
let posMasterCondition: string = "";
|
||||
let posMasterAlias: string = "";
|
||||
|
||||
// Special handling for Profile system with permission filtering
|
||||
// Special handling for Profile and ProfileEmployee systems with permission filtering
|
||||
if (system == "registry") {
|
||||
// Get current revision
|
||||
const revision = await this.orgRevisionRepository.findOne({
|
||||
|
|
@ -214,15 +238,89 @@ export class ApiWebServiceController extends Controller {
|
|||
|
||||
// Store for use in permission building
|
||||
this.currentRevisionId = revision?.id || "";
|
||||
posMasterAlias = "posMaster";
|
||||
|
||||
// Build permission condition
|
||||
posMasterCondition = this.buildPosMasterPermissionCondition(request.user.accessType, {
|
||||
dnaRootId: request.user.dnaRootId,
|
||||
dnaChild1Id: request.user.dnaChild1Id,
|
||||
dnaChild2Id: request.user.dnaChild2Id,
|
||||
dnaChild3Id: request.user.dnaChild3Id,
|
||||
dnaChild4Id: request.user.dnaChild4Id,
|
||||
posMasterCondition = this.buildPosMasterPermissionCondition(
|
||||
request.user.accessType,
|
||||
{
|
||||
dnaRootId: request.user.dnaRootId,
|
||||
dnaChild1Id: request.user.dnaChild1Id,
|
||||
dnaChild2Id: request.user.dnaChild2Id,
|
||||
dnaChild3Id: request.user.dnaChild3Id,
|
||||
dnaChild4Id: request.user.dnaChild4Id,
|
||||
},
|
||||
posMasterAlias,
|
||||
);
|
||||
} else if (system == "registry_emp") {
|
||||
// Get current revision
|
||||
const revision = await this.orgRevisionRepository.findOne({
|
||||
select: ["id"],
|
||||
where: { orgRevisionIsCurrent: true, orgRevisionIsDraft: false },
|
||||
});
|
||||
|
||||
// Store for use in permission building
|
||||
this.currentRevisionId = revision?.id || "";
|
||||
posMasterAlias = "employeePosMaster";
|
||||
|
||||
// Build permission condition
|
||||
posMasterCondition = this.buildPosMasterPermissionCondition(
|
||||
request.user.accessType,
|
||||
{
|
||||
dnaRootId: request.user.dnaRootId,
|
||||
dnaChild1Id: request.user.dnaChild1Id,
|
||||
dnaChild2Id: request.user.dnaChild2Id,
|
||||
dnaChild3Id: request.user.dnaChild3Id,
|
||||
dnaChild4Id: request.user.dnaChild4Id,
|
||||
},
|
||||
posMasterAlias,
|
||||
);
|
||||
} else if (system == "registry_temp") {
|
||||
// Get current revision
|
||||
const revision = await this.orgRevisionRepository.findOne({
|
||||
select: ["id"],
|
||||
where: { orgRevisionIsCurrent: true, orgRevisionIsDraft: false },
|
||||
});
|
||||
|
||||
// Store for use in permission building
|
||||
this.currentRevisionId = revision?.id || "";
|
||||
posMasterAlias = "employeeTempPosMaster";
|
||||
|
||||
// Build permission condition
|
||||
posMasterCondition = this.buildPosMasterPermissionCondition(
|
||||
request.user.accessType,
|
||||
{
|
||||
dnaRootId: request.user.dnaRootId,
|
||||
dnaChild1Id: request.user.dnaChild1Id,
|
||||
dnaChild2Id: request.user.dnaChild2Id,
|
||||
dnaChild3Id: request.user.dnaChild3Id,
|
||||
dnaChild4Id: request.user.dnaChild4Id,
|
||||
},
|
||||
posMasterAlias,
|
||||
);
|
||||
} else if (system == "position") {
|
||||
// Get current revision
|
||||
const revision = await this.orgRevisionRepository.findOne({
|
||||
select: ["id"],
|
||||
where: { orgRevisionIsCurrent: true, orgRevisionIsDraft: false },
|
||||
});
|
||||
|
||||
// Store for use in permission building
|
||||
this.currentRevisionId = revision?.id || "";
|
||||
posMasterAlias = "PosMaster"; // Note: Uses PascalCase to match tbMain alias
|
||||
|
||||
// Build permission condition
|
||||
posMasterCondition = this.buildPosMasterPermissionCondition(
|
||||
request.user.accessType,
|
||||
{
|
||||
dnaRootId: request.user.dnaRootId,
|
||||
dnaChild1Id: request.user.dnaChild1Id,
|
||||
dnaChild2Id: request.user.dnaChild2Id,
|
||||
dnaChild3Id: request.user.dnaChild3Id,
|
||||
dnaChild4Id: request.user.dnaChild4Id,
|
||||
},
|
||||
posMasterAlias,
|
||||
);
|
||||
}
|
||||
|
||||
const repo = AppDataSource.getRepository(tbMain);
|
||||
|
|
@ -256,6 +354,23 @@ export class ApiWebServiceController extends Controller {
|
|||
});
|
||||
}
|
||||
|
||||
// สำหรับ Position: ตรวจสอบฟิลด์ที่ต้องการ join และแปลง propertyKey
|
||||
const positionFieldJoins: Record<string, string> = {}; // alias -> relationName
|
||||
if (tbMain === "Position") {
|
||||
propertyKey = propertyKey.map((key) => {
|
||||
const [table, field] = key.split(".");
|
||||
if (table === "Position") {
|
||||
const replacement = this.POSITION_FIELD_REPLACEMENTS[field];
|
||||
if (replacement) {
|
||||
const alias = `${table}_${replacement.joinRelation}`;
|
||||
positionFieldJoins[alias] = replacement.joinRelation;
|
||||
return `${alias}.${replacement.joinField}`;
|
||||
}
|
||||
}
|
||||
return key;
|
||||
});
|
||||
}
|
||||
|
||||
const queryBuilder = repo.createQueryBuilder(tbMain);
|
||||
|
||||
// join กับตารารอง
|
||||
|
|
@ -278,9 +393,40 @@ export class ApiWebServiceController extends Controller {
|
|||
});
|
||||
}
|
||||
|
||||
// join กับ posMaster สำหรับ Profile เพื่อกรองตามสิทธิ์การเข้าถึง
|
||||
if (tbMain === "Profile" && posMasterCondition !== "1=1") {
|
||||
queryBuilder.leftJoin("Profile.current_holders", "posMaster");
|
||||
// join สำหรับฟิลด์ Position ที่ต้องการดึงค่าจากตารางอื่น
|
||||
if (tbMain === "Position" && Object.keys(positionFieldJoins).length > 0) {
|
||||
Object.entries(positionFieldJoins).forEach(([alias, relationName]) => {
|
||||
queryBuilder.leftJoin(`${tbMain}.${relationName}`, alias);
|
||||
});
|
||||
}
|
||||
|
||||
// join สำหรับ PosMaster เมื่อต้องการดึงค่าจาก Profile (ข้อมูลคนครอง)
|
||||
const posMasterProfileFields: string[] = [];
|
||||
if (tbMain === "PosMaster") {
|
||||
propertyKey.forEach((key) => {
|
||||
if (key.startsWith("Profile.")) {
|
||||
posMasterProfileFields.push(key);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// join PosMaster กับ Profile เมื่อมีการขอ Profile fields
|
||||
if (tbMain === "PosMaster" && posMasterProfileFields.length > 0) {
|
||||
queryBuilder.leftJoin("PosMaster.current_holder", "Profile");
|
||||
}
|
||||
|
||||
// join กับ posMaster/employeePosMaster/employeeTempPosMaster เพื่อกรองตามสิทธิ์การเข้าถึง
|
||||
if ((tbMain === "Profile" || tbMain === "ProfileEmployee") && posMasterCondition !== "1=1") {
|
||||
if (tbMain === "Profile") {
|
||||
queryBuilder.leftJoin("Profile.current_holders", "posMaster");
|
||||
} else if (tbMain === "ProfileEmployee") {
|
||||
// Use the correct relation based on posMasterAlias
|
||||
if (posMasterAlias === "employeeTempPosMaster") {
|
||||
queryBuilder.leftJoin("ProfileEmployee.current_holderTemps", "employeeTempPosMaster");
|
||||
} else {
|
||||
queryBuilder.leftJoin("ProfileEmployee.current_holders", "employeePosMaster");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// // เพิ่ม Main.id เพราะจะใช้ pk ในการแมบและนับจำนวน
|
||||
|
|
@ -333,6 +479,39 @@ export class ApiWebServiceController extends Controller {
|
|||
return flattened;
|
||||
}
|
||||
|
||||
// สำหรับ Position: แปลงฟิลด์ที่มาจาก join กลับเป็นชื่อเดิม
|
||||
if (tbMain === "Position") {
|
||||
const flattened: any = { ...rest };
|
||||
Object.entries(this.POSITION_FIELD_REPLACEMENTS).forEach(([nameField, config]) => {
|
||||
// Remove the original ID field
|
||||
delete flattened[config.propertyName];
|
||||
// Add the name field from joined table
|
||||
const alias = `${tbMain}_${config.joinRelation}`;
|
||||
if (rest[alias] && rest[alias][config.joinField] !== undefined) {
|
||||
flattened[nameField] = rest[alias][config.joinField];
|
||||
}
|
||||
// Remove the joined table object
|
||||
delete flattened[alias];
|
||||
});
|
||||
return flattened;
|
||||
}
|
||||
|
||||
// สำหรับ PosMaster: แปลงฟิลด์ Profile ที่มาจาก join กลับเป็นฟิลด์ระดับบน
|
||||
if (tbMain === "PosMaster" && posMasterProfileFields.length > 0) {
|
||||
const flattened: any = { ...rest };
|
||||
// Extract Profile fields and add them at top level with "profile_" prefix to avoid conflicts
|
||||
if (rest["Profile"]) {
|
||||
flattened["profile_prefix"] = rest["Profile"].prefix;
|
||||
flattened["profile_rank"] = rest["Profile"].rank;
|
||||
flattened["profile_firstName"] = rest["Profile"].firstName;
|
||||
flattened["profile_lastName"] = rest["Profile"].lastName;
|
||||
flattened["profile_citizenId"] = rest["Profile"].citizenId;
|
||||
// Remove the nested Profile object
|
||||
delete flattened["Profile"];
|
||||
}
|
||||
return flattened;
|
||||
}
|
||||
|
||||
return rest;
|
||||
});
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue