diff --git a/module-api/src/main/java/com/mile/controller/moim/MoimController.java b/module-api/src/main/java/com/mile/controller/moim/MoimController.java index 3c1e324d..22ccf752 100644 --- a/module-api/src/main/java/com/mile/controller/moim/MoimController.java +++ b/module-api/src/main/java/com/mile/controller/moim/MoimController.java @@ -4,6 +4,7 @@ import com.mile.exception.message.SuccessMessage; import com.mile.moim.serivce.MoimService; import com.mile.moim.serivce.dto.ContentListResponse; +import com.mile.moim.serivce.dto.MoimTopicResponse; import com.mile.moim.serivce.dto.MoimInfoResponse; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; @@ -20,8 +21,8 @@ public class MoimController implements MoimControllerSwagger { private final MoimService moimService; - @GetMapping("/{moimId}") @Override + @GetMapping("/{moimId}") public SuccessResponse getTopicsFromMoim( @PathVariable final Long moimId, final Principal principal @@ -29,8 +30,8 @@ public SuccessResponse getTopicsFromMoim( return SuccessResponse.of(SuccessMessage.TOPIC_SEARCH_SUCCESS, moimService.getContentsFromMoim(moimId, Long.valueOf(principal.getName()))); } - @GetMapping("/{moimId}/authenticate") @Override + @GetMapping("/{moimId}/authenticate") public SuccessResponse getAuthenticationOfMoim( final Long moimId, final Principal principal @@ -38,6 +39,16 @@ public SuccessResponse getAuthenticationOfMoim( return SuccessResponse.of(SuccessMessage.MOIM_AUTHENTICATE_SUCCESS, moimService.getAuthenticateUserOfMoim(moimId, Long.valueOf(principal.getName()))); } + + @Override + @GetMapping("/{moimId}/topic") + public SuccessResponse getTopicFromMoim( + @PathVariable Long moimId + ) { + return SuccessResponse.of(SuccessMessage.MOIM_TOPIC_GET_SUCCESS, moimService.getTopicFromMoim(moimId)); + + } + @GetMapping("/{moimId}/info") @Override public SuccessResponse getMoimInfo( diff --git a/module-api/src/main/java/com/mile/controller/moim/MoimControllerSwagger.java b/module-api/src/main/java/com/mile/controller/moim/MoimControllerSwagger.java index 2afa9200..007c097d 100644 --- a/module-api/src/main/java/com/mile/controller/moim/MoimControllerSwagger.java +++ b/module-api/src/main/java/com/mile/controller/moim/MoimControllerSwagger.java @@ -3,6 +3,7 @@ import com.mile.dto.ErrorResponse; import com.mile.dto.SuccessResponse; import com.mile.moim.serivce.dto.ContentListResponse; +import com.mile.moim.serivce.dto.MoimTopicResponse; import com.mile.moim.serivce.dto.MoimInfoResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; @@ -38,7 +39,8 @@ SuccessResponse getTopicsFromMoim( @ApiResponses( value = { @ApiResponse(responseCode = "200", description = "사용자의 권한이 확인되었습니다."), - @ApiResponse(responseCode = "403", description = "사용자 검증 토큰이 유효하지 안습니다.", content = @Content(schema = @Schema(implementation = ErrorResponse.class)) + @ApiResponse(responseCode = "403", description = "사용자 검증 토큰이 유효하지 않습니다.", + content = @Content(schema = @Schema(implementation = ErrorResponse.class)) ), @ApiResponse(responseCode = "500", description = "서버 내부 오류입니다.", content = @Content(schema = @Schema(implementation = ErrorResponse.class))) @@ -49,6 +51,21 @@ SuccessResponse getAuthenticationOfMoim( final Principal principal ); + + @Operation(summary = "글모임 최근 글감 ") + @ApiResponses( + value = { + @ApiResponse(responseCode = "200", description = "글감 조회가 완료되었습니다."), + @ApiResponse(responseCode = "404", description = "1. 해당 글모임이 존재하지 않습니다.\n 2.해당 모임의 주제가 존재하지 않습니다.", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))), + @ApiResponse(responseCode = "500", description = "서버 내부 오류입니다.", + content = @Content(schema = @Schema(implementation = ErrorResponse.class))) + } + ) + SuccessResponse getTopicFromMoim( + @PathVariable Long moimId + ); + @Operation(summary = "글모임 뷰 - 글모임 정보 조회") @ApiResponses( value = { diff --git a/module-common/src/main/java/com/mile/exception/message/ErrorMessage.java b/module-common/src/main/java/com/mile/exception/message/ErrorMessage.java index 37ff82a8..cabeef13 100644 --- a/module-common/src/main/java/com/mile/exception/message/ErrorMessage.java +++ b/module-common/src/main/java/com/mile/exception/message/ErrorMessage.java @@ -22,6 +22,7 @@ public enum ErrorMessage { COMMENT_NOT_FOUND(HttpStatus.NOT_FOUND.value(), "해당 댓글이 존재하지 않습니다."), CURIOUS_NOT_FOUND(HttpStatus.NOT_FOUND.value(), "해당 궁금해요는 존재하지 않습니다."), TOPIC_NOT_FOUND(HttpStatus.NOT_FOUND.value(), "해당 주제가 존재하지 않습니다."), + MOIM_TOPIC_NOT_FOUND(HttpStatus.NOT_FOUND.value(), "해당 모임의 주제가 존재하지 않습니다."), /* Bad Request */ diff --git a/module-common/src/main/java/com/mile/exception/message/SuccessMessage.java b/module-common/src/main/java/com/mile/exception/message/SuccessMessage.java index b354f1fc..65a6f130 100644 --- a/module-common/src/main/java/com/mile/exception/message/SuccessMessage.java +++ b/module-common/src/main/java/com/mile/exception/message/SuccessMessage.java @@ -22,6 +22,8 @@ public enum SuccessMessage { MOIM_INFO_SUCCESS(HttpStatus.OK.value(), "글모임 조회가 완료되었습니다."), PRESIGNED_URL_GET_SUCCESS(HttpStatus.OK.value(), "이미지를 업로드할 url이 발행되었습니다."), POST_DELETE_SUCCESS(HttpStatus.OK.value(), "글 삭제가 완료되었습니다."), + MOIM_TOPIC_GET_SUCCESS(HttpStatus.OK.value(), "글감 조회가 완료되었습니다."), + /* 201 CREATED */ diff --git a/module-domain/src/main/java/com/mile/moim/serivce/MoimService.java b/module-domain/src/main/java/com/mile/moim/serivce/MoimService.java index 044c1259..f269deab 100644 --- a/module-domain/src/main/java/com/mile/moim/serivce/MoimService.java +++ b/module-domain/src/main/java/com/mile/moim/serivce/MoimService.java @@ -7,6 +7,7 @@ import com.mile.moim.repository.MoimRepository; import com.mile.moim.serivce.dto.ContentListResponse; import com.mile.moim.serivce.dto.MoimAuthenticateResponse; +import com.mile.moim.serivce.dto.MoimTopicResponse; import com.mile.moim.serivce.dto.MoimInfoResponse; import com.mile.topic.serivce.TopicService; import com.mile.utils.DateUtil; @@ -44,7 +45,20 @@ public MoimAuthenticateResponse getAuthenticateUserOfMoim( ) { return MoimAuthenticateResponse.of(writerNameService.isUserInMoim(moimId, userId)); } + private Moim findById( + final Long moimId + ) { + return moimRepository.findById(moimId).orElseThrow( + () -> new NotFoundException(ErrorMessage.MOIM_NOT_FOUND) + ); + } + public MoimTopicResponse getTopicFromMoim( + final Long moimId + ) { + return MoimTopicResponse.of(topicService.findLatestTopicByMoim(findById(moimId))); + } + public MoimInfoResponse getMoimInfo( final Long moimId ) { diff --git a/module-domain/src/main/java/com/mile/moim/serivce/dto/MoimTopicResponse.java b/module-domain/src/main/java/com/mile/moim/serivce/dto/MoimTopicResponse.java new file mode 100644 index 00000000..7089d026 --- /dev/null +++ b/module-domain/src/main/java/com/mile/moim/serivce/dto/MoimTopicResponse.java @@ -0,0 +1,12 @@ +package com.mile.moim.serivce.dto; + +public record MoimTopicResponse( + String content +) { + + public static MoimTopicResponse of( + final String content + ) { + return new MoimTopicResponse(content); + } +} diff --git a/module-domain/src/main/java/com/mile/topic/domain/Topic.java b/module-domain/src/main/java/com/mile/topic/domain/Topic.java index 027b1a9f..969be9c8 100644 --- a/module-domain/src/main/java/com/mile/topic/domain/Topic.java +++ b/module-domain/src/main/java/com/mile/topic/domain/Topic.java @@ -15,11 +15,9 @@ public class Topic extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; - @ManyToOne private Moim moim; - private String keyword; - private String topic; + private String content; private String description; } diff --git a/module-domain/src/main/java/com/mile/topic/repository/TopicRepository.java b/module-domain/src/main/java/com/mile/topic/repository/TopicRepository.java index 72e678df..701729b9 100644 --- a/module-domain/src/main/java/com/mile/topic/repository/TopicRepository.java +++ b/module-domain/src/main/java/com/mile/topic/repository/TopicRepository.java @@ -5,7 +5,7 @@ import java.util.List; -public interface TopicRepository extends JpaRepository { +public interface TopicRepository extends JpaRepository, TopicRepositoryCustom { public List findByMoimId(final Long moimId); } diff --git a/module-domain/src/main/java/com/mile/topic/repository/TopicRepositoryCustom.java b/module-domain/src/main/java/com/mile/topic/repository/TopicRepositoryCustom.java new file mode 100644 index 00000000..f6abba38 --- /dev/null +++ b/module-domain/src/main/java/com/mile/topic/repository/TopicRepositoryCustom.java @@ -0,0 +1,11 @@ +package com.mile.topic.repository; + +import com.mile.moim.domain.Moim; + +import java.util.Optional; + +public interface TopicRepositoryCustom { + + Optional findLatestTopicByMoim(final Moim moim); + +} diff --git a/module-domain/src/main/java/com/mile/topic/repository/TopicRepositoryImpl.java b/module-domain/src/main/java/com/mile/topic/repository/TopicRepositoryImpl.java new file mode 100644 index 00000000..20efcffb --- /dev/null +++ b/module-domain/src/main/java/com/mile/topic/repository/TopicRepositoryImpl.java @@ -0,0 +1,24 @@ +package com.mile.topic.repository; + +import com.mile.moim.domain.Moim; +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; + +import java.util.Optional; + +import static com.mile.topic.domain.QTopic.topic; + +@RequiredArgsConstructor +public class TopicRepositoryImpl implements TopicRepositoryCustom { + + private final JPAQueryFactory jpaQueryFactory; + + @Override + public Optional findLatestTopicByMoim(final Moim moim) { + return Optional.ofNullable(jpaQueryFactory.selectFrom(topic) + .select(topic.content) + .where(topic.moim.eq(moim)) + .orderBy(topic.createdAt.desc()) + .fetchFirst()); + } +} diff --git a/module-domain/src/main/java/com/mile/topic/serivce/TopicService.java b/module-domain/src/main/java/com/mile/topic/serivce/TopicService.java index 16f055a4..82d4ab13 100644 --- a/module-domain/src/main/java/com/mile/topic/serivce/TopicService.java +++ b/module-domain/src/main/java/com/mile/topic/serivce/TopicService.java @@ -3,6 +3,7 @@ import com.mile.config.BaseTimeEntity; import com.mile.exception.message.ErrorMessage; import com.mile.exception.model.NotFoundException; +import com.mile.moim.domain.Moim; import com.mile.topic.domain.Topic; import com.mile.topic.repository.TopicRepository; import com.mile.topic.serivce.dto.ContentResponse; @@ -61,4 +62,13 @@ public Topic findById( () -> new NotFoundException(ErrorMessage.TOPIC_NOT_FOUND) ); } + + public String findLatestTopicByMoim( + final Moim moim + ) { + return topicRepository.findLatestTopicByMoim(moim) + .orElseThrow( + () -> new NotFoundException(ErrorMessage.MOIM_TOPIC_NOT_FOUND) + ); + } } diff --git a/module-domain/src/main/java/com/mile/topic/serivce/dto/ContentResponse.java b/module-domain/src/main/java/com/mile/topic/serivce/dto/ContentResponse.java index 69cf182a..2a138c18 100644 --- a/module-domain/src/main/java/com/mile/topic/serivce/dto/ContentResponse.java +++ b/module-domain/src/main/java/com/mile/topic/serivce/dto/ContentResponse.java @@ -9,6 +9,6 @@ public record ContentResponse( public static ContentResponse of( final Topic topic ) { - return new ContentResponse(topic.getId(), topic.getTopic()); + return new ContentResponse(topic.getId(), topic.getContent()); } }