Skip to content

Commit

Permalink
Merge pull request #98 from 100-hours-a-week/develop
Browse files Browse the repository at this point in the history
hotfix: prod 엔티티, 데이터베이스 일치
  • Loading branch information
49EHyeon42 authored Aug 27, 2024
2 parents 7d43cb7 + fcfa8e7 commit 272eaf6
Show file tree
Hide file tree
Showing 27 changed files with 358 additions and 156 deletions.
8 changes: 8 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -76,6 +76,14 @@ dependencies {
annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jakarta"
annotationProcessor "jakarta.annotation:jakarta.annotation-api"
annotationProcessor "jakarta.persistence:jakarta.persistence-api"

// MongoDB
implementation 'org.springframework.boot:spring-boot-starter-data-mongodb'

// RabbitMQ
implementation 'org.springframework.boot:spring-boot-starter-amqp'

// STOMP
}

tasks.named('bootBuildImage') {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,8 @@
import org.springframework.web.cors.CorsConfigurationSource;
import org.springframework.web.cors.UrlBasedCorsConfigurationSource;

import java.util.Arrays;

@Configuration
@EnableWebSecurity
@RequiredArgsConstructor
Expand Down Expand Up @@ -52,11 +54,14 @@ public SecurityFilterChain filterChain(HttpSecurity httpSecurity) throws Excepti
return httpSecurity.build();
}

// fixme-noah: 추후 환경 변수로 분리
@Bean
public CorsConfigurationSource corsConfigurationSource() {
CorsConfiguration configuration = new CorsConfiguration();
configuration.addAllowedOrigin("https://connectrip.kro.kr");
configuration.setAllowedOrigins(Arrays.asList(
"http://localhost:3000",
"https://dev.connectrip.kro.kr",
"https://connectrip.kro.kr"
));
configuration.addAllowedMethod("*");
configuration.addAllowedHeader("*");
configuration.setAllowCredentials(true);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import connectripbe.connectrip_be.chat.entity.ChatRoomEntity;

import connectripbe.connectrip_be.chat.entity.type.ChatRoomMemberStatus;
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.format.DateTimeFormatter;
Expand All @@ -28,6 +29,11 @@ public static ChatRoomListResponse fromEntity(ChatRoomEntity chatRoom) {
? chatRoom.getLastChatTime()
: chatRoom.getCreatedAt();

// 활성 멤버 수 계산
int activeMemberCnt = (int) chatRoom.getChatRoomMembers().stream()
.filter(member -> member.getStatus().equals(ChatRoomMemberStatus.ACTIVE))
.count();

return ChatRoomListResponse.builder()
.chatRoomId(chatRoom.getId())
.accompanyPostId(chatRoom.getAccompanyPost().getId())
Expand All @@ -37,7 +43,7 @@ public static ChatRoomListResponse fromEntity(ChatRoomEntity chatRoom) {
.endDate(formatToUTC(chatRoom.getAccompanyPost().getEndDate()))
.lastChatMessage(chatRoom.getLastChatMessage())
.lastChatMessageTime(formatToUTC(lastChatTime))
.memberNumber(chatRoom.getChatRoomMembers().size())
.memberNumber(activeMemberCnt)
.build();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package connectripbe.connectrip_be.chat.entity;

import jakarta.persistence.Id;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.springframework.data.mongodb.core.mapping.Document;
import org.springframework.data.mongodb.core.mapping.Field;

@Document(collection = "chat_message")
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class ChatMessage {

@Id
private String id;

@Field("chat_room_id")
private Long chatRoomId;

@Field("sender_id")
private Long senderId;


}
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,12 @@

import connectripbe.connectrip_be.chat.entity.ChatRoomEntity;
import java.util.List;
import java.util.Optional;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface ChatRoomRepository extends JpaRepository<ChatRoomEntity, Long> {

Optional<ChatRoomEntity> findByAccompanyPost_Id(long id);
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,22 @@

import connectripbe.connectrip_be.global.exception.GlobalException;
import connectripbe.connectrip_be.global.exception.type.ErrorCode;
import connectripbe.connectrip_be.pending_list.entity.PendingListEntity;
import connectripbe.connectrip_be.pending_list.entity.type.PendingStatus;
import connectripbe.connectrip_be.pending_list.repository.PendingListRepository;
import connectripbe.connectrip_be.post.entity.AccompanyPostEntity;
import connectripbe.connectrip_be.post.exception.NotFoundAccompanyPostException;
import connectripbe.connectrip_be.post.repository.AccompanyPostRepository;
import jakarta.transaction.Transactional;
import java.util.List;
import java.util.Objects;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
@Slf4j
public class ChatRoomServiceImpl implements ChatRoomService {

private final ChatRoomRepository chatRoomRepository;
Expand All @@ -36,6 +42,7 @@ public class ChatRoomServiceImpl implements ChatRoomService {

private final ChatRoomMemberService chatRoomMemberService;
private final AccompanyStatusJpaRepository accompanyStatusJpaRepository;
private final PendingListRepository pendingListRepository;

/**
* 사용자가 참여한 채팅방 목록을 조회하여 반환하는 메서드. 주어진 사용자의 이메일 주소를 기반으로 해당 사용자가 참여한 모든 채팅방을 조회
Expand Down Expand Up @@ -74,8 +81,7 @@ public List<ChatRoomMemberResponse> getChatRoomMembers(Long chatRoomId) {
}

/**
* 특정 게시물에 대한 채팅방을 생성하고, 게시물 작성자를 해당 채팅방에 자동으로 참여.
* 생성된 채팅방에서 게시물 작성자는 초기 방장으로 설정.
* 특정 게시물에 대한 채팅방을 생성하고, 게시물 작성자를 해당 채팅방에 자동으로 참여. 생성된 채팅방에서 게시물 작성자는 초기 방장으로 설정.
*
* @param postId 채팅방을 생성할 게시물의 ID
* @param memberId 채팅방에 자동으로 참여시킬 게시물 작성자의 ID
Expand Down Expand Up @@ -107,12 +113,11 @@ public void createChatRoom(Long postId, Long memberId) {


/**
* 사용자가 채팅방에서 나가도록 처리.
* 주어진 채팅방 ID와 사용자 ID를 기반으로, 사용자가 해당 채팅방에서 나가게 하며,
* 방장이 나가는 경우에는 방장을 승계하고, 마지막 남은 멤버가 나가는 경우 채팅방 상태를 'DELETE'로 변경.
* 사용자가 채팅방에서 나가도록 처리. 주어진 채팅방 ID와 사용자 ID를 기반으로, 사용자가 해당 채팅방에서 나가게 하며, 방장이 나가는 경우에는 방장을 승계하고,
* 마지막 남은 멤버가 나가는 경우 채팅방 상태를 'DELETE'로 변경.
*
* @param chatRoomId 나가려는 사용자가 속한 채팅방의 ID
* @param memberId 나가려는 사용자의 ID
* @param memberId 나가려는 사용자의 ID
* @throws GlobalException 채팅방이나 사용자가 존재하지 않거나, 방장 승계 중 문제가 발생한 경우
*/
@Override
Expand All @@ -125,6 +130,9 @@ public void exitChatRoom(Long chatRoomId, Long memberId) {
// 사용자가 존재하는지 확인
ChatRoomMemberEntity chatRoomMember = getRoomMember(chatRoomId, memberId);

// 채팅방에서 나가기 전 pendingList 업데이트
pendingListUpdate(chatRoomMember, chatRoom);

// 사용자가 채팅방에서 나가기
chatRoomMember.exitChatRoom();

Expand Down Expand Up @@ -157,6 +165,20 @@ public void exitChatRoom(Long chatRoomId, Long memberId) {
}

chatRoomRepository.save(chatRoom);

}

private void pendingListUpdate(ChatRoomMemberEntity chatRoomMember, ChatRoomEntity chatRoom) {
AccompanyPostEntity accompanyPost = chatRoomMember.getChatRoom().getAccompanyPost();

// 방장이 아닌 경우에만 pendingList 업데이트
if (!chatRoomMember.getMember().equals(chatRoom.getCurrentLeader().getMember())) {
PendingListEntity pendingMember = pendingListRepository.findByAccompanyPostAndMember(
accompanyPost, chatRoomMember.getMember())
.orElseThrow(() -> new GlobalException(ErrorCode.PENDING_LIST_NOT_FOUND));

pendingMember.updateStatus(PendingStatus.EXIT_ROOM);
}
}

private ChatRoomEntity getChatRoom(Long chatRoomId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ public class ChatRoomController {

private final ChatRoomService chatRoomService;

// 채팅방 목록 조회
@GetMapping("/list")
public ResponseEntity<List<ChatRoomListResponse>> getChatRoomList(
@AuthenticationPrincipal Long memberId
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ public class AccompanyCommentEntity extends BaseEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "member_id", nullable = false)
private MemberEntity memberEntity; // 사용자 아이디 (외래키)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,6 @@ public interface AccompanyCommentRepository extends JpaRepository<AccompanyComme

Optional<AccompanyCommentEntity> findByIdAndDeletedAtIsNull(long id);

// AccompanyPostEntity의 ID로 삭제되지 않은 댓글 목록 조회
// AccompanyPostEntity 의 ID로 삭제되지 않은 댓글 목록 조회
List<AccompanyCommentEntity> findByAccompanyPostEntity_IdAndDeletedAtIsNull(Long postId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -27,8 +27,8 @@ public class AccompanyCommentServiceImpl implements AccompanyCommentService {

/**
* 댓글을 생성하는 메서드.
* 사용자 이메일을 통해 MemberEntity를 조회하고, 게시물 ID를 통해 AccompanyPostEntity를 조회한 후
* AccompanyCommentEntity를 생성하여 데이터베이스에 저장
* 사용자 이메일을 통해 MemberEntity 를 조회하고, 게시물 ID를 통해 AccompanyPostEntity 를 조회한 후
* AccompanyCommentEntity 를 생성하여 데이터베이스에 저장
*
* @param memberId 댓글 작성자의 아이디
* @param request 댓글 생성 요청 정보 (게시물 ID, 댓글 내용 포함)
Expand Down Expand Up @@ -110,7 +110,7 @@ public List<AccompanyCommentResponse> getCommentsByPost(Long postId) {

/**
* 주어진 댓글 ID로 댓글을 조회하는 메서드.
* 만약 해당 댓글이 존재하지 않으면 GlobalException을 발생
* 만약 해당 댓글이 존재하지 않으면 GlobalException 을 발생
*
* @param commentId 조회할 댓글의 ID
* @return 조회된 AccompanyCommentEntity 객체
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@
@Getter
public class GlobalException extends RuntimeException {

private final ErrorCode errorCode;
private final ErrorCode errorCode;

public GlobalException(ErrorCode errorCode) {
public GlobalException(ErrorCode errorCode) {
super(errorCode.getDescription());
this.errorCode = errorCode;
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@ public enum ErrorCode {
INVALID_AUTH_CODE(HttpStatus.BAD_REQUEST, "인증 코드가 일치하지 않습니다."),
EMAIL_NOT_VERIFIED(HttpStatus.BAD_REQUEST, "이메일 인증이 완료되지 않았습니다."),
WRITE_NOT_YOURSELF(HttpStatus.BAD_REQUEST, "본인이 작성한 글만 수정 또는 삭제할 수 있습니다."),
POST_NOT_FOUND(HttpStatus.BAD_REQUEST, "해당 글을 찾을 수 없습니다."),
COMMENT_NOT_FOUND(HttpStatus.BAD_REQUEST, "해당 댓글을 찾을 수 없습니다."),
PROFILE_IMAGE_UPLOAD_ERROR(HttpStatus.BAD_REQUEST, "프로필 이미지 업로드 중 오류가 발생했습니다."),
POST_IMAGE_UPLOAD_ERROR(HttpStatus.BAD_REQUEST, "게시물 이미지 업로드 중 오류가 발생했습니다."),
Expand All @@ -30,7 +29,7 @@ public enum ErrorCode {
PENDING_NOT_FOUND(HttpStatus.BAD_REQUEST, "해당 신청을 찾을 수 없습니다."),
PENDING_ALREADY_EXISTS(HttpStatus.BAD_REQUEST, "이미 신청한 상태입니다."),
WRITE_YOURSELF(HttpStatus.BAD_REQUEST, "본인이 작성한 글은 신청할 수 없습니다."),

NOT_CHATROOM_LEADER(HttpStatus.BAD_REQUEST, "채팅방 방장이 아닙니다."),
// Member, 사용자
NOT_FOUND_MEMBER(HttpStatus.NOT_FOUND, "사용자를 찾을 수 없습니다."),
DUPLICATE_MEMBER_NICKNAME(HttpStatus.CONFLICT, "중복된 닉네임입니다."),
Expand All @@ -50,7 +49,6 @@ public enum ErrorCode {
DUPLICATE_MEETING(HttpStatus.BAD_REQUEST, "이미 모임에 참여하셨습니다."),

// ChatRoom error
CHAT_ROOM_NOT_FOUND(HttpStatus.BAD_REQUEST, "해당 채팅방을 찾을 수 없습니다."),
ALREADY_JOINED_CHAT_ROOM(HttpStatus.BAD_REQUEST, "이미 참여한 채팅방입니다."),
/**
* 401 Unauthorized
Expand All @@ -73,8 +71,13 @@ public enum ErrorCode {
* 404 Not Found
*/

PENDING_LIST_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 신청 목록을 찾을 수 없습니다."),
USER_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 이메일로 사용자를 찾을 수 없습니다."),
CHAT_ROOM_MEMBER_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 채팅방 참여자를 찾을 수 없습니다."),
CHAT_ROOM_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 채팅방을 찾을 수 없습니다."),
POST_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 글을 찾을 수 없습니다."),
CHATROOM_NOT_FOUND(HttpStatus.NOT_FOUND, "해당 채팅방을 찾을 수 없습니다."),

/**
* 409 Conflict
*/
Expand Down
Loading

0 comments on commit 272eaf6

Please sign in to comment.