Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -29,4 +33,21 @@ public APIResponse<List<OneToOneChatRoomResDto>> getOneToOneChatRooms() {
public APIResponse<List<GroupChatRoomResDto>> getGroupChatRooms() {
return success(chatRoomService.getGroupRooms());
}

@Operation(summary = "일대일 채팅방 접속 시 필요한 정보들을 조회합니다.", description = """
승인 대기, 승인 요청, 승인 수락, 승인 거절 등 <br>
호스트와 참여자 관계에 따른 상태 변화가 반영됩니다.
""")
@GetMapping("/one-to-one/{chatRoomId}")
public APIResponse<OneToOneChatRoomDetailResDto> getOneToOneChatRoomInfo(
@PathVariable Long chatRoomId) {
return success(chatRoomService.getOneToOneRoom(chatRoomId));
}

@Operation(summary = "그룹 채팅방 접속 시 필요한 정보들을 조회합니다.", description = "현재 개발중입니다.")
@GetMapping("/group/{chatRoomId}")
public APIResponse<GroupChatRoomDetailResDto> getGroupChatRoomInfo(
@PathVariable Long chatRoomId) {
return success(chatRoomService.getGroupRoom(chatRoomId));
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ita.tinybite.domain.chat.dto;

import lombok.Builder;

@Builder
public record GroupChatRoomDetailResDto() {
}
Original file line number Diff line number Diff line change
@@ -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();
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package ita.tinybite.domain.chat.enums;

public enum ParticipantType {
HOST,
PARTICIPANT,
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,18 @@
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;
import ita.tinybite.domain.chat.entity.ChatRoomMember;
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;
Expand All @@ -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<OneToOneChatRoomResDto> getOneToOneRooms() {
Expand Down Expand Up @@ -93,7 +98,25 @@ public List<GroupChatRoomResDto> 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();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,4 +10,5 @@ public class HostInfo {
private Long userId;
private String nickname;
private String profileImage;
private String hostLocation;
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,12 @@
@RequiredArgsConstructor(access = AccessLevel.PROTECTED)
public enum ParticipantStatus {
PENDING("승인 대기"),
APPROVED("승인됨"),
REJECTED("거절됨");
APPROVED("승인 완료"),
REJECTED("승인 거절"),

REQUESTED("승인 요청"),
ENDED("파티 종료")

;
private final String description;
}
Original file line number Diff line number Diff line change
Expand Up @@ -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())
Expand Down