From 2264fb26176b02ffc60e5cddd79b16dcdaa76cbd Mon Sep 17 00:00:00 2001 From: sohyundoh Date: Wed, 10 Jan 2024 17:05:30 +0900 Subject: [PATCH 1/5] =?UTF-8?q?#41=20[feat]=20API=20=EC=97=94=EB=93=9C?= =?UTF-8?q?=ED=8F=AC=EC=9D=B8=ED=8A=B8=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../mile/controller/moim/MoimController.java | 9 +++++++++ .../moim/MoimControllerSwagger.java | 19 ++++++++++++++++++- .../mile/exception/message/ErrorMessage.java | 1 + .../exception/message/SuccessMessage.java | 1 + .../moim/serivce/dto/MoimTopicResponse.java | 12 ++++++++++++ .../topic/serivce/dto/ContentResponse.java | 2 +- 6 files changed, 42 insertions(+), 2 deletions(-) create mode 100644 module-domain/src/main/java/com/mile/moim/serivce/dto/MoimTopicResponse.java 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 132b83d0..f1578ce2 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 lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; @@ -36,4 +37,12 @@ public SuccessResponse getAuthenticationOfMoim( ) { return SuccessResponse.of(SuccessMessage.MOIM_AUTHENTICATE_SUCCESS, moimService.getAuthenticateUserOfMoim(moimId, Long.valueOf(principal.getName()))); } + + @GetMapping("/{moimId}/topic") + @Override + public SuccessResponse getTopicFromTopic( + @PathVariable Long moimId + ) { + return SuccessResponse.of(SuccessMessage.MOIM_TOPIC_GET_SUCCESS, moimService.getTopicFromMoim(moimId)); + } } 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 d57de18b..ada978b5 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 io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.media.Content; import io.swagger.v3.oas.annotations.media.Schema; @@ -37,7 +38,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))) @@ -47,4 +49,19 @@ SuccessResponse getAuthenticationOfMoim( final Long moimId, 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 getTopicFromTopic( + @PathVariable Long moimId + ); } 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 b7d60f6e..f946b0ac 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 5ce6de93..abc5f6f4 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 @@ -19,6 +19,7 @@ public enum SuccessMessage { CURIOUS_DELETE_SUCCESS(HttpStatus.OK.value(), "궁금해요 삭제가 완료되었습니다."), WRITER_AUTHENTIACTE_SUCCESS(HttpStatus.OK.value(), "게시글 권한이 확인되었습니다."), POST_PUT_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/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/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()); } } From e2ef4b854c0602f22b6e7d4c8f8962a77201eb91 Mon Sep 17 00:00:00 2001 From: sohyundoh Date: Wed, 10 Jan 2024 17:07:39 +0900 Subject: [PATCH 2/5] =?UTF-8?q?#41=20[feat]=20topic=20=ED=95=84=EB=93=9C?= =?UTF-8?q?=EB=AA=85=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- module-domain/src/main/java/com/mile/topic/domain/Topic.java | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) 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; } From 67ab2374c3fc0bbc11153db62bc95707c034397a Mon Sep 17 00:00:00 2001 From: sohyundoh Date: Wed, 10 Jan 2024 17:08:10 +0900 Subject: [PATCH 3/5] =?UTF-8?q?#41=20[feat]=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mile/moim/serivce/MoimService.java | 19 +++++++++++++++ .../topic/repository/TopicRepository.java | 2 +- .../repository/TopicRepositoryCustom.java | 11 +++++++++ .../topic/repository/TopicRepositoryImpl.java | 24 +++++++++++++++++++ .../com/mile/topic/serivce/TopicService.java | 10 ++++++++ 5 files changed, 65 insertions(+), 1 deletion(-) create mode 100644 module-domain/src/main/java/com/mile/topic/repository/TopicRepositoryCustom.java create mode 100644 module-domain/src/main/java/com/mile/topic/repository/TopicRepositoryImpl.java 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 ad5fd577..d882b087 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 @@ -2,8 +2,12 @@ import com.mile.exception.message.ErrorMessage; import com.mile.exception.model.ForbiddenException; +import com.mile.exception.model.NotFoundException; +import com.mile.moim.domain.Moim; +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.topic.serivce.TopicService; import com.mile.writerName.serivce.WriterNameService; import lombok.RequiredArgsConstructor; @@ -14,6 +18,7 @@ public class MoimService { private final WriterNameService writerNameService; private final TopicService topicService; + private final MoimRepository moimRepository; public ContentListResponse getContentsFromMoim( final Long moimId, @@ -38,4 +43,18 @@ 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))); + } } 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) + ); + } } From 8f1e8935c43fd11722c248da98186a60611aadd1 Mon Sep 17 00:00:00 2001 From: sohyundoh Date: Wed, 10 Jan 2024 21:18:13 +0900 Subject: [PATCH 4/5] =?UTF-8?q?#50=20[feat]=20MoimController=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mile/controller/moim/MoimController.java | 9 +++++---- .../com/mile/controller/moim/MoimControllerSwagger.java | 2 +- 2 files changed, 6 insertions(+), 5 deletions(-) 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 f1578ce2..2ee9812c 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 @@ -20,8 +20,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 +29,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,9 +38,10 @@ public SuccessResponse getAuthenticationOfMoim( return SuccessResponse.of(SuccessMessage.MOIM_AUTHENTICATE_SUCCESS, moimService.getAuthenticateUserOfMoim(moimId, Long.valueOf(principal.getName()))); } - @GetMapping("/{moimId}/topic") + @Override - public SuccessResponse getTopicFromTopic( + @GetMapping("/{moimId}/topic") + public SuccessResponse getTopicFromMoim( @PathVariable Long moimId ) { return SuccessResponse.of(SuccessMessage.MOIM_TOPIC_GET_SUCCESS, moimService.getTopicFromMoim(moimId)); 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 ada978b5..427a32f6 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 @@ -61,7 +61,7 @@ SuccessResponse getAuthenticationOfMoim( content = @Content(schema = @Schema(implementation = ErrorResponse.class))) } ) - SuccessResponse getTopicFromTopic( + SuccessResponse getTopicFromMoim( @PathVariable Long moimId ); } From f863016efbfc6391fbd184764aef4298ef389171 Mon Sep 17 00:00:00 2001 From: sohyundoh Date: Thu, 11 Jan 2024 18:24:01 +0900 Subject: [PATCH 5/5] =?UTF-8?q?#50=20[feat]=20=EC=98=A4=ED=83=80=20?= =?UTF-8?q?=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mile/controller/moim/MoimControllerSwagger.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) 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 427a32f6..7886c888 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 @@ -38,7 +38,7 @@ SuccessResponse getTopicsFromMoim( @ApiResponses( value = { @ApiResponse(responseCode = "200", description = "사용자의 권한이 확인되었습니다."), - @ApiResponse(responseCode = "403", description = "사용자 검증 토큰이 유효하지 안습니다.", + @ApiResponse(responseCode = "403", description = "사용자 검증 토큰이 유효하지 않습니다.", content = @Content(schema = @Schema(implementation = ErrorResponse.class)) ), @ApiResponse(responseCode = "500", description = "서버 내부 오류입니다.",