From c4aed0c14282e4408510c48ca9c37840d8a6e885 Mon Sep 17 00:00:00 2001 From: wayanrivan Date: Thu, 9 Apr 2026 15:16:58 +0700 Subject: [PATCH] update --- src/controllers/user_to_room.ts | 99 +++++++++++++++++++-------------- 1 file changed, 56 insertions(+), 43 deletions(-) diff --git a/src/controllers/user_to_room.ts b/src/controllers/user_to_room.ts index 868ae93..fe4b167 100644 --- a/src/controllers/user_to_room.ts +++ b/src/controllers/user_to_room.ts @@ -39,61 +39,74 @@ export class UserToRoomController { let filter = param.filter && param.filter !== "" ? JSON.parse(param.filter) : {}; - var query = await UserToRoomModel.list(filter); - const offset = (param.page - 1) * param.limit; - let limit = param.limit; + const limit = param.limit; - const res_count = query.clone(); - const res_list = query - .orderBy("user_to_room." + param.order_field, param.order_direction) - .offset(offset) - .limit(limit); + // Query dari User sebagai root, leftJoin ke UserToRoom → Room + const userQuery = OrmHelper.DB.getRepository(User) + .createQueryBuilder("user") + .leftJoinAndSelect("user.roles", "roles") + .leftJoinAndMapMany( + "user.userToRooms", + UserToRoom, + "user_to_room", + "user_to_room.user = user.id" + ) + .leftJoinAndMapOne( + "user_to_room.roomData", + Room, + "room", + "room.id = user_to_room.room" + ) + .orderBy("user." + param.order_field, param.order_direction as "ASC" | "DESC"); if (param.with_deleted) { - res_count.withDeleted(); - res_list.withDeleted(); + userQuery.withDeleted(); } - const current_page = param.page; - const total_count_data = await res_count.getCount(); - const list_data = await res_list.getMany(); + // 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 }); + } - // Transform data: Group by user, room dijadikan object berindeks - const grouped: Record = {}; + const total_count_data = await userQuery.clone().getCount(); - list_data.forEach(item => { - if (!item.user) return; + const users = await userQuery + .offset(offset) + .limit(limit) + .getMany(); - const userId = item.user.id; + // Transform data + const list_data_return = users.map((user: any) => { + const userToRooms: any[] = user.userToRooms ?? []; - // Inisialisasi user jika belum ada - if (!grouped[userId]) { - grouped[userId] = { - id: item.user.id, - name: item.user.name, - username: item.user.username, - email: item.user.email, - status: item.user.status, - rooms: {} - }; - } + const rooms: Record = {}; + userToRooms.forEach((utr: any, index: number) => { + const room = utr.roomData ?? null; + rooms[`room_${index + 1}`] = room ? { + id: room.id, + room: room.room, + code: room.code, + } : null; + }); - // Hitung index room berikutnya - const roomIndex = Object.keys(grouped[userId].rooms).length + 1; - - // Tambahkan room ke user - if (item.room) { - grouped[userId].rooms[`room_${roomIndex}`] = { - id: item.room.id, - room: item.room.room, - code: item.room.code, - }; - } + return { + id: user.id, + name: user.name, + username: user.username, + email: user.email, + status: user.status, + roles: user.roles ? user.roles.map((role: any) => ({ + id: role.id, + name: role.name, + })) : [], + rooms: Object.keys(rooms).length > 0 ? rooms : null, + }; }); - const list_data_return = Object.values(grouped); - const count_data = CommonHelper.countObject(list_data_return); return ReturnHelper.successResponselist( @@ -101,7 +114,7 @@ export class UserToRoomController { 200, Language.lang.success_view, count_data, - current_page, + param.page, total_count_data, list_data_return );