diff --git a/src/main/java/com/idol/board/controller/article/command/ArticleController.java b/src/main/java/com/idol/board/controller/article/command/ArticleController.java index f6bc1bc..e623c38 100644 --- a/src/main/java/com/idol/board/controller/article/command/ArticleController.java +++ b/src/main/java/com/idol/board/controller/article/command/ArticleController.java @@ -46,6 +46,13 @@ public ApiResponse updateArticle(@RequestBody ArticleUpdateRequestDto requ return ApiResponse.ok(updatedArticleId, "게시글 수정 성공"); } + @Operation(summary = "게시글 모집 취소", description = "게시글 모집 취소") + @PatchMapping("/{articleId}/statusClose") + public ApiResponse updateArticleClose(@PathVariable Long articleId, @MemberId Long writerId) { + Long updatedArticleId = updateArticleUserCase.updateOpenStatusClose(articleId, writerId); + return ApiResponse.ok(updatedArticleId, "게시글 모집 취소"); + } + @Operation(summary = "펜팔 참여", description = "펜팔 참여") @PostMapping("/{articleId}/fanFal") @@ -61,4 +68,5 @@ public ApiResponse cancelFanFal(@PathVariable Long articleId, @MemberId Lo return ApiResponse.ok(fanFalId, "펜팔 취소 성공"); } + } diff --git a/src/main/java/com/idol/board/controller/mypage/command/MyPageController.java b/src/main/java/com/idol/board/controller/mypage/command/MyPageController.java index 71e0547..762d652 100644 --- a/src/main/java/com/idol/board/controller/mypage/command/MyPageController.java +++ b/src/main/java/com/idol/board/controller/mypage/command/MyPageController.java @@ -1,10 +1,16 @@ package com.idol.board.controller.mypage.command; import com.idol.board.dto.request.myPage.MyPageUpdateRequestDto; -import com.idol.board.usecase.mypage.UpdateMyPageUseCase; +import com.idol.board.usecase.mypage.command.DeleteMyPageUseCase; +import com.idol.board.usecase.mypage.command.UpdateMyPageUseCase; +import com.idol.board.dto.response.mypage.UserDataResponseDto; import com.idol.domains.auth.util.annotation.MemberId; +import com.idol.domains.member.dto.request.SignupMemberRequestDto; +import com.idol.domains.member.dto.response.SignupMemberResponseDto; import com.idol.global.common.response.ApiResponse; +import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; @@ -15,8 +21,9 @@ public class MyPageController { private final UpdateMyPageUseCase updateMyPageUseCase; + private final DeleteMyPageUseCase deleteMyPageUseCase; - + @Operation(summary = "프로필 수정", description = "이미지, 닉네임, 자기소개 수정") @PatchMapping() public ApiResponse updateProfile(@RequestBody MyPageUpdateRequestDto dto, @MemberId Long userId){ @@ -24,5 +31,11 @@ public ApiResponse updateProfile(@RequestBody MyPageUpdateRequestDto dto, return ApiResponse.ok(memberId,"개인 정보 수정 완료"); } + @Operation(summary = "내가 참여한 펜팔 삭제", description = "내가 참여하나 펜팔 삭제") + @DeleteMapping("/{articleId}") + public ApiResponse deleteMyFanFal(@PathVariable Long articleId, @MemberId Long userId){ + Long memberId = deleteMyPageUseCase.deleteMyFanFal(articleId, userId); + return ApiResponse.ok(memberId,"내가 참여한 펜팔 삭제"); + } } diff --git a/src/main/java/com/idol/board/controller/mypage/query/GetMyPageController.java b/src/main/java/com/idol/board/controller/mypage/query/GetMyPageController.java index 38555e3..7d0c92b 100644 --- a/src/main/java/com/idol/board/controller/mypage/query/GetMyPageController.java +++ b/src/main/java/com/idol/board/controller/mypage/query/GetMyPageController.java @@ -3,17 +3,18 @@ import com.idol.board.domain.BigCategory; import com.idol.board.domain.SmallCategory; import com.idol.board.dto.response.article.ArticleListResponseDto; +import com.idol.board.dto.response.comment.CommentResponseDto; +import com.idol.board.dto.response.mypage.MyPageQuestionResponseDto; +import com.idol.board.dto.response.mypage.UserDataResponseDto; import com.idol.board.service.article.query.ReadArticleService; import com.idol.board.usecase.article.query.ReadArticleUseCase; +import com.idol.board.usecase.mypage.query.ReadMyPageUseCase; import com.idol.domains.auth.util.annotation.MemberId; import com.idol.global.common.response.ApiResponse; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RequestParam; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; import java.sql.Timestamp; import java.util.List; @@ -23,22 +24,57 @@ @RequiredArgsConstructor @Tag(name = "마이페이지 Read API", description = "마이페이지 Read API") public class GetMyPageController { - private final ReadArticleUseCase readArticleUseCase; + private final ReadMyPageUseCase readMypageUseCase; - @Operation(summary = "나의 펜팔 리스트 출력", description = "나의 펜팔 리스트 출력") - @GetMapping() - public ApiResponse> readAllMyPage( + @Operation(summary = "나의 펜팔 출력", description = "나의 펜팔 출력") + @GetMapping() + public ApiResponse> readAllJoinMyPage( @RequestParam(value = "limit")Long limit, @RequestParam(value = "page")Long page, @MemberId Long userId ){ - List dto = readArticleUseCase.searchMypageList(limit,page,userId); + List dto = readMypageUseCase.readJoinMypageList(limit,page,userId); - return ApiResponse.ok(dto, "게시글 리스트 전체 조회 성공"); + return ApiResponse.ok(dto, "나의 펜팔 리스트 조회 성공"); } + @Operation(summary = "내가 만든 펜팔 출력", description = "내가 만든 펜팔 출력") + @GetMapping("/self") + public ApiResponse> readAllCreateMyPage( + @RequestParam(value = "limit")Long limit, + @RequestParam(value = "page")Long page, + @MemberId Long userId + ){ + + List dto = readMypageUseCase.readMypageList(limit,page,userId); + + return ApiResponse.ok(dto, "나가 만든 펜팔 리스트 조회 성공"); + } + + +// @Operation(summary = "나의 질문 출력", description = "나의 질문 출력") +// @GetMapping("/self") +// public ApiResponse readAllQuestionMyPage( +// @RequestParam(value = "lastParentCommentId", required = false) Long lastParentCommentId, +// @RequestParam(value = "lastCommentId", required = false) Long lastCommentId, +// @RequestParam(value = "pageSize") Long limit, +// @MemberId Long userId +// ){ +// MyPageQuestionResponseDto dto = readMypageUseCase.readMyQuestion(userId, lastParentCommentId,lastCommentId,limit); +// +// return ApiResponse.ok(dto, "나의 질문 조회 성공"); +// } + + @Operation(summary = "유저 정보 전달", description = "유저 정보 전달을 진행합니다.") + @GetMapping("/user") + public ApiResponse readUserInformation( + @MemberId Long userId + ) { + UserDataResponseDto response = readMypageUseCase.readUserInformation(userId); + return ApiResponse.ok(response, "유저 정보 전달 성공"); + } } diff --git a/src/main/java/com/idol/board/domain/entity/Comment.java b/src/main/java/com/idol/board/domain/entity/Comment.java index e88fee4..75aa8be 100644 --- a/src/main/java/com/idol/board/domain/entity/Comment.java +++ b/src/main/java/com/idol/board/domain/entity/Comment.java @@ -34,6 +34,9 @@ public class Comment extends BaseEntity { @Column(name = "secret", nullable = false) private boolean secret; +// @Column(name = "parent_check") +// private boolean parentCheck; + @Builder public Comment(Long commentId, Long articleId, Long writerId, String content, Long parentCommentId, boolean secret) { this.commentId = commentId; diff --git a/src/main/java/com/idol/board/dto/response/comment/CommentQuestionResponseDto.java b/src/main/java/com/idol/board/dto/response/comment/CommentQuestionResponseDto.java new file mode 100644 index 0000000..1f27273 --- /dev/null +++ b/src/main/java/com/idol/board/dto/response/comment/CommentQuestionResponseDto.java @@ -0,0 +1,49 @@ +package com.idol.board.dto.response.comment; + +import com.idol.board.domain.entity.Article; +import com.idol.board.repository.mapper.CommentReadQueryResult; +import com.idol.board.repository.mapper.CommentReadQuestionQueryResult; + +import java.sql.Timestamp; + +public record CommentQuestionResponseDto( + Long commentId, + String content, + Long parentCommentId, + Long writerId, + boolean deleted, + Long createdAt, + boolean secret, + String nickName, + String writerImageUrl, + Long articleId, + String title, + String locationAddress +) { + + public static Long changeToUnixTime(Timestamp ts) { + // 2. 밀리초 단위 UNIX timestamp 얻기 + long unixMillis = ts.getTime(); // 1750288750000 + + // 3. 초 단위 UNIX timestamp 얻기 + long unixSeconds = unixMillis / 1000; // 1750288750 + + return unixSeconds; + } + + public static CommentQuestionResponseDto from(CommentReadQuestionQueryResult result, String nickName, String writerImageUrl, Article article) { + return new CommentQuestionResponseDto( + result.commentId(), + result.content(), + result.parentCommentId(), + result.writerId(), + result.isDeleted(), + changeToUnixTime(Timestamp.valueOf(result.createdAt())), + result.secret(), + nickName, + writerImageUrl, + article.getArticleId(), + article.getTitle(), + article.getLocationAddress()); + } +} diff --git a/src/main/java/com/idol/board/dto/response/mypage/MyPageQuestionResponseDto.java b/src/main/java/com/idol/board/dto/response/mypage/MyPageQuestionResponseDto.java new file mode 100644 index 0000000..942d9d7 --- /dev/null +++ b/src/main/java/com/idol/board/dto/response/mypage/MyPageQuestionResponseDto.java @@ -0,0 +1,12 @@ +package com.idol.board.dto.response.mypage; + +import com.idol.board.dto.response.comment.CommentQuestionResponseDto; +import com.idol.board.dto.response.comment.CommentResponseDto; + +import java.util.List; + +public record MyPageQuestionResponseDto( + List answerWait, + List answerComplete +) { +} diff --git a/src/main/java/com/idol/board/dto/response/mypage/UserDataResponseDto.java b/src/main/java/com/idol/board/dto/response/mypage/UserDataResponseDto.java new file mode 100644 index 0000000..e6af55e --- /dev/null +++ b/src/main/java/com/idol/board/dto/response/mypage/UserDataResponseDto.java @@ -0,0 +1,20 @@ +package com.idol.board.dto.response.mypage; + +import com.idol.domains.member.domain.Member; + +public record UserDataResponseDto( + String nickName, + String profileImg, + int wishLikeCount, + String description +) { + + public static UserDataResponseDto from(Member member, String profileImg, int wishLikeCount) { + return new UserDataResponseDto( + member.getNickname(), + profileImg, + wishLikeCount, + member.getInformation() + ); + } +} diff --git a/src/main/java/com/idol/board/repository/article/ArticleRepositoryCustom.java b/src/main/java/com/idol/board/repository/article/ArticleRepositoryCustom.java index c405733..f0caf66 100644 --- a/src/main/java/com/idol/board/repository/article/ArticleRepositoryCustom.java +++ b/src/main/java/com/idol/board/repository/article/ArticleRepositoryCustom.java @@ -20,4 +20,7 @@ List findArticleList( Timestamp date, String sort, boolean sortAsc, Long limit, Long offset); List findMyPageArticle(Long userId, Long limit, Long offset); + + List findJoinMyPageArticle(List articleIds, Long limit, Long offset); + } diff --git a/src/main/java/com/idol/board/repository/article/ArticleRepositoryImpl.java b/src/main/java/com/idol/board/repository/article/ArticleRepositoryImpl.java index 536b99c..6285a3c 100644 --- a/src/main/java/com/idol/board/repository/article/ArticleRepositoryImpl.java +++ b/src/main/java/com/idol/board/repository/article/ArticleRepositoryImpl.java @@ -1,7 +1,9 @@ package com.idol.board.repository.article; import com.idol.board.domain.BigCategory; +import com.idol.board.domain.OpenStatus; import com.idol.board.domain.SmallCategory; +import com.idol.board.domain.UseStatus; import com.idol.board.domain.entity.Article; import com.idol.board.domain.entity.QArticle; import com.idol.board.dto.response.article.ArticleListResponseDto; @@ -17,6 +19,7 @@ import org.springframework.stereotype.Repository; import java.sql.Timestamp; +import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -95,6 +98,32 @@ public List findMyPageArticle(Long userId, Long limi .fetch(); } + @Override + public List findJoinMyPageArticle(List articleIds, Long limit, Long offset) { + return queryFactory + .select(Projections.constructor(ArticleListReadQueryResult.class, + article.articleId, + article.title, + article.locationId, + article.articleImageKey, + article.date, + article.deadline, + article.createdAt, + article.currentPerson, + article.maxPerson, + article.openStatus, + article.useStatus)) + + .from(article) + .where( + article.isDeleted.eq(false), + article.articleId.in(articleIds) + ) + .limit(limit) + .offset(offset) + .fetch(); + } + private BooleanExpression eqWriterId(Long userId) { return userId != null ? article.writerId.eq(userId) : null; } diff --git a/src/main/java/com/idol/board/repository/comment/CommentRepositoryCustom.java b/src/main/java/com/idol/board/repository/comment/CommentRepositoryCustom.java index 3803bda..3ff2465 100644 --- a/src/main/java/com/idol/board/repository/comment/CommentRepositoryCustom.java +++ b/src/main/java/com/idol/board/repository/comment/CommentRepositoryCustom.java @@ -2,6 +2,8 @@ import com.idol.board.domain.entity.Comment; import com.idol.board.repository.mapper.CommentReadQueryResult; +import com.idol.board.repository.mapper.CommentReadQuestionQueryResult; + import java.util.List; import java.util.Optional; @@ -16,4 +18,8 @@ public interface CommentRepositoryCustom { List findAllInfiniteScroll(Long articleId, Long lastParentCommentId, Long lastCommentId, Long limit); Optional findByParentCommentId(Long parentCommentId); + + +// List findQuestionAllInfiniteScroll(Long userId, Long limit); +// List findQuestionAllInfiniteScroll(Long userId, Long lastParentCommentId, Long lastCommentId, Long limit); } diff --git a/src/main/java/com/idol/board/repository/comment/CommentRepositoryImpl.java b/src/main/java/com/idol/board/repository/comment/CommentRepositoryImpl.java index 16a5f71..3fdd844 100644 --- a/src/main/java/com/idol/board/repository/comment/CommentRepositoryImpl.java +++ b/src/main/java/com/idol/board/repository/comment/CommentRepositoryImpl.java @@ -3,8 +3,10 @@ import com.idol.board.domain.entity.Comment; import com.idol.board.domain.entity.QComment; import com.idol.board.repository.mapper.CommentReadQueryResult; +import com.idol.board.repository.mapper.CommentReadQuestionQueryResult; import com.querydsl.core.BooleanBuilder; import com.querydsl.core.types.Projections; +import com.querydsl.jpa.JPAExpressions; import com.querydsl.jpa.impl.JPAQueryFactory; import jakarta.persistence.EntityManager; import jakarta.persistence.NoResultException; @@ -40,19 +42,6 @@ public Optional findByCommentId(Long commentId) { } -// @Override -// public Optional findByParentCommentId(Long parentCommentId) { -// String sql = "select a from Comment a where a.isDeleted = false and a.parentCommentId = :parentCommentId"; -// Query query = entityManager.createQuery(sql) -// .setParameter("parentCommentId", parentCommentId); -// try { -// return Optional.ofNullable((Comment) query.getSingleResult()); -// } catch (NoResultException e) { -// return Optional.empty(); -// } -// } - - @Override public Optional findByParentCommentId(Long parentCommentId) { @@ -67,24 +56,6 @@ public Optional findByParentCommentId(Long parentCommentId) { ); } - // 연관된 댓글 개수 확인 -// @Override -// public Long relatedCommentCountBy(Long articleId, Long parentCommentId, Long limit) { -// String sql = "select count(*) from(" + -// " select comment_id from comment" + -// " where is_deleted = false and article_id = :articleId and parent_comment_id = :parentCommentId" + -// " limit :limit" + -// ") t"; -// -// Query query = entityManager.createNativeQuery(sql) -// .setParameter("articleId", articleId) -// .setParameter("parentCommentId", parentCommentId) -// .setParameter("limit", limit); -// -// -// log.info(String.valueOf(((Number) query.getSingleResult()).longValue())); -// return ((Number) query.getSingleResult()).longValue(); -// } @Override public Long relatedCommentCountBy(Long articleId, Long parentCommentId, Long limit) { @@ -163,4 +134,46 @@ public List findAllInfiniteScroll(Long articleId, Long l .limit(limit) .fetch(); } + + +// @Override +// public List findQuestionAllInfiniteScroll(Long userId, Long limit) { +// +// return queryFactory +// .select(Projections.constructor(CommentReadQuestionQueryResult.class, +// comment.commentId, +// comment.articleId, +// comment.content, +// comment.parentCommentId, +// comment.writerId, +// comment.isDeleted, +// comment.createdAt, +// comment.secret)) +// .from(comment) +// .where( +// comment.isDeleted.eq(false), +// comment.writerId.eq(userId).and(comment.parentCheck.eq(true)) // 부모 댓글 +// .or( +// comment.parentCommentId.in( +// JPAExpressions +// .select(comment.commentId) +// .from(comment) +// .where( +// comment.isDeleted.eq(false), +// comment.writerId.eq(userId), +// comment.parentCheck.eq(true) +// ) +// ) // 자식 댓글 +// ) +// ) +// .orderBy( +// comment.parentCommentId.asc().nullsFirst(), // 부모 댓글 먼저 +// comment.parentCheck.desc(), // 부모 댓글 먼저 +// comment.createdAt.asc() +// ) +//// .limit(limit * 10) +//// .offset(offset) +// .fetch(); +// } + } diff --git a/src/main/java/com/idol/board/repository/fanFal/ParticipantRepositoryCustom.java b/src/main/java/com/idol/board/repository/fanFal/ParticipantRepositoryCustom.java index 8888a72..f99446e 100644 --- a/src/main/java/com/idol/board/repository/fanFal/ParticipantRepositoryCustom.java +++ b/src/main/java/com/idol/board/repository/fanFal/ParticipantRepositoryCustom.java @@ -9,4 +9,6 @@ public interface ParticipantRepositoryCustom { Optional findParticipant(Long articleId, Long writerId); List findParticipantFromArticle(Long articleId); + + List findParticipantFromWriterId(Long writerId); } diff --git a/src/main/java/com/idol/board/repository/fanFal/ParticipantRepositoryImpl.java b/src/main/java/com/idol/board/repository/fanFal/ParticipantRepositoryImpl.java index cd39f29..94b3495 100644 --- a/src/main/java/com/idol/board/repository/fanFal/ParticipantRepositoryImpl.java +++ b/src/main/java/com/idol/board/repository/fanFal/ParticipantRepositoryImpl.java @@ -46,4 +46,14 @@ public List findParticipantFromArticle(Long articleId) { ).fetch(); } + @Override + public List findParticipantFromWriterId(Long writerId) { + return queryFactory + .selectFrom(participant) + .where( + participant.isDeleted.eq(false), + participant.writerId.eq(writerId) + ).fetch(); + } + } diff --git a/src/main/java/com/idol/board/repository/mapper/CommentReadQuestionQueryResult.java b/src/main/java/com/idol/board/repository/mapper/CommentReadQuestionQueryResult.java new file mode 100644 index 0000000..6b8177a --- /dev/null +++ b/src/main/java/com/idol/board/repository/mapper/CommentReadQuestionQueryResult.java @@ -0,0 +1,15 @@ +package com.idol.board.repository.mapper; + +import java.time.LocalDateTime; + +public record CommentReadQuestionQueryResult( + Long commentId, + Long articleId, + String content, + Long parentCommentId, + Long writerId, + boolean isDeleted, + LocalDateTime createdAt, + boolean secret +){ +} diff --git a/src/main/java/com/idol/board/service/article/command/UpdateArticleService.java b/src/main/java/com/idol/board/service/article/command/UpdateArticleService.java index e881629..19a30af 100644 --- a/src/main/java/com/idol/board/service/article/command/UpdateArticleService.java +++ b/src/main/java/com/idol/board/service/article/command/UpdateArticleService.java @@ -1,5 +1,6 @@ package com.idol.board.service.article.command; +import com.idol.board.domain.OpenStatus; import com.idol.board.domain.entity.Article; import com.idol.board.domain.entity.Location; import com.idol.board.dto.request.article.ArticleUpdateRequestDto; @@ -27,7 +28,6 @@ public class UpdateArticleService implements UpdateArticleUseCase { @Override public Long updateArticle(ArticleUpdateRequestDto requestDto, Long writerId, Long articleId) { Article article = articleRepository.findByArticleId(articleId) - .filter(not(Article::getIsDeleted)) .orElseThrow(() -> new NotFoundException("Article", articleId)); validateUserHasPermission(article, writerId); @@ -43,6 +43,18 @@ public Long updateArticle(ArticleUpdateRequestDto requestDto, Long writerId, Lon return article.getArticleId(); } + @Override + public Long updateOpenStatusClose(Long writerId, Long articleId) { + Article article = articleRepository.findByArticleId(articleId) + .orElseThrow(() -> new NotFoundException("Article", articleId)); + + if(article.getWriterId() == writerId){ + article.updateOpenStatus(OpenStatus.CANCELED_STATUS); + } + + return 0L; + } + private void validateUserHasPermission(Article article, Long writerId) { if (article.getWriterId() != writerId) { log.info(String.valueOf(article.getWriterId() == writerId)); diff --git a/src/main/java/com/idol/board/service/article/query/ReadArticleService.java b/src/main/java/com/idol/board/service/article/query/ReadArticleService.java index b6e3f3f..25bdf66 100644 --- a/src/main/java/com/idol/board/service/article/query/ReadArticleService.java +++ b/src/main/java/com/idol/board/service/article/query/ReadArticleService.java @@ -112,19 +112,7 @@ public List searchArticleList( return searchArticles; } - @Override - public List searchMypageList(Long limit, Long page, Long userId) { - List searchMyPageList = articleRepository.findMyPageArticle(userId, limit, (page -1) * limit) - .stream().map(result -> - ArticleListResponseDto.from( - result, - validateLocation(result.locationId()).getRoadNameAddress(), - getS3Url(result.imageKey()).preSignedUrl() - )) - .collect(Collectors.toList()); - return searchMyPageList; - } private void validateCheckOpenStatus(Article article) { if(article.getCurrentPerson() >= article.getMinPerson()){ diff --git a/src/main/java/com/idol/board/service/comment/command/CreateCommentService.java b/src/main/java/com/idol/board/service/comment/command/CreateCommentService.java index 5ae95aa..c2664ac 100644 --- a/src/main/java/com/idol/board/service/comment/command/CreateCommentService.java +++ b/src/main/java/com/idol/board/service/comment/command/CreateCommentService.java @@ -38,6 +38,7 @@ public Long createComment(CommentCreateRequestDto requestDto, Long writerId, Lon if(parent == null){ comment.addCommentParentId(); +// comment.updateParentCheck(); } return comment.getCommentId(); diff --git a/src/main/java/com/idol/board/service/myPage/command/DeleteMyPageService.java b/src/main/java/com/idol/board/service/myPage/command/DeleteMyPageService.java new file mode 100644 index 0000000..66aaf5d --- /dev/null +++ b/src/main/java/com/idol/board/service/myPage/command/DeleteMyPageService.java @@ -0,0 +1,28 @@ +package com.idol.board.service.myPage.command; + +import com.idol.board.domain.entity.Participant; +import com.idol.board.repository.fanFal.ParticipantRepository; +import com.idol.board.usecase.mypage.command.DeleteMyPageUseCase; +import com.idol.domains.member.repository.MemberJpaRepository; +import com.idol.global.exception.NotFoundException; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +@Service +@RequiredArgsConstructor +public class DeleteMyPageService implements DeleteMyPageUseCase { + + private final MemberJpaRepository memberJpaRepository; + private final ParticipantRepository participantRepository; + + @Override + public Long deleteMyFanFal(Long articleId, Long userId) { + Participant participant = participantRepository.findParticipant(articleId,userId) + .orElseThrow(() -> new NotFoundException("Participant", "")); + + + participant.markAsDeleted(); + + return 0L; + } +} diff --git a/src/main/java/com/idol/board/service/myPage/command/UpdateMyPageService.java b/src/main/java/com/idol/board/service/myPage/command/UpdateMyPageService.java index bbd00e8..e1efaad 100644 --- a/src/main/java/com/idol/board/service/myPage/command/UpdateMyPageService.java +++ b/src/main/java/com/idol/board/service/myPage/command/UpdateMyPageService.java @@ -1,10 +1,9 @@ package com.idol.board.service.myPage.command; import com.idol.board.dto.request.myPage.MyPageUpdateRequestDto; -import com.idol.board.usecase.mypage.UpdateMyPageUseCase; +import com.idol.board.usecase.mypage.command.UpdateMyPageUseCase; import com.idol.domains.member.domain.Member; import com.idol.domains.member.repository.MemberJpaRepository; -import com.idol.domains.member.repository.MemberRepository; import com.idol.global.exception.NotFoundException; import com.idol.global.util.PasswordEncryptor; import lombok.RequiredArgsConstructor; diff --git a/src/main/java/com/idol/board/service/myPage/query/ReadMyPageService.java b/src/main/java/com/idol/board/service/myPage/query/ReadMyPageService.java new file mode 100644 index 0000000..d80df09 --- /dev/null +++ b/src/main/java/com/idol/board/service/myPage/query/ReadMyPageService.java @@ -0,0 +1,124 @@ +package com.idol.board.service.myPage.query; + +import com.idol.board.domain.entity.Article; +import com.idol.board.domain.entity.Location; +import com.idol.board.domain.entity.Participant; +import com.idol.board.dto.response.article.ArticleListResponseDto; +import com.idol.board.dto.response.comment.CommentQuestionResponseDto; +import com.idol.board.dto.response.comment.CommentResponseDto; +import com.idol.board.dto.response.mypage.MyPageQuestionResponseDto; +import com.idol.board.dto.response.mypage.UserDataResponseDto; +import com.idol.board.repository.article.ArticleRepository; +import com.idol.board.repository.comment.CommentRepository; +import com.idol.board.repository.fanFal.ParticipantRepository; +import com.idol.board.repository.location.LocationRepository; +import com.idol.board.repository.mapper.CommentReadQueryResult; +import com.idol.board.repository.mapper.CommentReadQuestionQueryResult; +import com.idol.board.usecase.mypage.query.ReadMyPageUseCase; +import com.idol.domains.member.domain.Member; +import com.idol.domains.member.repository.MemberJpaRepository; +import com.idol.global.exception.NotFoundException; +import com.idol.imageUpload.dto.GetS3UrlDto; +import com.idol.imageUpload.useCase.ImageGetUserCase; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.List; +import java.util.stream.Collectors; + +@Service +@RequiredArgsConstructor +public class ReadMyPageService implements ReadMyPageUseCase { + private final ArticleRepository articleRepository; + private final LocationRepository locationRepository; + private final ImageGetUserCase imageGetUserCase; + private final ParticipantRepository participantRepository; + private final CommentRepository commentJpaRepository; + private final MemberJpaRepository memberJpaRepository; + + @Override + public List readMypageList(Long limit, Long page, Long userId) { + List searchMyPageList = articleRepository.findMyPageArticle(userId, limit, (page -1) * limit) + .stream().map(result -> + ArticleListResponseDto.from( + result, + validateLocation(result.locationId()).getRoadNameAddress(), + getS3Url(result.imageKey()) + )) + .collect(Collectors.toList()); + + return searchMyPageList; + } + + + @Override + public List readJoinMypageList(Long limit, Long page, Long userId) { + List participants = participantRepository.findParticipantFromWriterId(userId); + + List articleIds = participants.stream().map(Participant::getArticleId).collect(Collectors.toList()); + + + List searchMyPageList = articleRepository.findJoinMyPageArticle(articleIds, limit, (page -1) * limit) + .stream().map(result -> + ArticleListResponseDto.from( + result, + validateLocation(result.locationId()).getRoadNameAddress(), + getS3Url(result.imageKey()) + )) + .collect(Collectors.toList()); + + return searchMyPageList; + } + + @Override + public UserDataResponseDto readUserInformation(Long userId) { + Member member = memberJpaRepository.findById(userId) + .orElseThrow(() -> new NotFoundException("Member", userId)); + + UserDataResponseDto responseDto = UserDataResponseDto.from(member,getS3Url(member.getProfileImgUrl()),0); + + return responseDto; + } + +// @Override +// public MyPageQuestionResponseDto readMyQuestion(Long userId, Long lastParentCommentId, Long lastCommentId, Long limit) { +// +// // 답변 대기 +// List comments = commentJpaRepository.findQuestionAllInfiniteScroll(userId, limit); +// +// List answerWait = new ArrayList<>(); +// +// for(CommentReadQuestionQueryResult result : comments){ +// Article article = articleRepository.findByArticleId(result.articleId()).orElseThrow(() -> new NotFoundException("Article", result.articleId())); +// Member member = memberJpaRepository.findById(result.writerId()).orElseThrow(() -> new NotFoundException("Member", result.writerId())); +// String writerImageUrl = ""; +// if(!member.getProfileImgUrl().equals("")){ +// writerImageUrl = getS3Url(member.getProfileImgUrl()).preSignedUrl(); +// } +// +// CommentQuestionResponseDto dto = CommentQuestionResponseDto.from(result,member.getNickname(),writerImageUrl,article); +// answerWait.add(dto); +// } +// +// MyPageQuestionResponseDto responseDto = new MyPageQuestionResponseDto(answerWait, null); +// +// return responseDto; +// // 답변 완료 +// } + + + private Location validateLocation(Long locationId) { + return locationRepository.findByLocationId(locationId) + .orElseThrow(() -> new NotFoundException("Location", locationId)); + } + + private String getS3Url(String imageKey){ + String userImageUrl = ""; + if(!imageKey.equals("")){ + userImageUrl = imageGetUserCase.getGetS3Url(imageKey).preSignedUrl(); + } + + return userImageUrl; + } +} diff --git a/src/main/java/com/idol/board/usecase/article/command/UpdateArticleUseCase.java b/src/main/java/com/idol/board/usecase/article/command/UpdateArticleUseCase.java index 5d942d2..593dbf8 100644 --- a/src/main/java/com/idol/board/usecase/article/command/UpdateArticleUseCase.java +++ b/src/main/java/com/idol/board/usecase/article/command/UpdateArticleUseCase.java @@ -4,4 +4,6 @@ public interface UpdateArticleUseCase { Long updateArticle(ArticleUpdateRequestDto requestDto, Long writerId ,Long articleId); + + Long updateOpenStatusClose(Long articleId, Long writerId); } diff --git a/src/main/java/com/idol/board/usecase/article/query/ReadArticleUseCase.java b/src/main/java/com/idol/board/usecase/article/query/ReadArticleUseCase.java index be1cb2f..285b9be 100644 --- a/src/main/java/com/idol/board/usecase/article/query/ReadArticleUseCase.java +++ b/src/main/java/com/idol/board/usecase/article/query/ReadArticleUseCase.java @@ -15,6 +15,4 @@ public interface ReadArticleUseCase { ArticleReadResponseDto readArticle(Long articleId); List searchArticleList(BigCategory bigCategory, SmallCategory smallCategory, String location, Long date, String sort, boolean sortAsc, Long limit, Long page); - - List searchMypageList(Long limit, Long page, Long userId); } \ No newline at end of file diff --git a/src/main/java/com/idol/board/usecase/mypage/command/DeleteMyPageUseCase.java b/src/main/java/com/idol/board/usecase/mypage/command/DeleteMyPageUseCase.java new file mode 100644 index 0000000..abe7d43 --- /dev/null +++ b/src/main/java/com/idol/board/usecase/mypage/command/DeleteMyPageUseCase.java @@ -0,0 +1,5 @@ +package com.idol.board.usecase.mypage.command; + +public interface DeleteMyPageUseCase { + Long deleteMyFanFal(Long articleId, Long userId); +} diff --git a/src/main/java/com/idol/board/usecase/mypage/UpdateMyPageUseCase.java b/src/main/java/com/idol/board/usecase/mypage/command/UpdateMyPageUseCase.java similarity index 78% rename from src/main/java/com/idol/board/usecase/mypage/UpdateMyPageUseCase.java rename to src/main/java/com/idol/board/usecase/mypage/command/UpdateMyPageUseCase.java index 17c9f67..fced83a 100644 --- a/src/main/java/com/idol/board/usecase/mypage/UpdateMyPageUseCase.java +++ b/src/main/java/com/idol/board/usecase/mypage/command/UpdateMyPageUseCase.java @@ -1,8 +1,10 @@ -package com.idol.board.usecase.mypage; +package com.idol.board.usecase.mypage.command; import com.idol.board.dto.request.myPage.MyPageUpdateRequestDto; public interface UpdateMyPageUseCase { Long updateProfile(MyPageUpdateRequestDto dto, Long userId); + + } diff --git a/src/main/java/com/idol/board/usecase/mypage/query/ReadMyPageUseCase.java b/src/main/java/com/idol/board/usecase/mypage/query/ReadMyPageUseCase.java new file mode 100644 index 0000000..43464a4 --- /dev/null +++ b/src/main/java/com/idol/board/usecase/mypage/query/ReadMyPageUseCase.java @@ -0,0 +1,17 @@ +package com.idol.board.usecase.mypage.query; + +import com.idol.board.dto.response.article.ArticleListResponseDto; +import com.idol.board.dto.response.mypage.MyPageQuestionResponseDto; +import com.idol.board.dto.response.mypage.UserDataResponseDto; + +import java.util.List; + +public interface ReadMyPageUseCase { + List readMypageList(Long limit, Long page, Long userId); + + List readJoinMypageList(Long limit, Long page, Long userId); + + UserDataResponseDto readUserInformation(Long userId); + +// MyPageQuestionResponseDto readMyQuestion(Long userId, Long lastParentCommentId, Long lastCommentId, Long limit); +} diff --git a/src/main/java/com/idol/global/config/SecurityConfig.java b/src/main/java/com/idol/global/config/SecurityConfig.java index 9142774..cca1736 100644 --- a/src/main/java/com/idol/global/config/SecurityConfig.java +++ b/src/main/java/com/idol/global/config/SecurityConfig.java @@ -49,9 +49,12 @@ public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { "/swagger-ui/**", "/v3/api-docs/**", "/fanfal/api-docs", - "/actuator/**" + "/actuator/**", + "/api/images/**", + "/api/images/" ).permitAll() .requestMatchers(HttpMethod.GET, "/api/board").permitAll() + .requestMatchers(HttpMethod.GET, "/api/board/*").permitAll() .requestMatchers(HttpMethod.GET, "/api/board/*/comment").permitAll() .anyRequest().authenticated() ) diff --git a/src/main/java/com/idol/imageUpload/controller/S3Controller.java b/src/main/java/com/idol/imageUpload/controller/S3Controller.java index 6794221..8bc788f 100644 --- a/src/main/java/com/idol/imageUpload/controller/S3Controller.java +++ b/src/main/java/com/idol/imageUpload/controller/S3Controller.java @@ -1,5 +1,6 @@ package com.idol.imageUpload.controller; +import com.idol.domains.auth.util.annotation.MemberId; import com.idol.global.common.response.ApiResponse; import com.idol.imageUpload.dto.GetS3UrlDto; import com.idol.imageUpload.dto.PostS3UrlDto; @@ -22,8 +23,7 @@ public class S3Controller { @GetMapping( "/postImage") // TODO :: User값 매개변수 추가 예정 public ApiResponse getPostS3Url(String fileName) { - Long userId = 1321414L; - GetS3UrlDto getS3UrlDto = imageUploadUseCase.getPostS3Url(userId, fileName); + GetS3UrlDto getS3UrlDto = imageUploadUseCase.getPostS3Url(fileName); return ApiResponse.ok(getS3UrlDto, "이미지 주소 저장 성공"); } diff --git a/src/main/java/com/idol/imageUpload/service/command/ImagePostService.java b/src/main/java/com/idol/imageUpload/service/command/ImagePostService.java index ee33d42..59ebef7 100644 --- a/src/main/java/com/idol/imageUpload/service/command/ImagePostService.java +++ b/src/main/java/com/idol/imageUpload/service/command/ImagePostService.java @@ -26,8 +26,8 @@ public class ImagePostService implements ImageUploadUseCase { // S3에 이미지 업로드 주소 URL 요청 @Override - public GetS3UrlDto getPostS3Url(Long userId, String fileName) { - String key = "profile/" + userId + "/" + UUID.randomUUID() + "/" + fileName; + public GetS3UrlDto getPostS3Url(String fileName) { + String key = "profile/" + UUID.randomUUID() + "/" + fileName; // PutObjectRequest: S3에 객체를 업로드하기 위한 요청 PutObjectRequest putObjectRequest = PutObjectRequest.builder() diff --git a/src/main/java/com/idol/imageUpload/useCase/ImageUploadUseCase.java b/src/main/java/com/idol/imageUpload/useCase/ImageUploadUseCase.java index 24caeac..53f0d10 100644 --- a/src/main/java/com/idol/imageUpload/useCase/ImageUploadUseCase.java +++ b/src/main/java/com/idol/imageUpload/useCase/ImageUploadUseCase.java @@ -5,5 +5,5 @@ import java.util.Date; public interface ImageUploadUseCase { - GetS3UrlDto getPostS3Url(Long memberId, String filename); + GetS3UrlDto getPostS3Url(String filename); }