Skip to content

Commit e857621

Browse files
committed
Merge branch 'dev' of https://github.com/CommitField/commitField into feat/#65
2 parents 9db21f0 + f2dfd59 commit e857621

File tree

13 files changed

+298
-14
lines changed

13 files changed

+298
-14
lines changed

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

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
import lombok.RequiredArgsConstructor;
1414
import org.springframework.data.domain.Pageable;
1515
import org.springframework.security.core.Authentication;
16+
import org.springframework.security.core.annotation.AuthenticationPrincipal;
1617
import org.springframework.security.core.context.SecurityContextHolder;
1718
import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken;
1819
import org.springframework.web.bind.annotation.*;
@@ -115,6 +116,7 @@ public GlobalResponse<Object> getByUserRoomPartList(Pageable pageable) {
115116
}
116117
}
117118

119+
//채팅방 제목 수정
118120
@PutMapping("/room/update/{roomId}")
119121
@LoginCheck
120122
public GlobalResponse<Object> updateRoom(
@@ -183,6 +185,36 @@ public GlobalResponse<Object> getRoomUsers(
183185
}
184186
}
185187

188+
// 전체 리스트에서 좋아요 순으로 정렬
189+
@GetMapping("/room/heart")
190+
@LoginCheck
191+
public GlobalResponse<Object> roomHeartSort(Pageable pageable) {
192+
List<ChatRoomDto> roomList = chatRoomService.getRoomHeartSortList(pageable);
193+
if (roomList.isEmpty()) {
194+
return GlobalResponse.error(ErrorCode.NO_ROOM);
195+
} else {
196+
return GlobalResponse.success(roomList);
197+
}
198+
}
199+
200+
// 사용자(자신)가 좋아요 누른 방 리스트 조회
201+
@GetMapping("/room/myHeart/list")
202+
@LoginCheck
203+
public GlobalResponse<Object> getMyHeartRoomList(
204+
Pageable pageable,
205+
@AuthenticationPrincipal CustomOAuth2User principal) { // 인증된 사용자 정보 주입
206+
207+
Long userId = principal.getId(); // 현재 로그인된 사용자 ID 가져오기
208+
List<ChatRoomDto> list = chatRoomService.myHeartRoomList(userId, pageable);
209+
210+
if (list.isEmpty()) {
211+
return GlobalResponse.error(ErrorCode.NO_ROOM_FOUND);
212+
}
213+
return GlobalResponse.success("좋아요 누른 채팅방 리스트 조회 완료", list);
214+
}
215+
216+
217+
186218

187219

188220
}

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: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.springframework.data.repository.query.Param;
99
import org.springframework.stereotype.Repository;
1010

11+
import java.util.List;
1112
import java.util.Optional;
1213

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

31+
@Query("SELECT c FROM ChatRoom c LEFT JOIN Heart h ON c.id = h.chatRoom.id " +
32+
"GROUP BY c.id " +
33+
"ORDER BY COUNT(h.user.id) DESC")
34+
Page<ChatRoom> findAllByOrderByHearts(Pageable pageable);
35+
36+
@Query("SELECT c FROM ChatRoom c WHERE c.id IN :ids ORDER BY c.createdAt DESC")
37+
Page<ChatRoom> findChatRoomByInId(@Param("ids") List<Long> ids, Pageable pageable);
38+
3039
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,9 @@ 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+
List<ChatRoomDto> myHeartRoomList(Long userId, Pageable pageable);
36+
3237
}

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

Lines changed: 56 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99
import cmf.commitField.domain.chat.chatRoom.repository.ChatRoomRepository;
1010
import cmf.commitField.domain.chat.userChatRoom.entity.UserChatRoom;
1111
import cmf.commitField.domain.chat.userChatRoom.repository.UserChatRoomRepository;
12+
import cmf.commitField.domain.heart.entity.Heart;
13+
import cmf.commitField.domain.heart.repository.HeartRepository;
1214
import cmf.commitField.domain.user.entity.User;
1315
import cmf.commitField.domain.user.repository.UserRepository;
1416
import cmf.commitField.global.error.ErrorCode;
@@ -26,6 +28,7 @@
2628
import java.util.List;
2729
import java.util.Objects;
2830
import java.util.concurrent.TimeUnit;
31+
import java.util.stream.Collectors;
2932

3033
@Service
3134
@RequiredArgsConstructor
@@ -41,6 +44,8 @@ public class ChatRoomServiceImpl implements ChatRoomService {
4144

4245
private final RedissonClient redissonClient;
4346

47+
private final HeartRepository heartRepository;
48+
4449
@Override
4550
@Transactional
4651
public void createRoom(ChatRoomRequest chatRoomRequest, Long userId) {
@@ -73,19 +78,9 @@ public void createRoom(ChatRoomRequest chatRoomRequest, Long userId) {
7378

7479
// 방 조회 DTO 변환 메서드 추출
7580
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;
81+
return all.stream()
82+
.map(ChatRoomDto::of)
83+
.collect(Collectors.toList());
8984
}
9085

9186

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

248+
// 좋아요 순으로 정렬 후 방 전체 조회
249+
@Override
250+
@Transactional(readOnly = true)
251+
public List<ChatRoomDto> getRoomHeartSortList(Pageable pageable) {
252+
Page<ChatRoom> all = chatRoomRepository.findAllByOrderByHearts(pageable);
253+
List<ChatRoom> chatRooms = all.toList();
254+
List<ChatRoomDto> chatRoomDtos = new ArrayList<>();
255+
for (ChatRoom chatRoom : chatRooms) {
256+
ChatRoomDto build = ChatRoomDto.builder()
257+
.id(chatRoom.getId())
258+
.title(chatRoom.getTitle())
259+
.userCountMax(chatRoom.getUserCountMax())
260+
.currentUserCount((long) chatRoom.getUserChatRooms().size())
261+
.heartCount(chatRoom.getHearts().size())
262+
.build();
263+
chatRoomDtos.add(build);
264+
}
265+
return chatRoomDtos;
266+
}
267+
268+
@Override
269+
@Transactional(readOnly = true)
270+
public List<ChatRoomDto> myHeartRoomList(Long userId, Pageable pageable) {
271+
getUser(userId);
272+
List<Heart> heart = heartRepository.findByUserId(userId);
273+
if (heart.isEmpty()) {
274+
throw new CustomException(ErrorCode.NOT_FOUND_HEART);
275+
}
276+
List<Long> ids = new ArrayList<>();
277+
for(Heart heart1 : heart) {
278+
Long id = heart1.getChatRoom().getId();
279+
ids.add(id);
280+
}
281+
Page<ChatRoom> chatRoomByInId = chatRoomRepository.findChatRoomByInId(ids, pageable);
282+
List<ChatRoom> chatRoomList = chatRoomByInId.toList();
283+
List<ChatRoomDto> chatRoomDtos = new ArrayList<>();
284+
for (ChatRoom chatRoom : chatRoomList) {
285+
ChatRoomDto build = ChatRoomDto.builder()
286+
.id(chatRoom.getId())
287+
.title(chatRoom.getTitle())
288+
.heartCount(chatRoom.getHearts().size())
289+
.currentUserCount((long) chatRoom.getUserChatRooms().size())
290+
.userCountMax(chatRoom.getUserCountMax())
291+
.build();
292+
chatRoomDtos.add(build);
293+
}
294+
return chatRoomDtos;
295+
}
253296
}
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: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
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.List;
8+
import java.util.Optional;
9+
10+
@Repository
11+
public interface HeartRepository extends JpaRepository<Heart, Long> {
12+
Optional<Heart> findByUserIdAndChatRoomId(Long userId, Long chatRoomId);
13+
14+
List<Heart> findByUserId(Long userId);
15+
}
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)