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
Expand Up @@ -13,6 +13,7 @@
import lombok.RequiredArgsConstructor;
import org.springframework.data.domain.Pageable;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
import org.springframework.web.bind.annotation.*;
Expand Down Expand Up @@ -115,6 +116,7 @@ public GlobalResponse<Object> getByUserRoomPartList(Pageable pageable) {
}
}

//채팅방 제목 수정
@PutMapping("/room/update/{roomId}")
@LoginCheck
public GlobalResponse<Object> updateRoom(
Expand Down Expand Up @@ -183,6 +185,36 @@ public GlobalResponse<Object> getRoomUsers(
}
}

// 전체 리스트에서 좋아요 순으로 정렬
@GetMapping("/room/heart")
@LoginCheck
public GlobalResponse<Object> roomHeartSort(Pageable pageable) {
List<ChatRoomDto> roomList = chatRoomService.getRoomHeartSortList(pageable);
if (roomList.isEmpty()) {
return GlobalResponse.error(ErrorCode.NO_ROOM);
} else {
return GlobalResponse.success(roomList);
}
}

// 사용자(자신)가 좋아요 누른 방 리스트 조회
@GetMapping("/room/myHeart/list")
@LoginCheck
public GlobalResponse<Object> getMyHeartRoomList(
Pageable pageable,
@AuthenticationPrincipal CustomOAuth2User principal) { // 인증된 사용자 정보 주입

Long userId = principal.getId(); // 현재 로그인된 사용자 ID 가져오기
List<ChatRoomDto> list = chatRoomService.myHeartRoomList(userId, pageable);

if (list.isEmpty()) {
return GlobalResponse.error(ErrorCode.NO_ROOM_FOUND);
}
return GlobalResponse.success("좋아요 누른 채팅방 리스트 조회 완료", list);
}





}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package cmf.commitField.domain.chat.chatRoom.dto;

import cmf.commitField.domain.chat.chatRoom.entity.ChatRoom;
import lombok.*;

@Getter
Expand All @@ -15,4 +16,16 @@ public class ChatRoomDto {
private Long currentUserCount;

private Integer userCountMax;

private Integer heartCount;

public static ChatRoomDto of(ChatRoom chatRoom) {
return ChatRoomDto.builder()
.id(chatRoom.getId())
.title(chatRoom.getTitle())
.currentUserCount((long) chatRoom.getUserChatRooms().size())
.userCountMax(chatRoom.getUserCountMax())
.heartCount(chatRoom.getHearts().size())
.build();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import cmf.commitField.domain.chat.chatMessage.entity.ChatMsg;
import cmf.commitField.domain.chat.userChatRoom.entity.UserChatRoom;
import cmf.commitField.domain.heart.entity.Heart;
import cmf.commitField.domain.user.entity.User;
import cmf.commitField.global.jpa.BaseEntity;
import jakarta.persistence.*;
Expand Down Expand Up @@ -37,6 +38,9 @@ public class ChatRoom extends BaseEntity {
@OneToMany(mappedBy = "chatRoom", fetch = FetchType.LAZY)
private List<ChatMsg> chatMsgs;

@OneToMany(mappedBy = "chatRoom", fetch = FetchType.LAZY)
private List<Heart> hearts;

@Override
public String toString() {
return "ChatRoom{" +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
import org.springframework.data.repository.query.Param;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

@Repository
Expand All @@ -27,4 +28,12 @@ public interface ChatRoomRepository extends JpaRepository<ChatRoom, Long> {
@Query(value = "SELECT ROOM_CREATOR FROM chat_room WHERE ID = ?", nativeQuery = true)
Optional<Long> findChatRoomIdByRoomId(@Param("roomId") Long roomId);

@Query("SELECT c FROM ChatRoom c LEFT JOIN Heart h ON c.id = h.chatRoom.id " +
"GROUP BY c.id " +
"ORDER BY COUNT(h.user.id) DESC")
Page<ChatRoom> findAllByOrderByHearts(Pageable pageable);

@Query("SELECT c FROM ChatRoom c WHERE c.id IN :ids ORDER BY c.createdAt DESC")
Page<ChatRoom> findChatRoomByInId(@Param("ids") List<Long> ids, Pageable pageable);

}
Original file line number Diff line number Diff line change
Expand Up @@ -29,4 +29,9 @@ public interface ChatRoomService {
void updateRoom(Long roomId, ChatRoomUpdateRequest chatRoomUpdateRequest, Long userId);

List<ChatRoomUserDto> getRoomUsers(Long roomId, Long userId);

List<ChatRoomDto> getRoomHeartSortList(Pageable pageable);

List<ChatRoomDto> myHeartRoomList(Long userId, Pageable pageable);

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
import cmf.commitField.domain.chat.chatRoom.repository.ChatRoomRepository;
import cmf.commitField.domain.chat.userChatRoom.entity.UserChatRoom;
import cmf.commitField.domain.chat.userChatRoom.repository.UserChatRoomRepository;
import cmf.commitField.domain.heart.entity.Heart;
import cmf.commitField.domain.heart.repository.HeartRepository;
import cmf.commitField.domain.user.entity.User;
import cmf.commitField.domain.user.repository.UserRepository;
import cmf.commitField.global.error.ErrorCode;
Expand All @@ -26,6 +28,7 @@
import java.util.List;
import java.util.Objects;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
Expand All @@ -41,6 +44,8 @@ public class ChatRoomServiceImpl implements ChatRoomService {

private final RedissonClient redissonClient;

private final HeartRepository heartRepository;

@Override
@Transactional
public void createRoom(ChatRoomRequest chatRoomRequest, Long userId) {
Expand Down Expand Up @@ -73,19 +78,9 @@ public void createRoom(ChatRoomRequest chatRoomRequest, Long userId) {

// 방 조회 DTO 변환 메서드 추출
private static List<ChatRoomDto> getChatRoomDtos(Page<ChatRoom> all) {
List<ChatRoomDto> chatRoomList = new ArrayList<>();

for (ChatRoom list : all) {
ChatRoomDto dto = ChatRoomDto.builder()
.id(list.getId())
.title(list.getTitle())
.currentUserCount((long) list.getUserChatRooms().size())
.userCountMax(list.getUserCountMax())
.build();

chatRoomList.add(dto);
}
return chatRoomList;
return all.stream()
.map(ChatRoomDto::of)
.collect(Collectors.toList());
}


Expand Down Expand Up @@ -250,4 +245,52 @@ public List<ChatRoomUserDto> getRoomUsers(Long roomId, Long userId) {
return chatRoomUserDtos;
}

// 좋아요 순으로 정렬 후 방 전체 조회
@Override
@Transactional(readOnly = true)
public List<ChatRoomDto> getRoomHeartSortList(Pageable pageable) {
Page<ChatRoom> all = chatRoomRepository.findAllByOrderByHearts(pageable);
List<ChatRoom> chatRooms = all.toList();
List<ChatRoomDto> chatRoomDtos = new ArrayList<>();
for (ChatRoom chatRoom : chatRooms) {
ChatRoomDto build = ChatRoomDto.builder()
.id(chatRoom.getId())
.title(chatRoom.getTitle())
.userCountMax(chatRoom.getUserCountMax())
.currentUserCount((long) chatRoom.getUserChatRooms().size())
.heartCount(chatRoom.getHearts().size())
.build();
chatRoomDtos.add(build);
}
return chatRoomDtos;
}

@Override
@Transactional(readOnly = true)
public List<ChatRoomDto> myHeartRoomList(Long userId, Pageable pageable) {
getUser(userId);
List<Heart> heart = heartRepository.findByUserId(userId);
if (heart.isEmpty()) {
throw new CustomException(ErrorCode.NOT_FOUND_HEART);
}
List<Long> ids = new ArrayList<>();
for(Heart heart1 : heart) {
Long id = heart1.getChatRoom().getId();
ids.add(id);
}
Page<ChatRoom> chatRoomByInId = chatRoomRepository.findChatRoomByInId(ids, pageable);
List<ChatRoom> chatRoomList = chatRoomByInId.toList();
List<ChatRoomDto> chatRoomDtos = new ArrayList<>();
for (ChatRoom chatRoom : chatRoomList) {
ChatRoomDto build = ChatRoomDto.builder()
.id(chatRoom.getId())
.title(chatRoom.getTitle())
.heartCount(chatRoom.getHearts().size())
.currentUserCount((long) chatRoom.getUserChatRooms().size())
.userCountMax(chatRoom.getUserCountMax())
.build();
chatRoomDtos.add(build);
}
return chatRoomDtos;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
package cmf.commitField.domain.heart.controller;

import cmf.commitField.domain.heart.service.HeartService;
import cmf.commitField.domain.user.entity.CustomOAuth2User;
import cmf.commitField.global.globalDto.GlobalResponse;
import cmf.commitField.global.security.LoginCheck;
import lombok.RequiredArgsConstructor;
import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
import org.springframework.web.bind.annotation.*;

@RestController
@RequiredArgsConstructor
@RequestMapping("/heart")
public class HeartController {

private final HeartService heartService;

@PostMapping("/{roomId}")
@LoginCheck
public GlobalResponse<Object> heart(@PathVariable Long roomId) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

if (authentication instanceof OAuth2AuthenticationToken) {
CustomOAuth2User principal = (CustomOAuth2User) authentication.getPrincipal();
Long userId = principal.getId(); // OAuth2 사용자 ID 추출
heartService.heart(userId, roomId);
return GlobalResponse.success("좋아요를 눌렀습니다.");
} else {
throw new IllegalArgumentException("로그인 후에 이용해 주세요.");
}
}

@DeleteMapping("/{roomId}")
@LoginCheck
public GlobalResponse<Object> heartDelete(@PathVariable Long roomId) {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();

if (authentication instanceof OAuth2AuthenticationToken) {
CustomOAuth2User principal = (CustomOAuth2User) authentication.getPrincipal();
Long userId = principal.getId(); // OAuth2 사용자 ID 추출
heartService.heartDelete(userId, roomId);
return GlobalResponse.success("좋아요를 취소했습니다.");
} else {
throw new IllegalArgumentException("로그인 후에 이용해 주세요.");
}
}
}
28 changes: 28 additions & 0 deletions src/main/java/cmf/commitField/domain/heart/entity/Heart.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package cmf.commitField.domain.heart.entity;

import cmf.commitField.domain.chat.chatRoom.entity.ChatRoom;
import cmf.commitField.domain.user.entity.User;
import cmf.commitField.global.jpa.BaseEntity;
import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import lombok.*;
import lombok.experimental.SuperBuilder;

@Entity
@SuperBuilder
@Getter
@Setter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PROTECTED)
public class Heart extends BaseEntity {

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "chat_room_id")
private ChatRoom chatRoom;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package cmf.commitField.domain.heart.repository;

import cmf.commitField.domain.heart.entity.Heart;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import java.util.List;
import java.util.Optional;

@Repository
public interface HeartRepository extends JpaRepository<Heart, Long> {
Optional<Heart> findByUserIdAndChatRoomId(Long userId, Long chatRoomId);

List<Heart> findByUserId(Long userId);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package cmf.commitField.domain.heart.service;

public interface HeartService {

void heart(Long userId, Long roomId);

void heartDelete(Long userId, Long roomId);
}
Loading