Skip to content

Commit 55c7725

Browse files
committed
Feat: 사용자 좋아요 기능 추가
1 parent 268c015 commit 55c7725

File tree

13 files changed

+240
-14
lines changed

13 files changed

+240
-14
lines changed

src/main/java/cmf/commitField/domain/chat/chatRoom/controller/ChatRoomController.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,7 @@ public GlobalResponse<Object> getByUserRoomPartList(Pageable pageable) {
115115
}
116116
}
117117

118+
//채팅방 제목 수정
118119
@PutMapping("/room/update/{roomId}")
119120
@LoginCheck
120121
public GlobalResponse<Object> updateRoom(
@@ -183,6 +184,19 @@ public GlobalResponse<Object> getRoomUsers(
183184
}
184185
}
185186

187+
// 전체 리스트에서 좋아요 순으로 정렬
188+
@GetMapping("/room/heart")
189+
@LoginCheck
190+
public GlobalResponse<Object> roomHeartSort(Pageable pageable) {
191+
List<ChatRoomDto> roomList = chatRoomService.getRoomHeartSortList(pageable);
192+
if (roomList.size() == 0) {
193+
return GlobalResponse.error(ErrorCode.NO_ROOM);
194+
} else {
195+
return GlobalResponse.success(roomList);
196+
}
197+
}
198+
199+
186200

187201

188202
}

src/main/java/cmf/commitField/domain/chat/chatRoom/dto/ChatRoomDto.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package cmf.commitField.domain.chat.chatRoom.dto;
22

3+
import cmf.commitField.domain.chat.chatRoom.entity.ChatRoom;
34
import lombok.*;
45

56
@Getter
@@ -15,4 +16,16 @@ public class ChatRoomDto {
1516
private Long currentUserCount;
1617

1718
private Integer userCountMax;
19+
20+
private Integer heartCount;
21+
22+
public static ChatRoomDto of(ChatRoom chatRoom) {
23+
return ChatRoomDto.builder()
24+
.id(chatRoom.getId())
25+
.title(chatRoom.getTitle())
26+
.currentUserCount((long) chatRoom.getUserChatRooms().size())
27+
.userCountMax(chatRoom.getUserCountMax())
28+
.heartCount(chatRoom.getHearts().size())
29+
.build();
30+
}
1831
}

src/main/java/cmf/commitField/domain/chat/chatRoom/entity/ChatRoom.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

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

41+
@OneToMany(mappedBy = "chatRoom", fetch = FetchType.LAZY)
42+
private List<Heart> hearts;
43+
4044
@Override
4145
public String toString() {
4246
return "ChatRoom{" +

src/main/java/cmf/commitField/domain/chat/chatRoom/repository/ChatRoomRepository.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,4 +27,9 @@ public interface ChatRoomRepository extends JpaRepository<ChatRoom, Long> {
2727
@Query(value = "SELECT ROOM_CREATOR FROM chat_room WHERE ID = ?", nativeQuery = true)
2828
Optional<Long> findChatRoomIdByRoomId(@Param("roomId") Long roomId);
2929

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

src/main/java/cmf/commitField/domain/chat/chatRoom/service/ChatRoomService.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,8 @@ public interface ChatRoomService {
2929
void updateRoom(Long roomId, ChatRoomUpdateRequest chatRoomUpdateRequest, Long userId);
3030

3131
List<ChatRoomUserDto> getRoomUsers(Long roomId, Long userId);
32+
33+
List<ChatRoomDto> getRoomHeartSortList(Pageable pageable);
34+
35+
3236
}

src/main/java/cmf/commitField/domain/chat/chatRoom/service/ChatRoomServiceImpl.java

Lines changed: 24 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import java.util.List;
2727
import java.util.Objects;
2828
import java.util.concurrent.TimeUnit;
29+
import java.util.stream.Collectors;
2930

3031
@Service
3132
@RequiredArgsConstructor
@@ -73,19 +74,9 @@ public void createRoom(ChatRoomRequest chatRoomRequest, Long userId) {
7374

7475
// 방 조회 DTO 변환 메서드 추출
7576
private static List<ChatRoomDto> getChatRoomDtos(Page<ChatRoom> all) {
76-
List<ChatRoomDto> chatRoomList = new ArrayList<>();
77-
78-
for (ChatRoom list : all) {
79-
ChatRoomDto dto = ChatRoomDto.builder()
80-
.id(list.getId())
81-
.title(list.getTitle())
82-
.currentUserCount((long) list.getUserChatRooms().size())
83-
.userCountMax(list.getUserCountMax())
84-
.build();
85-
86-
chatRoomList.add(dto);
87-
}
88-
return chatRoomList;
77+
return all.stream()
78+
.map(ChatRoomDto::of)
79+
.collect(Collectors.toList());
8980
}
9081

9182

@@ -250,4 +241,24 @@ public List<ChatRoomUserDto> getRoomUsers(Long roomId, Long userId) {
250241
return chatRoomUserDtos;
251242
}
252243

244+
// 좋아요 순으로 정렬 후 방 전체 조회
245+
@Override
246+
@Transactional(readOnly = true)
247+
public List<ChatRoomDto> getRoomHeartSortList(Pageable pageable) {
248+
Page<ChatRoom> all = chatRoomRepository.findAllByOrderByHearts(pageable);
249+
List<ChatRoom> chatRooms = all.toList();
250+
List<ChatRoomDto> chatRoomDtos = new ArrayList<>();
251+
for (ChatRoom chatRoom : chatRooms) {
252+
ChatRoomDto build = ChatRoomDto.builder()
253+
.id(chatRoom.getId())
254+
.title(chatRoom.getTitle())
255+
.userCountMax(chatRoom.getUserCountMax())
256+
.currentUserCount((long) chatRoom.getUserChatRooms().size())
257+
.heartCount(chatRoom.getHearts().size())
258+
.build();
259+
chatRoomDtos.add(build);
260+
}
261+
return chatRoomDtos;
262+
}
263+
253264
}
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package cmf.commitField.domain.heart.controller;
2+
3+
import cmf.commitField.domain.heart.service.HeartService;
4+
import cmf.commitField.domain.user.entity.CustomOAuth2User;
5+
import cmf.commitField.global.globalDto.GlobalResponse;
6+
import cmf.commitField.global.security.LoginCheck;
7+
import lombok.RequiredArgsConstructor;
8+
import org.springframework.security.core.Authentication;
9+
import org.springframework.security.core.context.SecurityContextHolder;
10+
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
11+
import org.springframework.web.bind.annotation.*;
12+
13+
@RestController
14+
@RequiredArgsConstructor
15+
@RequestMapping("/heart")
16+
public class HeartController {
17+
18+
private final HeartService heartService;
19+
20+
@PostMapping("/{roomId}")
21+
@LoginCheck
22+
public GlobalResponse<Object> heart(@PathVariable Long roomId) {
23+
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
24+
25+
if (authentication instanceof OAuth2AuthenticationToken) {
26+
CustomOAuth2User principal = (CustomOAuth2User) authentication.getPrincipal();
27+
Long userId = principal.getId(); // OAuth2 사용자 ID 추출
28+
heartService.heart(userId, roomId);
29+
return GlobalResponse.success("좋아요를 눌렀습니다.");
30+
} else {
31+
throw new IllegalArgumentException("로그인 후에 이용해 주세요.");
32+
}
33+
}
34+
35+
@DeleteMapping("/{roomId}")
36+
@LoginCheck
37+
public GlobalResponse<Object> heartDelete(@PathVariable Long roomId) {
38+
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
39+
40+
if (authentication instanceof OAuth2AuthenticationToken) {
41+
CustomOAuth2User principal = (CustomOAuth2User) authentication.getPrincipal();
42+
Long userId = principal.getId(); // OAuth2 사용자 ID 추출
43+
heartService.heartDelete(userId, roomId);
44+
return GlobalResponse.success("좋아요를 취소했습니다.");
45+
} else {
46+
throw new IllegalArgumentException("로그인 후에 이용해 주세요.");
47+
}
48+
}
49+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package cmf.commitField.domain.heart.entity;
2+
3+
import cmf.commitField.domain.chat.chatRoom.entity.ChatRoom;
4+
import cmf.commitField.domain.user.entity.User;
5+
import cmf.commitField.global.jpa.BaseEntity;
6+
import jakarta.persistence.Entity;
7+
import jakarta.persistence.FetchType;
8+
import jakarta.persistence.JoinColumn;
9+
import jakarta.persistence.ManyToOne;
10+
import lombok.*;
11+
import lombok.experimental.SuperBuilder;
12+
13+
@Entity
14+
@SuperBuilder
15+
@Getter
16+
@Setter
17+
@NoArgsConstructor(access = AccessLevel.PROTECTED)
18+
@AllArgsConstructor(access = AccessLevel.PROTECTED)
19+
public class Heart extends BaseEntity {
20+
21+
@ManyToOne(fetch = FetchType.LAZY)
22+
@JoinColumn(name = "user_id")
23+
private User user;
24+
25+
@ManyToOne(fetch = FetchType.LAZY)
26+
@JoinColumn(name = "chat_room_id")
27+
private ChatRoom chatRoom;
28+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
package cmf.commitField.domain.heart.repository;
2+
3+
import cmf.commitField.domain.heart.entity.Heart;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.stereotype.Repository;
6+
7+
import java.util.Optional;
8+
9+
@Repository
10+
public interface HeartRepository extends JpaRepository<Heart, Long> {
11+
Optional<Heart> findByUserIdAndChatRoomId(Long userId, Long chatRoomId);
12+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package cmf.commitField.domain.heart.service;
2+
3+
public interface HeartService {
4+
5+
void heart(Long userId, Long roomId);
6+
7+
void heartDelete(Long userId, Long roomId);
8+
}

0 commit comments

Comments
 (0)