From 7ff2a02b44cf0242b9ae6caa2b7160deac0e633c Mon Sep 17 00:00:00 2001 From: Donghun Won Date: Tue, 13 Jan 2026 00:15:22 +0900 Subject: [PATCH 1/4] =?UTF-8?q?Feat=20:=20=ED=8C=8C=ED=8B=B0=20=EC=83=81?= =?UTF-8?q?=EC=84=B8=20=EC=A1=B0=ED=9A=8C=EC=8B=9C=20host=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=EB=B0=98=ED=99=98=EA=B0=92=EC=97=90=20=EC=B6=94?= =?UTF-8?q?=EA=B0=80=20(#117)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/ita/tinybite/domain/party/dto/response/HostInfo.java | 1 + .../java/ita/tinybite/domain/party/service/PartyService.java | 1 + 2 files changed, 2 insertions(+) diff --git a/src/main/java/ita/tinybite/domain/party/dto/response/HostInfo.java b/src/main/java/ita/tinybite/domain/party/dto/response/HostInfo.java index ab27499..b96cdbb 100644 --- a/src/main/java/ita/tinybite/domain/party/dto/response/HostInfo.java +++ b/src/main/java/ita/tinybite/domain/party/dto/response/HostInfo.java @@ -10,4 +10,5 @@ public class HostInfo { private Long userId; private String nickname; private String profileImage; + private String hostLocation; } diff --git a/src/main/java/ita/tinybite/domain/party/service/PartyService.java b/src/main/java/ita/tinybite/domain/party/service/PartyService.java index 4ae7abb..b627e45 100644 --- a/src/main/java/ita/tinybite/domain/party/service/PartyService.java +++ b/src/main/java/ita/tinybite/domain/party/service/PartyService.java @@ -395,6 +395,7 @@ private PartyDetailResponse convertToDetailResponse(Party party, double distance .userId(party.getHost().getUserId()) .nickname(party.getHost().getNickname()) .profileImage(party.getHost().getProfileImage()) + .hostLocation(party.getHost().getLocation()) .build()) .pickupLocation(party.getPickupLocation()) .thumbnailImageDetail(party.getThumbnailImageDetail()) From c098c6661782cb1b1bc3f1f5e623033056f63a47 Mon Sep 17 00:00:00 2001 From: Wonjae Lim Date: Tue, 13 Jan 2026 11:19:34 +0900 Subject: [PATCH 2/4] =?UTF-8?q?feature=20:=20=EC=9D=BC=EB=8C=80=EC=9D=BC?= =?UTF-8?q?=20=EC=B1=84=ED=8C=85=EB=B0=A9=20=EC=A1=B0=ED=9A=8C=20API?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/controller/ChatRoomController.java | 21 ++++++ .../chat/dto/GroupChatRoomDetailResDto.java | 7 ++ .../dto/res/OneToOneChatRoomDetailResDto.java | 69 +++++++++++++++++++ .../domain/chat/enums/ParticipantType.java | 6 ++ .../domain/chat/service/ChatRoomService.java | 23 +++++++ .../domain/party/enums/ParticipantStatus.java | 8 ++- 6 files changed, 132 insertions(+), 2 deletions(-) create mode 100644 src/main/java/ita/tinybite/domain/chat/dto/GroupChatRoomDetailResDto.java create mode 100644 src/main/java/ita/tinybite/domain/chat/dto/res/OneToOneChatRoomDetailResDto.java create mode 100644 src/main/java/ita/tinybite/domain/chat/enums/ParticipantType.java diff --git a/src/main/java/ita/tinybite/domain/chat/controller/ChatRoomController.java b/src/main/java/ita/tinybite/domain/chat/controller/ChatRoomController.java index 2dbe9bc..0d474b2 100644 --- a/src/main/java/ita/tinybite/domain/chat/controller/ChatRoomController.java +++ b/src/main/java/ita/tinybite/domain/chat/controller/ChatRoomController.java @@ -1,11 +1,15 @@ package ita.tinybite.domain.chat.controller; +import io.swagger.v3.oas.annotations.Operation; +import ita.tinybite.domain.chat.dto.GroupChatRoomDetailResDto; import ita.tinybite.domain.chat.dto.res.GroupChatRoomResDto; +import ita.tinybite.domain.chat.dto.res.OneToOneChatRoomDetailResDto; import ita.tinybite.domain.chat.dto.res.OneToOneChatRoomResDto; import ita.tinybite.domain.chat.service.ChatRoomService; import ita.tinybite.global.response.APIResponse; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -29,4 +33,21 @@ public APIResponse> getOneToOneChatRooms() { public APIResponse> getGroupChatRooms() { return success(chatRoomService.getGroupRooms()); } + + @Operation(summary = "일대일 채팅방 접속 시 필요한 정보들을 조회합니다.", description = """ + 승인 대기, 승인 요청, 승인 수락, 승인 거절 등
+ 호스트와 참여자 관계에 따른 상태 변화가 반영됩니다. + """) + @GetMapping("/one-to-one/{chatRoomId}") + public APIResponse getOneToOneChatRoomInfo( + @PathVariable Long chatRoomId) { + return success(chatRoomService.getOneToOneRoom(chatRoomId)); + } + + @Operation(summary = "그룹 채팅방 접속 시 필요한 정보들을 조회합니다.", description = "현재 개발중입니다.") + @GetMapping("/group/{chatRoomId}") + public APIResponse getGroupChatRoomInfo( + @PathVariable Long chatRoomId) { + return success(chatRoomService.getGroupRoom(chatRoomId)); + } } diff --git a/src/main/java/ita/tinybite/domain/chat/dto/GroupChatRoomDetailResDto.java b/src/main/java/ita/tinybite/domain/chat/dto/GroupChatRoomDetailResDto.java new file mode 100644 index 0000000..d7598f0 --- /dev/null +++ b/src/main/java/ita/tinybite/domain/chat/dto/GroupChatRoomDetailResDto.java @@ -0,0 +1,7 @@ +package ita.tinybite.domain.chat.dto; + +import lombok.Builder; + +@Builder +public record GroupChatRoomDetailResDto() { +} diff --git a/src/main/java/ita/tinybite/domain/chat/dto/res/OneToOneChatRoomDetailResDto.java b/src/main/java/ita/tinybite/domain/chat/dto/res/OneToOneChatRoomDetailResDto.java new file mode 100644 index 0000000..45cfc49 --- /dev/null +++ b/src/main/java/ita/tinybite/domain/chat/dto/res/OneToOneChatRoomDetailResDto.java @@ -0,0 +1,69 @@ +package ita.tinybite.domain.chat.dto.res; + + +import com.fasterxml.jackson.annotation.JsonInclude; +import ita.tinybite.domain.chat.entity.ChatRoom; +import ita.tinybite.domain.chat.enums.ParticipantType; +import ita.tinybite.domain.party.entity.Party; +import ita.tinybite.domain.party.entity.PartyParticipant; +import ita.tinybite.domain.party.enums.ParticipantStatus; +import ita.tinybite.domain.user.entity.User; +import lombok.Builder; + +@Builder +@JsonInclude(JsonInclude.Include.NON_NULL) +public record OneToOneChatRoomDetailResDto( + Long chatRoomId, + Long groupChatRoomId, + ParticipantType participantType, // 호스트인지, 참여자인지 구분 + ParticipantStatus participantStatus, // 파티 승인 현황 (호스트, 참여자 입장 구분 O) + String targetName, + String targetProfileImage, + String targetLocation, + String partyTitle +) { + + public static OneToOneChatRoomDetailResDto of(Party party, PartyParticipant partyParticipant, User currentUser, ChatRoom groupChatRoom) { + User host = partyParticipant.getParty().getHost(); + User participant = partyParticipant.getUser(); + + ParticipantType type = currentUser.getUserId().equals(host.getUserId()) ? ParticipantType.HOST : ParticipantType.PARTICIPANT; + User targetUser = currentUser.getUserId().equals(participant.getUserId()) ? host : participant; // 상대방의 유저 (호스트면 참여자 / 참여자면 호스트) + ParticipantStatus participantStatus = partyParticipant.getStatus(); + + OneToOneChatRoomDetailResDtoBuilder resDtoBuilder = OneToOneChatRoomDetailResDto.builder() + .chatRoomId(partyParticipant.getOneToOneChatRoom().getId()) + .participantType(type) + .participantStatus(ParticipantStatus.PENDING) + .targetName(targetUser.getNickname()) + .partyTitle(party.getTitle()); + + switch(participantStatus) { + case PENDING -> { + if(type.equals(ParticipantType.PARTICIPANT)) { + resDtoBuilder + .participantStatus(ParticipantStatus.REQUESTED) + .targetProfileImage(targetUser.getProfileImage()) + .targetLocation(targetUser.getLocation()); + } else { // type = HOST + resDtoBuilder + .participantStatus(ParticipantStatus.PENDING); + } + } + case APPROVED -> { + resDtoBuilder + .participantStatus(ParticipantStatus.APPROVED); + if(type.equals(ParticipantType.HOST)) { + resDtoBuilder.groupChatRoomId(groupChatRoom != null ? groupChatRoom.getId() : null); + } + } + case REJECTED -> { + resDtoBuilder + .participantStatus(ParticipantStatus.REJECTED); + } + default -> throw new IllegalStateException("Unexpected value: " + participantStatus); + } + return resDtoBuilder.build(); + } +} + diff --git a/src/main/java/ita/tinybite/domain/chat/enums/ParticipantType.java b/src/main/java/ita/tinybite/domain/chat/enums/ParticipantType.java new file mode 100644 index 0000000..8a83b13 --- /dev/null +++ b/src/main/java/ita/tinybite/domain/chat/enums/ParticipantType.java @@ -0,0 +1,6 @@ +package ita.tinybite.domain.chat.enums; + +public enum ParticipantType { + HOST, + PARTICIPANT, +} diff --git a/src/main/java/ita/tinybite/domain/chat/service/ChatRoomService.java b/src/main/java/ita/tinybite/domain/chat/service/ChatRoomService.java index 150a6e1..64fd3a7 100644 --- a/src/main/java/ita/tinybite/domain/chat/service/ChatRoomService.java +++ b/src/main/java/ita/tinybite/domain/chat/service/ChatRoomService.java @@ -1,7 +1,9 @@ package ita.tinybite.domain.chat.service; import ita.tinybite.domain.auth.service.SecurityProvider; +import ita.tinybite.domain.chat.dto.GroupChatRoomDetailResDto; import ita.tinybite.domain.chat.dto.res.GroupChatRoomResDto; +import ita.tinybite.domain.chat.dto.res.OneToOneChatRoomDetailResDto; import ita.tinybite.domain.chat.dto.res.OneToOneChatRoomResDto; import ita.tinybite.domain.chat.entity.ChatMessage; import ita.tinybite.domain.chat.entity.ChatRoom; @@ -9,6 +11,8 @@ import ita.tinybite.domain.chat.enums.ChatRoomType; import ita.tinybite.domain.chat.repository.ChatMessageRepository; import ita.tinybite.domain.chat.repository.ChatRoomMemberRepository; +import ita.tinybite.domain.chat.repository.ChatRoomRepository; +import ita.tinybite.domain.party.entity.Party; import ita.tinybite.domain.party.entity.PartyParticipant; import ita.tinybite.domain.party.enums.ParticipantStatus; import ita.tinybite.domain.party.repository.PartyParticipantRepository; @@ -30,6 +34,7 @@ public class ChatRoomService { private final ChatRoomMemberRepository chatRoomMemberRepository; private final SecurityProvider securityProvider; private final PartyParticipantRepository partyParticipantRepository; + private final ChatRoomRepository chatRoomRepository; public List getOneToOneRooms() { @@ -93,7 +98,25 @@ public List getGroupRooms() { .toList(); } + public OneToOneChatRoomDetailResDto getOneToOneRoom(Long chatRoomId) { + User currentUser = securityProvider.getCurrentUser(); + ChatRoom chatRoom = chatRoomRepository.findById(chatRoomId).orElseThrow(); + PartyParticipant partyParticipant = partyParticipantRepository.findByOneToOneChatRoom(chatRoom).orElseThrow(); + ChatRoom groupChatRoom = chatRoomRepository.findByPartyAndType(chatRoom.getParty(), ChatRoomType.GROUP).orElseGet(null); + + User host = chatRoom.getParty().getHost(); + host.getNickname(); + + User targetUser = partyParticipant.getUser(); + targetUser.getNickname(); + + return OneToOneChatRoomDetailResDto.of(chatRoom.getParty(), partyParticipant, currentUser, groupChatRoom); + } + + public GroupChatRoomDetailResDto getGroupRoom(Long chatRoomId) { + return null; + } private static String getTimeAgo(LocalDateTime then) { LocalDateTime now = LocalDateTime.now(); diff --git a/src/main/java/ita/tinybite/domain/party/enums/ParticipantStatus.java b/src/main/java/ita/tinybite/domain/party/enums/ParticipantStatus.java index e47f061..7ed1b59 100644 --- a/src/main/java/ita/tinybite/domain/party/enums/ParticipantStatus.java +++ b/src/main/java/ita/tinybite/domain/party/enums/ParticipantStatus.java @@ -8,8 +8,12 @@ @RequiredArgsConstructor(access = AccessLevel.PROTECTED) public enum ParticipantStatus { PENDING("승인 대기"), - APPROVED("승인됨"), - REJECTED("거절됨"); + APPROVED("승인 완료"), + REJECTED("승인 거절"), + REQUESTED("승인 요청"), + ENDED("파티 종료") + + ; private final String description; } From 5414d6626e3dde15ed66e88044054712ebc0ef48 Mon Sep 17 00:00:00 2001 From: Wonjae Lim Date: Tue, 13 Jan 2026 14:06:53 +0900 Subject: [PATCH 3/4] =?UTF-8?q?feat=20:=20=EA=B7=B8=EB=A3=B9=20=EC=B1=84?= =?UTF-8?q?=ED=8C=85=EB=B0=A9=20=EC=A1=B0=ED=9A=8C=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../chat/dto/GroupChatRoomDetailResDto.java | 28 ++++++++++++++++++- .../dto/res/OneToOneChatRoomDetailResDto.java | 4 +-- .../domain/chat/service/ChatRoomService.java | 13 +++------ .../PartyParticipantRepository.java | 4 ++- 4 files changed, 36 insertions(+), 13 deletions(-) diff --git a/src/main/java/ita/tinybite/domain/chat/dto/GroupChatRoomDetailResDto.java b/src/main/java/ita/tinybite/domain/chat/dto/GroupChatRoomDetailResDto.java index d7598f0..da514c8 100644 --- a/src/main/java/ita/tinybite/domain/chat/dto/GroupChatRoomDetailResDto.java +++ b/src/main/java/ita/tinybite/domain/chat/dto/GroupChatRoomDetailResDto.java @@ -1,7 +1,33 @@ package ita.tinybite.domain.chat.dto; +import ita.tinybite.domain.chat.entity.ChatRoom; +import ita.tinybite.domain.party.enums.PartyStatus; import lombok.Builder; @Builder -public record GroupChatRoomDetailResDto() { +public record GroupChatRoomDetailResDto( + Long groupChatRoomId, + Long partyId, + String partyTitle, + PartyStatus status, + int currentParticipantCnt, + int maxParticipantCnt, + String formattedPartyCnt +) { + public static GroupChatRoomDetailResDto of(ChatRoom groupChatRoom) { + return GroupChatRoomDetailResDto.builder() + .groupChatRoomId(groupChatRoom.getId()) + .partyId(groupChatRoom.getParty().getId()) + .partyTitle(groupChatRoom.getParty().getTitle()) + .status(groupChatRoom.getParty().getStatus()) + .currentParticipantCnt(groupChatRoom.getParty().getCurrentParticipants()) + .maxParticipantCnt(groupChatRoom.getParty().getMaxParticipants()) + .formattedPartyCnt(formatParticipantStatus(groupChatRoom.getParty().getCurrentParticipants(), groupChatRoom.getParty().getMaxParticipants())) + .build(); + } + + private static String formatParticipantStatus(int current, int max) { + return String.format("%d/%d명", current, max); + } + } diff --git a/src/main/java/ita/tinybite/domain/chat/dto/res/OneToOneChatRoomDetailResDto.java b/src/main/java/ita/tinybite/domain/chat/dto/res/OneToOneChatRoomDetailResDto.java index 45cfc49..401b886 100644 --- a/src/main/java/ita/tinybite/domain/chat/dto/res/OneToOneChatRoomDetailResDto.java +++ b/src/main/java/ita/tinybite/domain/chat/dto/res/OneToOneChatRoomDetailResDto.java @@ -40,12 +40,12 @@ public static OneToOneChatRoomDetailResDto of(Party party, PartyParticipant part switch(participantStatus) { case PENDING -> { - if(type.equals(ParticipantType.PARTICIPANT)) { + if(type.equals(ParticipantType.HOST)) { // type = HOST resDtoBuilder .participantStatus(ParticipantStatus.REQUESTED) .targetProfileImage(targetUser.getProfileImage()) .targetLocation(targetUser.getLocation()); - } else { // type = HOST + } else { // type = PARTICIPANT resDtoBuilder .participantStatus(ParticipantStatus.PENDING); } diff --git a/src/main/java/ita/tinybite/domain/chat/service/ChatRoomService.java b/src/main/java/ita/tinybite/domain/chat/service/ChatRoomService.java index 64fd3a7..47b47c8 100644 --- a/src/main/java/ita/tinybite/domain/chat/service/ChatRoomService.java +++ b/src/main/java/ita/tinybite/domain/chat/service/ChatRoomService.java @@ -101,21 +101,16 @@ public List getGroupRooms() { public OneToOneChatRoomDetailResDto getOneToOneRoom(Long chatRoomId) { User currentUser = securityProvider.getCurrentUser(); ChatRoom chatRoom = chatRoomRepository.findById(chatRoomId).orElseThrow(); - PartyParticipant partyParticipant = partyParticipantRepository.findByOneToOneChatRoom(chatRoom).orElseThrow(); - ChatRoom groupChatRoom = chatRoomRepository.findByPartyAndType(chatRoom.getParty(), ChatRoomType.GROUP).orElseGet(null); - - User host = chatRoom.getParty().getHost(); - host.getNickname(); - - User targetUser = partyParticipant.getUser(); - targetUser.getNickname(); + PartyParticipant partyParticipant = partyParticipantRepository.findByOneToOneChatRoomAndStatus(chatRoom, ParticipantStatus.PENDING); + ChatRoom groupChatRoom = chatRoomRepository.findByPartyAndType(chatRoom.getParty(), ChatRoomType.GROUP).orElseGet(null); return OneToOneChatRoomDetailResDto.of(chatRoom.getParty(), partyParticipant, currentUser, groupChatRoom); } public GroupChatRoomDetailResDto getGroupRoom(Long chatRoomId) { - return null; + ChatRoom chatRoom = chatRoomRepository.findById(chatRoomId).orElseThrow(); + return GroupChatRoomDetailResDto.of(chatRoom); } private static String getTimeAgo(LocalDateTime then) { diff --git a/src/main/java/ita/tinybite/domain/party/repository/PartyParticipantRepository.java b/src/main/java/ita/tinybite/domain/party/repository/PartyParticipantRepository.java index 7366746..18bc945 100644 --- a/src/main/java/ita/tinybite/domain/party/repository/PartyParticipantRepository.java +++ b/src/main/java/ita/tinybite/domain/party/repository/PartyParticipantRepository.java @@ -91,8 +91,10 @@ boolean existsByParty_IdAndUser_UserIdAndStatus( ParticipantStatus status ); - @Query("SELECT pp FROM PartyParticipant pp WHERE pp.party.id = :partyId AND pp.user.id = :userId") + @Query("SELECT pp FROM PartyParticipant pp WHERE pp.party.id = :partyId AND pp.user.userId = :userId") Optional findByPartyIdAndUserId(@Param("partyId") Long partyId, @Param("userId") Long userId); Optional findByOneToOneChatRoom(ChatRoom oneToOneChatRoom); + + PartyParticipant findByOneToOneChatRoomAndStatus(ChatRoom oneToOneChatRoom, ParticipantStatus status); } \ No newline at end of file From 31097b20acdc0df15b6753a5cb1c74189d33f462 Mon Sep 17 00:00:00 2001 From: Wonjae Lim Date: Tue, 13 Jan 2026 15:10:32 +0900 Subject: [PATCH 4/4] =?UTF-8?q?fix=20:=20=EC=98=88=EC=99=B8=20=EC=B2=98?= =?UTF-8?q?=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/chat/service/ChatRoomService.java | 7 ++++++ .../errorcode/ChatRoomErrorCode.java | 23 +++++++++++++++++++ 2 files changed, 30 insertions(+) create mode 100644 src/main/java/ita/tinybite/global/exception/errorcode/ChatRoomErrorCode.java diff --git a/src/main/java/ita/tinybite/domain/chat/service/ChatRoomService.java b/src/main/java/ita/tinybite/domain/chat/service/ChatRoomService.java index 47b47c8..0cbbd37 100644 --- a/src/main/java/ita/tinybite/domain/chat/service/ChatRoomService.java +++ b/src/main/java/ita/tinybite/domain/chat/service/ChatRoomService.java @@ -17,6 +17,8 @@ import ita.tinybite.domain.party.enums.ParticipantStatus; import ita.tinybite.domain.party.repository.PartyParticipantRepository; import ita.tinybite.domain.user.entity.User; +import ita.tinybite.global.exception.BusinessException; +import ita.tinybite.global.exception.errorcode.ChatRoomErrorCode; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Limit; import org.springframework.stereotype.Service; @@ -102,6 +104,8 @@ public OneToOneChatRoomDetailResDto getOneToOneRoom(Long chatRoomId) { User currentUser = securityProvider.getCurrentUser(); ChatRoom chatRoom = chatRoomRepository.findById(chatRoomId).orElseThrow(); + if(!chatRoom.getType().equals(ChatRoomType.ONE_TO_ONE)) throw BusinessException.of(ChatRoomErrorCode.NOT_ONE_TO_ONE); + PartyParticipant partyParticipant = partyParticipantRepository.findByOneToOneChatRoomAndStatus(chatRoom, ParticipantStatus.PENDING); ChatRoom groupChatRoom = chatRoomRepository.findByPartyAndType(chatRoom.getParty(), ChatRoomType.GROUP).orElseGet(null); @@ -110,6 +114,9 @@ public OneToOneChatRoomDetailResDto getOneToOneRoom(Long chatRoomId) { public GroupChatRoomDetailResDto getGroupRoom(Long chatRoomId) { ChatRoom chatRoom = chatRoomRepository.findById(chatRoomId).orElseThrow(); + + if(!chatRoom.getType().equals(ChatRoomType.GROUP)) throw BusinessException.of(ChatRoomErrorCode.NOT_GROUP); + return GroupChatRoomDetailResDto.of(chatRoom); } diff --git a/src/main/java/ita/tinybite/global/exception/errorcode/ChatRoomErrorCode.java b/src/main/java/ita/tinybite/global/exception/errorcode/ChatRoomErrorCode.java new file mode 100644 index 0000000..fd5b811 --- /dev/null +++ b/src/main/java/ita/tinybite/global/exception/errorcode/ChatRoomErrorCode.java @@ -0,0 +1,23 @@ +package ita.tinybite.global.exception.errorcode; + +import lombok.Getter; +import org.springframework.http.HttpStatus; + +@Getter +public enum ChatRoomErrorCode implements ErrorCode { + + NOT_ONE_TO_ONE(HttpStatus.BAD_REQUEST, "NOT_ONE_TO_ONE", "일대일 채팅이 아닙니다."), + NOT_GROUP(HttpStatus.BAD_REQUEST, "NOT_GROUP", "그룹 채팅이 아닙니다."), + + ; + + private final HttpStatus httpStatus; + private final String code; + private final String message; + + ChatRoomErrorCode(HttpStatus httpStatus, String code, String message) { + this.httpStatus = httpStatus; + this.code = code; + this.message = message; + } +}