diff --git a/.github/workflows/stag-client-api-deploy.yml b/.github/workflows/stag-client-api-deploy.yml new file mode 100644 index 00000000..f6f98d9e --- /dev/null +++ b/.github/workflows/stag-client-api-deploy.yml @@ -0,0 +1,48 @@ +name: stag-client-api-deploy + +on: + push: + branches: [ "stag/client" ] + workflow_dispatch: + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-java@v3 + with: + distribution: 'corretto' + java-version: '17' + + - name: app clean + run: ./gradlew clean + + - name: client api build + run: ./gradlew :likelion-client:build -x test + + - name: Docker login + uses: docker/login-action@v2 + with: + username: ${{ secrets.DOCKERHUB_EMAIL }} + password: ${{ secrets.DOCKERHUB_PASSWORD }} + + - name: Build and push + uses: docker/build-push-action@v3 + with: + context: ./likelion-client + push: true + tags: ${{ secrets.DOCKER_CLIENT_API_STAG_IMAGE }} + build-args: PROFILE=stag + + - name: client-api-deploy + uses: appleboy/ssh-action@master + with: + host: ${{ secrets.HOST }} + username: ubuntu + key: ${{ secrets.KEY }} + script: | + sudo docker rm -f ${{ secrets.DOCKER_CLIENT_API_STAG_CONTAINER }} + sudo docker rmi ${{ secrets.DOCKER_CLIENT_API_STAG_IMAGE }} + docker-compose -f ${{ secrets.DOCKER_COMPOSE_DIRECTORY }} up -d + docker image prune -f diff --git a/.gitignore b/.gitignore index f512adb2..c768528b 100644 --- a/.gitignore +++ b/.gitignore @@ -40,3 +40,6 @@ out/ ### env file ### .env.dev .env.* + +### .DS_Store ignore ### +.DS_Store diff --git a/build.gradle b/build.gradle index e7b53966..4d7fcbc2 100644 --- a/build.gradle +++ b/build.gradle @@ -1,19 +1,23 @@ plugins { - id 'java' + id 'java-library' id 'org.springframework.boot' version '2.7.13' id 'io.spring.dependency-management' version '1.0.15.RELEASE' } -group = 'likelion.univ' -version = '0.0.1-SNAPSHOT' - -java { - sourceCompatibility = '17' -} +allprojects { + group = 'likelion.univ' + version = '0.0.1-SNAPSHOT' -configurations { - compileOnly { - extendsFrom annotationProcessor + java { + sourceCompatibility = 17 + targetCompatibility = 17 + } + repositories { + mavenCentral() + } + dependencies { +// implementation 'org.springframework.boot:spring-boot-starter' +// annotationProcessor('org.springframework.boot:spring-boot-configuration-processor:3.0.4') } } @@ -30,16 +34,11 @@ subprojects { apply plugin: 'org.springframework.boot' apply plugin: 'io.spring.dependency-management' - sourceCompatibility = 17 - targetCompatibility = 17 - - group = 'likelion.univ' - version = '0.0.1-SNAPSHOT' - - repositories { - mavenCentral() + configurations { + compileOnly { + extendsFrom annotationProcessor + } } - dependencies { implementation 'org.springframework.boot:spring-boot-starter' testImplementation 'org.springframework.boot:spring-boot-starter-test' @@ -47,4 +46,11 @@ subprojects { annotationProcessor 'org.projectlombok:lombok' annotationProcessor("org.springframework.boot:spring-boot-configuration-processor") } -} \ No newline at end of file + test { + useJUnitPlatform() + } +} +bootJar { + enabled = false +} + diff --git a/likelion-admin/Dockerfile b/likelion-admin/Dockerfile index 4de98a9b..92de7192 100644 --- a/likelion-admin/Dockerfile +++ b/likelion-admin/Dockerfile @@ -1,6 +1,5 @@ FROM openjdk:17 -ARG JAR_FILE=build/libs/*.jar +ARG JAR_FILE=./build/libs/*.jar COPY ${JAR_FILE} app.jar -EXPOSE 8090 -ENTRYPOINT ["java","-jar","-Duser.timezone=Asia/Seoul","-Dspring.profiles.active=${PROFILE}","/app.jar"] \ No newline at end of file +ENTRYPOINT ["java","-jar","-Duser.timezone=Asia/Seoul","-Dspring.profiles.active=${PROFILE}","/app.jar"] diff --git a/likelion-admin/build.gradle b/likelion-admin/build.gradle index 282bcc5b..3ed4da9f 100644 --- a/likelion-admin/build.gradle +++ b/likelion-admin/build.gradle @@ -1,15 +1,5 @@ -plugins { - id 'java' -} - -group = 'likelion.univ' -version = '0.0.1-SNAPSHOT' - -repositories { - mavenCentral() -} - dependencies { + implementation 'org.springframework.boot:spring-boot-starter-validation' testImplementation platform('org.junit:junit-bom:5.9.1') testImplementation 'org.junit.jupiter:junit-jupiter' @@ -28,14 +18,3 @@ dependencies { implementation project(':likelion-infrastructure') } -test { - useJUnitPlatform() -} - -bootJar { - enabled = true -} - -jar { - enabled = true -} \ No newline at end of file diff --git a/likelion-admin/src/main/resources/application.yml b/likelion-admin/src/main/resources/application.yml index dbb1c423..16f3243d 100644 --- a/likelion-admin/src/main/resources/application.yml +++ b/likelion-admin/src/main/resources/application.yml @@ -42,4 +42,4 @@ spring: spring: config: activate: - on-profile: prod \ No newline at end of file + on-profile: prod diff --git a/likelion-client/Dockerfile b/likelion-client/Dockerfile index 3c790882..28c361b4 100644 --- a/likelion-client/Dockerfile +++ b/likelion-client/Dockerfile @@ -1,5 +1,4 @@ FROM openjdk:17 -ARG JAR_FILE=build/libs/*.jar -COPY ${JAR_FILE} app.jar +COPY ./build/libs/*.jar app.jar -ENTRYPOINT ["java","-jar","-Duser.timezone=Asia/Seoul","-Dspring.profiles.active=${PROFILE}","/app.jar"] \ No newline at end of file +ENTRYPOINT ["java","-jar","-Duser.timezone=Asia/Seoul","-Dspring.profiles.active=${PROFILE}","/app.jar"] diff --git a/likelion-client/build.gradle b/likelion-client/build.gradle index acc5a137..fed02f79 100644 --- a/likelion-client/build.gradle +++ b/likelion-client/build.gradle @@ -1,14 +1,3 @@ -plugins { - id 'java' -} - -group = 'likelion.univ' -version = '0.0.1-SNAPSHOT' - -repositories { - mavenCentral() -} - dependencies { implementation 'org.springframework.boot:spring-boot-starter-web' @@ -22,6 +11,8 @@ dependencies { testImplementation platform('org.junit:junit-bom:5.9.1') testImplementation 'org.junit.jupiter:junit-jupiter' + + /* core 모듈 추가 */ implementation project(':likelion-core') /* redis 모듈 추가 */ @@ -34,14 +25,3 @@ dependencies { implementation project(':likelion-infrastructure') } -test { - useJUnitPlatform() -} - -bootJar { - enabled = true -} - -jar { - enabled = true -} \ No newline at end of file diff --git a/likelion-client/src/main/java/likelion/univ/auth/controller/AuthController.java b/likelion-client/src/main/java/likelion/univ/auth/controller/AuthController.java index 4caa4b91..25f4283c 100644 --- a/likelion-client/src/main/java/likelion/univ/auth/controller/AuthController.java +++ b/likelion-client/src/main/java/likelion/univ/auth/controller/AuthController.java @@ -10,6 +10,7 @@ import likelion.univ.auth.usecase.SignUpUseCase; import likelion.univ.auth.dto.request.SignUpRequestDto; import likelion.univ.response.SuccessResponse; +import likelion.univ.utils.AuthentiatedUserUtils; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; @@ -23,6 +24,7 @@ public class AuthController { private final RequestIdTokenUseCase requestIdTokenUseCase; private final SignUpUseCase signUpUseCase; private final RefreshTokenUseCase refreshTokenUseCase; + private final AuthentiatedUserUtils userUtils; @Operation(summary = "id token 발급", description = "인가 코드로 id token을 발급받습니다.") @GetMapping("/{logintype}/idtoken") @@ -49,7 +51,6 @@ public SuccessResponse signUp( @RequestParam("idtoken") String idToken, @PathVariable("logintype") String loginType, @RequestBody SignUpRequestDto signUpRequestDto){ - AccountTokenDto accountTokenDto = signUpUseCase.execute(loginType,idToken,signUpRequestDto); return SuccessResponse.of(accountTokenDto); } @@ -61,4 +62,10 @@ public SuccessResponse refreshToken( AccountTokenDto accountTokenDto = refreshTokenUseCase.execute(refreshToken); return SuccessResponse.of(accountTokenDto); } + + @Operation(summary = "로그인 유저 Id 반환", description = "(for client only) 로그인 중인 유저의 Id를 얻습니다.") + @GetMapping("/loginuserid") + public SuccessResponse getLoginUserId() { + return SuccessResponse.of(userUtils.getCurrentUserId()); + } } diff --git a/likelion-client/src/main/java/likelion/univ/auth/usecase/SignUpUseCase.java b/likelion-client/src/main/java/likelion/univ/auth/usecase/SignUpUseCase.java index 791ac0b2..e77d320e 100644 --- a/likelion-client/src/main/java/likelion/univ/auth/usecase/SignUpUseCase.java +++ b/likelion-client/src/main/java/likelion/univ/auth/usecase/SignUpUseCase.java @@ -28,8 +28,7 @@ public AccountTokenDto execute(String loginType, SignUpRequestDto signUpRequestDto){ UserInfoFromIdToken userInfo = loginByIdTokenProcessor.execute(loginType, idToken); if (!userAdaptor.checkEmail(userInfo.getEmail())){ - Profile profile = Profile.profileForSignUp(userInfo.getNickname(), - userInfo.getProfileImage()); + Profile profile = Profile.fromName(signUpRequestDto.getName()); University university = universityAdaptor.findByName(signUpRequestDto.getUniversityName()); UniversityInfo universityInfo = UniversityInfo.universityInfoForSignUp(university, diff --git a/likelion-client/src/main/java/likelion/univ/comment/controller/CommentController.java b/likelion-client/src/main/java/likelion/univ/comment/controller/CommentController.java new file mode 100644 index 00000000..d2498f3b --- /dev/null +++ b/likelion-client/src/main/java/likelion/univ/comment/controller/CommentController.java @@ -0,0 +1,71 @@ +package likelion.univ.comment.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import likelion.univ.comment.dto.CommentCreateChildRequestDto; +import likelion.univ.comment.dto.CommentCreateParentRequestDto; +import likelion.univ.comment.dto.CommentUpdateRequestDto; +import likelion.univ.comment.repository.CommentReadRepository; +import likelion.univ.comment.usecase.*; +import likelion.univ.domain.comment.dto.CommentDetailResponseDto; +import likelion.univ.response.SuccessResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + + +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping("/v1/community/comments") +@Tag(name = "댓글", description = "댓글 API") +public class CommentController { + private final CreateParentCommentUseCase createParentCommentUseCase; + private final CreateChildCommentUseCase createChildCommentUseCase; + private final UpdateCommentUseCase updateCommentUseCase; + private final SoftDeleteCommentUseCase softDeleteCommentUseCase; + private final HardDeleteCommentUseCase hardDeleteCommentUseCase; + private final CommentReadRepository commentReadRepository; + + /* read */ + @Operation(summary = "댓글 조회", description = "게시글에 대한 댓글을 최신순으로 조회합니다.") + @GetMapping("/of/{postId}") + public SuccessResponse getComments(@PathVariable Long postId) { + List response = commentReadRepository.findAll(postId); + return SuccessResponse.of(response); + } + + + /* command */ + @Operation(summary = "댓글 작성", description = "부모 댓글을 생성합니다.") + @PostMapping("/parent") + public SuccessResponse createParentComment(@RequestBody CommentCreateParentRequestDto request) { + return createParentCommentUseCase.execute(request); + } + + @Operation(summary = "대댓글 작성", description = "자식 댓글을 생성합니다.") + @PostMapping("/child") + public SuccessResponse createChildComment(@RequestBody CommentCreateChildRequestDto request) { + return createChildCommentUseCase.execute(request); + } + + @Operation(summary = "댓글 내용 수정", description = "댓글의 내용(body only)을 수정합니다.") + @PatchMapping("/{commentId}") + public SuccessResponse updateComment(@PathVariable Long commentId, @RequestBody CommentUpdateRequestDto request) { + return updateCommentUseCase.execute(commentId, request); + } + + @Operation(summary = "댓글 삭제", description = "댓글을 soft delete 합니다.") + @PatchMapping("/disable/{commentId}") + public SuccessResponse deleteCommentSoft(@PathVariable Long commentId) { + return softDeleteCommentUseCase.execute(commentId);// soft delete + } + + @Operation(summary = "댓글 완전 삭제", description = "댓글을 hard delete 합니다.") + @DeleteMapping("/{commentId}") + public SuccessResponse deleteCommentHard(@PathVariable Long commentId) { + return hardDeleteCommentUseCase.execute(commentId); + } +} diff --git a/likelion-client/src/main/java/likelion/univ/comment/dto/CommentCreateChildRequestDto.java b/likelion-client/src/main/java/likelion/univ/comment/dto/CommentCreateChildRequestDto.java new file mode 100644 index 00000000..0b022024 --- /dev/null +++ b/likelion-client/src/main/java/likelion/univ/comment/dto/CommentCreateChildRequestDto.java @@ -0,0 +1,24 @@ +package likelion.univ.comment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Data +@Builder +@AllArgsConstructor +public class CommentCreateChildRequestDto { + @NotNull + @Schema(description = "게시글 id") + private Long postId; + @NotNull + @Schema(description = "대댓글을 다는 댓글 id") + private Long parentCommentId; + @NotBlank + @Schema(description = "대댓글 내용", example = "대댓글 내용입니다.") + private String body; +} diff --git a/likelion-client/src/main/java/likelion/univ/comment/dto/CommentCreateParentRequestDto.java b/likelion-client/src/main/java/likelion/univ/comment/dto/CommentCreateParentRequestDto.java new file mode 100644 index 00000000..6681bcab --- /dev/null +++ b/likelion-client/src/main/java/likelion/univ/comment/dto/CommentCreateParentRequestDto.java @@ -0,0 +1,21 @@ +package likelion.univ.comment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Data +@Builder +@AllArgsConstructor +public class CommentCreateParentRequestDto { + @NotNull + @Schema(description = "댓글을 다는 게시글 id") + private Long postId; + @NotBlank + @Schema(description = "댓글 내용", example = "댓글 내용입니다.") + private String body; +} diff --git a/likelion-client/src/main/java/likelion/univ/comment/dto/CommentRequestDto.java b/likelion-client/src/main/java/likelion/univ/comment/dto/CommentRequestDto.java deleted file mode 100644 index da6f85fd..00000000 --- a/likelion-client/src/main/java/likelion/univ/comment/dto/CommentRequestDto.java +++ /dev/null @@ -1,36 +0,0 @@ -package likelion.univ.comment.dto; - -import lombok.Builder; -import lombok.Data; - -public class CommentRequestDto { - @Data - @Builder - public static class CreateParent { - private Long postId; - private Long userId; - private String body; - } - - @Data - @Builder - public static class CreateChild { - private Long postId; - private Long userId; - private Long parentId; - private String body; - } - - @Data - @Builder - public static class EditComment { - private Long userId; - private String body; - } - - @Data - @Builder - public static class DeleteComment { - private Long userId; - } -} diff --git a/likelion-client/src/main/java/likelion/univ/comment/dto/CommentUpdateRequestDto.java b/likelion-client/src/main/java/likelion/univ/comment/dto/CommentUpdateRequestDto.java new file mode 100644 index 00000000..9dd4af5a --- /dev/null +++ b/likelion-client/src/main/java/likelion/univ/comment/dto/CommentUpdateRequestDto.java @@ -0,0 +1,18 @@ +package likelion.univ.comment.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Data +@Builder +@AllArgsConstructor +public class CommentUpdateRequestDto { + @NotBlank + @Schema(description = "변경하려는 댓글 내용", example = "변경된 댓글 내용입니다.") + private String body; +} diff --git a/likelion-client/src/main/java/likelion/univ/comment/repository/CommentReadRepository.java b/likelion-client/src/main/java/likelion/univ/comment/repository/CommentReadRepository.java new file mode 100644 index 00000000..0f7bf051 --- /dev/null +++ b/likelion-client/src/main/java/likelion/univ/comment/repository/CommentReadRepository.java @@ -0,0 +1,7 @@ +package likelion.univ.comment.repository; + +import likelion.univ.domain.comment.entity.Comment; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface CommentReadRepository extends JpaRepository, CommentReadRepositoryCustom { +} diff --git a/likelion-client/src/main/java/likelion/univ/comment/repository/CommentReadRepositoryCustom.java b/likelion-client/src/main/java/likelion/univ/comment/repository/CommentReadRepositoryCustom.java new file mode 100644 index 00000000..74f5ba7b --- /dev/null +++ b/likelion-client/src/main/java/likelion/univ/comment/repository/CommentReadRepositoryCustom.java @@ -0,0 +1,9 @@ +package likelion.univ.comment.repository; + +import likelion.univ.domain.comment.dto.CommentDetailResponseDto; + +import java.util.List; + +public interface CommentReadRepositoryCustom { + List findAll(Long postId); +} diff --git a/likelion-client/src/main/java/likelion/univ/comment/repository/CommentReadRepositoryCustomImpl.java b/likelion-client/src/main/java/likelion/univ/comment/repository/CommentReadRepositoryCustomImpl.java new file mode 100644 index 00000000..bb7d7e05 --- /dev/null +++ b/likelion-client/src/main/java/likelion/univ/comment/repository/CommentReadRepositoryCustomImpl.java @@ -0,0 +1,46 @@ +package likelion.univ.comment.repository; + +import com.querydsl.jpa.impl.JPAQueryFactory; +import likelion.univ.domain.comment.dto.CommentDetailResponseDto; +import likelion.univ.domain.comment.dto.QCommentDetailResponseDto; +import likelion.univ.utils.AuthentiatedUserUtils; +import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.NotNull; +import org.springframework.stereotype.Repository; + +import java.util.List; + +import static likelion.univ.domain.comment.entity.QComment.comment; +import static likelion.univ.domain.like.commentlike.entity.QCommentLike.commentLike; +import static likelion.univ.domain.user.entity.QUser.user; + +@Repository +@RequiredArgsConstructor +public class CommentReadRepositoryCustomImpl implements CommentReadRepositoryCustom { + private final JPAQueryFactory queryFactory; + private final AuthentiatedUserUtils userUtils; + + @Override + public List findAll(Long postId) { + return queryFactory + .select(commentDetailResponseDto()) + .from(comment) + .join(comment.author, user) +// .leftJoin(comment.commentLikes, commentLike) + .where(comment.post.id.eq(postId)) + .orderBy(comment.createdDate.asc()) + .fetch(); + } + + @NotNull + private static QCommentDetailResponseDto commentDetailResponseDto() { + return new QCommentDetailResponseDto( + comment.id, + comment.author.id, + comment.author.profile.name, + comment.parentComment.id, + comment.body, + comment.commentLikes.size(), + comment.isDeleted); + } +} diff --git a/likelion-client/src/main/java/likelion/univ/comment/usecase/CreateChildCommentUseCase.java b/likelion-client/src/main/java/likelion/univ/comment/usecase/CreateChildCommentUseCase.java index 8caf02ae..d404d52d 100644 --- a/likelion-client/src/main/java/likelion/univ/comment/usecase/CreateChildCommentUseCase.java +++ b/likelion-client/src/main/java/likelion/univ/comment/usecase/CreateChildCommentUseCase.java @@ -1,32 +1,30 @@ package likelion.univ.comment.usecase; import likelion.univ.annotation.UseCase; -import likelion.univ.comment.dto.CommentRequestDto; -import likelion.univ.domain.comment.adaptor.CommentAdaptor; -import likelion.univ.domain.comment.dto.CommentServiceDto; +import likelion.univ.comment.dto.CommentCreateChildRequestDto; +import likelion.univ.domain.comment.dto.CommentCommandResponseDto; +import likelion.univ.domain.comment.dto.CommentCreateChildServiceDto; import likelion.univ.domain.comment.service.CommentDomainService; -import likelion.univ.domain.post.adaptor.PostAdaptor; -import likelion.univ.domain.user.adaptor.UserAdaptor; +import likelion.univ.response.SuccessResponse; +import likelion.univ.utils.AuthentiatedUserUtils; import lombok.RequiredArgsConstructor; @UseCase @RequiredArgsConstructor public class CreateChildCommentUseCase { - private final CommentAdaptor commentAdaptor; - private final PostAdaptor postAdaptor; - private final UserAdaptor userAdaptor; + private final AuthentiatedUserUtils userUtils; private final CommentDomainService commentDomainService; - public CommentServiceDto.CommandResponse execute(CommentRequestDto.CreateChild createRequest) { - CommentServiceDto.CreateChildCommentRequest createServiceDto = buildServiceDtoBy(createRequest); - return commentDomainService.createChildComment(createServiceDto); + public SuccessResponse execute(CommentCreateChildRequestDto request) { + CommentCommandResponseDto response = commentDomainService.createChildComment(serviceDtoBy(request)); + return SuccessResponse.of(response); } - private CommentServiceDto.CreateChildCommentRequest buildServiceDtoBy(CommentRequestDto.CreateChild createRequest) { - return CommentServiceDto.CreateChildCommentRequest.builder() - .parent(commentAdaptor.findById(createRequest.getParentId())) - .post(postAdaptor.findById(createRequest.getPostId())) - .user(userAdaptor.findById(createRequest.getUserId())) - .body(createRequest.getBody()) + private CommentCreateChildServiceDto serviceDtoBy(CommentCreateChildRequestDto request) { + return CommentCreateChildServiceDto.builder() + .parentCommentId(request.getParentCommentId()) + .postId(request.getPostId()) + .loginUserId(userUtils.getCurrentUserId()) + .body(request.getBody()) .build(); } } diff --git a/likelion-client/src/main/java/likelion/univ/comment/usecase/CreateParentCommentUseCase.java b/likelion-client/src/main/java/likelion/univ/comment/usecase/CreateParentCommentUseCase.java index 9bf0d918..f409d354 100644 --- a/likelion-client/src/main/java/likelion/univ/comment/usecase/CreateParentCommentUseCase.java +++ b/likelion-client/src/main/java/likelion/univ/comment/usecase/CreateParentCommentUseCase.java @@ -1,29 +1,29 @@ package likelion.univ.comment.usecase; import likelion.univ.annotation.UseCase; -import likelion.univ.comment.dto.CommentRequestDto; -import likelion.univ.domain.comment.dto.CommentServiceDto; +import likelion.univ.comment.dto.CommentCreateParentRequestDto; +import likelion.univ.domain.comment.dto.CommentCommandResponseDto; +import likelion.univ.domain.comment.dto.CommentCreateParentServiceDto; import likelion.univ.domain.comment.service.CommentDomainService; -import likelion.univ.domain.post.adaptor.PostAdaptor; -import likelion.univ.domain.user.adaptor.UserAdaptor; +import likelion.univ.response.SuccessResponse; +import likelion.univ.utils.AuthentiatedUserUtils; import lombok.RequiredArgsConstructor; @UseCase @RequiredArgsConstructor public class CreateParentCommentUseCase { - private final PostAdaptor postAdaptor; - private final UserAdaptor userAdaptor; + private final AuthentiatedUserUtils userUtils; private final CommentDomainService commentDomainService; - public CommentServiceDto.CommandResponse execute(CommentRequestDto.CreateParent createRequestDto) { - CommentServiceDto.CreateParentCommentRequest createServiceDto = buildServiceDtoBy(createRequestDto); - return commentDomainService.createParentComment(createServiceDto); + public SuccessResponse execute(CommentCreateParentRequestDto createRequestDto) { + CommentCommandResponseDto response = commentDomainService.createParentComment(serviceDtoBy(createRequestDto)); + return SuccessResponse.of(response); } - private CommentServiceDto.CreateParentCommentRequest buildServiceDtoBy(CommentRequestDto.CreateParent createParentRequest) { - return CommentServiceDto.CreateParentCommentRequest.builder() - .post(postAdaptor.findById(createParentRequest.getPostId())) - .user(userAdaptor.findById(createParentRequest.getUserId())) + private CommentCreateParentServiceDto serviceDtoBy(CommentCreateParentRequestDto createParentRequest) { + return CommentCreateParentServiceDto.builder() + .postId(createParentRequest.getPostId()) + .loginUserId(userUtils.getCurrentUserId()) .body(createParentRequest.getBody()) .build(); } diff --git a/likelion-client/src/main/java/likelion/univ/comment/usecase/EditCommentUseCase.java b/likelion-client/src/main/java/likelion/univ/comment/usecase/EditCommentUseCase.java deleted file mode 100644 index 507fda8f..00000000 --- a/likelion-client/src/main/java/likelion/univ/comment/usecase/EditCommentUseCase.java +++ /dev/null @@ -1,39 +0,0 @@ -package likelion.univ.comment.usecase; - -import likelion.univ.annotation.UseCase; -import likelion.univ.comment.dto.CommentRequestDto; -import likelion.univ.domain.comment.adaptor.CommentAdaptor; -import likelion.univ.domain.comment.dto.CommentServiceDto; -import likelion.univ.domain.comment.exception.AuthorNotDetectedException; -import likelion.univ.domain.comment.service.CommentDomainService; -import lombok.RequiredArgsConstructor; - -@UseCase -@RequiredArgsConstructor -public class EditCommentUseCase { - private final CommentAdaptor commentAdaptor; - private final CommentDomainService commentDomainService; - - public CommentServiceDto.CommandResponse execute(CommentRequestDto.EditComment editRequestDto, Long commentId) { - if (!isCommentAuthor(editRequestDto, commentId)) { - throw new AuthorNotDetectedException(); - } - CommentServiceDto.EditCommentRequest editServiceDto = buildServiceDtoBy(editRequestDto, commentId); - return commentDomainService.editCommentBody(editServiceDto); - } - - private static CommentServiceDto.EditCommentRequest buildServiceDtoBy(CommentRequestDto.EditComment editRequestDto, Long commentId) { - return CommentServiceDto.EditCommentRequest.builder() - .id(commentId) - .body(editRequestDto.getBody()) - .build(); - } - - private boolean isCommentAuthor(CommentRequestDto.EditComment editRequestDto, Long commentId) { - return editRequestDto.getUserId().equals(getUserIdFromComment(commentId)); - } - - private Long getUserIdFromComment(Long commentId) { - return commentAdaptor.findById(commentId).getAuthor().getId(); - } -} diff --git a/likelion-client/src/main/java/likelion/univ/comment/usecase/GetAllCommentUseCase.java b/likelion-client/src/main/java/likelion/univ/comment/usecase/GetAllCommentUseCase.java deleted file mode 100644 index fce1035b..00000000 --- a/likelion-client/src/main/java/likelion/univ/comment/usecase/GetAllCommentUseCase.java +++ /dev/null @@ -1,28 +0,0 @@ -package likelion.univ.comment.usecase; - -import likelion.univ.annotation.UseCase; -import likelion.univ.domain.comment.adaptor.CommentAdaptor; -import likelion.univ.domain.comment.dto.CommentServiceDto; -import likelion.univ.domain.comment.entity.Comment; -import likelion.univ.domain.post.adaptor.PostAdaptor; -import likelion.univ.domain.post.entity.Post; -import lombok.RequiredArgsConstructor; - -import java.util.List; - -@UseCase -@RequiredArgsConstructor -public class GetAllCommentUseCase { - private final CommentAdaptor commentAdaptor; - private final PostAdaptor postAdaptor; - - public List execute(Long postId) { - Post post = postAdaptor.findById(postId); - List allByPost = commentAdaptor.findAllByPost(post); - return allByPost.stream() - .map(CommentServiceDto.ReadResponse::of) - .toList(); - - } - -} diff --git a/likelion-client/src/main/java/likelion/univ/comment/usecase/HardDeleteCommentUseCase.java b/likelion-client/src/main/java/likelion/univ/comment/usecase/HardDeleteCommentUseCase.java index 4b7f2153..899d0684 100644 --- a/likelion-client/src/main/java/likelion/univ/comment/usecase/HardDeleteCommentUseCase.java +++ b/likelion-client/src/main/java/likelion/univ/comment/usecase/HardDeleteCommentUseCase.java @@ -1,39 +1,26 @@ package likelion.univ.comment.usecase; import likelion.univ.annotation.UseCase; -import likelion.univ.comment.dto.CommentRequestDto; -import likelion.univ.domain.comment.adaptor.CommentAdaptor; -import likelion.univ.domain.comment.dto.CommentServiceDto; -import likelion.univ.domain.comment.exception.AuthorNotDetectedException; +import likelion.univ.domain.comment.dto.CommentDeleteServiceDto; import likelion.univ.domain.comment.service.CommentDomainService; import likelion.univ.response.SuccessResponse; +import likelion.univ.utils.AuthentiatedUserUtils; import lombok.RequiredArgsConstructor; @UseCase @RequiredArgsConstructor public class HardDeleteCommentUseCase { - public final CommentAdaptor commentAdaptor; - public final CommentDomainService commentDomainService; + private final AuthentiatedUserUtils userUtils; + private final CommentDomainService commentDomainService; - public SuccessResponse execute(CommentRequestDto.DeleteComment deleteRequestDto, Long commentId) { - if (!isCommentAuthor(deleteRequestDto, commentId)) { - throw new AuthorNotDetectedException(); - } - CommentServiceDto.DeleteCommentRequest deleteServiceDto = buildServiceDtoBy(commentId); - commentDomainService.deleteCommentHard(deleteServiceDto); + public SuccessResponse execute(Long commentId) { + commentDomainService.deleteCommentHard(serviceDtoBy(commentId)); return SuccessResponse.empty(); } - private static CommentServiceDto.DeleteCommentRequest buildServiceDtoBy(Long commentId) { - return CommentServiceDto.DeleteCommentRequest.builder() - .id(commentId) + private CommentDeleteServiceDto serviceDtoBy(Long commentId) { + return CommentDeleteServiceDto.builder() + .commentId(commentId) + .loginUserId(userUtils.getCurrentUserId()) .build(); } - - private boolean isCommentAuthor(CommentRequestDto.DeleteComment deleteRequestDto, Long commentId) { - return deleteRequestDto.getUserId().equals(getUserIdFromComment(commentId)); - } - - private Long getUserIdFromComment(Long commentId) { - return commentAdaptor.findById(commentId).getAuthor().getId(); - } } diff --git a/likelion-client/src/main/java/likelion/univ/comment/usecase/SoftDeleteCommentUseCase.java b/likelion-client/src/main/java/likelion/univ/comment/usecase/SoftDeleteCommentUseCase.java index e62c46d4..da293732 100644 --- a/likelion-client/src/main/java/likelion/univ/comment/usecase/SoftDeleteCommentUseCase.java +++ b/likelion-client/src/main/java/likelion/univ/comment/usecase/SoftDeleteCommentUseCase.java @@ -1,39 +1,28 @@ package likelion.univ.comment.usecase; import likelion.univ.annotation.UseCase; -import likelion.univ.comment.dto.CommentRequestDto; -import likelion.univ.domain.comment.adaptor.CommentAdaptor; -import likelion.univ.domain.comment.dto.CommentServiceDto; -import likelion.univ.domain.comment.exception.AuthorNotDetectedException; +import likelion.univ.domain.comment.dto.CommentCommandResponseDto; +import likelion.univ.domain.comment.dto.CommentDeleteServiceDto; import likelion.univ.domain.comment.service.CommentDomainService; import likelion.univ.response.SuccessResponse; +import likelion.univ.utils.AuthentiatedUserUtils; import lombok.RequiredArgsConstructor; @UseCase @RequiredArgsConstructor public class SoftDeleteCommentUseCase { - public final CommentAdaptor commentAdaptor; - public final CommentDomainService commentDomainService; + private final AuthentiatedUserUtils userUtils; + private final CommentDomainService commentDomainService; - public SuccessResponse execute(CommentRequestDto.DeleteComment deleteRequestDto, Long commentId) { - if (!isCommentAuthor(deleteRequestDto, commentId)) { - throw new AuthorNotDetectedException(); - } - CommentServiceDto.DeleteCommentRequest deleteServiceDto = buildServiceDtoBy(commentId); - CommentServiceDto.CommandResponse deleteCommandResponseDto = commentDomainService.deleteCommentSoft(deleteServiceDto); - return SuccessResponse.of(deleteCommandResponseDto); + public SuccessResponse execute(Long commentId) { + CommentCommandResponseDto response = commentDomainService.deleteCommentSoft(serviceDtoBy(commentId)); + return SuccessResponse.of(response); } - private static CommentServiceDto.DeleteCommentRequest buildServiceDtoBy(Long commentId) { - return CommentServiceDto.DeleteCommentRequest.builder() - .id(commentId) + private CommentDeleteServiceDto serviceDtoBy(Long commentId) { + return CommentDeleteServiceDto.builder() + .commentId(commentId) + .loginUserId(userUtils.getCurrentUserId()) .build(); } - private boolean isCommentAuthor(CommentRequestDto.DeleteComment deleteRequestDto, Long commentId) { - return deleteRequestDto.getUserId().equals(getUserIdFromComment(commentId)); - } - - private Long getUserIdFromComment(Long commentId) { - return commentAdaptor.findById(commentId).getAuthor().getId(); - } } diff --git a/likelion-client/src/main/java/likelion/univ/comment/usecase/UpdateCommentUseCase.java b/likelion-client/src/main/java/likelion/univ/comment/usecase/UpdateCommentUseCase.java new file mode 100644 index 00000000..2074f8f8 --- /dev/null +++ b/likelion-client/src/main/java/likelion/univ/comment/usecase/UpdateCommentUseCase.java @@ -0,0 +1,31 @@ +package likelion.univ.comment.usecase; + +import likelion.univ.annotation.UseCase; +import likelion.univ.comment.dto.CommentUpdateRequestDto; +import likelion.univ.domain.comment.dto.CommentCommandResponseDto; +import likelion.univ.domain.comment.dto.CommentUpdateServiceDto; +import likelion.univ.domain.comment.service.CommentDomainService; +import likelion.univ.response.SuccessResponse; +import likelion.univ.utils.AuthentiatedUserUtils; +import lombok.RequiredArgsConstructor; + + +@UseCase +@RequiredArgsConstructor +public class UpdateCommentUseCase { + private final AuthentiatedUserUtils userUtils; + private final CommentDomainService commentDomainService; + + public SuccessResponse execute(Long commentId, CommentUpdateRequestDto request) { + CommentCommandResponseDto response = commentDomainService.updateCommentBody(serviceDtoBy(commentId, request)); + return SuccessResponse.of(response); + } + + private CommentUpdateServiceDto serviceDtoBy(Long commentId, CommentUpdateRequestDto request) { + return CommentUpdateServiceDto.builder() + .commentId(commentId) + .loginUserId(userUtils.getCurrentUserId()) + .body(request.getBody()) + .build(); + } +} diff --git a/likelion-client/src/main/java/likelion/univ/config/SwaggerConfig.java b/likelion-client/src/main/java/likelion/univ/config/SwaggerConfig.java index 8eacf330..4f79960e 100644 --- a/likelion-client/src/main/java/likelion/univ/config/SwaggerConfig.java +++ b/likelion-client/src/main/java/likelion/univ/config/SwaggerConfig.java @@ -26,11 +26,12 @@ public OpenAPI openAPI(ServletContext servletContext) { Server server = new Server().url(contextPath); return new OpenAPI() .servers(List.of(server)) - // Security 인증 컴포넌트 설정 - .components(new Components().addSecuritySchemes("Authorization(accessToken)", securityScheme())) + .info(info()) // 인증 전역설정 .addSecurityItem(securityItem()) - .info(info()); + // Security 인증 컴포넌트 설정 + .components(new Components() + .addSecuritySchemes("Authorization(accessToken)", securityScheme())); } @Bean public ModelResolver modelResolver(ObjectMapper objectMapper) { @@ -65,7 +66,7 @@ private SecurityScheme securityScheme() { // Security 요청 설정 private SecurityRequirement securityItem(){ SecurityRequirement securityItem = new SecurityRequirement(); - securityItem.addList("Authorization"); + securityItem.addList("Authorization(accessToken)"); return securityItem; } -} \ No newline at end of file +} diff --git a/likelion-client/src/main/java/likelion/univ/like/commentlike/controller/CommentLikeController.java b/likelion-client/src/main/java/likelion/univ/like/commentlike/controller/CommentLikeController.java new file mode 100644 index 00000000..85c638ba --- /dev/null +++ b/likelion-client/src/main/java/likelion/univ/like/commentlike/controller/CommentLikeController.java @@ -0,0 +1,35 @@ +package likelion.univ.like.commentlike.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import likelion.univ.domain.like.commentlike.dto.CommentLikeResponseDto; +import likelion.univ.like.commentlike.dto.CommentLikeCreateRequestDto; +import likelion.univ.like.commentlike.usecase.CreateCommentLikeUseCase; +import likelion.univ.like.commentlike.usecase.SwitchCommentLikeUseCase; +import likelion.univ.response.SuccessResponse; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.*; + +@Slf4j +@RestController +@RequiredArgsConstructor +@RequestMapping("/v1/community/commentlike") +@Tag(name = "댓글 좋아요", description = "댓글 좋아요 API") +public class CommentLikeController { + private final CreateCommentLikeUseCase createCommentLikeUseCase; + private final SwitchCommentLikeUseCase switchCommentLikeUseCase; + + @Operation(summary = "댓글 좋아요 수행", description = "댓글 좋아요를 생성합니다.") + @PostMapping("") + public SuccessResponse createCommentLike(@RequestBody CommentLikeCreateRequestDto request) { + CommentLikeResponseDto response = createCommentLikeUseCase.execute(request); + return SuccessResponse.of(response); + } + + @Operation(summary = "댓글 좋아요 수정", description = "좋아요 상태를 bool 필드를 이용해 on/off 전환합니다. (soft switch)") + @PatchMapping("/switch/{commentLikeId}") + public SuccessResponse switchCommentLike(@PathVariable Long commentLikeId) { + return switchCommentLikeUseCase.execute(commentLikeId); + } +} diff --git a/likelion-client/src/main/java/likelion/univ/like/commentlike/dto/CommentLikeCreateRequestDto.java b/likelion-client/src/main/java/likelion/univ/like/commentlike/dto/CommentLikeCreateRequestDto.java new file mode 100644 index 00000000..53f27310 --- /dev/null +++ b/likelion-client/src/main/java/likelion/univ/like/commentlike/dto/CommentLikeCreateRequestDto.java @@ -0,0 +1,19 @@ +package likelion.univ.like.commentlike.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class CommentLikeCreateRequestDto { + @NotNull + @Schema(description = "좋아요를 누르는 댓글 id") + private Long commentId; +} diff --git a/likelion-client/src/main/java/likelion/univ/like/commentlike/usecase/CreateCommentLikeUseCase.java b/likelion-client/src/main/java/likelion/univ/like/commentlike/usecase/CreateCommentLikeUseCase.java new file mode 100644 index 00000000..b0336287 --- /dev/null +++ b/likelion-client/src/main/java/likelion/univ/like/commentlike/usecase/CreateCommentLikeUseCase.java @@ -0,0 +1,28 @@ +package likelion.univ.like.commentlike.usecase; + +import likelion.univ.annotation.UseCase; +import likelion.univ.like.commentlike.dto.CommentLikeCreateRequestDto; +import likelion.univ.domain.like.commentlike.dto.CommentLikeCreateServiceDto; +import likelion.univ.domain.like.commentlike.dto.CommentLikeResponseDto; +import likelion.univ.domain.like.commentlike.service.CommentLikeDomainService; +import likelion.univ.response.SuccessResponse; +import likelion.univ.utils.AuthentiatedUserUtils; +import lombok.RequiredArgsConstructor; + +@UseCase +@RequiredArgsConstructor +public class CreateCommentLikeUseCase { + private final AuthentiatedUserUtils userUtils; + private final CommentLikeDomainService commentLikeDomainService; + public CommentLikeResponseDto execute(CommentLikeCreateRequestDto request) { + return commentLikeDomainService.createLikeComment(serviceDtoBy(request)); + } + + private CommentLikeCreateServiceDto serviceDtoBy(CommentLikeCreateRequestDto request) { + return CommentLikeCreateServiceDto.builder() + .loginUserId(userUtils.getCurrentUserId()) + .commentId(request.getCommentId()) + .build(); + } + +} diff --git a/likelion-client/src/main/java/likelion/univ/like/commentlike/usecase/SwitchCommentLikeUseCase.java b/likelion-client/src/main/java/likelion/univ/like/commentlike/usecase/SwitchCommentLikeUseCase.java new file mode 100644 index 00000000..db03477c --- /dev/null +++ b/likelion-client/src/main/java/likelion/univ/like/commentlike/usecase/SwitchCommentLikeUseCase.java @@ -0,0 +1,28 @@ +package likelion.univ.like.commentlike.usecase; + +import likelion.univ.annotation.UseCase; +import likelion.univ.domain.like.commentlike.dto.CommentLikeResponseDto; +import likelion.univ.domain.like.commentlike.dto.CommentLikeSwitchServiceDto; +import likelion.univ.domain.like.commentlike.service.CommentLikeDomainService; +import likelion.univ.response.SuccessResponse; +import likelion.univ.utils.AuthentiatedUserUtils; +import lombok.RequiredArgsConstructor; + +@UseCase +@RequiredArgsConstructor +public class SwitchCommentLikeUseCase { + private final AuthentiatedUserUtils userUtils; + private final CommentLikeDomainService commentLikeDomainService; + + public SuccessResponse execute(Long commentLikeId) { + CommentLikeResponseDto response = commentLikeDomainService.switchLikeComment(serviceDtoBy(commentLikeId)); + return SuccessResponse.of(response); + } + + private CommentLikeSwitchServiceDto serviceDtoBy(Long commentLikeId) { + return CommentLikeSwitchServiceDto.builder() + .commentLikeId(commentLikeId) + .loginUserId(userUtils.getCurrentUserId()) + .build(); + } +} diff --git a/likelion-client/src/main/java/likelion/univ/like/postlike/controller/PostLikeController.java b/likelion-client/src/main/java/likelion/univ/like/postlike/controller/PostLikeController.java new file mode 100644 index 00000000..9d9086c4 --- /dev/null +++ b/likelion-client/src/main/java/likelion/univ/like/postlike/controller/PostLikeController.java @@ -0,0 +1,35 @@ +package likelion.univ.like.postlike.controller; + + +import io.swagger.v3.oas.annotations.Operation; +import likelion.univ.domain.like.postlike.dto.PostLikeResponseDto; +import likelion.univ.like.postlike.dto.PostLikeRequestDto; +import likelion.univ.like.postlike.usecase.CreatePostLikeUseCase; +import likelion.univ.like.postlike.usecase.DeletePostLikeUseCase; +import likelion.univ.response.SuccessResponse; +import lombok.RequiredArgsConstructor; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/v1/community/likepost") +public class PostLikeController { + private final CreatePostLikeUseCase createPostLikeUseCase; + private final DeletePostLikeUseCase deletePostLikeUseCase; + + + @Operation(summary = "게시글 좋아요 수행", description = "게시글 좋아요를 생성함") + @PostMapping("") + public SuccessResponse createLikePost(@RequestBody PostLikeRequestDto request) { + + PostLikeResponseDto response = createPostLikeUseCase.execute(request); + return SuccessResponse.of(response); + } + + @Operation(summary = "게시글 좋아요 삭제", description = "게시글 좋아요를 hard delete함") + @DeleteMapping("/{postLikeId}") + public SuccessResponse deleteLikePost(@PathVariable Long postLikeId) { + + return deletePostLikeUseCase.execute(postLikeId); + } +} diff --git a/likelion-client/src/main/java/likelion/univ/like/postlike/dto/PostLikeRequestDto.java b/likelion-client/src/main/java/likelion/univ/like/postlike/dto/PostLikeRequestDto.java new file mode 100644 index 00000000..776fad7f --- /dev/null +++ b/likelion-client/src/main/java/likelion/univ/like/postlike/dto/PostLikeRequestDto.java @@ -0,0 +1,19 @@ +package likelion.univ.like.postlike.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import javax.validation.constraints.NotNull; + +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class PostLikeRequestDto { + @NotNull + @Schema(description = "좋아요를 누르는 게시글 id") + private Long postId; +} diff --git a/likelion-client/src/main/java/likelion/univ/like/postlike/usecase/CreatePostLikeUseCase.java b/likelion-client/src/main/java/likelion/univ/like/postlike/usecase/CreatePostLikeUseCase.java new file mode 100644 index 00000000..d50515c4 --- /dev/null +++ b/likelion-client/src/main/java/likelion/univ/like/postlike/usecase/CreatePostLikeUseCase.java @@ -0,0 +1,29 @@ +package likelion.univ.like.postlike.usecase; + +import likelion.univ.annotation.UseCase; +import likelion.univ.domain.like.postlike.dto.PostLikeCreateServiceDto; +import likelion.univ.domain.like.postlike.dto.PostLikeResponseDto; +import likelion.univ.domain.like.postlike.service.PostLikeDomainService; +import likelion.univ.like.postlike.dto.PostLikeRequestDto; +import likelion.univ.utils.AuthentiatedUserUtils; +import lombok.RequiredArgsConstructor; + +@UseCase +@RequiredArgsConstructor +public class CreatePostLikeUseCase { + private final PostLikeDomainService postLikeDomainService; + private final AuthentiatedUserUtils userUtils; + + public PostLikeResponseDto execute(PostLikeRequestDto postIdDto) { + return postLikeDomainService.createLikePost(serviceDtoBy(postIdDto)); + } + + private PostLikeCreateServiceDto serviceDtoBy(PostLikeRequestDto postIdDto) { + return PostLikeCreateServiceDto.builder() + .postId(postIdDto.getPostId()) + .authorId(userUtils.getCurrentUserId()) + .build(); + } + + +} diff --git a/likelion-client/src/main/java/likelion/univ/like/postlike/usecase/DeletePostLikeUseCase.java b/likelion-client/src/main/java/likelion/univ/like/postlike/usecase/DeletePostLikeUseCase.java new file mode 100644 index 00000000..ca02d6ee --- /dev/null +++ b/likelion-client/src/main/java/likelion/univ/like/postlike/usecase/DeletePostLikeUseCase.java @@ -0,0 +1,31 @@ +package likelion.univ.like.postlike.usecase; + +import likelion.univ.annotation.UseCase; +import likelion.univ.domain.like.postlike.dto.PostLikeDeleteServiceDto; +import likelion.univ.domain.like.postlike.service.PostLikeDomainService; +import likelion.univ.domain.post.adaptor.PostAdaptor; +import likelion.univ.response.SuccessResponse; +import likelion.univ.utils.AuthentiatedUserUtils; +import lombok.RequiredArgsConstructor; + +@UseCase +@RequiredArgsConstructor +public class DeletePostLikeUseCase { + + private final PostLikeDomainService postLikeDomainService; + private final AuthentiatedUserUtils userUtils; + private final PostAdaptor postAdaptor; + + public SuccessResponse execute(Long postLikeId) { + PostLikeDeleteServiceDto serviceDto = serviceDtoBy(postLikeId); + postLikeDomainService.deleteLikePost(serviceDto); + return SuccessResponse.empty(); + } + + private PostLikeDeleteServiceDto serviceDtoBy(Long postLikeId) { + return PostLikeDeleteServiceDto.builder() + .postLikeId(postLikeId) + .loginUserId(userUtils.getCurrentUserId()) + .build(); + } +} diff --git a/likelion-client/src/main/java/likelion/univ/likecomment/controller/LikeCommentApiController.java b/likelion-client/src/main/java/likelion/univ/likecomment/controller/LikeCommentApiController.java deleted file mode 100644 index 7344f9c2..00000000 --- a/likelion-client/src/main/java/likelion/univ/likecomment/controller/LikeCommentApiController.java +++ /dev/null @@ -1,37 +0,0 @@ -package likelion.univ.likecomment.controller; - -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import likelion.univ.likecomment.dto.LikeCommentRequestDto; -import likelion.univ.likecomment.usecase.CreateLikeCommentUseCase; -import likelion.univ.likecomment.usecase.SwitchLikeCommentUseCase; -import likelion.univ.domain.comment.dto.LikeCommentServiceDto; -import likelion.univ.response.SuccessResponse; -import lombok.RequiredArgsConstructor; -import lombok.extern.slf4j.Slf4j; -import org.springframework.web.bind.annotation.*; - -@Slf4j -@RestController -@CrossOrigin("*") -@RequiredArgsConstructor -@RequestMapping("/api/v1/community/likecomment") -@Tag(name = "댓글 좋아요", description = "댓글 좋아요 API") -public class LikeCommentApiController { - private final CreateLikeCommentUseCase createLikeCommentUseCase; - private final SwitchLikeCommentUseCase switchLikeCommentUseCase; - - @Operation(summary = "댓글 좋아요 수행", description = "댓글 좋아요를 생성합니다.") - @PostMapping("/new") - public SuccessResponse createLikeComment(@RequestBody LikeCommentRequestDto.Create createRequest) { - LikeCommentServiceDto.CommandResponse createLikeCommentResponse = createLikeCommentUseCase.execute(createRequest); - return SuccessResponse.of(createLikeCommentResponse); - } - - @Operation(summary = "댓글 좋아요 수정", description = "이미 좋아요한 댓글을 취소하거나, 취소한 댓글을 다시 좋아요 합니다.") - @PatchMapping("/switch/{likeCommentId}") - public SuccessResponse switchLikeComment(@RequestBody LikeCommentRequestDto.Switch switchRequest, Long likeCommentId) { - LikeCommentServiceDto.CommandResponse switchLikeCommentResponse = switchLikeCommentUseCase.execute(switchRequest, likeCommentId); - return SuccessResponse.of(switchLikeCommentResponse); - } -} diff --git a/likelion-client/src/main/java/likelion/univ/likecomment/dto/LikeCommentRequestDto.java b/likelion-client/src/main/java/likelion/univ/likecomment/dto/LikeCommentRequestDto.java deleted file mode 100644 index 44ebfccf..00000000 --- a/likelion-client/src/main/java/likelion/univ/likecomment/dto/LikeCommentRequestDto.java +++ /dev/null @@ -1,20 +0,0 @@ -package likelion.univ.likecomment.dto; - -import lombok.Builder; -import lombok.Data; - -public class LikeCommentRequestDto { - @Data - @Builder - public static class Create { - private Long userId; - private Long commentId; - } - - @Data - @Builder - public static class Switch { - private Long userId; - } - -} diff --git a/likelion-client/src/main/java/likelion/univ/likecomment/usecase/CreateLikeCommentUseCase.java b/likelion-client/src/main/java/likelion/univ/likecomment/usecase/CreateLikeCommentUseCase.java deleted file mode 100644 index 69ab1a64..00000000 --- a/likelion-client/src/main/java/likelion/univ/likecomment/usecase/CreateLikeCommentUseCase.java +++ /dev/null @@ -1,26 +0,0 @@ -package likelion.univ.likecomment.usecase; - -import likelion.univ.annotation.UseCase; -import likelion.univ.likecomment.dto.LikeCommentRequestDto; -import likelion.univ.domain.comment.dto.LikeCommentServiceDto; -import likelion.univ.domain.comment.service.LikeCommentDomainService; -import lombok.RequiredArgsConstructor; - -@UseCase -@RequiredArgsConstructor -public class CreateLikeCommentUseCase { - private final LikeCommentDomainService likeCommentDomainService; - - public LikeCommentServiceDto.CommandResponse execute(LikeCommentRequestDto.Create createRequest) { - LikeCommentServiceDto.createLikeCommentRequest createLikeCommentRequest = buildServiceDtoBy(createRequest); - return likeCommentDomainService.createLikeComment(createLikeCommentRequest); - } - - private LikeCommentServiceDto.createLikeCommentRequest buildServiceDtoBy(LikeCommentRequestDto.Create createRequest) { - return LikeCommentServiceDto.createLikeCommentRequest.builder() - .userId(createRequest.getUserId()) - .commentId(createRequest.getCommentId()) - .build(); - } - -} diff --git a/likelion-client/src/main/java/likelion/univ/likecomment/usecase/SwitchLikeCommentUseCase.java b/likelion-client/src/main/java/likelion/univ/likecomment/usecase/SwitchLikeCommentUseCase.java deleted file mode 100644 index b5f60fec..00000000 --- a/likelion-client/src/main/java/likelion/univ/likecomment/usecase/SwitchLikeCommentUseCase.java +++ /dev/null @@ -1,25 +0,0 @@ -package likelion.univ.likecomment.usecase; - -import likelion.univ.annotation.UseCase; -import likelion.univ.likecomment.dto.LikeCommentRequestDto; -import likelion.univ.domain.comment.dto.LikeCommentServiceDto; -import likelion.univ.domain.comment.service.LikeCommentDomainService; -import lombok.RequiredArgsConstructor; - -@UseCase -@RequiredArgsConstructor -public class SwitchLikeCommentUseCase { - private final LikeCommentDomainService likeCommentDomainService; - - public LikeCommentServiceDto.CommandResponse execute(LikeCommentRequestDto.Switch switchRequest, Long likeCommentId) { - LikeCommentServiceDto.switchLikeCommentRequest switchLikeCommentRequest = buildServiceDtoBy(switchRequest, likeCommentId); - return likeCommentDomainService.switchLikeComment(switchLikeCommentRequest); - } - - private LikeCommentServiceDto.switchLikeCommentRequest buildServiceDtoBy(LikeCommentRequestDto.Switch switchRequest, Long likeCommentId) { - return LikeCommentServiceDto.switchLikeCommentRequest.builder() - .likeCommentId(likeCommentId) - .userId(switchRequest.getUserId()) - .build(); - } -} diff --git a/likelion-client/src/main/java/likelion/univ/post/controller/PostController.java b/likelion-client/src/main/java/likelion/univ/post/controller/PostController.java index 405b1583..6f18ff17 100644 --- a/likelion-client/src/main/java/likelion/univ/post/controller/PostController.java +++ b/likelion-client/src/main/java/likelion/univ/post/controller/PostController.java @@ -1,67 +1,85 @@ package likelion.univ.post.controller; -import likelion.univ.post.dto.PostRequestDTO; -import likelion.univ.post.usecase.PostCreateUseCase; -import likelion.univ.post.usecase.PostDeleteUseCase; -import likelion.univ.post.usecase.PostEditUseCase; -import likelion.univ.post.usecase.PostRetrieveUseCase; -import likelion.univ.domain.post.dto.PostServiceDTO; +import io.swagger.v3.oas.annotations.Operation; +import likelion.univ.domain.post.dto.response.PostDetailResponseDto; +import likelion.univ.domain.post.dto.response.PostCommandResponseDto; +import likelion.univ.domain.post.entity.enums.MainCategory; +import likelion.univ.domain.post.entity.enums.SubCategory; +import likelion.univ.post.dto.PostCreateRequestDto; +import likelion.univ.post.dto.PostUpdateRequestDto; +import likelion.univ.post.repository.PostReadRepository; +import likelion.univ.post.usecase.*; import likelion.univ.response.SuccessResponse; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.PageRequest; import org.springframework.web.bind.annotation.*; +import javax.validation.Valid; +import java.util.List; + @RestController -@CrossOrigin("*") @RequiredArgsConstructor -@RequestMapping("/v1/community/post") +@RequestMapping("/v1/community/posts") public class PostController { - @Autowired - private PostCreateUseCase postCreateUseCase; - - @Autowired - private PostEditUseCase postEditUseCase; - - @Autowired - private PostDeleteUseCase postDeleteUseCase; - - @Autowired - private PostRetrieveUseCase postRetrieveUseCase; - - @PostMapping("") - public SuccessResponse createPost(@RequestBody PostRequestDTO.Save request) { - - PostServiceDTO.ResponseDTO response = postCreateUseCase.execute(request); - + private final PostCreateUseCase postCreateUseCase; + private final PostUpdateUseCase postUpdateUsecase; + private final PostDeleteUseCase postDeleteUseCase; + private final PostReadRepository postReadRepository; + + /* read */ + @Operation(summary = "(커뮤니티) 카테고리별 posts 최신순 조회", description = "카테고리가 일치하는 게시글 최신순으로 조회") + @GetMapping("") + public SuccessResponse findCategorizedPosts(@RequestParam MainCategory mainCategory, @RequestParam SubCategory subCategory, @RequestParam Integer page, @RequestParam Integer size) { + PageRequest pageRequest = PageRequest.of(page, size); + List response = postReadRepository.findAll(mainCategory, subCategory, pageRequest); + return SuccessResponse.of(response); + } + @Operation(summary = "(마이페이지) 유저별 posts 최신순 조회", description = "유저Id를 param으로 넣어서, 유저별로 작성한 게시글을 최신순으로 조회") + @GetMapping("/author/{userId}") + public SuccessResponse findAuthorPosts(@PathVariable Long userId, @RequestParam Integer page, @RequestParam Integer size) { + PageRequest pageRequest = PageRequest.of(page, size); + List response = postReadRepository.findAuthorPosts(userId, pageRequest); return SuccessResponse.of(response); } -// @GetMapping("") -// public SuccessResponse retrievePostPaging(@RequestParam Integer page,@RequestParam Integer limit) { -// -// List response = postRetrieveUseCase.execute(page,limit); -// -// return SuccessResponse.of(response); -// } - - @PatchMapping("") - public SuccessResponse editPost(@RequestBody PostRequestDTO.Edit request) { - - PostServiceDTO.ResponseDTO response = postEditUseCase.execute(request); - + @Operation(summary = "(마이페이지) 유저가 댓글을 단 posts 최신순 조회", description = "(로그인된 유저 기준 only) 댓글 단 posts 최신순 조회") + @GetMapping("/commented") + public SuccessResponse findCommentedPosts(@RequestParam Integer page, @RequestParam Integer size) { + PageRequest pageRequest = PageRequest.of(page, size); + List response = postReadRepository.findCommentedPosts(pageRequest); return SuccessResponse.of(response); } - @DeleteMapping("") - public SuccessResponse deletePost(@RequestBody PostRequestDTO.Delete request) { + @Operation(summary = "(마이페이지) 유저가 좋아요한 posts 최신순 조회", description = "(로그인된 유저 기준 only) 좋아요를 누른 posts 최신순 조회") + @GetMapping("/liked") + public SuccessResponse findLikedPosts(@RequestParam Integer page, @RequestParam Integer size) { + PageRequest pageRequest = PageRequest.of(page, size); + List response = postReadRepository.findLikedPosts(pageRequest); + return SuccessResponse.of(response); + } - postDeleteUseCase.execute(request); + /* command */ + @Operation(summary = "게시글을 생성", description = "(작업중 - 카테고리 반영 필요)") + @PostMapping("/new") + public SuccessResponse createPost(@RequestBody @Valid PostCreateRequestDto request/*, BindingResult bindingResult*/) { + PostCommandResponseDto response = postCreateUseCase.execute(request); + return SuccessResponse.of(response); + } + @Operation(summary = "게시글 수정", description = "제목, 내용, 썸네일 수정 : 수정을 안하는 값은 기존 데이터로 넘겨줘야 함") + @PatchMapping("/{postId}") + public SuccessResponse updatePost(@PathVariable Long postId, @RequestBody PostUpdateRequestDto request) { + PostCommandResponseDto response = postUpdateUsecase.execute(postId, request); + return SuccessResponse.of(response); + } + @Operation(summary = "게시글 hard delete", description = "게시글을 database로부터 hard delete") + @DeleteMapping("/{postId}") + public SuccessResponse deletePost(@PathVariable Long postId) { + postDeleteUseCase.execute(postId); return SuccessResponse.empty(); } - } diff --git a/likelion-client/src/main/java/likelion/univ/post/dto/PostCreateRequestDto.java b/likelion-client/src/main/java/likelion/univ/post/dto/PostCreateRequestDto.java new file mode 100644 index 00000000..a8974660 --- /dev/null +++ b/likelion-client/src/main/java/likelion/univ/post/dto/PostCreateRequestDto.java @@ -0,0 +1,29 @@ +package likelion.univ.post.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Data +@Builder +@AllArgsConstructor +public class PostCreateRequestDto { + @NotBlank + @Schema(description = "제목", example = "LIKELIONUNIV 프로젝트 회고", required = true) + private String title; + @NotBlank + @Schema(description = "내용", example = "프로젝트 재밌었다.", required = true) + private String body; + @Schema(description = "썸네일 이미지", example = "string") + private String thumbnail; + @NotNull + @Schema(description = "메인 카테고리", example = "자유게시판", required = true) + private String mainCategory; + @NotNull + @Schema(description = "서브 카테고리", example = "백엔드", required = true) + private String subCategory; +} diff --git a/likelion-client/src/main/java/likelion/univ/post/dto/PostDeleteRequestDto.java b/likelion-client/src/main/java/likelion/univ/post/dto/PostDeleteRequestDto.java new file mode 100644 index 00000000..7ea1d62b --- /dev/null +++ b/likelion-client/src/main/java/likelion/univ/post/dto/PostDeleteRequestDto.java @@ -0,0 +1,17 @@ +package likelion.univ.post.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +import javax.validation.constraints.NotNull; + +@Data +@Builder +@AllArgsConstructor +public class PostDeleteRequestDto { + @NotNull + @Schema(description = "지우려는 게시글 id") + private Long postId; +} diff --git a/likelion-client/src/main/java/likelion/univ/post/dto/PostRequestDTO.java b/likelion-client/src/main/java/likelion/univ/post/dto/PostRequestDTO.java deleted file mode 100644 index 293ee6bd..00000000 --- a/likelion-client/src/main/java/likelion/univ/post/dto/PostRequestDTO.java +++ /dev/null @@ -1,45 +0,0 @@ -package likelion.univ.post.dto; - -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; - -@Data -public class PostRequestDTO { - - @Data - @Builder - @AllArgsConstructor - public static class Save { - - private String title; - - private String body; - private Long userId; - - private String thumbnail; - - private String mainCategory; - - private String subCategory; - - } - - @Data - public static class Edit { - private Long postId; - private String title; - - private String body; - - private String thumbnail; - } - - @Data - public static class Delete { - private Long postId; - } - - - -} diff --git a/likelion-client/src/main/java/likelion/univ/post/dto/PostUpdateRequestDto.java b/likelion-client/src/main/java/likelion/univ/post/dto/PostUpdateRequestDto.java new file mode 100644 index 00000000..f0723bb3 --- /dev/null +++ b/likelion-client/src/main/java/likelion/univ/post/dto/PostUpdateRequestDto.java @@ -0,0 +1,23 @@ +package likelion.univ.post.dto; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.NotNull; + +@Data +@Builder +@AllArgsConstructor +public class PostUpdateRequestDto { + @NotBlank + @Schema(description = "게시글 제목 수정", example = "수정된 제목입니다.") + private String title; + @NotBlank + @Schema(description = "게시글 내용 수정", example = "수정된 내용입니다.") + private String body; + @Schema(description = "게시글 썸네일 수정", example = "수정된 썸네일입니다.") + private String thumbnail; +} diff --git a/likelion-client/src/main/java/likelion/univ/post/repository/PostReadRepository.java b/likelion-client/src/main/java/likelion/univ/post/repository/PostReadRepository.java new file mode 100644 index 00000000..9957c5f0 --- /dev/null +++ b/likelion-client/src/main/java/likelion/univ/post/repository/PostReadRepository.java @@ -0,0 +1,8 @@ +package likelion.univ.post.repository; + +import likelion.univ.domain.post.entity.Post; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface PostReadRepository extends JpaRepository, PostReadRepositoryCustom { + +} diff --git a/likelion-client/src/main/java/likelion/univ/post/repository/PostReadRepositoryCustom.java b/likelion-client/src/main/java/likelion/univ/post/repository/PostReadRepositoryCustom.java new file mode 100644 index 00000000..3ea88e6a --- /dev/null +++ b/likelion-client/src/main/java/likelion/univ/post/repository/PostReadRepositoryCustom.java @@ -0,0 +1,19 @@ +package likelion.univ.post.repository; + +import likelion.univ.domain.post.dto.response.PostDetailResponseDto; +import likelion.univ.domain.post.entity.enums.MainCategory; +import likelion.univ.domain.post.entity.enums.SubCategory; +import org.springframework.data.domain.Pageable; + +import java.util.List; + +public interface PostReadRepositoryCustom { + + List findAll(MainCategory mainCategory, SubCategory subCategory, Pageable pageable); + + List findAuthorPosts(Long authorId, Pageable pageable); + + List findCommentedPosts(Pageable pageable); + + List findLikedPosts(Pageable pageable); +} diff --git a/likelion-client/src/main/java/likelion/univ/post/repository/PostReadRepositoryCustomImpl.java b/likelion-client/src/main/java/likelion/univ/post/repository/PostReadRepositoryCustomImpl.java new file mode 100644 index 00000000..3d6551c3 --- /dev/null +++ b/likelion-client/src/main/java/likelion/univ/post/repository/PostReadRepositoryCustomImpl.java @@ -0,0 +1,131 @@ +package likelion.univ.post.repository; + +import com.querydsl.core.types.dsl.BooleanExpression; +import likelion.univ.domain.post.dto.response.PostDetailResponseDto; +import likelion.univ.domain.post.dto.response.QPostDetailResponseDto; +import likelion.univ.domain.post.entity.enums.MainCategory; +import likelion.univ.domain.post.entity.enums.SubCategory; +import likelion.univ.utils.AuthentiatedUserUtils; +import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.NotNull; +import org.springframework.data.domain.Pageable; +import com.querydsl.jpa.impl.JPAQueryFactory; +import org.springframework.stereotype.Repository; + +import java.util.List; + +import static likelion.univ.domain.comment.entity.QComment.comment; +import static likelion.univ.domain.like.postlike.entity.QPostLike.postLike; +import static likelion.univ.domain.post.entity.QPost.post; +import static likelion.univ.domain.user.entity.QUser.user; + + +@Repository +@RequiredArgsConstructor +public class PostReadRepositoryCustomImpl implements PostReadRepositoryCustom { + private final JPAQueryFactory queryFactory; + private final AuthentiatedUserUtils userUtils; + + @Override + public List findAll(MainCategory mainCategory, SubCategory subCategory, Pageable pageable) { + return queryFactory + .select(postDetailResponseDto()) + .from(post) + .join(post.author, user) + .where( + post.mainCategory.eq(mainCategory), + post.subCategory.eq(subCategory) + ) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .orderBy(post.createdDate.desc()) + .fetch(); + } + + @Override + public List findAuthorPosts(Long userId, Pageable pageable) { + + return queryFactory + .select(postDetailResponseDto()) + .from(post) + .join(post.author, user) + .where( + post.author.id.eq(userId) + ) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .orderBy(post.createdDate.desc()) + .fetch(); + } + + + @Override + public List findCommentedPosts(Pageable pageable) { + Long loginUserId = userUtils.getCurrentUserId(); + + List postIds = queryFactory + .select(comment.post.id) + .from(comment) + .join(comment.post, post) + .where( + comment.author.id.eq(loginUserId), + comment.isDeleted.isFalse() + ) + .fetch(); + return queryFactory + .select(postDetailResponseDto()) + .from(post) + .innerJoin(post.author, user) + .where( + post.id.in(postIds) + ) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .orderBy(post.createdDate.desc()) + .fetch(); + } + + @Override + public List findLikedPosts(Pageable pageable) { + Long loginUserId = userUtils.getCurrentUserId(); + + List postIds = queryFactory + .select(postLike.post.id) + .from(postLike) + .join(postLike.post, post) + .where( + postLike.author.id.eq(loginUserId) + ) + .fetch(); + return queryFactory + .select(postDetailResponseDto()) + .from(post) + .innerJoin(post.author, user) + .where( + post.id.in(postIds) + ) + .offset(pageable.getOffset()) + .limit(pageable.getPageSize()) + .orderBy(post.createdDate.desc()) + .fetch(); + } + + + @NotNull + private static QPostDetailResponseDto postDetailResponseDto() { + return new QPostDetailResponseDto( + post.id, + post.author.id, + post.author.profile.name, + post.title, + post.body, + post.thumbnail, + post.mainCategory, + post.subCategory, + post.createdDate, + post.modifiedDate); + } + + + +} diff --git a/likelion-client/src/main/java/likelion/univ/post/usecase/PostCreateUseCase.java b/likelion-client/src/main/java/likelion/univ/post/usecase/PostCreateUseCase.java index 0594058d..a31bb968 100644 --- a/likelion-client/src/main/java/likelion/univ/post/usecase/PostCreateUseCase.java +++ b/likelion-client/src/main/java/likelion/univ/post/usecase/PostCreateUseCase.java @@ -1,33 +1,27 @@ package likelion.univ.post.usecase; import likelion.univ.annotation.UseCase; -import likelion.univ.post.dto.PostRequestDTO; -import likelion.univ.domain.post.dto.PostServiceDTO; -import likelion.univ.domain.post.service.PostService; -import likelion.univ.domain.user.adaptor.UserAdaptor; +import likelion.univ.domain.post.dto.request.PostCreateServiceDto; +import likelion.univ.domain.post.dto.response.PostCommandResponseDto; +import likelion.univ.domain.post.service.PostDomainService; +import likelion.univ.post.dto.PostCreateRequestDto; +import likelion.univ.utils.AuthentiatedUserUtils; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; @UseCase @RequiredArgsConstructor public class PostCreateUseCase { - - - @Autowired - private PostService postService; - @Autowired - private UserAdaptor userAdaptor; - public PostServiceDTO.ResponseDTO execute(PostRequestDTO.Save request) { - //user 인자 추가 - PostServiceDTO.ResponseDTO response = postService.createPost(buildDTO(request)); - return response; + private final PostDomainService postDomainService; + private final AuthentiatedUserUtils userUtils; + public PostCommandResponseDto execute(PostCreateRequestDto request) { + return postDomainService.createPost(serviceDtoBy(request)); } - PostServiceDTO.CreateRequest buildDTO(PostRequestDTO.Save request) { - return PostServiceDTO.CreateRequest.builder() + PostCreateServiceDto serviceDtoBy(PostCreateRequestDto request) { + return PostCreateServiceDto.builder() .title(request.getTitle()) .body(request.getBody()) - .user(null) + .authorId(userUtils.getCurrentUserId()) .thumbnail(request.getThumbnail()) .mainCategory(request.getMainCategory()) .subCategory(request.getSubCategory()) diff --git a/likelion-client/src/main/java/likelion/univ/post/usecase/PostDeleteUseCase.java b/likelion-client/src/main/java/likelion/univ/post/usecase/PostDeleteUseCase.java index a16d4b0f..d35cae05 100644 --- a/likelion-client/src/main/java/likelion/univ/post/usecase/PostDeleteUseCase.java +++ b/likelion-client/src/main/java/likelion/univ/post/usecase/PostDeleteUseCase.java @@ -1,27 +1,26 @@ package likelion.univ.post.usecase; import likelion.univ.annotation.UseCase; -import likelion.univ.post.dto.PostRequestDTO; -import likelion.univ.domain.post.dto.PostServiceDTO; -import likelion.univ.domain.post.service.PostService; +import likelion.univ.domain.post.dto.request.PostDeleteServiceDto; +import likelion.univ.domain.post.service.PostDomainService; +import likelion.univ.utils.AuthentiatedUserUtils; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; @UseCase @RequiredArgsConstructor public class PostDeleteUseCase { + private final PostDomainService postDomainService; + private final AuthentiatedUserUtils userUtils; - @Autowired - private PostService postService; - - public void execute(PostRequestDTO.Delete request) { - postService.deletePost(buildDTO(request)); + public void execute(Long postId) { + postDomainService.deletePost(serviceDtoBy(postId)); return ; } - PostServiceDTO.DeleteRequest buildDTO(PostRequestDTO.Delete request) { - return PostServiceDTO.DeleteRequest.builder() - .postId(request.getPostId()) + private PostDeleteServiceDto serviceDtoBy(Long postId) { + return PostDeleteServiceDto.builder() + .postId(postId) + .loginUserId(userUtils.getCurrentUserId()) .build(); } } diff --git a/likelion-client/src/main/java/likelion/univ/post/usecase/PostEditUseCase.java b/likelion-client/src/main/java/likelion/univ/post/usecase/PostEditUseCase.java deleted file mode 100644 index 9342622c..00000000 --- a/likelion-client/src/main/java/likelion/univ/post/usecase/PostEditUseCase.java +++ /dev/null @@ -1,31 +0,0 @@ -package likelion.univ.post.usecase; - -import likelion.univ.annotation.UseCase; -import likelion.univ.post.dto.PostRequestDTO; -import likelion.univ.domain.post.dto.PostServiceDTO; -import likelion.univ.domain.post.service.PostService; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; - - -@UseCase -@RequiredArgsConstructor -public class PostEditUseCase { - - @Autowired - private PostService postService; - - public PostServiceDTO.ResponseDTO execute(PostRequestDTO.Edit request) { - PostServiceDTO.ResponseDTO response = postService.editPost(buildDTO(request)); - return response; - } - - PostServiceDTO.EditRequest buildDTO(PostRequestDTO.Edit request) { - return PostServiceDTO.EditRequest.builder() - .postId(request.getPostId()) - .title(request.getTitle()) - .thumbnail(request.getThumbnail()) - .body(request.getBody()) - .build(); - } -} diff --git a/likelion-client/src/main/java/likelion/univ/post/usecase/PostRetrieveUseCase.java b/likelion-client/src/main/java/likelion/univ/post/usecase/PostRetrieveUseCase.java deleted file mode 100644 index 3769aeac..00000000 --- a/likelion-client/src/main/java/likelion/univ/post/usecase/PostRetrieveUseCase.java +++ /dev/null @@ -1,19 +0,0 @@ -package likelion.univ.post.usecase; - -import likelion.univ.annotation.UseCase; -import likelion.univ.domain.post.service.PostService; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; - -@UseCase -@RequiredArgsConstructor -public class PostRetrieveUseCase { - - @Autowired - private PostService postService; - -// public List execute(Integer page, Integer limit) { -// List response = postService.retrievePostPaging(page,limit); -// return response; -// } -} diff --git a/likelion-client/src/main/java/likelion/univ/post/usecase/PostUpdateUseCase.java b/likelion-client/src/main/java/likelion/univ/post/usecase/PostUpdateUseCase.java new file mode 100644 index 00000000..9eee0066 --- /dev/null +++ b/likelion-client/src/main/java/likelion/univ/post/usecase/PostUpdateUseCase.java @@ -0,0 +1,31 @@ +package likelion.univ.post.usecase; + +import likelion.univ.annotation.UseCase; +import likelion.univ.domain.post.dto.response.PostCommandResponseDto; +import likelion.univ.domain.post.dto.request.PostUpdateServiceDto; +import likelion.univ.domain.post.service.PostDomainService; +import likelion.univ.post.dto.PostUpdateRequestDto; +import likelion.univ.utils.AuthentiatedUserUtils; +import lombok.RequiredArgsConstructor; + + +@UseCase +@RequiredArgsConstructor +public class PostUpdateUseCase { + private final PostDomainService postDomainService; + private final AuthentiatedUserUtils userUtils; + + public PostCommandResponseDto execute(Long postId, PostUpdateRequestDto request) { + return postDomainService.editPost(buildDTO(postId, request)); + } + + private PostUpdateServiceDto buildDTO(Long postId, PostUpdateRequestDto request) { + return PostUpdateServiceDto.builder() + .loginUserId(userUtils.getCurrentUserId()) + .postId(postId) + .title(request.getTitle()) + .thumbnail(request.getThumbnail()) + .body(request.getBody()) + .build(); + } +} diff --git a/likelion-client/src/test/java/likelion/univ/TestConfiguration.java b/likelion-client/src/test/java/likelion/univ/TestConfiguration.java new file mode 100644 index 00000000..d3ad04cf --- /dev/null +++ b/likelion-client/src/test/java/likelion/univ/TestConfiguration.java @@ -0,0 +1,12 @@ +package likelion.univ; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class TestConfiguration { + @Test + void ContextLoads() { + + } +} diff --git a/likelion-client/src/test/java/likelion/univ/post/controller/PostControllerTest.java b/likelion-client/src/test/java/likelion/univ/post/controller/PostControllerTest.java new file mode 100644 index 00000000..46be092c --- /dev/null +++ b/likelion-client/src/test/java/likelion/univ/post/controller/PostControllerTest.java @@ -0,0 +1,32 @@ +package likelion.univ.post.controller; + +import likelion.univ.LikelionClientApplication; +import likelion.univ.TestConfiguration; +import org.junit.jupiter.api.Test; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.TestPropertySources; + +import static org.junit.jupiter.api.Assertions.*; + +@SpringBootTest(classes = TestConfiguration.class) +@TestPropertySource("classpath:application.yml") +class PostControllerTest { + + @Test + void createPost() { + + } + + @Test + void findAll() { + } + + @Test + void updatePost() { + } + + @Test + void deletePost() { + } +} diff --git a/likelion-client/src/test/resources/application.yml b/likelion-client/src/test/resources/application.yml new file mode 100644 index 00000000..7b41e9fd --- /dev/null +++ b/likelion-client/src/test/resources/application.yml @@ -0,0 +1,49 @@ +## 공통 설정 +spring: + profiles: + include: + - common + - core + - infrastructure + - security + - redis + data: + web: + pageable: ##페이징 + one-indexed-parameters: true #1페이지부터 시작, default:0페이지 + +server: + servlet: + context-path: /api + +springdoc: + default-consumes-media-type: application/json;charset=UTF-8 + default-produces-media-type: application/json;charset=UTF-8 + api-docs: + enabled: ${SWAGGER_ENABLED} + path: '/swagger' + swagger-ui: + enabled: ${SWAGGER_ENABLED} + path: '/swagger-ui.html' + try-it-out-enabled: ${SWAGGER_TRY_IT_OUT} + operations-sorter: alpha + + +--- ## dev 환경 설정 +spring: + config: + activate: + on-profile: dev + + +--- ## staging환경 설정 +spring: + config: + activate: + on-profile: staging + +--- ## prod 환경 설정 +spring: + config: + activate: + on-profile: prod diff --git a/likelion-common/build.gradle b/likelion-common/build.gradle index 516743e9..a0accfb8 100644 --- a/likelion-common/build.gradle +++ b/likelion-common/build.gradle @@ -15,4 +15,5 @@ bootJar { jar { enabled = true -} \ No newline at end of file +} + diff --git a/likelion-common/src/main/resources/application-common.yml b/likelion-common/src/main/resources/application-common.yml index f1577e11..a7297bcf 100644 --- a/likelion-common/src/main/resources/application-common.yml +++ b/likelion-common/src/main/resources/application-common.yml @@ -1,5 +1,6 @@ ## 공통 설정 + --- ## dev 환경 설정 spring: config: @@ -16,4 +17,4 @@ spring: spring: config: activate: - on-profile: prod \ No newline at end of file + on-profile: prod diff --git a/likelion-core/build.gradle b/likelion-core/build.gradle index 9230bd9c..ad09a576 100644 --- a/likelion-core/build.gradle +++ b/likelion-core/build.gradle @@ -8,20 +8,23 @@ dependencies { api는 다른 모듈에서 이 라이브러리를 사용할때(직접적으로) 적용 두번 컴파일 되므로 없는게 의존성 낮추는 가장 좋은 방법 */ - implementation 'org.springframework.boot:spring-boot-starter-data-jpa' + api 'org.springframework.boot:spring-boot-starter-data-jpa' + testImplementation 'org.junit.jupiter:junit-jupiter:5.8.1' + runtimeOnly 'com.h2database:h2' implementation group: 'com.mysql', name: 'mysql-connector-j' - // Querydsl - implementation 'com.querydsl:querydsl-jpa' - implementation 'com.querydsl:querydsl-core' - implementation project(path: ':likelion-common') - // Querydsl JPAAnnotationProcessor 사용 지정 + // Querydsl + api 'com.querydsl:querydsl-jpa' + api 'com.querydsl:querydsl-core' + // Querydsl JPAAnnotationProcessor 사용 지정 annotationProcessor "com.querydsl:querydsl-apt:${dependencyManagement.importedProperties['querydsl.version']}:jpa" annotationProcessor("jakarta.persistence:jakarta.persistence-api") // java.lang.NoClassDefFoundError(javax.annotation.Entity) 발생 대응 annotationProcessor("jakarta.annotation:jakarta.annotation-api") // java.lang.NoClassDefFoundError (javax.annotation.Generated) 발생 대응 + /* common 모듈 추가 */ implementation project(':likelion-common') + implementation project(path: ':likelion-common') } clean { @@ -39,3 +42,4 @@ bootJar { jar { enabled = true } + diff --git a/likelion-core/src/main/java/likelion/univ/config/QueryDslConfig.java b/likelion-core/src/main/java/likelion/univ/config/QueryDslConfig.java index ab3b334d..65a6c6e3 100644 --- a/likelion-core/src/main/java/likelion/univ/config/QueryDslConfig.java +++ b/likelion-core/src/main/java/likelion/univ/config/QueryDslConfig.java @@ -5,16 +5,11 @@ import org.springframework.context.annotation.Configuration; import javax.persistence.EntityManager; -import javax.persistence.PersistenceContext; @Configuration public class QueryDslConfig { - - @PersistenceContext - private EntityManager entityManager; - @Bean - public JPAQueryFactory jpaQueryFactory () { + public JPAQueryFactory jpaQueryFactory(EntityManager entityManager) { return new JPAQueryFactory(entityManager); } } diff --git a/likelion-core/src/main/java/likelion/univ/domain/comment/adaptor/CommentAdaptor.java b/likelion-core/src/main/java/likelion/univ/domain/comment/adaptor/CommentAdaptor.java index 0288da9a..9ba6cdb9 100644 --- a/likelion-core/src/main/java/likelion/univ/domain/comment/adaptor/CommentAdaptor.java +++ b/likelion-core/src/main/java/likelion/univ/domain/comment/adaptor/CommentAdaptor.java @@ -15,8 +15,8 @@ public class CommentAdaptor { private final CommentRepository commentRepository; - public Comment save(Comment comment) { - return commentRepository.save(comment); + public Long save(Comment comment) { + return commentRepository.save(comment).getId(); } public Comment findById(Long id) { diff --git a/likelion-core/src/main/java/likelion/univ/domain/comment/adaptor/LikeCommentAdaptor.java b/likelion-core/src/main/java/likelion/univ/domain/comment/adaptor/LikeCommentAdaptor.java deleted file mode 100644 index deaad444..00000000 --- a/likelion-core/src/main/java/likelion/univ/domain/comment/adaptor/LikeCommentAdaptor.java +++ /dev/null @@ -1,33 +0,0 @@ -package likelion.univ.domain.comment.adaptor; - -import likelion.univ.annotation.Adaptor; -import likelion.univ.domain.comment.entity.LikeComment; -import likelion.univ.domain.comment.exception.LikeCommentNotFoundException; -import likelion.univ.domain.comment.repository.LikeCommentRepository; -import likelion.univ.domain.user.entity.User; -import lombok.RequiredArgsConstructor; - -import java.util.List; - -@Adaptor -@RequiredArgsConstructor -public class LikeCommentAdaptor { - private final LikeCommentRepository likeCommentRepository; - - public LikeComment save(LikeComment likeComment) { - return likeCommentRepository.save(likeComment); - } - - public LikeComment findById(Long id) { - return likeCommentRepository.findById(id) - .orElseThrow(LikeCommentNotFoundException::new); - } - public void delete(LikeComment likeComment) { - likeCommentRepository.delete(likeComment); - } - - public List findAllByUser(User user) { - return likeCommentRepository.findByUser(user); - } - -} diff --git a/likelion-core/src/main/java/likelion/univ/domain/comment/dto/CommentCommandResponseDto.java b/likelion-core/src/main/java/likelion/univ/domain/comment/dto/CommentCommandResponseDto.java new file mode 100644 index 00000000..6f2db472 --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/comment/dto/CommentCommandResponseDto.java @@ -0,0 +1,19 @@ +package likelion.univ.domain.comment.dto; + +import likelion.univ.domain.comment.entity.Comment; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +@AllArgsConstructor +public class CommentCommandResponseDto { + private Long commentId; + + public static CommentCommandResponseDto of(Long commentId) { + return CommentCommandResponseDto.builder() + .commentId(commentId) + .build(); + } +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/comment/dto/CommentCreateChildServiceDto.java b/likelion-core/src/main/java/likelion/univ/domain/comment/dto/CommentCreateChildServiceDto.java new file mode 100644 index 00000000..e023f341 --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/comment/dto/CommentCreateChildServiceDto.java @@ -0,0 +1,15 @@ +package likelion.univ.domain.comment.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +@AllArgsConstructor +public class CommentCreateChildServiceDto { + private Long parentCommentId; + private Long postId; + private Long loginUserId; + private String body; +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/comment/dto/CommentCreateParentServiceDto.java b/likelion-core/src/main/java/likelion/univ/domain/comment/dto/CommentCreateParentServiceDto.java new file mode 100644 index 00000000..a7523df8 --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/comment/dto/CommentCreateParentServiceDto.java @@ -0,0 +1,14 @@ +package likelion.univ.domain.comment.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +@AllArgsConstructor +public class CommentCreateParentServiceDto { + private Long postId; + private Long loginUserId; + private String body; +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/comment/dto/CommentDeleteServiceDto.java b/likelion-core/src/main/java/likelion/univ/domain/comment/dto/CommentDeleteServiceDto.java new file mode 100644 index 00000000..c56b5ba8 --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/comment/dto/CommentDeleteServiceDto.java @@ -0,0 +1,13 @@ +package likelion.univ.domain.comment.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +@AllArgsConstructor +public class CommentDeleteServiceDto { + private Long loginUserId; + private Long commentId; +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/comment/dto/CommentDetailResponseDto.java b/likelion-core/src/main/java/likelion/univ/domain/comment/dto/CommentDetailResponseDto.java new file mode 100644 index 00000000..ea1fb9df --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/comment/dto/CommentDetailResponseDto.java @@ -0,0 +1,47 @@ +package likelion.univ.domain.comment.dto; + +import com.querydsl.core.annotations.QueryProjection; +import likelion.univ.domain.comment.entity.Comment; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class CommentDetailResponseDto { + private Long commentId; + private Long userId; + private String username; + private Long parentId; + private String body; + private Integer likeCount; + private Boolean isDeleted; + + @QueryProjection + public CommentDetailResponseDto(Long commentId, Long userId, String username, Long parentId, String body, Integer likeCount, Boolean isDeleted) { + this.commentId = commentId; + this.userId = userId; + this.username = username; + this.parentId = parentId; + this.body = body; + this.likeCount = likeCount; + this.isDeleted = isDeleted; + } + + public static CommentDetailResponseDto of(Comment comment) { + return CommentDetailResponseDto.builder() + .commentId(comment.getId()) + .userId(comment.getAuthor().getId()) + .username(comment.getAuthor().getProfile().getName()) + .parentId(comment.getParentComment().getId()) + .body(comment.getBody()) + .likeCount(getLikeCount(comment)) + .isDeleted(comment.getIsDeleted()) + .build(); + } + private static Integer getLikeCount(Comment comment) { + return Math.toIntExact(comment.getCommentLikes().stream() + .filter(l -> l.getIsCanceled().equals(false)) + .count()); + } +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/comment/dto/CommentServiceDto.java b/likelion-core/src/main/java/likelion/univ/domain/comment/dto/CommentServiceDto.java deleted file mode 100644 index c4b5f33f..00000000 --- a/likelion-core/src/main/java/likelion/univ/domain/comment/dto/CommentServiceDto.java +++ /dev/null @@ -1,83 +0,0 @@ -package likelion.univ.domain.comment.dto; - -import likelion.univ.domain.comment.entity.Comment; -import likelion.univ.domain.post.entity.Post; -import likelion.univ.domain.user.entity.User; -import lombok.Builder; -import lombok.Data; - - -public class CommentServiceDto { - @Data - @Builder - public static class CreateParentCommentRequest { - private String body; - private Post post; - private User user; - } - - @Data - @Builder - public static class CreateChildCommentRequest { - private String body; - private Post post; - private User user; - private Comment parent; - } - - @Data - @Builder - public static class EditCommentRequest { - private Long id; - private String body; - } - - @Data - @Builder - public static class DeleteCommentRequest { - private Long id; - } - - @Data - @Builder - public static class CommandResponse { - private Long id; - - public static CommandResponse of(Comment comment) { - return CommandResponse.builder() - .id(comment.getId()) - .build(); - } - } - - @Data - @Builder - public static class ReadResponse { - private Long id; - private String username; // author.profile.name - private Long parentId; - private String body; - private Long likeCount; - private Boolean isDeleted; - - public static ReadResponse of(Comment comment) { - return ReadResponse.builder() - .id(comment.getId()) - .username(comment.getAuthor().getProfile().getName()) - .parentId(comment.getParentComment().getId()) - .body(comment.getBody()) - .likeCount(getLikeCount(comment)) - .isDeleted(comment.getIsDeleted()) - .build(); - } - - private static long getLikeCount(Comment comment) { - return comment.getLikeComments().stream() - .filter(l -> l.getIsCanceled().equals(false)) - .count(); - } - } - - - -} diff --git a/likelion-core/src/main/java/likelion/univ/domain/comment/dto/CommentUpdateServiceDto.java b/likelion-core/src/main/java/likelion/univ/domain/comment/dto/CommentUpdateServiceDto.java new file mode 100644 index 00000000..721339da --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/comment/dto/CommentUpdateServiceDto.java @@ -0,0 +1,14 @@ +package likelion.univ.domain.comment.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +@AllArgsConstructor +public class CommentUpdateServiceDto { + private Long commentId; + private Long loginUserId; + private String body; +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/comment/dto/LikeCommentServiceDto.java b/likelion-core/src/main/java/likelion/univ/domain/comment/dto/LikeCommentServiceDto.java deleted file mode 100644 index 6ba69aa0..00000000 --- a/likelion-core/src/main/java/likelion/univ/domain/comment/dto/LikeCommentServiceDto.java +++ /dev/null @@ -1,34 +0,0 @@ -package likelion.univ.domain.comment.dto; - -import likelion.univ.domain.comment.entity.LikeComment; -import lombok.Builder; -import lombok.Data; - -public class LikeCommentServiceDto { - @Data - @Builder - public static class createLikeCommentRequest { - private Long userId; - private Long commentId; - } - - @Data - @Builder - public static class switchLikeCommentRequest { - private Long likeCommentId; - private Long userId; - } - - - @Data - @Builder - public static class CommandResponse { - private Long id; - - public static CommandResponse of(LikeComment likeComment) { - return CommandResponse.builder() - .id(likeComment.getId()) - .build(); - } - } -} diff --git a/likelion-core/src/main/java/likelion/univ/domain/comment/entity/Comment.java b/likelion-core/src/main/java/likelion/univ/domain/comment/entity/Comment.java index 081399d5..018bc699 100644 --- a/likelion-core/src/main/java/likelion/univ/domain/comment/entity/Comment.java +++ b/likelion-core/src/main/java/likelion/univ/domain/comment/entity/Comment.java @@ -1,6 +1,7 @@ package likelion.univ.domain.comment.entity; import likelion.univ.common.entity.BaseTimeEntity; +import likelion.univ.domain.like.commentlike.entity.CommentLike; import likelion.univ.domain.post.entity.Post; import likelion.univ.domain.user.entity.User; import lombok.AccessLevel; @@ -31,19 +32,19 @@ public class Comment extends BaseTimeEntity { private Post post; @ManyToOne(fetch = FetchType.LAZY) - @JoinColumn(name = "parent_id") + @JoinColumn(name = "parent_comment_id") private Comment parentComment; @OneToMany(mappedBy = "comment", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true) // 안정성 체크해봐야됨 - private List likeComments = new ArrayList<>(); + private List commentLikes = new ArrayList<>(); @OneToMany(mappedBy = "parentComment", cascade = {CascadeType.PERSIST, CascadeType.REMOVE}, orphanRemoval = true) // 안정성 체크해봐야됨 private List childComments = new ArrayList<>(); - @Column(nullable = false) + @Column(nullable = false, columnDefinition = "TEXT") private String body; @Column(nullable = false) @@ -51,19 +52,20 @@ public class Comment extends BaseTimeEntity { @Builder private Comment(Post post, User author, String body) { + this.parentComment = null; this.post = post; this.author = author; this.body = body; - isDeleted = false; + this.isDeleted = false; } - public Comment editBody(String body) { + public Long updateBody(String body) { this.body = body; - return this; + return this.id; } - public Comment delete() { + public Long softDelete() { this.isDeleted = true; - return this; + return this.id; } /* 연관관계 편의 메서드 */ diff --git a/likelion-core/src/main/java/likelion/univ/domain/comment/exception/LikeCommentNotFoundException.java b/likelion-core/src/main/java/likelion/univ/domain/comment/exception/LikeCommentNotFoundException.java deleted file mode 100644 index 424fd39c..00000000 --- a/likelion-core/src/main/java/likelion/univ/domain/comment/exception/LikeCommentNotFoundException.java +++ /dev/null @@ -1,9 +0,0 @@ -package likelion.univ.domain.comment.exception; - -import likelion.univ.exception.base.BaseException; - -public class LikeCommentNotFoundException extends BaseException { - public LikeCommentNotFoundException() { - super(LikeCommentErrorCode.CREATE_LIKECOMMENT_BAD_REQUEST); - } -} diff --git a/likelion-core/src/main/java/likelion/univ/domain/comment/exception/AuthorNotDetectedException.java b/likelion-core/src/main/java/likelion/univ/domain/comment/exception/NotAuthorizedException.java similarity index 60% rename from likelion-core/src/main/java/likelion/univ/domain/comment/exception/AuthorNotDetectedException.java rename to likelion-core/src/main/java/likelion/univ/domain/comment/exception/NotAuthorizedException.java index 74f490e3..86bd2c96 100644 --- a/likelion-core/src/main/java/likelion/univ/domain/comment/exception/AuthorNotDetectedException.java +++ b/likelion-core/src/main/java/likelion/univ/domain/comment/exception/NotAuthorizedException.java @@ -2,8 +2,8 @@ import likelion.univ.exception.base.BaseException; -public class AuthorNotDetectedException extends BaseException { - public AuthorNotDetectedException() { +public class NotAuthorizedException extends BaseException { + public NotAuthorizedException() { super(CommentErrorCode.AUTHOR_NOT_DETECTED); } } diff --git a/likelion-core/src/main/java/likelion/univ/domain/comment/repository/LikeCommentRepository.java b/likelion-core/src/main/java/likelion/univ/domain/comment/repository/LikeCommentRepository.java deleted file mode 100644 index 2b28acba..00000000 --- a/likelion-core/src/main/java/likelion/univ/domain/comment/repository/LikeCommentRepository.java +++ /dev/null @@ -1,12 +0,0 @@ -package likelion.univ.domain.comment.repository; - -import likelion.univ.domain.comment.entity.LikeComment; -import likelion.univ.domain.user.entity.User; -import org.springframework.data.jpa.repository.JpaRepository; - -import java.util.List; - -public interface LikeCommentRepository extends JpaRepository { - - List findByUser(User user); -} diff --git a/likelion-core/src/main/java/likelion/univ/domain/comment/service/CommentDomainService.java b/likelion-core/src/main/java/likelion/univ/domain/comment/service/CommentDomainService.java index 0ef600ad..0a06f887 100644 --- a/likelion-core/src/main/java/likelion/univ/domain/comment/service/CommentDomainService.java +++ b/likelion-core/src/main/java/likelion/univ/domain/comment/service/CommentDomainService.java @@ -1,8 +1,11 @@ package likelion.univ.domain.comment.service; import likelion.univ.domain.comment.adaptor.CommentAdaptor; +import likelion.univ.domain.comment.dto.*; import likelion.univ.domain.comment.entity.Comment; -import likelion.univ.domain.comment.dto.CommentServiceDto; +import likelion.univ.domain.comment.exception.NotAuthorizedException; +import likelion.univ.domain.post.adaptor.PostAdaptor; +import likelion.univ.domain.user.adaptor.UserAdaptor; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -12,53 +15,84 @@ @RequiredArgsConstructor public class CommentDomainService { private final CommentAdaptor commentAdaptor; + private final PostAdaptor postAdaptor; + private final UserAdaptor userAdaptor; - public CommentServiceDto.CommandResponse createParentComment(CommentServiceDto.CreateParentCommentRequest createParentCommentRequest) { - Comment parent = buildParentComment(createParentCommentRequest); - Comment saveComment = commentAdaptor.save(parent); - - return CommentServiceDto.CommandResponse.of(saveComment); + public CommentCommandResponseDto createParentComment(CommentCreateParentServiceDto request) { + Comment parentComment = parentCommentBy(request); + Long savedId = commentAdaptor.save(parentComment); + return CommentCommandResponseDto.of(savedId); } - public CommentServiceDto.CommandResponse createChildComment(CommentServiceDto.CreateChildCommentRequest createChildCommentRequest) { - Comment child = buildChildComment(createChildCommentRequest); - Comment saveComment = commentAdaptor.save(child); - return CommentServiceDto.CommandResponse.of(saveComment); + public CommentCommandResponseDto createChildComment(CommentCreateChildServiceDto request) { + Comment childComment = childCommentBy(request); + Long savedId = commentAdaptor.save(childComment); + return CommentCommandResponseDto.of(savedId); } - public CommentServiceDto.CommandResponse editCommentBody(CommentServiceDto.EditCommentRequest editCommentRequest) { - Comment findComment = commentAdaptor.findById(editCommentRequest.getId()); - Comment editComment = findComment.editBody(editCommentRequest.getBody()); - return CommentServiceDto.CommandResponse.of(editComment); + public CommentCommandResponseDto updateCommentBody(CommentUpdateServiceDto request) { + if (isAuthorized(request)) { + Comment findComment = commentAdaptor.findById(request.getCommentId()); + Long updatedId = findComment.updateBody(request.getBody()); + return CommentCommandResponseDto.of(updatedId); + } + throw new NotAuthorizedException(); } - public CommentServiceDto.CommandResponse deleteCommentSoft(CommentServiceDto.DeleteCommentRequest deleteCommentRequest) { - Comment findComment = commentAdaptor.findById(deleteCommentRequest.getId()); - Comment deleteComment = findComment.delete(); - return CommentServiceDto.CommandResponse.of(deleteComment); + public CommentCommandResponseDto deleteCommentSoft(CommentDeleteServiceDto request) { + if (isAuthorized(request)) { + Comment findComment = commentAdaptor.findById(request.getCommentId()); + Long deletedId = findComment.softDelete(); + return CommentCommandResponseDto.of(deletedId); + } + throw new NotAuthorizedException(); } - public void deleteCommentHard(CommentServiceDto.DeleteCommentRequest deleteCommentRequest) { - Comment findComment = commentAdaptor.findById(deleteCommentRequest.getId()); + public void deleteCommentHard(CommentDeleteServiceDto request) { + Comment findComment = commentAdaptor.findById(request.getCommentId()); commentAdaptor.delete(findComment); } /* --------------- 내부 편의 메서드 --------------- */ - private static Comment buildParentComment(CommentServiceDto.CreateParentCommentRequest createParentCommentRequest) { + private Comment parentCommentBy(CommentCreateParentServiceDto request) { return Comment.builder() - .post(createParentCommentRequest.getPost()) - .author(createParentCommentRequest.getUser()) - .body(createParentCommentRequest.getBody()) + .post(postAdaptor.findById(request.getPostId())) + .author(userAdaptor.findById(request.getLoginUserId())) + .body(request.getBody()) .build(); } - private static Comment buildChildComment(CommentServiceDto.CreateChildCommentRequest createChildCommentRequest) { - return Comment.builder() - .post(createChildCommentRequest.getPost()) - .author(createChildCommentRequest.getUser()) - .body(createChildCommentRequest.getBody()) + private Comment childCommentBy(CommentCreateChildServiceDto request) { + Comment comment = Comment.builder() + .post(postAdaptor.findById(request.getPostId())) + .author(userAdaptor.findById(request.getLoginUserId())) + .body(request.getBody()) .build(); + comment.setParent(parentCommentBy(request.getParentCommentId())); + return comment; + } + + private Comment parentCommentBy(Long parentCommentId) { + return commentAdaptor.findById(parentCommentId); + } + + private boolean isAuthorized(CommentUpdateServiceDto request) { + Long commentId = request.getCommentId(); + Long authorId = getAuthorId(commentId); + Long loginUserId = request.getLoginUserId(); + return authorId.equals(loginUserId); + } + + private boolean isAuthorized(CommentDeleteServiceDto request) { + Long commentId = request.getCommentId(); + Long authorId = getAuthorId(commentId); + Long loginUserId = request.getLoginUserId(); + return authorId.equals(loginUserId); + } + + private Long getAuthorId(Long commentId) { + return commentAdaptor.findById(commentId).getAuthor().getId(); } } diff --git a/likelion-core/src/main/java/likelion/univ/domain/comment/service/LikeCommentDomainService.java b/likelion-core/src/main/java/likelion/univ/domain/comment/service/LikeCommentDomainService.java deleted file mode 100644 index 9200f99a..00000000 --- a/likelion-core/src/main/java/likelion/univ/domain/comment/service/LikeCommentDomainService.java +++ /dev/null @@ -1,58 +0,0 @@ -package likelion.univ.domain.comment.service; - -import likelion.univ.domain.comment.adaptor.CommentAdaptor; -import likelion.univ.domain.comment.entity.Comment; -import likelion.univ.domain.comment.exception.AuthorNotDetectedException; -import likelion.univ.domain.comment.adaptor.LikeCommentAdaptor; -import likelion.univ.domain.comment.dto.LikeCommentServiceDto; -import likelion.univ.domain.comment.entity.LikeComment; -import likelion.univ.domain.user.adaptor.UserAdaptor; -import likelion.univ.domain.user.entity.User; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -@Transactional -@RequiredArgsConstructor -public class LikeCommentDomainService { - private final LikeCommentAdaptor likeCommentAdaptor; - private final UserAdaptor userAdaptor; - private final CommentAdaptor commentAdaptor; - - // 좋아요 생성 - public LikeCommentServiceDto.CommandResponse createLikeComment(LikeCommentServiceDto.createLikeCommentRequest createLikeCommentRequest) { - LikeComment likeComment = getLikeCommentBy(createLikeCommentRequest); - LikeComment saveLikeComment = likeCommentAdaptor.save(likeComment); - return LikeCommentServiceDto.CommandResponse.of(saveLikeComment); - } - - // 좋아요 전환 - public LikeCommentServiceDto.CommandResponse switchLikeComment(LikeCommentServiceDto.switchLikeCommentRequest switchLikeCommentRequest) { - LikeComment findLikeComment = likeCommentAdaptor.findById(switchLikeCommentRequest.getLikeCommentId()); - if (isSameUser(switchLikeCommentRequest, findLikeComment)) { - throw new AuthorNotDetectedException(); - } - LikeComment switchedLikeComment = findLikeComment.switchLikeComment(); - return LikeCommentServiceDto.CommandResponse.of(switchedLikeComment); - } - - - /* ----- 내부 편의 메서드 ------ */ - private LikeComment getLikeCommentBy(LikeCommentServiceDto.createLikeCommentRequest createLikeCommentRequest) { - return LikeComment.builder() - .user(getUserBy(createLikeCommentRequest)) - .comment(getCommentBy(createLikeCommentRequest)) - .build(); - } - private boolean isSameUser(LikeCommentServiceDto.switchLikeCommentRequest switchLikeCommentRequest, LikeComment likeComment) { - return likeComment.getUser().equals(userAdaptor.findById(switchLikeCommentRequest.getUserId())); - } - private User getUserBy(LikeCommentServiceDto.createLikeCommentRequest createLikeCommentRequest) { - return userAdaptor.findById(createLikeCommentRequest.getUserId()); - } - private Comment getCommentBy(LikeCommentServiceDto.createLikeCommentRequest createLikeCommentRequest) { - return commentAdaptor.findById(createLikeCommentRequest.getCommentId()); - } - -} diff --git a/likelion-core/src/main/java/likelion/univ/domain/like/commentlike/adaptor/CommentLikeAdaptor.java b/likelion-core/src/main/java/likelion/univ/domain/like/commentlike/adaptor/CommentLikeAdaptor.java new file mode 100644 index 00000000..7e5bbed0 --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/like/commentlike/adaptor/CommentLikeAdaptor.java @@ -0,0 +1,33 @@ +package likelion.univ.domain.like.commentlike.adaptor; + +import likelion.univ.annotation.Adaptor; +import likelion.univ.domain.like.commentlike.entity.CommentLike; +import likelion.univ.domain.like.commentlike.exception.CommentLikeNotFoundException; +import likelion.univ.domain.like.commentlike.repository.CommentLikeRepository; +import likelion.univ.domain.user.entity.User; +import lombok.RequiredArgsConstructor; + +import java.util.List; + +@Adaptor +@RequiredArgsConstructor +public class CommentLikeAdaptor { + private final CommentLikeRepository commentLikeRepository; + + public Long save(CommentLike commentLike) { + return commentLikeRepository.save(commentLike).getId(); + } + + public CommentLike findById(Long id) { + return commentLikeRepository.findById(id) + .orElseThrow(CommentLikeNotFoundException::new); + } + public void delete(CommentLike commentLike) { + commentLikeRepository.delete(commentLike); + } + + public List findAllByUser(User user) { + return commentLikeRepository.findByUser(user); + } + +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/like/commentlike/dto/CommentLikeCreateServiceDto.java b/likelion-core/src/main/java/likelion/univ/domain/like/commentlike/dto/CommentLikeCreateServiceDto.java new file mode 100644 index 00000000..384bbbb1 --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/like/commentlike/dto/CommentLikeCreateServiceDto.java @@ -0,0 +1,13 @@ +package likelion.univ.domain.like.commentlike.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +@AllArgsConstructor +public class CommentLikeCreateServiceDto { + private Long loginUserId; + private Long commentId; +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/like/commentlike/dto/CommentLikeResponseDto.java b/likelion-core/src/main/java/likelion/univ/domain/like/commentlike/dto/CommentLikeResponseDto.java new file mode 100644 index 00000000..e9119701 --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/like/commentlike/dto/CommentLikeResponseDto.java @@ -0,0 +1,25 @@ +package likelion.univ.domain.like.commentlike.dto; + +import likelion.univ.domain.like.commentlike.entity.CommentLike; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +@AllArgsConstructor +public class CommentLikeResponseDto { + private Long commentLikeId; + + public static CommentLikeResponseDto of(Long commentLikeId) { + return CommentLikeResponseDto.builder() + .commentLikeId(commentLikeId) + .build(); + } + + public static CommentLikeResponseDto of(CommentLike commentLike) { + return CommentLikeResponseDto.builder() + .commentLikeId(commentLike.getId()) + .build(); + } +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/like/commentlike/dto/CommentLikeSwitchServiceDto.java b/likelion-core/src/main/java/likelion/univ/domain/like/commentlike/dto/CommentLikeSwitchServiceDto.java new file mode 100644 index 00000000..df984675 --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/like/commentlike/dto/CommentLikeSwitchServiceDto.java @@ -0,0 +1,13 @@ +package likelion.univ.domain.like.commentlike.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +@AllArgsConstructor +public class CommentLikeSwitchServiceDto { + private Long commentLikeId; + private Long loginUserId; +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/comment/entity/LikeComment.java b/likelion-core/src/main/java/likelion/univ/domain/like/commentlike/entity/CommentLike.java similarity index 73% rename from likelion-core/src/main/java/likelion/univ/domain/comment/entity/LikeComment.java rename to likelion-core/src/main/java/likelion/univ/domain/like/commentlike/entity/CommentLike.java index d405657d..63404d9a 100644 --- a/likelion-core/src/main/java/likelion/univ/domain/comment/entity/LikeComment.java +++ b/likelion-core/src/main/java/likelion/univ/domain/like/commentlike/entity/CommentLike.java @@ -1,6 +1,7 @@ -package likelion.univ.domain.comment.entity; +package likelion.univ.domain.like.commentlike.entity; import likelion.univ.common.entity.BaseTimeEntity; +import likelion.univ.domain.comment.entity.Comment; import likelion.univ.domain.user.entity.User; import lombok.AccessLevel; import lombok.Builder; @@ -12,7 +13,7 @@ @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -public class LikeComment extends BaseTimeEntity { +public class CommentLike extends BaseTimeEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "like_comment_id") private Long id; @@ -28,13 +29,13 @@ public class LikeComment extends BaseTimeEntity { private Boolean isCanceled; @Builder - public LikeComment(User user, Comment comment) { + public CommentLike(User user, Comment comment, Boolean isCanceled) { this.user = user; this.comment = comment; - this.isCanceled = false; + this.isCanceled = isCanceled; } - public LikeComment switchLikeComment() { + public CommentLike switchLikeComment() { this.isCanceled = !this.getIsCanceled(); return this; } diff --git a/likelion-core/src/main/java/likelion/univ/domain/comment/exception/LikeCommentErrorCode.java b/likelion-core/src/main/java/likelion/univ/domain/like/commentlike/exception/CommentLikeErrorCode.java similarity index 79% rename from likelion-core/src/main/java/likelion/univ/domain/comment/exception/LikeCommentErrorCode.java rename to likelion-core/src/main/java/likelion/univ/domain/like/commentlike/exception/CommentLikeErrorCode.java index 9c8aca13..76000504 100644 --- a/likelion-core/src/main/java/likelion/univ/domain/comment/exception/LikeCommentErrorCode.java +++ b/likelion-core/src/main/java/likelion/univ/domain/like/commentlike/exception/CommentLikeErrorCode.java @@ -1,4 +1,4 @@ -package likelion.univ.domain.comment.exception; +package likelion.univ.domain.like.commentlike.exception; import likelion.univ.exception.base.BaseErrorCode; import lombok.Getter; @@ -8,7 +8,7 @@ @Getter @RequiredArgsConstructor -public enum LikeCommentErrorCode implements BaseErrorCode { +public enum CommentLikeErrorCode implements BaseErrorCode { CREATE_LIKECOMMENT_BAD_REQUEST(BAD_REQUEST, "COMMENT_400", "댓글 좋아요를 생성하는 데 잘못된 요청을 하였습니다."); private final int httpStatus; diff --git a/likelion-core/src/main/java/likelion/univ/domain/like/commentlike/exception/CommentLikeNotFoundException.java b/likelion-core/src/main/java/likelion/univ/domain/like/commentlike/exception/CommentLikeNotFoundException.java new file mode 100644 index 00000000..9f513b6a --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/like/commentlike/exception/CommentLikeNotFoundException.java @@ -0,0 +1,9 @@ +package likelion.univ.domain.like.commentlike.exception; + +import likelion.univ.exception.base.BaseException; + +public class CommentLikeNotFoundException extends BaseException { + public CommentLikeNotFoundException() { + super(CommentLikeErrorCode.CREATE_LIKECOMMENT_BAD_REQUEST); + } +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/like/commentlike/repository/CommentLikeRepository.java b/likelion-core/src/main/java/likelion/univ/domain/like/commentlike/repository/CommentLikeRepository.java new file mode 100644 index 00000000..cd42caf5 --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/like/commentlike/repository/CommentLikeRepository.java @@ -0,0 +1,12 @@ +package likelion.univ.domain.like.commentlike.repository; + +import likelion.univ.domain.like.commentlike.entity.CommentLike; +import likelion.univ.domain.user.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.List; + +public interface CommentLikeRepository extends JpaRepository { + + List findByUser(User user); +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/like/commentlike/service/CommentLikeDomainService.java b/likelion-core/src/main/java/likelion/univ/domain/like/commentlike/service/CommentLikeDomainService.java new file mode 100644 index 00000000..0c8efa2c --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/like/commentlike/service/CommentLikeDomainService.java @@ -0,0 +1,56 @@ +package likelion.univ.domain.like.commentlike.service; + +import likelion.univ.domain.comment.adaptor.CommentAdaptor; +import likelion.univ.domain.comment.exception.NotAuthorizedException; +import likelion.univ.domain.like.commentlike.adaptor.CommentLikeAdaptor; +import likelion.univ.domain.like.commentlike.dto.CommentLikeCreateServiceDto; +import likelion.univ.domain.like.commentlike.dto.CommentLikeResponseDto; +import likelion.univ.domain.like.commentlike.dto.CommentLikeSwitchServiceDto; +import likelion.univ.domain.like.commentlike.entity.CommentLike; +import likelion.univ.domain.user.adaptor.UserAdaptor; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional +@RequiredArgsConstructor +public class CommentLikeDomainService { + private final UserAdaptor userAdaptor; + private final CommentAdaptor commentAdaptor; + private final CommentLikeAdaptor commentLikeAdaptor; + + // 좋아요 생성 + public CommentLikeResponseDto createLikeComment(CommentLikeCreateServiceDto request) { + CommentLike commentLike = getCommentLikeBy(request); + Long savedId = commentLikeAdaptor.save(commentLike); + return CommentLikeResponseDto.of(savedId); + } + + // 좋아요 전환 + public CommentLikeResponseDto switchLikeComment(CommentLikeSwitchServiceDto request) { + if (isAuthorized(request)) { + CommentLike commentLike = commentLikeAdaptor.findById(request.getCommentLikeId()); + CommentLike switchedCommentLike = commentLike.switchLikeComment(); + return CommentLikeResponseDto.of(switchedCommentLike); + } + throw new NotAuthorizedException(); + } + + + /* ----- 내부 편의 메서드 ------ */ + private CommentLike getCommentLikeBy(CommentLikeCreateServiceDto request) { + return CommentLike.builder() + .user(userAdaptor.findById(request.getLoginUserId())) + .comment(commentAdaptor.findById(request.getCommentId())) + .isCanceled(false) // default + .build(); + } + private boolean isAuthorized(CommentLikeSwitchServiceDto request) { + Long commentLikeId = request.getCommentLikeId(); + Long commentLikeAuthorId = commentLikeAdaptor.findById(commentLikeId).getUser().getId(); + Long loginUserId = request.getLoginUserId(); + + return commentLikeAuthorId.equals(loginUserId); + } +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/like/postlike/adaptor/PostLikeAdaptor.java b/likelion-core/src/main/java/likelion/univ/domain/like/postlike/adaptor/PostLikeAdaptor.java new file mode 100644 index 00000000..07ceeefe --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/like/postlike/adaptor/PostLikeAdaptor.java @@ -0,0 +1,31 @@ +package likelion.univ.domain.like.postlike.adaptor; + +import likelion.univ.annotation.Adaptor; +import likelion.univ.domain.like.postlike.entity.PostLike; +import likelion.univ.domain.like.postlike.exception.PostLikeNotFoundException; +import likelion.univ.domain.like.postlike.repository.PostLikeRepository; +import likelion.univ.domain.post.entity.Post; +import likelion.univ.domain.user.entity.User; +import lombok.RequiredArgsConstructor; + +@Adaptor +@RequiredArgsConstructor +public class PostLikeAdaptor { + private final PostLikeRepository postLikeRepository; + + public Long save(PostLike postLike) { + PostLike savedLike = postLikeRepository.save(postLike); + return savedLike.getId(); + } + public void delete(PostLike postLike) { + postLikeRepository.delete(postLike); + } + + public PostLike find(Post post, User author) { + return postLikeRepository.findByPostAndAuthor(post, author).orElseThrow(() -> new PostLikeNotFoundException()); + } + + public PostLike findById(Long postLikeId) { + return postLikeRepository.findById(postLikeId).orElseThrow(() -> new PostLikeNotFoundException()); + } +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/like/postlike/dto/PostLikeCreateServiceDto.java b/likelion-core/src/main/java/likelion/univ/domain/like/postlike/dto/PostLikeCreateServiceDto.java new file mode 100644 index 00000000..83f96065 --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/like/postlike/dto/PostLikeCreateServiceDto.java @@ -0,0 +1,17 @@ +package likelion.univ.domain.like.postlike.dto; + +import likelion.univ.domain.post.entity.Post; +import likelion.univ.domain.user.entity.User; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +@AllArgsConstructor +public class PostLikeCreateServiceDto { + private Long authorId; + private Long postId; + + +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/like/postlike/dto/PostLikeDeleteServiceDto.java b/likelion-core/src/main/java/likelion/univ/domain/like/postlike/dto/PostLikeDeleteServiceDto.java new file mode 100644 index 00000000..d8ba6e31 --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/like/postlike/dto/PostLikeDeleteServiceDto.java @@ -0,0 +1,14 @@ +package likelion.univ.domain.like.postlike.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +@AllArgsConstructor +public class PostLikeDeleteServiceDto { + private Long postLikeId; + private Long loginUserId; + +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/like/postlike/dto/PostLikeResponseDto.java b/likelion-core/src/main/java/likelion/univ/domain/like/postlike/dto/PostLikeResponseDto.java new file mode 100644 index 00000000..bbeb154c --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/like/postlike/dto/PostLikeResponseDto.java @@ -0,0 +1,12 @@ +package likelion.univ.domain.like.postlike.dto; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +@AllArgsConstructor +public class PostLikeResponseDto { + private Long id; +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/post/entity/LikePost.java b/likelion-core/src/main/java/likelion/univ/domain/like/postlike/entity/PostLike.java similarity index 64% rename from likelion-core/src/main/java/likelion/univ/domain/post/entity/LikePost.java rename to likelion-core/src/main/java/likelion/univ/domain/like/postlike/entity/PostLike.java index 1cb7a76c..31787729 100644 --- a/likelion-core/src/main/java/likelion/univ/domain/post/entity/LikePost.java +++ b/likelion-core/src/main/java/likelion/univ/domain/like/postlike/entity/PostLike.java @@ -1,8 +1,9 @@ -package likelion.univ.domain.post.entity; +package likelion.univ.domain.like.postlike.entity; -import likelion.univ.common.entity.BaseTimeEntity; import likelion.univ.domain.post.entity.Post; import likelion.univ.domain.user.entity.User; +import lombok.AllArgsConstructor; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -11,12 +12,12 @@ @Entity @Getter @NoArgsConstructor -public class LikePost extends BaseTimeEntity { - - @Id - @GeneratedValue +@AllArgsConstructor +@Builder +public class PostLike { + @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "like_post_id") - private Long likeId; + private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id", nullable = false) @@ -26,12 +27,4 @@ public class LikePost extends BaseTimeEntity { @JoinColumn(name = "post_id" ) private Post post; - - - @Column(name = "post_title") - private String postTitle; - - - - } diff --git a/likelion-core/src/main/java/likelion/univ/domain/like/postlike/exception/PostLikeErrorCode.java b/likelion-core/src/main/java/likelion/univ/domain/like/postlike/exception/PostLikeErrorCode.java new file mode 100644 index 00000000..52b8020c --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/like/postlike/exception/PostLikeErrorCode.java @@ -0,0 +1,17 @@ +package likelion.univ.domain.like.postlike.exception; + +import likelion.univ.exception.base.BaseErrorCode; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import static likelion.univ.constant.StaticValue.NOT_FOUND; + +@Getter +@AllArgsConstructor +public enum PostLikeErrorCode implements BaseErrorCode { + LIKEPOST_NOT_FOUND(NOT_FOUND, "LIKEPOST_404", "LikePost가 존재하지 않습니다."); + + private final int httpStatus; + private final String code; + private final String message; +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/like/postlike/exception/PostLikeNotFoundException.java b/likelion-core/src/main/java/likelion/univ/domain/like/postlike/exception/PostLikeNotFoundException.java new file mode 100644 index 00000000..096d3992 --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/like/postlike/exception/PostLikeNotFoundException.java @@ -0,0 +1,10 @@ +package likelion.univ.domain.like.postlike.exception; + +import likelion.univ.exception.base.BaseException; + +public class PostLikeNotFoundException extends BaseException { + + public PostLikeNotFoundException() { + super(PostLikeErrorCode.LIKEPOST_NOT_FOUND); + } +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/like/postlike/repository/PostLikeRepository.java b/likelion-core/src/main/java/likelion/univ/domain/like/postlike/repository/PostLikeRepository.java new file mode 100644 index 00000000..e1fac128 --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/like/postlike/repository/PostLikeRepository.java @@ -0,0 +1,12 @@ +package likelion.univ.domain.like.postlike.repository; + +import likelion.univ.domain.like.postlike.entity.PostLike; +import likelion.univ.domain.post.entity.Post; +import likelion.univ.domain.user.entity.User; +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.Optional; + +public interface PostLikeRepository extends JpaRepository { + Optional findByPostAndAuthor(Post post, User author); +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/like/postlike/service/PostLikeDomainService.java b/likelion-core/src/main/java/likelion/univ/domain/like/postlike/service/PostLikeDomainService.java new file mode 100644 index 00000000..9f9fce56 --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/like/postlike/service/PostLikeDomainService.java @@ -0,0 +1,64 @@ +package likelion.univ.domain.like.postlike.service; + +import likelion.univ.domain.comment.exception.NotAuthorizedException; +import likelion.univ.domain.like.postlike.adaptor.PostLikeAdaptor; +import likelion.univ.domain.like.postlike.entity.PostLike; +import likelion.univ.domain.post.adaptor.PostAdaptor; +import likelion.univ.domain.post.entity.Post; +import likelion.univ.domain.like.postlike.dto.PostLikeCreateServiceDto; +import likelion.univ.domain.like.postlike.dto.PostLikeDeleteServiceDto; +import likelion.univ.domain.like.postlike.dto.PostLikeResponseDto; +import likelion.univ.domain.user.adaptor.UserAdaptor; +import likelion.univ.domain.user.entity.User; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class PostLikeDomainService { + + private final PostLikeAdaptor postLikeAdaptor; + private final PostAdaptor postAdaptor; + private final UserAdaptor userAdaptor; + + public PostLikeResponseDto createLikePost(PostLikeCreateServiceDto request) { + PostLike newPostLike = newPostLikeBy(request); + Long savedLikeId = postLikeAdaptor.save(newPostLike); + + return PostLikeResponseDto.builder() + .id(savedLikeId) + .build(); + } + + + public void deleteLikePost(PostLikeDeleteServiceDto request) { + Long postLikeId = request.getPostLikeId(); + Long loginUserId = request.getLoginUserId(); + PostLike findPostLike = postLikeAdaptor.findById(postLikeId); + + if (!isAuthorized(findPostLike, loginUserId)) { + throw new NotAuthorizedException(); + } + postLikeAdaptor.delete(findPostLike); + + } + + private boolean isAuthorized(PostLike findPostLike, Long loginUserId) { + Long authorId = findPostLike.getAuthor().getId(); + return loginUserId.equals(authorId); + } + + private PostLike newPostLikeBy(PostLikeCreateServiceDto request) { + Long postId = request.getPostId(); + Long authorId = request.getAuthorId(); + Post findPost = postAdaptor.findById(postId); + User findUser = userAdaptor.findById(authorId); + PostLike newPostLike = PostLike.builder() + .post(findPost) + .author(findUser) + .build(); + return newPostLike; + } + + +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/post/adaptor/PostAdaptor.java b/likelion-core/src/main/java/likelion/univ/domain/post/adaptor/PostAdaptor.java index 54fbac7a..ff7137c8 100644 --- a/likelion-core/src/main/java/likelion/univ/domain/post/adaptor/PostAdaptor.java +++ b/likelion-core/src/main/java/likelion/univ/domain/post/adaptor/PostAdaptor.java @@ -2,34 +2,33 @@ import likelion.univ.annotation.Adaptor; import likelion.univ.domain.post.entity.Post; -//import likelion.univ.domain.community.post.repository.PostCustomRepository; -import likelion.univ.domain.post.repository.PostRepository; +import likelion.univ.domain.post.exception.PostNotFoudException; +import likelion.univ.domain.post.repository.PostCommandRepository; +import likelion.univ.domain.user.entity.User; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +import java.util.List; @Adaptor @RequiredArgsConstructor public class PostAdaptor { - @Autowired - private PostRepository postRepository; -// @Autowired -// private PostCustomRepository postCustomRepository; + private final PostCommandRepository postRepository; - public void save(Post post) { - postRepository.save(post); + public Long save(Post post) { + Post savedPost = postRepository.save(post); + return savedPost.getId(); } public Post findById(Long id) { - return postRepository.findById(id).get(); //예외처리 + return postRepository.findById(id).orElseThrow(() -> new PostNotFoudException()); } public void delete(Post post) { postRepository.delete(post); //예외처리 } -// public List retrievePostPaging(Integer page, Integer limit) { -// return postCustomRepository.pagingWithCoveringIndex(page, limit); -// } } diff --git a/likelion-core/src/main/java/likelion/univ/domain/post/dto/PostServiceDTO.java b/likelion-core/src/main/java/likelion/univ/domain/post/dto/PostServiceDTO.java deleted file mode 100644 index f3080577..00000000 --- a/likelion-core/src/main/java/likelion/univ/domain/post/dto/PostServiceDTO.java +++ /dev/null @@ -1,79 +0,0 @@ -package likelion.univ.domain.post.dto; - -import likelion.univ.domain.post.entity.enums.MainCategory; -import likelion.univ.domain.post.entity.enums.SubCategory; -import likelion.univ.domain.user.entity.User; -import lombok.AllArgsConstructor; -import lombok.Builder; -import lombok.Data; - -public class PostServiceDTO { - - @Data - @Builder - public static class Retrieve { - - - private Long id; - - private Long authorId; - private String author; - - private String title; - - private String body; - - private String thumbnail; - - private MainCategory mainCategory; - - private SubCategory subCategory; - - } - - @Data - @Builder - public static class ResponseDTO { - - - private Long id; - - - } - - @Data - @Builder - @AllArgsConstructor - public static class CreateRequest { - - private String title; - - private String body; - private User user; - - private String thumbnail; - - private String mainCategory; - - private String subCategory; - - } - @Data - @Builder - @AllArgsConstructor - public static class EditRequest { - private Long postId; - private String title; - - private String body; - - private String thumbnail; - } - - @Data - @Builder - @AllArgsConstructor - public static class DeleteRequest { - private Long postId; - } -} diff --git a/likelion-core/src/main/java/likelion/univ/domain/post/dto/request/PostCreateServiceDto.java b/likelion-core/src/main/java/likelion/univ/domain/post/dto/request/PostCreateServiceDto.java new file mode 100644 index 00000000..fa4966eb --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/post/dto/request/PostCreateServiceDto.java @@ -0,0 +1,23 @@ +package likelion.univ.domain.post.dto.request; + +import likelion.univ.domain.user.entity.User; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +@AllArgsConstructor +public class PostCreateServiceDto { + private String title; + private String body; + + private Long authorId; + + private String thumbnail; + + private String mainCategory; + + private String subCategory; + +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/post/dto/request/PostDeleteServiceDto.java b/likelion-core/src/main/java/likelion/univ/domain/post/dto/request/PostDeleteServiceDto.java new file mode 100644 index 00000000..2b914b42 --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/post/dto/request/PostDeleteServiceDto.java @@ -0,0 +1,13 @@ +package likelion.univ.domain.post.dto.request; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +@AllArgsConstructor +public class PostDeleteServiceDto { + private Long postId; + private Long loginUserId; +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/post/dto/request/PostUpdateServiceDto.java b/likelion-core/src/main/java/likelion/univ/domain/post/dto/request/PostUpdateServiceDto.java new file mode 100644 index 00000000..20a80420 --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/post/dto/request/PostUpdateServiceDto.java @@ -0,0 +1,18 @@ +package likelion.univ.domain.post.dto.request; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +@AllArgsConstructor +public class PostUpdateServiceDto { + private Long loginUserId; + private Long postId; + private String title; + + private String body; + + private String thumbnail; +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/post/dto/response/PostCommandResponseDto.java b/likelion-core/src/main/java/likelion/univ/domain/post/dto/response/PostCommandResponseDto.java new file mode 100644 index 00000000..e5a81898 --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/post/dto/response/PostCommandResponseDto.java @@ -0,0 +1,12 @@ +package likelion.univ.domain.post.dto.response; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +@AllArgsConstructor +public class PostCommandResponseDto { + private Long postId; +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/post/dto/response/PostDetailResponseDto.java b/likelion-core/src/main/java/likelion/univ/domain/post/dto/response/PostDetailResponseDto.java new file mode 100644 index 00000000..6e1c3e0d --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/post/dto/response/PostDetailResponseDto.java @@ -0,0 +1,48 @@ +package likelion.univ.domain.post.dto.response; + +import com.querydsl.core.annotations.QueryProjection; +import likelion.univ.domain.post.entity.enums.MainCategory; +import likelion.univ.domain.post.entity.enums.SubCategory; +import lombok.Builder; +import lombok.Data; + +import java.time.LocalDateTime; + +@Data +@Builder +public class PostDetailResponseDto { + private Long postId; + + private Long authorId; // 각 유저별 작성글 조회 기능 구현 목적 + + private String authorName; + + private String title; + + private String body; + + private String thumbnail; + + private MainCategory mainCategory; + + private SubCategory subCategory; + + private LocalDateTime createdDate; + + private LocalDateTime modifiedDate; + + @QueryProjection + public PostDetailResponseDto(Long postId, Long authorId, String authorName, String title, String body, String thumbnail, MainCategory mainCategory, SubCategory subCategory, LocalDateTime createdDate, LocalDateTime modifiedDate) { + this.postId = postId; + this.authorId = authorId; + this.authorName = authorName; + this.title = title; + this.body = body; + this.thumbnail = thumbnail; + this.mainCategory = mainCategory; + this.subCategory = subCategory; + this.createdDate = createdDate; + this.modifiedDate = modifiedDate; + + } +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/post/entity/Post.java b/likelion-core/src/main/java/likelion/univ/domain/post/entity/Post.java index a80fb052..480f6bad 100644 --- a/likelion-core/src/main/java/likelion/univ/domain/post/entity/Post.java +++ b/likelion-core/src/main/java/likelion/univ/domain/post/entity/Post.java @@ -1,7 +1,7 @@ package likelion.univ.domain.post.entity; import likelion.univ.common.entity.BaseTimeEntity; -import likelion.univ.domain.post.dto.PostServiceDTO; +import likelion.univ.domain.post.dto.request.PostUpdateServiceDto; import likelion.univ.domain.post.entity.enums.MainCategory; import likelion.univ.domain.post.entity.enums.SubCategory; import likelion.univ.domain.user.entity.User; @@ -9,45 +9,43 @@ import javax.persistence.*; -@Entity +@Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor @Builder -@Getter -@Setter -@Table(name = "posts") +@AllArgsConstructor +@Entity public class Post extends BaseTimeEntity { - @Id @GeneratedValue(strategy = GenerationType.IDENTITY) + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "post_id") private Long id; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "user_id", nullable = false) private User author; - @Column(length = 500) + @Column(length = 100) private String title; - @Column(columnDefinition = "TEXT") + @Column(columnDefinition="TEXT") private String body; private String thumbnail; @Enumerated(EnumType.STRING) - @Column(name = "main_category") private MainCategory mainCategory; @Enumerated(EnumType.STRING) - @Column(name = "sub_category") private SubCategory subCategory; - public void edit(PostServiceDTO.EditRequest request){ - if(request.getTitle() != null) + public void edit(PostUpdateServiceDto request) { + if (request.getTitle() != null) this.title = request.getTitle(); - if(request.getBody() != null) + if (request.getBody() != null) this.body = request.getBody(); - if(request.getThumbnail() == null) - this.thumbnail = null ; + if (request.getThumbnail() == null) + this.thumbnail = null; else if (!request.getThumbnail().equals(this.getThumbnail())) this.thumbnail = request.getThumbnail(); } diff --git a/likelion-core/src/main/java/likelion/univ/domain/post/entity/enums/MainCategory.java b/likelion-core/src/main/java/likelion/univ/domain/post/entity/enums/MainCategory.java index 190e3201..b12d8dc7 100644 --- a/likelion-core/src/main/java/likelion/univ/domain/post/entity/enums/MainCategory.java +++ b/likelion-core/src/main/java/likelion/univ/domain/post/entity/enums/MainCategory.java @@ -6,11 +6,10 @@ @Getter @RequiredArgsConstructor public enum MainCategory { - BOARD("MAINCATEGORY_MAIN", "멋대중앙"), - HOMEWORK("MAINCATEGORY_FREEBOARD", "자유게시판"), - PROJECT("MAINCATEGORY_OVERFLOW", "멋사오버플로우"); + HQ("HQ"), + BOARD("BOARD"), + OVERFLOW("OVERFLOW"); - private final String key; - private final String title; + private final String value; } diff --git a/likelion-core/src/main/java/likelion/univ/domain/post/exception/PostErrorCode.java b/likelion-core/src/main/java/likelion/univ/domain/post/exception/PostErrorCode.java new file mode 100644 index 00000000..6c4d89fd --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/post/exception/PostErrorCode.java @@ -0,0 +1,19 @@ +package likelion.univ.domain.post.exception; + +import likelion.univ.exception.base.BaseErrorCode; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import static likelion.univ.constant.StaticValue.BAD_REQUEST; +import static likelion.univ.constant.StaticValue.NOT_FOUND; + +@Getter +@AllArgsConstructor +public enum PostErrorCode implements BaseErrorCode { + POST_NOT_FOUND(NOT_FOUND, "POST_404", "Post가 존재하지 않습니다."), + NOT_AUTHORIZATION(BAD_REQUEST, "POST_400", "Post의 작성자가 아닙니다."); + + private final int httpStatus; + private final String code; + private final String message; +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/post/exception/PostNoAuthorizationException.java b/likelion-core/src/main/java/likelion/univ/domain/post/exception/PostNoAuthorizationException.java new file mode 100644 index 00000000..80453456 --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/post/exception/PostNoAuthorizationException.java @@ -0,0 +1,9 @@ +package likelion.univ.domain.post.exception; + +import likelion.univ.exception.base.BaseException; + +public class PostNoAuthorizationException extends BaseException { + public PostNoAuthorizationException() { + super(PostErrorCode.NOT_AUTHORIZATION); + } +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/post/exception/PostNotFoudException.java b/likelion-core/src/main/java/likelion/univ/domain/post/exception/PostNotFoudException.java new file mode 100644 index 00000000..00ce1367 --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/post/exception/PostNotFoudException.java @@ -0,0 +1,10 @@ +package likelion.univ.domain.post.exception; + +import likelion.univ.exception.base.BaseException; + +public class PostNotFoudException extends BaseException { + + public PostNotFoudException() { + super(PostErrorCode.POST_NOT_FOUND); + } +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/post/repository/PostCommandCustomRepository.java b/likelion-core/src/main/java/likelion/univ/domain/post/repository/PostCommandCustomRepository.java new file mode 100644 index 00000000..c370bccf --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/post/repository/PostCommandCustomRepository.java @@ -0,0 +1,14 @@ +package likelion.univ.domain.post.repository; + +import likelion.univ.domain.post.entity.Post; +import likelion.univ.domain.user.entity.User; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; + +import java.util.List; + +public interface PostCommandCustomRepository { + + + +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/post/repository/PostCommandCustomRepositoryImpl.java b/likelion-core/src/main/java/likelion/univ/domain/post/repository/PostCommandCustomRepositoryImpl.java new file mode 100644 index 00000000..e6a32b85 --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/post/repository/PostCommandCustomRepositoryImpl.java @@ -0,0 +1,18 @@ +package likelion.univ.domain.post.repository; + +import likelion.univ.domain.post.entity.Post; +import likelion.univ.domain.user.entity.User; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.Pageable; +import org.springframework.stereotype.Repository; + +import java.util.List; + +import static likelion.univ.domain.post.entity.QPost.post; +import static likelion.univ.domain.user.entity.QUser.user; + +@Repository +public class PostCommandCustomRepositoryImpl implements PostCommandCustomRepository { + +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/post/repository/PostRepository.java b/likelion-core/src/main/java/likelion/univ/domain/post/repository/PostCommandRepository.java similarity index 60% rename from likelion-core/src/main/java/likelion/univ/domain/post/repository/PostRepository.java rename to likelion-core/src/main/java/likelion/univ/domain/post/repository/PostCommandRepository.java index 6927a8cc..8e1f2eb7 100644 --- a/likelion-core/src/main/java/likelion/univ/domain/post/repository/PostRepository.java +++ b/likelion-core/src/main/java/likelion/univ/domain/post/repository/PostCommandRepository.java @@ -3,6 +3,7 @@ import likelion.univ.domain.post.entity.Post; import org.springframework.data.jpa.repository.JpaRepository; -public interface PostRepository extends JpaRepository { +public interface PostCommandRepository extends JpaRepository, PostCommandCustomRepository { + } diff --git a/likelion-core/src/main/java/likelion/univ/domain/post/repository/PostCustomRepository.java b/likelion-core/src/main/java/likelion/univ/domain/post/repository/PostCustomRepository.java deleted file mode 100644 index bb8e6bb8..00000000 --- a/likelion-core/src/main/java/likelion/univ/domain/post/repository/PostCustomRepository.java +++ /dev/null @@ -1,10 +0,0 @@ -//package likelion.univ.domain.community.post.repository; -// -//import likelion.univ.domain.community.post.entity.Post; -// -//import java.util.List; -// -//public interface PostCustomRepository { -// -// public List pagingWithCoveringIndex(Integer page, Integer limit); -//} diff --git a/likelion-core/src/main/java/likelion/univ/domain/post/repository/PostCustomRepositoryImpl.java b/likelion-core/src/main/java/likelion/univ/domain/post/repository/PostCustomRepositoryImpl.java deleted file mode 100644 index 07560d90..00000000 --- a/likelion-core/src/main/java/likelion/univ/domain/post/repository/PostCustomRepositoryImpl.java +++ /dev/null @@ -1,33 +0,0 @@ -//package likelion.univ.domain.community.post.repository; -// -//import com.querydsl.jpa.impl.JPAQueryFactory; -//import likelion.univ.domain.community.post.entity.Post; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.stereotype.Repository; -// -//import java.util.List; -// -//@Repository -//public class PostCustomRepositoryImpl implements PostCustomRepository{ -// @Autowired -// private JPAQueryFactory jpaQueryFactory; -// -// @Override -// public List pagingWithCoveringIndex(Integer page, Integer limit) { -// -// return null; -//// List ids = jpaQueryFactory -//// .select(post.id) -//// .from(post) -//// .limit(limit) -//// .offset(page * limit) -//// .fetch(); -//// -//// return jpaQueryFactory -//// .selectFrom(post) -//// .innerJoin(post.author, user) -//// .fetchJoin() -//// .where(post.id.in(ids)) -//// .fetch(); -// } -//} diff --git a/likelion-core/src/main/java/likelion/univ/domain/post/service/PostDomainService.java b/likelion-core/src/main/java/likelion/univ/domain/post/service/PostDomainService.java new file mode 100644 index 00000000..6a587e78 --- /dev/null +++ b/likelion-core/src/main/java/likelion/univ/domain/post/service/PostDomainService.java @@ -0,0 +1,63 @@ +package likelion.univ.domain.post.service; + +import likelion.univ.domain.post.adaptor.PostAdaptor; +import likelion.univ.domain.post.dto.request.PostCreateServiceDto; +import likelion.univ.domain.post.dto.request.PostDeleteServiceDto; +import likelion.univ.domain.post.dto.request.PostUpdateServiceDto; +import likelion.univ.domain.post.dto.response.PostCommandResponseDto; +import likelion.univ.domain.post.entity.Post; +import likelion.univ.domain.post.exception.PostNoAuthorizationException; +import likelion.univ.domain.user.adaptor.UserAdaptor; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +@Service +@Transactional +@RequiredArgsConstructor +public class PostDomainService { + + private final PostAdaptor postAdaptor; + private final UserAdaptor userAdaptor; + + + public PostCommandResponseDto createPost(PostCreateServiceDto request) { + Post post = createEntity(request); + Long savedId = postAdaptor.save(post); + return PostCommandResponseDto.builder() + .postId(savedId) + .build(); + } + + public PostCommandResponseDto editPost(PostUpdateServiceDto request) { + Post post = postAdaptor.findById(request.getPostId()); + if (!(post.getAuthor().getId().equals(request.getLoginUserId()))) { + throw new PostNoAuthorizationException(); + } + post.edit(request); + Long savedId = postAdaptor.save(post); + return PostCommandResponseDto.builder() + .postId(savedId) + .build(); + } + public void deletePost(PostDeleteServiceDto request) { + Post post = postAdaptor.findById(request.getPostId()); + if (!(post.getAuthor().getId().equals(request.getLoginUserId()))) { + throw new PostNoAuthorizationException(); + } + postAdaptor.delete(post); + } + + private Post createEntity(PostCreateServiceDto request) { + return Post.builder() + .author(userAdaptor.findById(request.getAuthorId())) + .title(request.getTitle()) + .body(request.getBody()) + .thumbnail(request.getThumbnail()) + // TODO : category 입력되도록 수정 +// .mainCategory(MainCategory.valueOf(request.getMainCategory())) +// .subCategory(SubCategory.valueOf(request.getSubCategory())) + .build(); + } + +} diff --git a/likelion-core/src/main/java/likelion/univ/domain/post/service/PostService.java b/likelion-core/src/main/java/likelion/univ/domain/post/service/PostService.java deleted file mode 100644 index 15040109..00000000 --- a/likelion-core/src/main/java/likelion/univ/domain/post/service/PostService.java +++ /dev/null @@ -1,67 +0,0 @@ -package likelion.univ.domain.post.service; - -import likelion.univ.domain.post.adaptor.PostAdaptor; -import likelion.univ.domain.post.dto.PostServiceDTO; -import likelion.univ.domain.post.entity.Post; -import likelion.univ.domain.post.entity.enums.MainCategory; -import likelion.univ.domain.post.entity.enums.SubCategory; -import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class PostService{ - - @Autowired - private PostAdaptor postAdaptor; - - - public PostServiceDTO.ResponseDTO createPost(PostServiceDTO.CreateRequest request) { - Post post = createEntity(request); - postAdaptor.save(post); - return PostServiceDTO.ResponseDTO.builder().id(post.getId()).build(); - } - -// public List retrievePostPaging(Integer page, Integer limit) { -// List posts= postAdaptor.retrievePostPaging(page,limit); -// return posts.stream() -// .map(post -> PostServiceDTO.Retrieve.builder() -// .id(post.getId()) -// .authorId(post.getAuthor().getId()) -// .author(post.getAuthor().getProfile().getName()) -// .title(post.getTitle()) -// .body(post.getBody()) -// .thumbnail(post.getThumbnail()) -// .mainCategory(post.getMainCategory()) -// .subCategory(post.getSubCategory()) -// .build()) -// .collect(Collectors.toList()); -// } - - public PostServiceDTO.ResponseDTO editPost(PostServiceDTO.EditRequest request) { - Post post = postAdaptor.findById(request.getPostId()); - post.edit(request); - postAdaptor.save(post); - return PostServiceDTO.ResponseDTO.builder().id(post.getId()).build(); - } - public void deletePost(PostServiceDTO.DeleteRequest request) { - Post post = postAdaptor.findById(request.getPostId()); - postAdaptor.delete(post); - return; - } - - private static Post createEntity(PostServiceDTO.CreateRequest request) { - return Post.builder() - .author(request.getUser()) - .title(request.getTitle()) - .body(request.getBody()) - .thumbnail(request.getThumbnail()) - .mainCategory(MainCategory.valueOf(request.getMainCategory())) - .subCategory(SubCategory.valueOf(request.getSubCategory())) - .build(); - } - - - -} diff --git a/likelion-core/src/main/java/likelion/univ/domain/user/entity/Profile.java b/likelion-core/src/main/java/likelion/univ/domain/user/entity/Profile.java index a8fc2083..517f7f31 100644 --- a/likelion-core/src/main/java/likelion/univ/domain/user/entity/Profile.java +++ b/likelion-core/src/main/java/likelion/univ/domain/user/entity/Profile.java @@ -16,7 +16,7 @@ public class Profile { private String name; // 010-0000-0000 형태로 - // private String phoneNumber; + private String phoneNumber; private String profileImage; @Column(columnDefinition = "TEXT") @@ -25,10 +25,9 @@ public class Profile { @Enumerated(EnumType.STRING) private Part part; - public static Profile profileForSignUp(String name, String profileImage){ + public static Profile fromName(String name){ return Profile.builder() .name(name) - .profileImage(profileImage) .build(); } } diff --git a/likelion-core/src/main/java/likelion/univ/domain/user/entity/User.java b/likelion-core/src/main/java/likelion/univ/domain/user/entity/User.java index 7aa5d3dc..b78ed1e0 100644 --- a/likelion-core/src/main/java/likelion/univ/domain/user/entity/User.java +++ b/likelion-core/src/main/java/likelion/univ/domain/user/entity/User.java @@ -2,16 +2,14 @@ import likelion.univ.common.entity.BaseTimeEntity; import lombok.*; - import javax.persistence.*; -import java.time.LocalDateTime; @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) @Builder @AllArgsConstructor @Entity -@Table(uniqueConstraints = {@UniqueConstraint(columnNames = {"email", "loginType"})}) +@Table(name="users", uniqueConstraints = {@UniqueConstraint(columnNames = {"email", "loginType"})}) public class User extends BaseTimeEntity{ @Id diff --git a/likelion-core/src/main/resources/application-core.yml b/likelion-core/src/main/resources/application-core.yml index b57ad337..4cc8663b 100644 --- a/likelion-core/src/main/resources/application-core.yml +++ b/likelion-core/src/main/resources/application-core.yml @@ -11,12 +11,11 @@ spring: open-in-view: false hibernate: ddl-auto: update #create update none - naming: - physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl properties: dialect: org.hibernate.dialect.MySQL8Dialect hibernate: default_batch_fetch_size: 1000 + format_sql: true logging: level: @@ -42,3 +41,32 @@ spring: config: activate: on-profile: prod + +--- ## test 환경 설정 for local +#spring: +# config: +# activate: +# on-profile: test +# datasource: +# driver-class-name: org.h2.Driver +# url: jdbc:h2:tcp://localhost/~/likelionuniv +# username: sa +# password: +# jpa: +# show-sql: true +# open-in-view: false +# hibernate: +# ddl-auto: none +# properties: +# hibernate: +# default_batch_fetch_size: 1000 +# format_sql: true + +logging: + level: + org.springframework.orm.jpa: DEBUG + org.springframework.transaction: DEBUG + pattern: + console: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n" + + diff --git a/likelion-core/src/test/java/likelion/univ/domain/TestConfiguration.java b/likelion-core/src/test/java/likelion/univ/domain/TestConfiguration.java new file mode 100644 index 00000000..f0e8fdfd --- /dev/null +++ b/likelion-core/src/test/java/likelion/univ/domain/TestConfiguration.java @@ -0,0 +1,12 @@ +package likelion.univ.domain; + +import org.junit.jupiter.api.Test; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class TestConfiguration { + @Test + void ContextLoad() { + + } +} diff --git a/likelion-core/src/test/java/likelion/univ/domain/community/comment/entity/CommentTest.java b/likelion-core/src/test/java/likelion/univ/domain/comment/entity/CommentTest.java similarity index 92% rename from likelion-core/src/test/java/likelion/univ/domain/community/comment/entity/CommentTest.java rename to likelion-core/src/test/java/likelion/univ/domain/comment/entity/CommentTest.java index 07c640c1..a8ac839a 100644 --- a/likelion-core/src/test/java/likelion/univ/domain/community/comment/entity/CommentTest.java +++ b/likelion-core/src/test/java/likelion/univ/domain/comment/entity/CommentTest.java @@ -1,6 +1,5 @@ -package likelion.univ.domain.community.comment.entity; +package likelion.univ.domain.comment.entity; -import likelion.univ.domain.comment.entity.Comment; import likelion.univ.domain.user.entity.User; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -22,7 +21,7 @@ void editBody() { String getPrev = comment.getBody(); // when - comment.editBody(next); + comment.updateBody(next); // then assertThat(getPrev).isEqualTo(prev); @@ -41,7 +40,7 @@ void deleteByAuthor() { Boolean prevIsDeleted = comment.getIsDeleted(); // when - comment.delete(); + comment.softDelete(); // then assertThat(prevIsDeleted).isEqualTo(false); diff --git a/likelion-core/src/test/java/likelion/univ/domain/community/likecomment/entity/LikeCommentTest.java b/likelion-core/src/test/java/likelion/univ/domain/commentlike/entity/CommentLikeTest.java similarity index 50% rename from likelion-core/src/test/java/likelion/univ/domain/community/likecomment/entity/LikeCommentTest.java rename to likelion-core/src/test/java/likelion/univ/domain/commentlike/entity/CommentLikeTest.java index 234876a8..ffdf0b84 100644 --- a/likelion-core/src/test/java/likelion/univ/domain/community/likecomment/entity/LikeCommentTest.java +++ b/likelion-core/src/test/java/likelion/univ/domain/commentlike/entity/CommentLikeTest.java @@ -1,41 +1,41 @@ -package likelion.univ.domain.community.likecomment.entity; +package likelion.univ.domain.commentlike.entity; -import likelion.univ.domain.comment.entity.LikeComment; +import likelion.univ.domain.like.commentlike.entity.CommentLike; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import static org.assertj.core.api.Assertions.assertThat; -class LikeCommentTest { +class CommentLikeTest { @DisplayName("생성된 좋아요를 다시 누르면 좋아요를 취소한다.") @Test void switchLikeComment() { // given - LikeComment likeComment = LikeComment.builder().build(); - Boolean beforeSwitch = likeComment.getIsCanceled(); + CommentLike commentLike = CommentLike.builder().build(); + Boolean beforeSwitch = commentLike.getIsCanceled(); // when - likeComment.switchLikeComment(); + commentLike.switchLikeComment(); // then assertThat(beforeSwitch).isFalse(); - assertThat(likeComment.getIsCanceled()).isTrue(); + assertThat(commentLike.getIsCanceled()).isTrue(); } @DisplayName("취소한 좋아요를 다시 누르면 다시 좋아요를 할 수 있다.") @Test public void switchDislikeComment() throws Exception { // given - LikeComment likeComment = LikeComment.builder().build(); - Boolean beforeSwitch = likeComment.getIsCanceled(); + CommentLike commentLike = CommentLike.builder().build(); + Boolean beforeSwitch = commentLike.getIsCanceled(); // when - likeComment.switchLikeComment(); - likeComment.switchLikeComment(); + commentLike.switchLikeComment(); + commentLike.switchLikeComment(); // then assertThat(beforeSwitch).isFalse(); - assertThat(likeComment.getIsCanceled()).isFalse(); + assertThat(commentLike.getIsCanceled()).isFalse(); } } diff --git a/likelion-core/src/test/java/likelion/univ/domain/community/TestConfiguration.java b/likelion-core/src/test/java/likelion/univ/domain/community/TestConfiguration.java deleted file mode 100644 index 4050f96f..00000000 --- a/likelion-core/src/test/java/likelion/univ/domain/community/TestConfiguration.java +++ /dev/null @@ -1,12 +0,0 @@ -//package likelion.univ.domain.community; -// -//import org.springframework.boot.SpringApplication; -//import org.springframework.boot.autoconfigure.SpringBootApplication; -// -//@SpringBootApplication -////@EntityScan("likelion.univ.") -//public class TestConfiguration { -//// public static void main(String[] args) { -//// SpringApplication.run(TestConfiguration.class, args); -//// } -//} diff --git a/likelion-core/src/test/java/likelion/univ/domain/repository/CommentRepositoryTest.java b/likelion-core/src/test/java/likelion/univ/domain/repository/CommentRepositoryTest.java new file mode 100644 index 00000000..4461b9f7 --- /dev/null +++ b/likelion-core/src/test/java/likelion/univ/domain/repository/CommentRepositoryTest.java @@ -0,0 +1,27 @@ +package likelion.univ.domain.repository; + +import likelion.univ.LikelionCoreApplication; +import likelion.univ.domain.TestConfiguration; +import likelion.univ.domain.comment.repository.CommentRepository; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.context.TestComponent; +import org.springframework.test.context.ContextConfiguration; + +@SpringBootTest +@ContextConfiguration(classes = LikelionCoreApplication.class) +class CommentRepositoryTest { + + @Autowired + private CommentRepository commentRepository; + + @Test + @DisplayName("테스트") + void findAllByPost() { + + } + +} diff --git a/likelion-core/src/test/resources/application.yml b/likelion-core/src/test/resources/application.yml new file mode 100644 index 00000000..e450d2c5 --- /dev/null +++ b/likelion-core/src/test/resources/application.yml @@ -0,0 +1,24 @@ +## test 설정 +spring: + datasource: + driver-class-name: org.h2.Driver + url: jdbc:h2:tcp://localhost/~/test + username: sa + password: + jpa: + show-sql: true + open-in-view: false + hibernate: + ddl-auto: create-drop + properties: + hibernate: + default_batch_fetch_size: 1000 + +logging: + level: + org.springframework.orm.jpa: DEBUG + org.springframework.transaction: DEBUG + pattern: + console: "%d{yyyy-MM-dd HH:mm:ss} - %msg%n" + + diff --git a/likelion-infrastructure/src/main/resources/application-infrastructure.yml b/likelion-infrastructure/src/main/resources/application-infrastructure.yml index 40ae2f0f..bbb927a9 100644 --- a/likelion-infrastructure/src/main/resources/application-infrastructure.yml +++ b/likelion-infrastructure/src/main/resources/application-infrastructure.yml @@ -53,4 +53,4 @@ alarm: sms: api-key: ${SMS_API_KEY} api-secret: ${SMS_API_SECRET} - sending-number: ${SMS_SENDING_NUMBER} \ No newline at end of file + sending-number: ${SMS_SENDING_NUMBER} diff --git a/likelion-security/src/main/java/likelion/univ/security/CorsConfig.java b/likelion-security/src/main/java/likelion/univ/security/CorsConfig.java index 01c014b4..de87f5eb 100644 --- a/likelion-security/src/main/java/likelion/univ/security/CorsConfig.java +++ b/likelion-security/src/main/java/likelion/univ/security/CorsConfig.java @@ -16,6 +16,7 @@ public void addCorsMappings(CorsRegistry registry) { allowedOriginPatterns.add("http://localhost:8080"); allowedOriginPatterns.add("https://likelionuniv.com"); allowedOriginPatterns.add("https://stag.likelionuniv.com"); + allowedOriginPatterns.add("http://localhost:8080"); // local test String[] patterns = allowedOriginPatterns.toArray(String[]::new); registry.addMapping("/**") diff --git a/likelion-security/src/main/java/likelion/univ/security/SecurityUtils.java b/likelion-security/src/main/java/likelion/univ/security/SecurityUtils.java index 787454c8..c8c7a910 100644 --- a/likelion-security/src/main/java/likelion/univ/security/SecurityUtils.java +++ b/likelion-security/src/main/java/likelion/univ/security/SecurityUtils.java @@ -1,16 +1,28 @@ package likelion.univ.security; import likelion.univ.exception.NotAuthentiatedException; +import lombok.extern.slf4j.Slf4j; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; +import javax.servlet.http.HttpServletRequest; + +@Slf4j public class SecurityUtils { private SecurityUtils(){}; public static Long getCurrentUserId() { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + // for test + System.out.println("authentication = " + authentication); + System.out.println("authentication.isAuthenticated() = " + authentication.isAuthenticated()); + System.out.println("authentication.getPrincipal().toString() = " + authentication.getPrincipal().toString()); + if (authentication != null && authentication.isAuthenticated() && authentication.getPrincipal() instanceof Long) { + System.out.println("로그인 성공"); return (Long) authentication.getPrincipal(); + } else { + throw new NotAuthentiatedException(); } - else throw new NotAuthentiatedException(); } -} \ No newline at end of file +} diff --git a/likelion-socket/build.gradle b/likelion-socket/build.gradle index a5845fcb..b73cbe55 100644 --- a/likelion-socket/build.gradle +++ b/likelion-socket/build.gradle @@ -1,19 +1,8 @@ -plugins { - id 'java' -} - -group = 'likelion.univ' -version = '0.0.1-SNAPSHOT' - -repositories { - mavenCentral() -} - dependencies { testImplementation platform('org.junit:junit-bom:5.9.1') testImplementation 'org.junit.jupiter:junit-jupiter' } -test { - useJUnitPlatform() -} \ No newline at end of file +//test { +// useJUnitPlatform() +//}