diff --git a/src/main/java/com/example/team4backend/controller/MessageController.java b/src/main/java/com/example/team4backend/controller/MessageController.java new file mode 100644 index 0000000..ae2f3bc --- /dev/null +++ b/src/main/java/com/example/team4backend/controller/MessageController.java @@ -0,0 +1,34 @@ +package com.example.team4backend.controller; + +import com.example.team4backend.common.response.ApiResult; +import com.example.team4backend.dto.MessageListResponse; +import com.example.team4backend.security.CustomUserDetails; +import com.example.team4backend.service.MessageService; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.RequiredArgsConstructor; +import org.springframework.http.ResponseEntity; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +@Tag(name = "Message", description = "메시지 관리 API") +@RestController +@RequestMapping("/messages") +@RequiredArgsConstructor +public class MessageController { + + private final MessageService messageService; + + @Operation(summary = "메시지 리스트 조회", description = "대상자별 이름, 추천 서두, 마지막 연락 날짜를 리스트로 조회합니다.") + @GetMapping + public ResponseEntity>> getMessageList( + @AuthenticationPrincipal CustomUserDetails userDetails + ) { + List messageList = messageService.getMessageList(userDetails.getId()); + return ResponseEntity.ok(ApiResult.ok(messageList)); + } +} diff --git a/src/main/java/com/example/team4backend/domain/TargetPerson.java b/src/main/java/com/example/team4backend/domain/TargetPerson.java index 53278ab..5967acf 100644 --- a/src/main/java/com/example/team4backend/domain/TargetPerson.java +++ b/src/main/java/com/example/team4backend/domain/TargetPerson.java @@ -49,6 +49,9 @@ public class TargetPerson extends BaseTimeEntity { private Instant lastMessageDate; + @Column(columnDefinition = "TEXT") + private String recommendedOpening; + private Instant deletedAt; @Builder diff --git a/src/main/java/com/example/team4backend/dto/MessageListResponse.java b/src/main/java/com/example/team4backend/dto/MessageListResponse.java new file mode 100644 index 0000000..24b7dce --- /dev/null +++ b/src/main/java/com/example/team4backend/dto/MessageListResponse.java @@ -0,0 +1,32 @@ +package com.example.team4backend.dto; + +import com.example.team4backend.domain.TargetPerson; +import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.v3.oas.annotations.media.Schema; + +import java.time.Instant; + +@Schema(description = "메시지 리스트 응답") +public record MessageListResponse( + @Schema(description = "대상자 ID", example = "1") + Long targetId, + + @Schema(description = "대상자 이름", example = "홍길동") + String name, + + @Schema(description = "추천 서두", example = "안녕하세요! 오랜만이에요") + String recommendedOpening, + + @Schema(description = "마지막 연락 날짜", example = "2024-01-15T10:30:00Z") + @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd'T'HH:mm:ss'Z'", timezone = "UTC") + Instant lastMessageDate +) { + public static MessageListResponse of(TargetPerson target, String recommendedOpening) { + return new MessageListResponse( + target.getId(), + target.getName(), + recommendedOpening, + target.getLastMessageDate() + ); + } +} diff --git a/src/main/java/com/example/team4backend/repository/TargetPersonRepository.java b/src/main/java/com/example/team4backend/repository/TargetPersonRepository.java index 1a1421f..231dded 100644 --- a/src/main/java/com/example/team4backend/repository/TargetPersonRepository.java +++ b/src/main/java/com/example/team4backend/repository/TargetPersonRepository.java @@ -37,4 +37,9 @@ public interface TargetPersonRepository extends JpaRepository getMessageList(Long userId) { + List targets = targetPersonRepository.findAllByUserIdWithDetailsAndDeletedAtIsNull(userId); + + return targets.stream() + .map(target -> MessageListResponse.of(target, target.getRecommendedOpening())) + .toList(); + } +}