update
This commit is contained in:
@ -36,13 +36,54 @@ export class UserToRoomController {
|
||||
});
|
||||
|
||||
let param: Paging = await schema.validateAsync(req.query);
|
||||
|
||||
let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {};
|
||||
|
||||
const offset = (param.page - 1) * param.limit;
|
||||
const limit = param.limit;
|
||||
|
||||
// Query dari User sebagai root, leftJoin ke UserToRoom → Room
|
||||
// Base filter builder (reusable untuk step 1 & count)
|
||||
const applyFilters = (qb: any) => {
|
||||
if (param.with_deleted) qb.withDeleted();
|
||||
if (filter.name) qb.andWhere("user.name ILIKE :name", { name: `%${filter.name}%` });
|
||||
if (filter.status) qb.andWhere("user.status = :status", { status: filter.status });
|
||||
return qb;
|
||||
};
|
||||
|
||||
// Step 1: Ambil paginated user IDs dulu (tanpa join room)
|
||||
const idQuery = OrmHelper.DB.getRepository(User)
|
||||
.createQueryBuilder("user")
|
||||
.select("user.id")
|
||||
.orderBy("user." + param.order_field, param.order_direction as "ASC" | "DESC")
|
||||
.offset(offset)
|
||||
.limit(limit);
|
||||
|
||||
applyFilters(idQuery);
|
||||
|
||||
const paginatedUserIds = await idQuery.getRawMany();
|
||||
const userIds = paginatedUserIds.map((row) => row.user_id);
|
||||
|
||||
if (userIds.length === 0) {
|
||||
return ReturnHelper.successResponselist(
|
||||
res,
|
||||
200,
|
||||
Language.lang.success_view,
|
||||
0,
|
||||
param.page,
|
||||
0,
|
||||
[]
|
||||
);
|
||||
}
|
||||
|
||||
// Step 2: Count total (tanpa join room, tanpa offset/limit)
|
||||
const countQuery = OrmHelper.DB.getRepository(User)
|
||||
.createQueryBuilder("user")
|
||||
.select("user.id");
|
||||
|
||||
applyFilters(countQuery);
|
||||
|
||||
const total_count_data = await countQuery.getCount();
|
||||
|
||||
// Step 3: Fetch data lengkap hanya untuk IDs yang sudah dipaginasi
|
||||
const userQuery = OrmHelper.DB.getRepository(User)
|
||||
.createQueryBuilder("user")
|
||||
.leftJoinAndSelect("user.roles", "roles")
|
||||
@ -58,26 +99,12 @@ export class UserToRoomController {
|
||||
"room",
|
||||
"room.id = user_to_room.room"
|
||||
)
|
||||
.whereInIds(userIds)
|
||||
.orderBy("user." + param.order_field, param.order_direction as "ASC" | "DESC");
|
||||
|
||||
if (param.with_deleted) {
|
||||
userQuery.withDeleted();
|
||||
}
|
||||
if (param.with_deleted) userQuery.withDeleted();
|
||||
|
||||
// Filter jika ada
|
||||
if (filter.name) {
|
||||
userQuery.andWhere("user.name ILIKE :name", { name: `%${filter.name}%` });
|
||||
}
|
||||
if (filter.status) {
|
||||
userQuery.andWhere("user.status = :status", { status: filter.status });
|
||||
}
|
||||
|
||||
const total_count_data = await userQuery.clone().getCount();
|
||||
|
||||
const users = await userQuery
|
||||
.offset(offset)
|
||||
.limit(limit)
|
||||
.getMany();
|
||||
const users = await userQuery.getMany();
|
||||
|
||||
// Transform data
|
||||
const list_data_return = users.map((user: any) => {
|
||||
|
||||
Reference in New Issue
Block a user