Skip to content

Commit

Permalink
Merge branch 'dev' into refactor/#115-로그인-에러-페이지-반환
Browse files Browse the repository at this point in the history
  • Loading branch information
seokjun01 authored Jan 31, 2025
2 parents 4be2ddc + 54cc529 commit 387518a
Show file tree
Hide file tree
Showing 26 changed files with 578 additions and 92 deletions.
5 changes: 4 additions & 1 deletion build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -58,8 +58,11 @@ dependencies {
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.13.0'

implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'

testCompileOnly 'org.projectlombok:lombok'
testAnnotationProcessor 'org.projectlombok:lombok'
}

tasks.named('test') {
useJUnitPlatform()
}
}
4 changes: 4 additions & 0 deletions src/main/java/com/example/eatmate/EatmateApplication.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,13 @@
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.config.EnableJpaAuditing;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.annotation.EnableScheduling;

@SpringBootApplication
@EnableJpaAuditing
@EnableScheduling
@EnableAsync
public class EatmateApplication {

public static void main(String[] args) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ public void sendChatMessage(
}

//보완적 함수 웹소켓 끊어졌을 경우
@PostMapping("/chat/{chatRoomId}")
@PostMapping("/api/chat/{chatRoomId}")
@Operation(summary = "채팅 메세지 전송 대체 수단", description = "채팅을 메세지를 대체 방안을 통해 전송합니다.")
public ResponseEntity<GlobalResponseDto<Void>> sendChatMessageAlter(
@PathVariable Long chatRoomId,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
package com.example.eatmate.app.domain.chat.domain.repository;

import java.time.LocalDateTime;
import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.jpa.repository.JpaRepository;

import com.example.eatmate.app.domain.chat.domain.Chat;
Expand All @@ -12,7 +13,9 @@

public interface ChatRepository extends JpaRepository<Chat, Long> {

Page<Chat> findChatByChatRoom(ChatRoom chatRoom, Pageable pageable);
Slice<Chat> findChatByChatRoomOrderByCreatedAtDesc(ChatRoom chatRoom, Pageable pageable);

Slice<Chat> findChatByChatRoomAndCreatedAtLessThanOrderByCreatedAtDesc(ChatRoom chatRoom, LocalDateTime createdAt, Pageable pageable);

List<Chat> findChatByChatRoomAndDeletedStatusNot(ChatRoom chatRoom, DeletedStatus deletedStatus);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.example.eatmate.app.domain.chat.dto.response;

import java.util.List;

import org.springframework.data.domain.Slice;

import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
public class ChatMessageListDto {

private List<ChatMessageResponseDto> chats;
private int pageNumber;
private boolean isLast;

@Builder
private ChatMessageListDto(List<ChatMessageResponseDto> chats, int pageNumber, boolean isLast) {
this.chats = chats;
this.pageNumber = pageNumber;
this.isLast = isLast;
}

public static ChatMessageListDto from(Slice<ChatMessageResponseDto> chatList) {
return ChatMessageListDto.builder()
.chats(chatList.getContent())
.pageNumber(chatList.getNumber())
.isLast(chatList.isLast())
.build();
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,18 @@
package com.example.eatmate.app.domain.chat.service;

import java.time.LocalDateTime;
import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.example.eatmate.app.domain.chat.domain.Chat;
import com.example.eatmate.app.domain.chat.domain.repository.ChatRepository;
import com.example.eatmate.app.domain.chat.dto.request.ChatMessageRequestDto;
import com.example.eatmate.app.domain.chat.dto.response.ChatMessageListDto;
import com.example.eatmate.app.domain.chat.dto.response.ChatMessageResponseDto;
import com.example.eatmate.app.domain.chatRoom.domain.ChatRoom;
import com.example.eatmate.app.domain.chatRoom.domain.DeletedStatus;
Expand Down Expand Up @@ -50,19 +52,41 @@ public void saveChat(ChatMessageRequestDto chatMessageDto, UserDetails userDetai
chatRoom.updateLastChatAt(chat.getCreatedAt());
}

//불러오기(읽기 상태 없음)
public Page<ChatMessageResponseDto> loadChat(Long chatRoomId, Pageable pageable) {
//불러오기
public Slice<ChatMessageResponseDto> loadChat(Long chatRoomId, LocalDateTime cursor, Pageable pageable) {
ChatRoom chatRoom = chatRoomRepository.findByIdAndDeletedStatus(chatRoomId, DeletedStatus.NOT_DELETED)
.orElseThrow(() -> new CommonException(ErrorCode.CHATROOM_NOT_FOUND));

Page<Chat> chats = chatRepository.findChatByChatRoom(chatRoom, pageable);
try{
if (cursor == null) {
Slice<Chat> chats = chatRepository.findChatByChatRoomOrderByCreatedAtDesc(chatRoom, pageable);
return chats.map(ChatMessageResponseDto::from);
}
if (cursor.isAfter(LocalDateTime.now())) {
throw new CommonException(ErrorCode.INVALID_CURSOR);
}
Slice<Chat> chats = chatRepository.findChatByChatRoomAndCreatedAtLessThanOrderByCreatedAtDesc(chatRoom, cursor, pageable);

return chats.map(ChatMessageResponseDto::from);
return chats.map(ChatMessageResponseDto::from);

} catch (CommonException e) {
throw e;

} catch (Exception e) {
throw new CommonException(ErrorCode.CHAT_LOAD_FAIL);

}
}

//채팅 삭제
public void deleteChat(ChatRoom chatRoom) {
List<Chat> chatList = chatRepository.findChatByChatRoomAndDeletedStatusNot(chatRoom, DeletedStatus.NOT_DELETED);
chatList.forEach(Chat::deleteChat);
}

public ChatMessageListDto convertChatList(Long chatRoomId, LocalDateTime cursor, Pageable pageable) {
Slice<ChatMessageResponseDto> chatDtos = loadChat(chatRoomId, cursor, pageable);

return ChatMessageListDto.from(chatDtos);
}
}
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
package com.example.eatmate.app.domain.chatRoom.controller;

import java.time.LocalDateTime;

import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.data.web.PageableDefault;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
Expand All @@ -11,9 +14,11 @@
import org.springframework.web.bind.annotation.PatchMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.example.eatmate.app.domain.chat.service.ChatPublisher;
import com.example.eatmate.app.domain.chat.dto.response.ChatMessageListDto;
import com.example.eatmate.app.domain.chat.service.ChatService;
import com.example.eatmate.app.domain.chatRoom.dto.response.ChatRoomResponseDto;
import com.example.eatmate.app.domain.chatRoom.service.ChatRoomService;
import com.example.eatmate.global.response.GlobalResponseDto;
Expand All @@ -26,20 +31,31 @@
@RequiredArgsConstructor
public class ChatRoomController {

private final ChatPublisher chatPublisher;
private final ChatRoomService chatRoomService;
private final ChatService chatService;

@GetMapping("/{chatRoomId}")
@Operation(summary = "채팅방 입장", description = "채팅방에 입장합니다.")
public ResponseEntity<GlobalResponseDto<ChatRoomResponseDto>> enterChatRoom(
@PathVariable Long chatRoomId,
@AuthenticationPrincipal UserDetails userDetails,
@PageableDefault(size = 20, sort = "createdAt", direction = Sort.Direction.ASC) Pageable pageable) {
@PageableDefault(size = 20, sort = "createdAt", direction = Sort.Direction.DESC) Pageable pageable) {

return ResponseEntity.status(HttpStatus.OK)
.body(GlobalResponseDto.success(chatRoomService.enterChatRoomAndLoadMessage(chatRoomId, userDetails, pageable)));
}

@GetMapping("/{chatRoomId}/past")
@Operation(summary = "채팅방의 과거 채팅 로딩", description = "채팅방의 과거 채팅을 로딩합니다.")
public ResponseEntity<GlobalResponseDto<ChatMessageListDto>> loadChatRoomPastMessage(
@PathVariable Long chatRoomId,
@RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime cursor,
@PageableDefault(size = 20, sort = "createdAt", direction = Sort.Direction.DESC) Pageable pageable) {

return ResponseEntity.status(HttpStatus.OK)
.body(GlobalResponseDto.success(chatService.convertChatList(chatRoomId, cursor, pageable)));
}

@PatchMapping("/{chatRoomId}")
@Operation(summary = "채팅방 나가기", description = "채팅방을 나갑니다.")
public ResponseEntity<GlobalResponseDto<Void>> leftChatRoom(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

import java.util.List;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Slice;

import com.example.eatmate.app.domain.chat.dto.response.ChatMessageResponseDto;
import com.example.eatmate.app.domain.member.domain.Mbti;
Expand All @@ -23,7 +23,7 @@ public class ChatRoomResponseDto {
private boolean isLast;

@Builder
private ChatRoomResponseDto(Page<ChatMessageResponseDto> chats, List<ChatMemberResponseDto> participants,
private ChatRoomResponseDto(Slice<ChatMessageResponseDto> chats, List<ChatMemberResponseDto> participants,
ChatRoomDeliveryNoticeDto deliveryNotice, ChatRoomOfflineNoticeDto offlineNotice) {
this.chats = chats.getContent();
this.participants = participants;
Expand All @@ -33,37 +33,42 @@ private ChatRoomResponseDto(Page<ChatMessageResponseDto> chats, List<ChatMemberR
this.isLast = chats.isLast();
}

public static ChatRoomResponseDto ofWithDelivery(List<ChatMemberResponseDto> participants, Page<ChatMessageResponseDto> chatPage, ChatRoomDeliveryNoticeDto deliveryNotice) {
public static ChatRoomResponseDto ofWithDelivery(List<ChatMemberResponseDto> participants, Slice<ChatMessageResponseDto> chatPage, ChatRoomDeliveryNoticeDto deliveryNotice) {
return ChatRoomResponseDto.builder()
.chats(chatPage)
.participants(participants)
.offlineNotice(null)
.deliveryNotice(deliveryNotice)
.build();
}

public static ChatRoomResponseDto ofWithOffline(List<ChatMemberResponseDto> participants, Page<ChatMessageResponseDto> chatPage, ChatRoomOfflineNoticeDto offlineNotice) {
public static ChatRoomResponseDto ofWithOffline(List<ChatMemberResponseDto> participants, Slice<ChatMessageResponseDto> chatPage, ChatRoomOfflineNoticeDto offlineNotice) {
return ChatRoomResponseDto.builder()
.chats(chatPage)
.participants(participants)
.offlineNotice(offlineNotice)
.deliveryNotice(null)
.build();
}

@Getter
public static class ChatMemberResponseDto {
private String memberName;
private String nickname;
private Mbti mbti;
private String profileImageUrl;

@Builder
private ChatMemberResponseDto(String memberName, Mbti mbti) {
this.memberName = memberName;
private ChatMemberResponseDto(String nickname, Mbti mbti, String profileImageUrl) {
this.nickname = nickname;
this.mbti = mbti;
this.profileImageUrl = profileImageUrl;
}

public static ChatMemberResponseDto from(Member member) {
return ChatMemberResponseDto.builder()
.memberName(member.getName())
.nickname(member.getNickname())
.mbti(member.getMbti())
.profileImageUrl(member.getProfileImage().getImageUrl())
.build();
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@
import java.util.stream.Collectors;

import org.springframework.context.ApplicationEventPublisher;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand Down Expand Up @@ -79,7 +79,7 @@ public ChatRoomResponseDto enterChatRoomAndLoadMessage(Long chatRoomId, UserDeta
.map(memberChatRoom -> ChatRoomResponseDto.ChatMemberResponseDto.from(memberChatRoom.getMember()))
.collect(Collectors.toList());

Page<ChatMessageResponseDto> chatList = chatService.loadChat(chatRoomId, pageable);
Slice<ChatMessageResponseDto> chatList = chatService.loadChat(chatRoomId, null, pageable);

//채팅방 공지 처리
Meeting meeting = chatRoom.getMeeting();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.validation.constraints.Future;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
Expand All @@ -33,15 +32,11 @@ public class DeliveryMeeting extends Meeting {
private String pickupLocation; // 현재 지도 API 관련 정보가 없어 임시로 String 자료형 선언

@Column(nullable = false)
@Future
private LocalDateTime orderDeadline;

@Column(nullable = false)
private String accountNumber;

@Column(nullable = false)
private String accountHolder;

@Column(nullable = false)
private BankName bankName;

Expand All @@ -52,7 +47,6 @@ public void updateDeliveryMeeting(
String storeName,
String pickupLocation,
String accountNumber,
String accountHolder,
Image backgroundImage
) {
super.updateMeeting(meetingName, description, backgroundImage);
Expand All @@ -61,6 +55,5 @@ public void updateDeliveryMeeting(
this.storeName = storeName;
this.pickupLocation = pickupLocation;
this.accountNumber = accountNumber;
this.accountHolder = accountHolder;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
import jakarta.persistence.Entity;
import jakarta.persistence.EnumType;
import jakarta.persistence.Enumerated;
import jakarta.validation.constraints.Future;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;
Expand All @@ -25,7 +24,6 @@ public class OfflineMeeting extends Meeting {
private String meetingPlace; // 현재 지도 API 관련 정보가 없어 임시로 String 자료형 선언

@Column(nullable = false)
@Future
private LocalDateTime meetingDate;

@Column(nullable = false)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package com.example.eatmate.app.domain.meeting.domain.repository;

import java.time.LocalDateTime;
import java.util.List;

import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Slice;
import org.springframework.data.jpa.repository.JpaRepository;
Expand All @@ -11,5 +14,8 @@
public interface DeliveryMeetingRepository extends JpaRepository<DeliveryMeeting, Long> {
Slice<DeliveryMeeting> findAllByFoodCategoryAndMeetingStatus(FoodCategory foodCategory,
MeetingStatus meetingStatus, Pageable pageable);

List<DeliveryMeeting> findByMeetingStatusAndOrderDeadlineBefore(MeetingStatus meetingStatus,
LocalDateTime orderDeadline);
}

Loading

0 comments on commit 387518a

Please sign in to comment.