Skip to content

Commit

Permalink
feat: ✨ Fetch Summary of Chatrooms Joined by User (#187)
Browse files Browse the repository at this point in the history
* feat: find chatroom ids where user is joined

* rename: change from find to read by the convention

* feat: search chat_room_ids business logic where user is joined

* feat: add chat_room summary response dto

* feat: impl get my chatroom id in summary

* feat: add to query parameter where chatroom_controller.get_my_chat_rooms()

* rename: when fetch chatrooms summary info, domain-name's place is allocated singular nouns
  • Loading branch information
psychology50 authored Oct 31, 2024
1 parent 19be782 commit 6aa5578
Show file tree
Hide file tree
Showing 7 changed files with 54 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

@Tag(name = "[μ±„νŒ…λ°© API]")
public interface ChatRoomApi {
Expand All @@ -25,8 +26,9 @@ public interface ChatRoomApi {
ResponseEntity<?> createChatRoom(@RequestBody ChatRoomReq.Create request, @AuthenticationPrincipal SecurityUserDetails user);

@Operation(summary = "κ°€μž…ν•œ μ±„νŒ…λ°© λͺ©λ‘ 쑰회", method = "GET", description = "μ‚¬μš©μžκ°€ κ°€μž…ν•œ μ±„νŒ…λ°© λͺ©λ‘μ„ μ‘°νšŒν•˜λ©°, μ •λ ¬ μˆœμ„œλŠ” 보μž₯ν•˜μ§€ μ•ŠλŠ”λ‹€. 졜근 ν™œμ„±ν™”λœ μ±„νŒ…λ°©μ˜ μˆœμ„œλ₯Ό 지정할 방법에 λŒ€ν•΄ μΆ”κ°€ κ°œμ„ μ΄ ν•„μš”ν•œ APIμ΄λ―€λ‘œ, μΆ”ν›„ κΈ°λŠ₯이 일뢀 μˆ˜μ •λ  μˆ˜λ„ μžˆλ‹€.")
@Parameter(name = "summary", description = "μ±„νŒ…λ°© μš”μ•½ 정보 쑰회 μ—¬λΆ€. true둜 μ„€μ •ν•˜λ©΄ μ±„νŒ…λ°©μ˜ 상세 정보가 chatRoomIds ν•„λ“œλ§Œ λ°˜ν™˜λœλ‹€. (default=false)", example = "false")
@ApiResponse(responseCode = "200", description = "κ°€μž…ν•œ μ±„νŒ…λ°© λͺ©λ‘ 쑰회 성곡", content = @Content(schemaProperties = @SchemaProperty(name = "chatRooms", array = @ArraySchema(schema = @Schema(implementation = ChatRoomRes.Detail.class)))))
ResponseEntity<?> getMyChatRooms(@AuthenticationPrincipal SecurityUserDetails user);
ResponseEntity<?> getMyChatRooms(@RequestParam(name = "summary", required = false, defaultValue = "false") boolean query, @AuthenticationPrincipal SecurityUserDetails user);

@Operation(summary = "μ±„νŒ…λ°© 검색", method = "GET", description = "μ‚¬μš©μžκ°€ κ°€μž…ν•œ μ±„νŒ…λ°© 쀑 검색어에 μΌμΉ˜ν•˜λŠ” μ±„νŒ…λ°© λͺ©λ‘μ„ μ‘°νšŒν•œλ‹€. 검색 κ²°κ³ΌλŠ” λ¬΄ν•œ 슀크둀 μ‘λ‹΅μœΌλ‘œ λ°˜ν™˜λ˜λ©°, μ •λ ¬ μˆœμ„œλŠ” 정확도가 높은 순으둜 λ°˜ν™˜λœλ‹€. contents ν•„λ“œλŠ” List<ChatRoomRes.Detail> νƒ€μž…μœΌλ‘œ, 'κ°€μž…ν•œ μ±„νŒ…λ°© λͺ©λ‘ 쑰회' API 응닡과 λ™μΌν•˜λ‹€.")
@Parameters({
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,11 @@ public ResponseEntity<?> createChatRoom(@Validated @RequestBody ChatRoomReq.Crea
@Override
@GetMapping("/me")
@PreAuthorize("isAuthenticated()")
public ResponseEntity<?> getMyChatRooms(@AuthenticationPrincipal SecurityUserDetails user) {
public ResponseEntity<?> getMyChatRooms(@RequestParam(name = "summary", required = false, defaultValue = "false") boolean isSummary, @AuthenticationPrincipal SecurityUserDetails user) {
if (isSummary) {
return ResponseEntity.ok(SuccessResponse.from(CHAT_ROOM, chatRoomUseCase.readJoinedChatRoomIds(user.getUserId())));
}

return ResponseEntity.ok(SuccessResponse.from(CHAT_ROOMS, chatRoomUseCase.getChatRooms(user.getUserId())));
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@

import java.time.LocalDateTime;
import java.util.Objects;
import java.util.Set;

public final class ChatRoomRes {
@Schema(description = "μ±„νŒ…λ°© 상세 정보")
Expand Down Expand Up @@ -55,4 +56,11 @@ public static Detail from(ChatRoom chatRoom, boolean isAdmin, int participantCou
);
}
}

@Schema(description = "μ±„νŒ…λ°© μš”μ•½ 정보")
public record Summary(
@Schema(description = "μ±„νŒ…λ°© ID λͺ©λ‘. 빈 λͺ©λ‘μΌ 경우 빈 배열이 λ°˜ν™˜λœλ‹€. 각 μš”μ†ŒλŠ” long νƒ€μž…μ΄λ‹€.")
Set<Long> chatRoomIds
) {
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package kr.co.pennyway.api.apis.chat.service;

import kr.co.pennyway.domain.domains.member.service.ChatMemberService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.Set;

@Slf4j
@Service
@RequiredArgsConstructor
public class ChatMemberSearchService {
private final ChatMemberService chatMemberService;

public Set<Long> readJoinedChatRoomIds(Long userId) {
return chatMemberService.readChatRoomIdsByUserId(userId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
import kr.co.pennyway.api.apis.chat.dto.ChatRoomReq;
import kr.co.pennyway.api.apis.chat.dto.ChatRoomRes;
import kr.co.pennyway.api.apis.chat.mapper.ChatRoomMapper;
import kr.co.pennyway.api.apis.chat.service.ChatMemberSearchService;
import kr.co.pennyway.api.apis.chat.service.ChatRoomSaveService;
import kr.co.pennyway.api.apis.chat.service.ChatRoomSearchService;
import kr.co.pennyway.api.common.response.SliceResponseTemplate;
Expand All @@ -14,13 +15,16 @@
import org.springframework.data.domain.Slice;

import java.util.List;
import java.util.Set;

@UseCase
@RequiredArgsConstructor
public class ChatRoomUseCase {
private final ChatRoomSaveService chatRoomSaveService;
private final ChatRoomSearchService chatRoomSearchService;

private final ChatMemberSearchService chatMemberSearchService;

public ChatRoomRes.Detail createChatRoom(ChatRoomReq.Create request, Long userId) {
ChatRoom chatRoom = chatRoomSaveService.createChatRoom(request, userId);

Expand All @@ -33,6 +37,12 @@ public List<ChatRoomRes.Detail> getChatRooms(Long userId) {
return ChatRoomMapper.toChatRoomResDetails(chatRooms);
}

public ChatRoomRes.Summary readJoinedChatRoomIds(Long userId) {
Set<Long> chatRoomIds = chatMemberSearchService.readJoinedChatRoomIds(userId);

return new ChatRoomRes.Summary(chatRoomIds);
}

public SliceResponseTemplate<ChatRoomRes.Detail> searchChatRooms(Long userId, String target, Pageable pageable) {
Slice<ChatRoomDetail> chatRooms = chatRoomSearchService.readChatRoomsBySearch(userId, target, pageable);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,4 +14,8 @@ public interface ChatMemberRepository extends ExtendedRepository<ChatMember, Lon
@Transactional(readOnly = true)
@Query("SELECT COUNT(*) FROM ChatMember cm WHERE cm.chatRoom.id = :chatRoomId AND cm.deletedAt IS NULL")
long countByChatRoomIdAndActive(Long chatRoomId);

@Transactional(readOnly = true)
@Query("SELECT cm.chatRoom.id FROM ChatMember cm WHERE cm.user.id = :userId AND cm.deletedAt IS NULL")
Set<Long> findChatRoomIdsByUserId(Long userId);
}
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ public ChatMember createMember(User user, ChatRoom chatRoom) {
return chatMemberRepository.save(chatMember);
}

@Transactional
public Set<Long> readChatRoomIdsByUserId(Long userId) {
return chatMemberRepository.findChatRoomIdsByUserId(userId);
}

/**
* μ±„νŒ…λ°©μ— ν•΄λ‹Ή μœ μ €κ°€ μ‘΄μž¬ν•˜λŠ”μ§€ ν™•μΈν•œλ‹€.
* 이 λ•Œ, μ‚­μ œλœ μ‚¬μš©μž λ°μ΄ν„°λŠ” μ‘°νšŒν•˜μ§€ μ•ŠλŠ”λ‹€.
Expand Down

0 comments on commit 6aa5578

Please sign in to comment.