From b02a7f966e270f8243325453f888fa02ea85c650 Mon Sep 17 00:00:00 2001 From: wayanrivan Date: Thu, 9 Apr 2026 15:04:01 +0700 Subject: [PATCH] update: list in user to room --- src/controllers/user_to_room.ts | 256 +++++++++++++++++++------------- 1 file changed, 150 insertions(+), 106 deletions(-) diff --git a/src/controllers/user_to_room.ts b/src/controllers/user_to_room.ts index a475b03..868ae93 100644 --- a/src/controllers/user_to_room.ts +++ b/src/controllers/user_to_room.ts @@ -44,7 +44,7 @@ export class UserToRoomController { const offset = (param.page - 1) * param.limit; let limit = param.limit; - const res_count = query; + const res_count = query.clone(); const res_list = query .orderBy("user_to_room." + param.order_field, param.order_direction) .offset(offset) @@ -58,9 +58,53 @@ export class UserToRoomController { const current_page = param.page; const total_count_data = await res_count.getCount(); const list_data = await res_list.getMany(); - const count_data = CommonHelper.countObject(list_data); - return ReturnHelper.successResponselist(res, 200, Language.lang.success_view, count_data, current_page, total_count_data, list_data); + // Transform data: Group by user, room dijadikan object berindeks + const grouped: Record = {}; + + list_data.forEach(item => { + if (!item.user) return; + + const userId = item.user.id; + + // 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: {} + }; + } + + // 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, + }; + } + }); + + const list_data_return = Object.values(grouped); + + const count_data = CommonHelper.countObject(list_data_return); + + return ReturnHelper.successResponselist( + res, + 200, + Language.lang.success_view, + count_data, + current_page, + total_count_data, + list_data_return + ); } catch (e: unknown) { log.error(e); const err = e as Error; @@ -110,7 +154,7 @@ export class UserToRoomController { var query = await UserToRoomModel.list(filter); const data = await query.getMany(); - + const filename = "user_to_room.csv"; res.setHeader('Content-Type', 'text/csv'); @@ -173,15 +217,15 @@ export class UserToRoomController { try { const schema = Joi.object().keys({ user_id: Joi.string() - .uuid() - .required() - .label("User ID"), + .uuid() + .required() + .label("User ID"), room_id: Joi.string() - .uuid() - .required() - .label("Room ID"), - + .uuid() + .required() + .label("Room ID"), + // room_ids: Joi.array() // .items(Joi.string().uuid().required()) // .min(1) @@ -205,7 +249,7 @@ export class UserToRoomController { const data = new UserToRoom() data.user = param.user_id; data.room = param.room_id; - data.created_by = req.auth.data.name; + data.created_by = req.auth?.data.name; await OrmHelper.DB.manager.save(data); @@ -234,117 +278,117 @@ export class UserToRoomController { } static async update(req: Request, res: Response, next: NextFunction): Promise { - /* - #swagger.tags = ['UserToRoom'] - #swagger.security = [{ - "bearerAuth": [] - }] - #swagger.parameters['user_id'] = { - in: 'path', - description: 'User ID.', - required: true, - type: 'string' - } - - #swagger.requestBody = { - required: true, - content: { - "application/json": { - schema: { - $ref: "#/components/schemas/user_to_room_update" - } - } + /* + #swagger.tags = ['UserToRoom'] + #swagger.security = [{ + "bearerAuth": [] + }] + #swagger.parameters['user_id'] = { + in: 'path', + description: 'User ID.', + required: true, + type: 'string' + } + + #swagger.requestBody = { + required: true, + content: { + "application/json": { + schema: { + $ref: "#/components/schemas/user_to_room_update" + } } } - */ - - try { - const schema = Joi.object().keys({ - user_id: Joi.string().uuid().required().label('User ID'), - room_ids: Joi.array() + } + */ + + try { + const schema = Joi.object().keys({ + user_id: Joi.string().uuid().required().label('User ID'), + room_ids: Joi.array() .items(Joi.string().uuid().required()) .min(1) .required() .label("Factory IDs") - // room_id: Joi.string().uuid().required().label('Room ID'), - }); - - req.body.user_id = req.params['user_id']; - - const param: any = await schema.validateAsync(req.body); + // room_id: Joi.string().uuid().required().label('Room ID'), + }); - const userToRoomRepo = OrmHelper.DB.getRepository(UserToRoom); - const userRepo = OrmHelper.DB.getRepository(User); - const roomRepo = OrmHelper.DB.getRepository(Room); + req.body.user_id = req.params['user_id']; - await userToRoomRepo - .createQueryBuilder() - .delete() - .from(UserToRoom) - .where("service_id = :userId", { userId: param.user_id }) - .execute(); + const param: any = await schema.validateAsync(req.body); - let relation : UserToRoom; - for (const roomId of param.room_ids) { - relation = new UserToRoom(); - relation.user = await userRepo.findOneBy({ id: param.user_id }); - relation.room = await roomRepo.findOneBy({ id: roomId }); - relation.created_by = req.auth.data.name; + const userToRoomRepo = OrmHelper.DB.getRepository(UserToRoom); + const userRepo = OrmHelper.DB.getRepository(User); + const roomRepo = OrmHelper.DB.getRepository(Room); - await userToRoomRepo.save(relation); - } + await userToRoomRepo + .createQueryBuilder() + .delete() + .from(UserToRoom) + .where("service_id = :userId", { userId: param.user_id }) + .execute(); - const data = await userToRoomRepo.createQueryBuilder("user_to_room") + let relation: UserToRoom; + for (const roomId of param.room_ids) { + relation = new UserToRoom(); + relation.user = await userRepo.findOneBy({ id: param.user_id }); + relation.room = await roomRepo.findOneBy({ id: roomId }); + relation.created_by = req.auth.data.name; + + await userToRoomRepo.save(relation); + } + + const data = await userToRoomRepo.createQueryBuilder("user_to_room") .leftJoinAndSelect("user_to_room.user", "user") .leftJoinAndSelect("user_to_room.room", "room") .where("user_to_room.service_id = :userId", { userId: param.user_id }).getMany(); - return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data); - - // const repo = OrmHelper.DB.getRepository(UserToRoom); - - // const data = await repo.findOneBy({ id: param.id }); - - // if (data != null) { - // data.user = param.user_id; - // data.room = param.room_id; - // data.updated_by = req.auth.data.name; - - // await repo.save(data); - - // return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data); - // } else { - // return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, ""); - // } - } catch (e: unknown) { - log.error(e); - const err = e as Error; - - return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message); - } + return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data); + + // const repo = OrmHelper.DB.getRepository(UserToRoom); + + // const data = await repo.findOneBy({ id: param.id }); + + // if (data != null) { + // data.user = param.user_id; + // data.room = param.room_id; + // data.updated_by = req.auth.data.name; + + // await repo.save(data); + + // return ReturnHelper.successResponseAny(res, 200, Language.lang.success_update, data); + // } else { + // return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed_not_found, ""); + // } + } catch (e: unknown) { + log.error(e); + const err = e as Error; + + return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_update, err.message); } + } static async detail(req: Request, res: Response, next: NextFunction): Promise { - /* - #swagger.tags = ['UserToRoom'] - #swagger.security = [{ "bearerAuth": [] }] - #swagger.parameters['id'] = { description: '', in: 'path', type: 'string' } - */ - try { - const schema = Joi.object().keys({ - id: Joi.string().uuid().required().label("UserToRoom Id"), - }); - - let param: any = await schema.validateAsync(req.params); - - let data = await UserToRoomModel.list({ "id": param.id }).then((q) => q.getOne()); - if (!data) throw { message: "UserToRoom Not Found" }; - - return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, data); - } catch (e: unknown) { - log.error(e); - const err = e as Error; - return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message); - } + /* + #swagger.tags = ['UserToRoom'] + #swagger.security = [{ "bearerAuth": [] }] + #swagger.parameters['id'] = { description: '', in: 'path', type: 'string' } + */ + try { + const schema = Joi.object().keys({ + id: Joi.string().uuid().required().label("UserToRoom Id"), + }); + + let param: any = await schema.validateAsync(req.params); + + let data = await UserToRoomModel.list({ "id": param.id }).then((q) => q.getOne()); + if (!data) throw { message: "UserToRoom Not Found" }; + + return ReturnHelper.successResponseAny(res, 200, Language.lang.success_view, data); + } catch (e: unknown) { + log.error(e); + const err = e as Error; + return ReturnHelper.errorResponse(res, 400, 401, Language.lang.failed_not_found, err.message); } + } } \ No newline at end of file