From a1e87d89a324a5240d89fd2dff0634b12b647831 Mon Sep 17 00:00:00 2001 From: Eunjeong Lee Date: Sat, 21 Dec 2024 18:38:45 +0900 Subject: [PATCH 1/4] =?UTF-8?q?feat:=20=EB=B0=98=EB=A0=A4=EA=B2=AC=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0,=20=EC=82=B0=EC=B1=85=EC=9E=90=20=EB=A6=AC?= =?UTF-8?q?=EB=B7=B0=20=EC=9E=91=EC=84=B1=20api=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 11 ++ .../api/apply/repository/ApplyRepository.java | 3 + .../api/apply/service/ApplyService.java | 11 ++ .../api/board/domain/Review.java | 31 ----- .../api/board/repository/BoardRepository.java | 3 +- .../board/repository/ReviewRepository.java | 9 -- .../api/board/rest/ReviewController.java | 15 --- .../api/board/service/BoardService.java | 13 +++ .../api/board/service/ReviewService.java | 11 -- .../api/review/domain/HashtagToWalker.java | 36 ++++++ .../api/review/domain/ReviewToOwner.java | 67 +++++++++++ .../api/review/domain/ReviewToOwnerImage.java | 30 +++++ .../api/review/domain/ReviewToWalker.java | 64 +++++++++++ .../review/domain/ReviewToWalkerImage.java | 30 +++++ .../api/review/domain/enums/Activity.java | 15 +++ .../review/domain/enums/Aggressiveness.java | 15 +++ .../api/review/domain/enums/DogOwnership.java | 15 +++ .../review/domain/enums/HashtagWalkerNm.java | 21 ++++ .../api/review/domain/enums/Sociality.java | 15 +++ .../review/dto/req/ReviewToOwnerReqDto.java | 22 ++++ .../review/dto/req/ReviewToWalkerReqDto.java | 34 ++++++ .../repository/HashtagToWalkerRepository.java | 9 ++ .../ReviewToOwnerImageRepository.java | 7 ++ .../repository/ReviewToOwnerRepository.java | 7 ++ .../ReviewToWalkerImageRepository.java | 7 ++ .../repository/ReviewToWalkerRepository.java | 7 ++ .../review/rest/ReviewToOwnerController.java | 22 ++++ .../review/rest/ReviewToWalkerController.java | 26 +++++ .../review/service/ReviewToOwnerService.java | 56 +++++++++ .../review/service/ReviewToWalkerService.java | 69 +++++++++++ .../common/exception/ErrorType.java | 9 ++ .../common/file/FileService.java | 107 ++++++++++++++++++ .../walkmong_back/common/utils/FileUtils.java | 77 +++++++++++++ .../walkmong_back/config/S3Config.java | 32 ++++++ 34 files changed, 839 insertions(+), 67 deletions(-) delete mode 100644 src/main/java/org/jullaene/walkmong_back/api/board/domain/Review.java delete mode 100644 src/main/java/org/jullaene/walkmong_back/api/board/repository/ReviewRepository.java delete mode 100644 src/main/java/org/jullaene/walkmong_back/api/board/rest/ReviewController.java delete mode 100644 src/main/java/org/jullaene/walkmong_back/api/board/service/ReviewService.java create mode 100644 src/main/java/org/jullaene/walkmong_back/api/review/domain/HashtagToWalker.java create mode 100644 src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToOwner.java create mode 100644 src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToOwnerImage.java create mode 100644 src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToWalker.java create mode 100644 src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToWalkerImage.java create mode 100644 src/main/java/org/jullaene/walkmong_back/api/review/domain/enums/Activity.java create mode 100644 src/main/java/org/jullaene/walkmong_back/api/review/domain/enums/Aggressiveness.java create mode 100644 src/main/java/org/jullaene/walkmong_back/api/review/domain/enums/DogOwnership.java create mode 100644 src/main/java/org/jullaene/walkmong_back/api/review/domain/enums/HashtagWalkerNm.java create mode 100644 src/main/java/org/jullaene/walkmong_back/api/review/domain/enums/Sociality.java create mode 100644 src/main/java/org/jullaene/walkmong_back/api/review/dto/req/ReviewToOwnerReqDto.java create mode 100644 src/main/java/org/jullaene/walkmong_back/api/review/dto/req/ReviewToWalkerReqDto.java create mode 100644 src/main/java/org/jullaene/walkmong_back/api/review/repository/HashtagToWalkerRepository.java create mode 100644 src/main/java/org/jullaene/walkmong_back/api/review/repository/ReviewToOwnerImageRepository.java create mode 100644 src/main/java/org/jullaene/walkmong_back/api/review/repository/ReviewToOwnerRepository.java create mode 100644 src/main/java/org/jullaene/walkmong_back/api/review/repository/ReviewToWalkerImageRepository.java create mode 100644 src/main/java/org/jullaene/walkmong_back/api/review/repository/ReviewToWalkerRepository.java create mode 100644 src/main/java/org/jullaene/walkmong_back/api/review/rest/ReviewToOwnerController.java create mode 100644 src/main/java/org/jullaene/walkmong_back/api/review/rest/ReviewToWalkerController.java create mode 100644 src/main/java/org/jullaene/walkmong_back/api/review/service/ReviewToOwnerService.java create mode 100644 src/main/java/org/jullaene/walkmong_back/api/review/service/ReviewToWalkerService.java create mode 100644 src/main/java/org/jullaene/walkmong_back/common/file/FileService.java create mode 100644 src/main/java/org/jullaene/walkmong_back/common/utils/FileUtils.java create mode 100644 src/main/java/org/jullaene/walkmong_back/config/S3Config.java diff --git a/build.gradle b/build.gradle index d1b4241..4d814bb 100644 --- a/build.gradle +++ b/build.gradle @@ -50,6 +50,17 @@ dependencies { annotationProcessor "jakarta.persistence:jakarta.persistence-api" + // Redis + implementation 'org.springframework.boot:spring-boot-starter-data-redis' + + //smtp + implementation 'org.springframework.boot:spring-boot-starter-mail' + + // s3 + implementation(enforcedPlatform("com.amazonaws:aws-java-sdk-bom:1.11.1000")) + implementation("com.amazonaws:aws-java-sdk-s3") + implementation("javax.xml.bind:jaxb-api:2.3.1") + } tasks.named('test') { diff --git a/src/main/java/org/jullaene/walkmong_back/api/apply/repository/ApplyRepository.java b/src/main/java/org/jullaene/walkmong_back/api/apply/repository/ApplyRepository.java index 56c9595..2c300e4 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/apply/repository/ApplyRepository.java +++ b/src/main/java/org/jullaene/walkmong_back/api/apply/repository/ApplyRepository.java @@ -1,9 +1,12 @@ package org.jullaene.walkmong_back.api.apply.repository; import org.jullaene.walkmong_back.api.apply.domain.Apply; +import org.jullaene.walkmong_back.api.apply.domain.enums.MatchingStatus; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @Repository public interface ApplyRepository extends JpaRepository { + boolean existsByBoardIdAndMemberIdAndDelYn(Long boardId, Long memberId, String delYn); + boolean existsByBoardIdAndMemberIdAndMatchingStatusAndDelYn(Long boardId, Long memberId, MatchingStatus matchingStatus, String delYn); } diff --git a/src/main/java/org/jullaene/walkmong_back/api/apply/service/ApplyService.java b/src/main/java/org/jullaene/walkmong_back/api/apply/service/ApplyService.java index 8dbc122..2c7da2b 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/apply/service/ApplyService.java +++ b/src/main/java/org/jullaene/walkmong_back/api/apply/service/ApplyService.java @@ -1,11 +1,22 @@ package org.jullaene.walkmong_back.api.apply.service; import lombok.RequiredArgsConstructor; +import org.jullaene.walkmong_back.api.apply.domain.enums.MatchingStatus; import org.jullaene.walkmong_back.api.apply.repository.ApplyRepository; +import org.jullaene.walkmong_back.common.exception.CustomException; +import org.jullaene.walkmong_back.common.exception.ErrorType; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor public class ApplyService { private final ApplyRepository applyRepository; + @Transactional(readOnly = true) + public void isValidWalkerByBoardIdAndMatchingStatus(Long memberId, Long boardId, MatchingStatus matchingStatus) { + if (!applyRepository.existsByBoardIdAndMemberIdAndMatchingStatusAndDelYn(boardId, memberId, matchingStatus, "N")) { + throw new CustomException(HttpStatus.UNAUTHORIZED, ErrorType.ACCESS_DENIED); + } + } } diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/domain/Review.java b/src/main/java/org/jullaene/walkmong_back/api/board/domain/Review.java deleted file mode 100644 index 7b29a9b..0000000 --- a/src/main/java/org/jullaene/walkmong_back/api/board/domain/Review.java +++ /dev/null @@ -1,31 +0,0 @@ -package org.jullaene.walkmong_back.api.board.domain; - -import jakarta.persistence.*; -import org.hibernate.annotations.Comment; -import org.hibernate.annotations.DynamicUpdate; -import org.jullaene.walkmong_back.common.BaseEntity; - -@Table(name = "review") -@Entity -@DynamicUpdate -public class Review extends BaseEntity { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "review_id") - private Long reviewId; - - @Comment("게시글 아이디") - private Long postId; - - @Comment("후기 작성자 아이디") - private Long reviewerId; - - @Comment("후기 대상자 아이디") - private Long reviewTargetId; - - @Comment("내용") - private String content; - - @Comment("평점") - private Integer rating; -} diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/repository/BoardRepository.java b/src/main/java/org/jullaene/walkmong_back/api/board/repository/BoardRepository.java index b27a723..c4cb0b4 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/board/repository/BoardRepository.java +++ b/src/main/java/org/jullaene/walkmong_back/api/board/repository/BoardRepository.java @@ -5,5 +5,6 @@ import org.springframework.stereotype.Repository; @Repository -public interface BoardRepository extends JpaRepository { +public interface BoardRepository extends JpaRepository, BoardRepositoryCustom { + boolean existsByOwnerIdAndBoardIdAndDelYn(Long ownerId, Long boardId, String delYn); } diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/repository/ReviewRepository.java b/src/main/java/org/jullaene/walkmong_back/api/board/repository/ReviewRepository.java deleted file mode 100644 index 46599f2..0000000 --- a/src/main/java/org/jullaene/walkmong_back/api/board/repository/ReviewRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package org.jullaene.walkmong_back.api.board.repository; - -import org.jullaene.walkmong_back.api.board.domain.Review; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface ReviewRepository extends JpaRepository { -} diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/rest/ReviewController.java b/src/main/java/org/jullaene/walkmong_back/api/board/rest/ReviewController.java deleted file mode 100644 index 13e0f6c..0000000 --- a/src/main/java/org/jullaene/walkmong_back/api/board/rest/ReviewController.java +++ /dev/null @@ -1,15 +0,0 @@ -package org.jullaene.walkmong_back.api.board.rest; - -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.RequiredArgsConstructor; -import org.jullaene.walkmong_back.api.board.service.ReviewService; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; - -@Tag(name = "Review", description = "리뷰 정보 관련 api 입니다.") -@RestController -@RequiredArgsConstructor -@RequestMapping("/api/v1/review") -public class ReviewController { - private final ReviewService reviewService; -} diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/service/BoardService.java b/src/main/java/org/jullaene/walkmong_back/api/board/service/BoardService.java index 689c391..a9a66e5 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/board/service/BoardService.java +++ b/src/main/java/org/jullaene/walkmong_back/api/board/service/BoardService.java @@ -3,9 +3,22 @@ import lombok.RequiredArgsConstructor; import org.jullaene.walkmong_back.api.board.repository.BoardRepository; import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; @Service @RequiredArgsConstructor public class BoardService { private final BoardRepository boardRepository; + + /** + * + * */ + @Transactional(readOnly = true) + public void isValidOwnerByBoardIdAndDelYn (Long memberId, Long boardId, String delYn) { + if (!boardRepository.existsByOwnerIdAndBoardIdAndDelYn(memberId, boardId, delYn)) { + throw new CustomException(HttpStatus.UNAUTHORIZED, ErrorType.ACCESS_DENIED); + } + } + + } diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/service/ReviewService.java b/src/main/java/org/jullaene/walkmong_back/api/board/service/ReviewService.java deleted file mode 100644 index 3a75452..0000000 --- a/src/main/java/org/jullaene/walkmong_back/api/board/service/ReviewService.java +++ /dev/null @@ -1,11 +0,0 @@ -package org.jullaene.walkmong_back.api.board.service; - -import lombok.RequiredArgsConstructor; -import org.jullaene.walkmong_back.api.board.repository.ReviewRepository; -import org.springframework.stereotype.Service; - -@Service -@RequiredArgsConstructor -public class ReviewService { - private final ReviewRepository reviewRepository; -} diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/domain/HashtagToWalker.java b/src/main/java/org/jullaene/walkmong_back/api/review/domain/HashtagToWalker.java new file mode 100644 index 0000000..0b0cf8e --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/review/domain/HashtagToWalker.java @@ -0,0 +1,36 @@ +package org.jullaene.walkmong_back.api.review.domain; + +import jakarta.persistence.*; +import lombok.Builder; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.Comment; +import org.hibernate.annotations.DynamicUpdate; +import org.jullaene.walkmong_back.api.review.domain.enums.HashtagWalkerNm; +import org.jullaene.walkmong_back.common.BaseEntity; + +@Table(name = "hashtag_walker") +@Entity +@NoArgsConstructor +@DynamicUpdate +public class HashtagToWalker extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "hashtag_to_walker_id", nullable = false) + private Long hashtagToWalkerId; + + @Comment("후기 아이디") + private Long reviewToWalkerId; + + @Comment("후기 대상 아이디") + private Long reviewTargetId; + + @Comment("해시태그 명") + private HashtagWalkerNm hashtagWalkerNm; + + @Builder + public HashtagToWalker(Long reviewToWalkerId, Long reviewTargetId, HashtagWalkerNm hashtagWalkerNm) { + this.reviewToWalkerId = reviewToWalkerId; + this.reviewTargetId = reviewTargetId; + this.hashtagWalkerNm = hashtagWalkerNm; + } +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToOwner.java b/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToOwner.java new file mode 100644 index 0000000..8e18123 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToOwner.java @@ -0,0 +1,67 @@ +package org.jullaene.walkmong_back.api.review.domain; + +import jakarta.persistence.*; +import lombok.Builder; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.Comment; +import org.hibernate.annotations.DynamicUpdate; +import org.jullaene.walkmong_back.api.review.domain.enums.Activity; +import org.jullaene.walkmong_back.api.review.domain.enums.Aggressiveness; +import org.jullaene.walkmong_back.api.review.domain.enums.Sociality; +import org.jullaene.walkmong_back.api.review.dto.req.ReviewToOwnerReqDto; +import org.jullaene.walkmong_back.common.BaseEntity; + +@Table(name = "review_to_owner") +@Entity +@NoArgsConstructor +@DynamicUpdate +public class ReviewToOwner extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "review_to_owner_id", nullable = false) + private Long reviewToOwnerId; + + @Comment("게시글 아이디") + private Long boardId; + + @Comment("후기 작성자 아이디") + private Long reviewerId; + + @Comment("후기 대상자 아이디") + private Long reviewTargetId; + + @Comment("후기") + private String content; + + @Comment("좋음/싫음") + @Column(name = "good_yn", columnDefinition = "VARCHAR(1) default 'N'") + private String goodYn; + + @Comment("사회성") + private Sociality sociality; + + @Comment("활동량") + private Activity activity; + + @Comment("공격력") + private Aggressiveness aggressiveness; + + @Comment("아쉬운 점") + private String disappointment; + + @Builder + public ReviewToOwner(ReviewToOwnerReqDto reviewToOwnerReqDto, Long reviewerId) { + this.boardId = reviewToOwnerReqDto.getBoardId(); + this.reviewerId = reviewerId; + this.reviewTargetId = reviewToOwnerReqDto.getOwnerId(); + this.content = reviewToOwnerReqDto.getContent(); + this.sociality = reviewToOwnerReqDto.getSociality(); + this.activity = reviewToOwnerReqDto.getActivity(); + this.aggressiveness = reviewToOwnerReqDto.getAggressiveness(); + this.disappointment = reviewToOwnerReqDto.getDisappointment(); + } + + public Long getReviewToOwnerId () { + return reviewToOwnerId; + } +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToOwnerImage.java b/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToOwnerImage.java new file mode 100644 index 0000000..73fe0d8 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToOwnerImage.java @@ -0,0 +1,30 @@ +package org.jullaene.walkmong_back.api.review.domain; + +import jakarta.persistence.*; +import lombok.Builder; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.Comment; +import org.hibernate.annotations.DynamicUpdate; + +@Table(name = "review_owner") +@Entity +@NoArgsConstructor +@DynamicUpdate +public class ReviewToOwnerImage { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "review_to_owner_image_id", nullable = false) + private Long reviewToOwnerImageId; + + @Comment("반려인 후기 아이디") + private Long reviewToOwnerId; + + @Comment("이미지") + private String imageUrl; + + @Builder + public ReviewToOwnerImage(Long reviewToOwnerId, String imageUrl) { + this.reviewToOwnerId = reviewToOwnerId; + this.imageUrl = imageUrl; + } +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToWalker.java b/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToWalker.java new file mode 100644 index 0000000..390e1bf --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToWalker.java @@ -0,0 +1,64 @@ +package org.jullaene.walkmong_back.api.review.domain; + +import jakarta.persistence.*; +import lombok.Builder; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.Comment; +import org.hibernate.annotations.DynamicUpdate; +import org.jullaene.walkmong_back.api.review.dto.req.ReviewToWalkerReqDto; +import org.jullaene.walkmong_back.common.BaseEntity; + +@Table(name = "review_walker") +@Entity +@NoArgsConstructor +@DynamicUpdate +public class ReviewToWalker extends BaseEntity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "review_to_walker_id", nullable = false) + private Long reviewToWalkerId; + + @Comment("게시글 아이디") + private Long boardId; + + @Comment("후기 작성자 아이디") + private Long reviewerId; + + @Comment("후기 대상자 아이디") + private Long reviewTargetId; + + @Comment("후기") + private String content; + + @Comment("시간 약속 준수 여부") + private Float timePunctuality; + + @Comment("소통") + private Float communication; + + @Comment("태도") + private Float attitude; + + @Comment("산책 요청사항 이행") + private Float taskCompletion; + + @Comment("산책 중 사진 공유") + private Float photoSharing; + + @Builder + public ReviewToWalker(ReviewToWalkerReqDto reviewToWalkerReqDto, Long reviewerId) { + this.boardId = reviewToWalkerReqDto.getBoardId(); + this.reviewerId = reviewerId; + this.reviewTargetId = reviewToWalkerReqDto.getWalkerId(); + this.content = reviewToWalkerReqDto.getContent(); + this.timePunctuality = reviewToWalkerReqDto.getTimePunctuality(); + this.communication = reviewToWalkerReqDto.getCommunication(); + this.attitude = reviewToWalkerReqDto.getAttitude(); + this.taskCompletion = reviewToWalkerReqDto.getTaskCompletion(); + this.photoSharing = reviewToWalkerReqDto.getPhotoSharing(); + } + + public Long getReviewToWalkerId () { + return reviewToWalkerId; + } +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToWalkerImage.java b/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToWalkerImage.java new file mode 100644 index 0000000..dfda021 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToWalkerImage.java @@ -0,0 +1,30 @@ +package org.jullaene.walkmong_back.api.review.domain; + +import jakarta.persistence.*; +import lombok.Builder; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.Comment; +import org.hibernate.annotations.DynamicUpdate; + +@Table(name = "review_walker") +@Entity +@NoArgsConstructor +@DynamicUpdate +public class ReviewToWalkerImage { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "review_to_walker_image_id", nullable = false) + private Long reviewToWalkerImageId; + + @Comment("산책자 후기 아이디") + private Long reviewToWalkerId; + + @Comment("이미지") + private String imageUrl; + + @Builder + public ReviewToWalkerImage(Long reviewToWalkerId, String imageUrl) { + this.reviewToWalkerId = reviewToWalkerId; + this.imageUrl = imageUrl; + } +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/domain/enums/Activity.java b/src/main/java/org/jullaene/walkmong_back/api/review/domain/enums/Activity.java new file mode 100644 index 0000000..ecdbad7 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/review/domain/enums/Activity.java @@ -0,0 +1,15 @@ +package org.jullaene.walkmong_back.api.review.domain.enums; + +public enum Activity { + RUNNING_CONSTANTLY("계속 뜀"), + RUNNING_OCCASIONALLY("가끔 뜀"), + WALKING_FAST("빠르게 걸음"), + WALKING_SLOWLY("천천히 걸음"), + FREQUENTLY_STOPPING("자주 멈춤"); + + private final String name; + + Activity(String name) { + this.name = name; + } +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/domain/enums/Aggressiveness.java b/src/main/java/org/jullaene/walkmong_back/api/review/domain/enums/Aggressiveness.java new file mode 100644 index 0000000..57e5d6a --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/review/domain/enums/Aggressiveness.java @@ -0,0 +1,15 @@ +package org.jullaene.walkmong_back.api.review.domain.enums; + +public enum Aggressiveness { + DOCILE("온순"), + OCCASIONAL_BARKING("가끔 짖음"), + FREQUENT_BARKING("자주 짖음"), + BITING("물음"), + NIPPING("입질"); + + private final String name; + + Aggressiveness(String name) { + this.name = name; + } +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/domain/enums/DogOwnership.java b/src/main/java/org/jullaene/walkmong_back/api/review/domain/enums/DogOwnership.java new file mode 100644 index 0000000..cc48e6a --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/review/domain/enums/DogOwnership.java @@ -0,0 +1,15 @@ +package org.jullaene.walkmong_back.api.review.domain.enums; + +public enum DogOwnership { + NONE("없음"), + LESS_THAN_3("3년 미만"), + MORE_THAN_3("3년 이상"), + MORE_THAN_5("5년 이상"), + MORE_THAN_10("10년 이상"); + + private final String name; + + DogOwnership(String name) { + this.name = name; + } +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/domain/enums/HashtagWalkerNm.java b/src/main/java/org/jullaene/walkmong_back/api/review/domain/enums/HashtagWalkerNm.java new file mode 100644 index 0000000..ba503c8 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/review/domain/enums/HashtagWalkerNm.java @@ -0,0 +1,21 @@ +package org.jullaene.walkmong_back.api.review.domain.enums; + +public enum HashtagWalkerNm { + LIKED_BY_DOG("반려견이 좋아해요"), + POLITE("매너가 좋아요"), + DETAIL_ORIENTED("꼼꼼해요"), + GOOD_SCHEDULE_MANAGEMENT("일정 조정을 잘 해줘요"), + RESPONSIBLE_WALKING("산책을 성실히 해줘요"), + GOOD_WITH_DOGS("반려견을 잘 다뤄요"), + FAST_RESPONSE("답장이 빨라요"), + FOLLOWS_REQUESTS("요청 사항을 잘 들어줘요"), + RELIABLE("믿고 맡길 수 있어요"), + SAFE_WALKING("안전한 산책을 제공해요"), + PROFESSIONAL("전문적으로 느껴져요"); + + private final String name; + + HashtagWalkerNm(String name) { + this.name = name; + } +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/domain/enums/Sociality.java b/src/main/java/org/jullaene/walkmong_back/api/review/domain/enums/Sociality.java new file mode 100644 index 0000000..8e0e29a --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/review/domain/enums/Sociality.java @@ -0,0 +1,15 @@ +package org.jullaene.walkmong_back.api.review.domain.enums; + +public enum Sociality { + PEOPLE_FRIENDLY("사람 좋아함"), + DOG_FRIENDLY("강아지 좋아함"), + SHY("낯가림 있음"), + PLAYFUL("애교 많음"), + GUARDED("경계심 심함"); + + private final String name; + + Sociality(String name) { + this.name = name; + } +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/dto/req/ReviewToOwnerReqDto.java b/src/main/java/org/jullaene/walkmong_back/api/review/dto/req/ReviewToOwnerReqDto.java new file mode 100644 index 0000000..f2ea7be --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/review/dto/req/ReviewToOwnerReqDto.java @@ -0,0 +1,22 @@ +package org.jullaene.walkmong_back.api.review.dto.req; + +import lombok.Getter; +import org.jullaene.walkmong_back.api.review.domain.enums.Activity; +import org.jullaene.walkmong_back.api.review.domain.enums.Aggressiveness; +import org.jullaene.walkmong_back.api.review.domain.enums.Sociality; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +@Getter +public class ReviewToOwnerReqDto { + private Long ownerId; + private Long boardId; + private String goodYn; + private Sociality sociality; + private Activity activity; + private Aggressiveness aggressiveness; + private String disappointment; + private String content; + private List images; +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/dto/req/ReviewToWalkerReqDto.java b/src/main/java/org/jullaene/walkmong_back/api/review/dto/req/ReviewToWalkerReqDto.java new file mode 100644 index 0000000..21f83db --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/review/dto/req/ReviewToWalkerReqDto.java @@ -0,0 +1,34 @@ +package org.jullaene.walkmong_back.api.review.dto.req; + +import lombok.Getter; +import org.jullaene.walkmong_back.api.review.domain.enums.HashtagWalkerNm; +import org.springframework.web.multipart.MultipartFile; + +import java.util.List; + +@Getter +public class ReviewToWalkerReqDto { + private final Long walkerId; + private final Long boardId; + private final Float timePunctuality; + private final Float communication; + private final Float attitude; + private final Float taskCompletion; + private final Float photoSharing; + private final String content; + private final List hashtags; + private final List images; + + public ReviewToWalkerReqDto(Long walkerId, Long boardId, Float timePunctuality, Float communication, Float attitude, Float taskCompletion, Float photoSharing, String content, List hashtags, List images) { + this.walkerId = walkerId; + this.boardId = boardId; + this.timePunctuality = timePunctuality; + this.communication = communication; + this.attitude = attitude; + this.taskCompletion = taskCompletion; + this.photoSharing = photoSharing; + this.content = content; + this.hashtags = hashtags; + this.images = images; + } +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/repository/HashtagToWalkerRepository.java b/src/main/java/org/jullaene/walkmong_back/api/review/repository/HashtagToWalkerRepository.java new file mode 100644 index 0000000..1acc064 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/review/repository/HashtagToWalkerRepository.java @@ -0,0 +1,9 @@ +package org.jullaene.walkmong_back.api.review.repository; + +import org.jullaene.walkmong_back.api.review.domain.HashtagToWalker; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface HashtagToWalkerRepository extends JpaRepository { +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/repository/ReviewToOwnerImageRepository.java b/src/main/java/org/jullaene/walkmong_back/api/review/repository/ReviewToOwnerImageRepository.java new file mode 100644 index 0000000..3154c4c --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/review/repository/ReviewToOwnerImageRepository.java @@ -0,0 +1,7 @@ +package org.jullaene.walkmong_back.api.review.repository; + +import org.jullaene.walkmong_back.api.review.domain.ReviewToOwnerImage; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ReviewToOwnerImageRepository extends JpaRepository { +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/repository/ReviewToOwnerRepository.java b/src/main/java/org/jullaene/walkmong_back/api/review/repository/ReviewToOwnerRepository.java new file mode 100644 index 0000000..09e1579 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/review/repository/ReviewToOwnerRepository.java @@ -0,0 +1,7 @@ +package org.jullaene.walkmong_back.api.review.repository; + +import org.jullaene.walkmong_back.api.review.domain.ReviewToOwner; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ReviewToOwnerRepository extends JpaRepository { +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/repository/ReviewToWalkerImageRepository.java b/src/main/java/org/jullaene/walkmong_back/api/review/repository/ReviewToWalkerImageRepository.java new file mode 100644 index 0000000..5f6b4a6 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/review/repository/ReviewToWalkerImageRepository.java @@ -0,0 +1,7 @@ +package org.jullaene.walkmong_back.api.review.repository; + +import org.jullaene.walkmong_back.api.review.domain.ReviewToWalkerImage; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ReviewToWalkerImageRepository extends JpaRepository { +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/repository/ReviewToWalkerRepository.java b/src/main/java/org/jullaene/walkmong_back/api/review/repository/ReviewToWalkerRepository.java new file mode 100644 index 0000000..c06cc72 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/review/repository/ReviewToWalkerRepository.java @@ -0,0 +1,7 @@ +package org.jullaene.walkmong_back.api.review.repository; + +import org.jullaene.walkmong_back.api.review.domain.ReviewToWalker; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface ReviewToWalkerRepository extends JpaRepository { +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/rest/ReviewToOwnerController.java b/src/main/java/org/jullaene/walkmong_back/api/review/rest/ReviewToOwnerController.java new file mode 100644 index 0000000..be7d113 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/review/rest/ReviewToOwnerController.java @@ -0,0 +1,22 @@ +package org.jullaene.walkmong_back.api.review.rest; + +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.jullaene.walkmong_back.api.review.dto.req.ReviewToOwnerReqDto; +import org.jullaene.walkmong_back.api.review.service.ReviewToOwnerService; +import org.jullaene.walkmong_back.common.BasicResponse; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/v1/review/to/owner") +public class ReviewToOwnerController { + private final ReviewToOwnerService reviewToOwnerService; + + + @PostMapping("/register") + public ResponseEntity> registerReviewToOwner(@Valid @ModelAttribute ReviewToOwnerReqDto reviewToOwnerReqDto) { + return ResponseEntity.ok(BasicResponse.ofSuccess(reviewToOwnerService.registerReviewToOwner(reviewToOwnerReqDto))); + } +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/rest/ReviewToWalkerController.java b/src/main/java/org/jullaene/walkmong_back/api/review/rest/ReviewToWalkerController.java new file mode 100644 index 0000000..73d88f9 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/review/rest/ReviewToWalkerController.java @@ -0,0 +1,26 @@ +package org.jullaene.walkmong_back.api.review.rest; + +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.jullaene.walkmong_back.api.review.dto.req.ReviewToWalkerReqDto; +import org.jullaene.walkmong_back.api.review.service.ReviewToWalkerService; +import org.jullaene.walkmong_back.common.BasicResponse; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/v1/review/to/walker") +public class ReviewToWalkerController { + + private final ReviewToWalkerService reviewToWalkerService; + + + @PostMapping("/register") + public ResponseEntity> registerReviewToOwner(@Valid @ModelAttribute ReviewToWalkerReqDto reviewToWalkerReqDto) { + return ResponseEntity.ok(BasicResponse.ofSuccess(reviewToWalkerService.registerReviewToWalker(reviewToWalkerReqDto))); + } +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/service/ReviewToOwnerService.java b/src/main/java/org/jullaene/walkmong_back/api/review/service/ReviewToOwnerService.java new file mode 100644 index 0000000..430754d --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/review/service/ReviewToOwnerService.java @@ -0,0 +1,56 @@ +package org.jullaene.walkmong_back.api.review.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jullaene.walkmong_back.api.apply.domain.enums.MatchingStatus; +import org.jullaene.walkmong_back.api.apply.service.ApplyService; +import org.jullaene.walkmong_back.api.member.domain.Member; +import org.jullaene.walkmong_back.api.member.service.MemberService; +import org.jullaene.walkmong_back.api.review.domain.ReviewToOwner; +import org.jullaene.walkmong_back.api.review.domain.ReviewToOwnerImage; +import org.jullaene.walkmong_back.api.review.dto.req.ReviewToOwnerReqDto; +import org.jullaene.walkmong_back.api.review.repository.ReviewToOwnerImageRepository; +import org.jullaene.walkmong_back.api.review.repository.ReviewToOwnerRepository; +import org.jullaene.walkmong_back.common.file.FileService; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Slf4j +@Service +@RequiredArgsConstructor +public class ReviewToOwnerService { + private final MemberService memberService; + private final ApplyService applyService; + private final FileService fileService; + private final ReviewToOwnerRepository reviewToOwnerRepository; + private final ReviewToOwnerImageRepository reviewToOwnerImageRepository; + public Long registerReviewToOwner(ReviewToOwnerReqDto reviewToOwnerReqDto) { + Member member = memberService.getMemberFromUserDetail(); + + applyService.isValidWalkerByBoardIdAndMatchingStatus(member.getMemberId(), reviewToOwnerReqDto.getBoardId(), MatchingStatus.CONFIRMED); + log.info("해당 산책의 산책자 인증 완료"); + + ReviewToOwner reviewToOwner = ReviewToOwner.builder() + .reviewToOwnerReqDto(reviewToOwnerReqDto) + .reviewerId(member.getMemberId()) + .build(); + + Long reviewToOwnerId = reviewToOwnerRepository.save(reviewToOwner).getReviewToOwnerId(); + log.info("산책자 -> 반려인 리뷰 작성 완료 : " + reviewToOwnerId); + + List images = reviewToOwnerReqDto.getImages().stream() + .map(image -> { + String imageUrl = fileService.uploadFile(image, "/review/to/walker"); + return ReviewToOwnerImage.builder() + .reviewToOwnerId(reviewToOwnerId) + .imageUrl(imageUrl) + .build(); + }) + .toList(); + reviewToOwnerImageRepository.saveAll(images); + log.info("산책자 -> 반려인 리뷰 이미지 저장 완료"); + + return reviewToOwnerId; + } +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/service/ReviewToWalkerService.java b/src/main/java/org/jullaene/walkmong_back/api/review/service/ReviewToWalkerService.java new file mode 100644 index 0000000..e9b79d1 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/review/service/ReviewToWalkerService.java @@ -0,0 +1,69 @@ +package org.jullaene.walkmong_back.api.review.service; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jullaene.walkmong_back.api.board.service.BoardService; +import org.jullaene.walkmong_back.api.member.domain.Member; +import org.jullaene.walkmong_back.api.member.service.MemberService; +import org.jullaene.walkmong_back.api.review.domain.HashtagToWalker; +import org.jullaene.walkmong_back.api.review.domain.ReviewToWalker; +import org.jullaene.walkmong_back.api.review.domain.ReviewToWalkerImage; +import org.jullaene.walkmong_back.api.review.dto.req.ReviewToWalkerReqDto; +import org.jullaene.walkmong_back.api.review.repository.HashtagToWalkerRepository; +import org.jullaene.walkmong_back.api.review.repository.ReviewToWalkerImageRepository; +import org.jullaene.walkmong_back.api.review.repository.ReviewToWalkerRepository; +import org.jullaene.walkmong_back.common.file.FileService; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +@Slf4j +@Service +@RequiredArgsConstructor +public class ReviewToWalkerService { + private final MemberService memberService; + private final BoardService boardService; + private final FileService fileService; + private final ReviewToWalkerRepository reviewToWalkerRepository; + private final HashtagToWalkerRepository hashtagToWalkerRepository; + private final ReviewToWalkerImageRepository reviewToWalkerImageRepository; + + @Transactional + public Long registerReviewToWalker(ReviewToWalkerReqDto reviewToWalkerReqDto) { + Member member = memberService.getMemberFromUserDetail(); + + boardService.isValidOwnerByBoardIdAndDelYn(member.getMemberId(), reviewToWalkerReqDto.getBoardId(), "N"); + log.info("해당 게시글의 반려인 인증 완료"); + + ReviewToWalker reviewToWalker = ReviewToWalker.builder().build(); + Long reviewToWalkerId = reviewToWalkerRepository.save(reviewToWalker).getReviewToWalkerId(); + log.info("산책자 리뷰 저장"); + + List hashtagToWalkers = reviewToWalkerReqDto.getHashtags().stream() + .map(hashtag -> { + return HashtagToWalker.builder() + .reviewToWalkerId(reviewToWalkerId) + .reviewTargetId(member.getMemberId()) + .hashtagWalkerNm(hashtag) + .build(); + }) + .toList(); + hashtagToWalkerRepository.saveAll(hashtagToWalkers); + log.info("산책자 리뷰 해시태그 저장 완료"); + + List images = reviewToWalkerReqDto.getImages().stream() + .map(image -> { + String imageUrl = fileService.uploadFile(image, "/review/to/walker"); + return ReviewToWalkerImage.builder() + .reviewToWalkerId(reviewToWalkerId) + .imageUrl(imageUrl) + .build(); + }) + .toList(); + reviewToWalkerImageRepository.saveAll(images); + log.info("산책자 리뷰 이미지 저장 완료"); + + return reviewToWalkerId; + } +} diff --git a/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java b/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java index 3a81491..bbe06c5 100644 --- a/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java +++ b/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java @@ -12,12 +12,21 @@ public enum ErrorType { LOGIN_REQUIRED("로그인 해주세요."), EXPIRED_TOKEN("만료된 요청입니다."), ALREADY_EXIST_USER("이미 존재하는 유저입니다."), + ALREADY_EXIST_NICKNAME("이미 존재하는 닉네임입니다."), + INVALID_VERIFICATION_CODE("인증에 실패했습니다."), ALREADY_LOGIN("로그인 상태입니다"), WRONG_PASSWORD("잘못된 비밀번호 입니다."), REQUEST_VALIDATION_ERROR("유효성 검사가 실패하였습니다."), INVALID_TOKEN("유효하지 않은 토큰입니다."), INTERNAL_SERVER("서버 오류입니다."), UNAUTHORIZED_UPDATE("수정 권한이 없는 유저입니다."), + DOG_NOT_FOUND("존재하지 않는 강아지입니다."), + INVALID_ADDRESS("유효하지 않은 주소입니다."), + CANNOT_SELF_APPLY("본인의 게시글에는 지원할 수 없습니다."), + CANNOT_DUPLICATED_APPLY("한 게시글에 여러 번 지원할 수 없습니다."), + CANNOT_DUPLICATED_DOG_PROFILE("이미 등록된 강아지입니다"), + INVALID_FILE("존재하지 않는 파일입니다."), + INVALID_S3_FILE("AWS S3 저장소에 존재하지 않는 파일입니다."), ; private String message; diff --git a/src/main/java/org/jullaene/walkmong_back/common/file/FileService.java b/src/main/java/org/jullaene/walkmong_back/common/file/FileService.java new file mode 100644 index 0000000..137cc5c --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/common/file/FileService.java @@ -0,0 +1,107 @@ +package org.jullaene.walkmong_back.common.file; + +import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.s3.model.*; +import com.amazonaws.util.IOUtils; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jullaene.walkmong_back.common.exception.CustomException; +import org.jullaene.walkmong_back.common.exception.ErrorType; +import org.jullaene.walkmong_back.common.utils.FileUtils; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.MediaType; +import org.springframework.http.ResponseEntity; +import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; + +import java.io.IOException; +import java.net.URLEncoder; +import java.nio.charset.StandardCharsets; +import java.util.List; + +@Slf4j +@RequiredArgsConstructor +@Service +public class FileService { + + @Value("${cloud.aws.bucket}") + private String bucket; + private final AmazonS3Client s3Client; + + /** + * S3 file upload + * @param multipartFile file + * @return file url + */ + public String uploadFile(MultipartFile multipartFile, String dirPath) { + FileUtils.checkInvalidUploadFile(multipartFile); + + try { + // Set metadata for the file + ObjectMetadata objectMetadata = new ObjectMetadata(); + objectMetadata.setContentType(multipartFile.getContentType()); + objectMetadata.setContentLength(multipartFile.getSize()); + + // Construct file path + String filePath = dirPath + "/" + multipartFile.getOriginalFilename(); + + // Upload file to S3 + s3Client.putObject(new PutObjectRequest(bucket, filePath, multipartFile.getInputStream(), objectMetadata)); + + // Generate file URL + String uploadFileUrl = s3Client.getUrl(bucket, filePath).toString(); + log.info("File upload success : {}", uploadFileUrl); + + return uploadFileUrl; + } catch (IOException e) { + log.error("File upload failed : {}", e.getMessage(), e); + throw new RuntimeException("File upload failed", e); + } + } + + /** + * S3 file delete + * @return Failed Delete Object Counts + */ + public int deleteFile (Integer idCount, List keys) { + DeleteObjectsRequest deleteObjectsRequest = new DeleteObjectsRequest(bucket).withKeys(keys); + DeleteObjectsResult result = s3Client.deleteObjects(deleteObjectsRequest); + int count = idCount - result.getDeletedObjects().size(); + log.info("Failed Delete Object Counts = {}", idCount - result.getDeletedObjects().size()); + return count; + } + + /** + * S3 file download + */ + public ResponseEntity downloadFile (String originFileName, String filePath) { + byte[] bytes = null; + HttpHeaders httpHeaders = new HttpHeaders(); + + try { + S3Object o = s3Client.getObject(new GetObjectRequest(bucket, filePath)); + if (o == null) throw new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_S3_FILE); + + S3ObjectInputStream objectInputStream = o.getObjectContent(); + + bytes = IOUtils.toByteArray(objectInputStream); + + String fileName = URLEncoder.encode(originFileName, String.valueOf(StandardCharsets.UTF_8)).replaceAll("\\+", "%20"); + httpHeaders.setContentType(MediaType.APPLICATION_OCTET_STREAM); + httpHeaders.setContentLength(bytes.length); + httpHeaders.setContentDispositionFormData("attachment", fileName); + + } catch (AmazonS3Exception e) { + log.error("File not find : {}", e.getMessage()); + throw new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_S3_FILE); + } catch (IOException e) { + e.printStackTrace(); + log.error("File upload failed : {}", e.getMessage()); + } + + return new ResponseEntity<>(bytes, httpHeaders, HttpStatus.OK); + } + +} diff --git a/src/main/java/org/jullaene/walkmong_back/common/utils/FileUtils.java b/src/main/java/org/jullaene/walkmong_back/common/utils/FileUtils.java new file mode 100644 index 0000000..9099ffc --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/common/utils/FileUtils.java @@ -0,0 +1,77 @@ +package org.jullaene.walkmong_back.common.utils; + +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jullaene.walkmong_back.common.exception.CustomException; +import org.jullaene.walkmong_back.common.exception.ErrorType; +import org.springframework.http.HttpStatus; +import org.springframework.util.StringUtils; +import org.springframework.web.multipart.MultipartFile; + +import java.text.SimpleDateFormat; +import java.util.Date; +import java.util.Locale; +import java.util.UUID; + +@Slf4j +@RequiredArgsConstructor +public class FileUtils { + private static final String BASE_DIR = "freeSign"; + + /** + * UUID 파일명 반환 + */ + public static String getUuidFileName() { + return UUID.randomUUID().toString(); + } + + + /** + * Multipart 의 contentType 값에서 / 이후 확장자만 자름 + * @param contentType ex) image/png + * @return ex) png + */ + public static String getFileType (String contentType) { + if (StringUtils.hasText(contentType)) { + return contentType.substring(contentType.lastIndexOf('/') + 1); + } + return null; + } + + /** + * 파일 전체 경로 생성 + * @param fileId 생성된 파일 고유 ID + * @param fileType 확장자 + */ + public static String createPath (String fileId, String fileType, String folderName, String dirPath) { + return String.format("%s/%s/%s.%s", BASE_DIR + dirPath, folderName, fileId, fileType); + } + + /** + * 년/월/일 폴더명 반환 + */ + public static String getFolderName() { + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd", Locale.getDefault()); + Date date = new Date(); + String str = sdf.format(date); + return str.replace("-", "/"); + } + + /** + * 파일 유효성 체크 + * @param multipartFile file + */ + public static void checkInvalidUploadFile(MultipartFile multipartFile) { + if (multipartFile == null || multipartFile.isEmpty() || multipartFile.getSize() == 0) { + throw new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_FILE); + } + } + + public static boolean isFileNull(MultipartFile multipartFile) { + if (multipartFile == null || multipartFile.isEmpty() || multipartFile.getSize() == 0) { + return true; + } + + return false; + } +} diff --git a/src/main/java/org/jullaene/walkmong_back/config/S3Config.java b/src/main/java/org/jullaene/walkmong_back/config/S3Config.java new file mode 100644 index 0000000..5750188 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/config/S3Config.java @@ -0,0 +1,32 @@ +package org.jullaene.walkmong_back.config; + +import com.amazonaws.auth.AWSStaticCredentialsProvider; +import com.amazonaws.auth.BasicAWSCredentials; +import com.amazonaws.services.s3.AmazonS3Client; +import com.amazonaws.services.s3.AmazonS3ClientBuilder; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class S3Config { + + @Value("${cloud.aws.credentials.access-key}") + private String accessKey; + + @Value("${cloud.aws.credentials.secret-key}") + private String secretKey; + + @Value("${cloud.aws.region.static}") + private String region; + + @Bean + public AmazonS3Client amazonS3Client() { + BasicAWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey); + + return (AmazonS3Client) AmazonS3ClientBuilder.standard() + .withCredentials(new AWSStaticCredentialsProvider(credentials)) + .withRegion(region) + .build(); + } +} From 3cd6018c4bbd65a4107b19389ef4f9c9ec90608c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=20=EC=9D=80=EC=A0=95?= Date: Sat, 28 Dec 2024 03:14:23 +0900 Subject: [PATCH 2/4] =?UTF-8?q?fix:=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../walkmong_back/api/board/repository/BoardRepository.java | 2 +- .../jullaene/walkmong_back/api/board/service/BoardService.java | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/repository/BoardRepository.java b/src/main/java/org/jullaene/walkmong_back/api/board/repository/BoardRepository.java index c4cb0b4..c8bb9dd 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/board/repository/BoardRepository.java +++ b/src/main/java/org/jullaene/walkmong_back/api/board/repository/BoardRepository.java @@ -5,6 +5,6 @@ import org.springframework.stereotype.Repository; @Repository -public interface BoardRepository extends JpaRepository, BoardRepositoryCustom { +public interface BoardRepository extends JpaRepository { boolean existsByOwnerIdAndBoardIdAndDelYn(Long ownerId, Long boardId, String delYn); } diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/service/BoardService.java b/src/main/java/org/jullaene/walkmong_back/api/board/service/BoardService.java index a9a66e5..0004e3a 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/board/service/BoardService.java +++ b/src/main/java/org/jullaene/walkmong_back/api/board/service/BoardService.java @@ -2,6 +2,9 @@ import lombok.RequiredArgsConstructor; import org.jullaene.walkmong_back.api.board.repository.BoardRepository; +import org.jullaene.walkmong_back.common.exception.CustomException; +import org.jullaene.walkmong_back.common.exception.ErrorType; +import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; From a9909ab1304c99e9861bfeecf7ee39e80d1c0f6c Mon Sep 17 00:00:00 2001 From: Eunjeong Lee Date: Sat, 21 Dec 2024 20:18:30 +0900 Subject: [PATCH 3/4] =?UTF-8?q?fix:=20=EB=A6=AC=EB=B7=B0=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EC=98=A4=EB=A5=98=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/board/service/BoardService.java | 92 ++++++++++++++++++- .../api/review/domain/HashtagToWalker.java | 3 +- .../api/review/domain/ReviewToOwner.java | 4 + .../api/review/domain/ReviewToOwnerImage.java | 2 +- .../api/review/domain/ReviewToWalker.java | 2 +- .../review/domain/ReviewToWalkerImage.java | 2 +- .../review/dto/req/ReviewToOwnerReqDto.java | 32 +++++-- .../review/service/ReviewToWalkerService.java | 5 +- 8 files changed, 127 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/service/BoardService.java b/src/main/java/org/jullaene/walkmong_back/api/board/service/BoardService.java index 0004e3a..19a359e 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/board/service/BoardService.java +++ b/src/main/java/org/jullaene/walkmong_back/api/board/service/BoardService.java @@ -1,27 +1,117 @@ package org.jullaene.walkmong_back.api.board.service; import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jullaene.walkmong_back.api.board.domain.Board; +import org.jullaene.walkmong_back.api.board.dto.req.BoardRequestDto; +import org.jullaene.walkmong_back.api.board.dto.res.BoardDetailResponseDto; +import org.jullaene.walkmong_back.api.board.dto.res.BoardResponseDto; import org.jullaene.walkmong_back.api.board.repository.BoardRepository; +import org.jullaene.walkmong_back.api.dog.domain.Dog; +import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; +import org.jullaene.walkmong_back.api.dog.repository.DogRepository; +import org.jullaene.walkmong_back.api.member.domain.Address; +import org.jullaene.walkmong_back.api.member.domain.Member; +import org.jullaene.walkmong_back.api.member.domain.enums.DistanceRange; +import org.jullaene.walkmong_back.api.member.repository.AddressRepository; +import org.jullaene.walkmong_back.api.member.service.MemberService; import org.jullaene.walkmong_back.common.exception.CustomException; import org.jullaene.walkmong_back.common.exception.ErrorType; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import java.time.LocalDate; +import java.util.List; + +@Slf4j @Service @RequiredArgsConstructor public class BoardService { private final BoardRepository boardRepository; + private final AddressRepository addressRepository; + private final MemberService memberService; + private final DogRepository dogRepository; + + /** + * 게시글 리스트 조회 + * */ + @Transactional(readOnly = true) + public List getBoards(LocalDate date, Long addressId, DistanceRange distance, DogSize dogSize, String matchingYn) { + Member member = memberService.getMemberFromUserDetail(); + + // 주소 id가 null이면 기본 주소 반환, 주소 id가 null이 아니면 해당 id를 가진 주소 반환 + Address address; + if (addressId == null) { + address = getBasicAddressAndDelYn(member.getMemberId(), "N"); + } + else { + address = getAddressByIdAndDelYn(addressId, "N"); + } + return boardRepository.getBoardsWithFilters(date, address, distance, dogSize, matchingYn); + } + + @Transactional(readOnly = true) + public BoardDetailResponseDto getBoardDetail(Long boardId) { + Member member = memberService.getMemberFromUserDetail(); + + return boardRepository.getBoardDetailResponse(boardId,member.getMemberId(), "N") + .orElseThrow(()->new CustomException(HttpStatus.BAD_REQUEST,ErrorType.INVALID_ADDRESS)); + } + + @Transactional + public Long createBoard(BoardRequestDto boardRequestDto) { + Member member = memberService.getMemberFromUserDetail(); + + List
addresses = addressRepository.findByMemberIdAndDelYn(member.getMemberId(), "N"); + + boolean isAddressValid = addresses.stream() + .anyMatch(address -> address.getAddressId().equals(boardRequestDto.getAddressId())); + + if (!isAddressValid) { + throw new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_ADDRESS); + } + + Dog dog = dogRepository.findByDogIdAndDelYn(boardRequestDto.getDogId(), "N") + .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.DOG_NOT_FOUND)); + + Board board = Board.builder() + .boardRequestDto(boardRequestDto) + .content(dog.getWalkRequestContent()) + .build(); + + return boardRepository.save(board).getBoardId(); + } /** - * + * 게시글 아이디와 삭제 여부로 해당 게시글의 유효한 반려인인지 확인 * */ @Transactional(readOnly = true) public void isValidOwnerByBoardIdAndDelYn (Long memberId, Long boardId, String delYn) { + log.info("memberId : " + memberId + " boardId : " + boardId); if (!boardRepository.existsByOwnerIdAndBoardIdAndDelYn(memberId, boardId, delYn)) { throw new CustomException(HttpStatus.UNAUTHORIZED, ErrorType.ACCESS_DENIED); } } + /** + * 주어진 멤버가 가진 기본 address를 반환 + * */ + @Transactional(readOnly = true) + protected Address getBasicAddressAndDelYn(Long memberId, String delYn) { + return addressRepository.findByMemberIdAndBasicAddressYnAndDelYn(memberId,"Y", delYn) + .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_ADDRESS)); + } + + /** + * 주어진 addressId를 이용하여 address 반환 + * */ + @Transactional(readOnly = true) + protected Address getAddressByIdAndDelYn (Long addressId, String delYn) { + + return addressRepository.findByAddressIdAndDelYn(addressId, delYn) + .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_ADDRESS)); + + } } diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/domain/HashtagToWalker.java b/src/main/java/org/jullaene/walkmong_back/api/review/domain/HashtagToWalker.java index 0b0cf8e..43227c0 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/review/domain/HashtagToWalker.java +++ b/src/main/java/org/jullaene/walkmong_back/api/review/domain/HashtagToWalker.java @@ -8,7 +8,7 @@ import org.jullaene.walkmong_back.api.review.domain.enums.HashtagWalkerNm; import org.jullaene.walkmong_back.common.BaseEntity; -@Table(name = "hashtag_walker") +@Table(name = "hashtag_to_walker") @Entity @NoArgsConstructor @DynamicUpdate @@ -25,6 +25,7 @@ public class HashtagToWalker extends BaseEntity { private Long reviewTargetId; @Comment("해시태그 명") + @Enumerated(EnumType.STRING) private HashtagWalkerNm hashtagWalkerNm; @Builder diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToOwner.java b/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToOwner.java index 8e18123..5f98fe4 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToOwner.java +++ b/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToOwner.java @@ -38,12 +38,15 @@ public class ReviewToOwner extends BaseEntity { private String goodYn; @Comment("사회성") + @Enumerated(EnumType.STRING) private Sociality sociality; @Comment("활동량") + @Enumerated(EnumType.STRING) private Activity activity; @Comment("공격력") + @Enumerated(EnumType.STRING) private Aggressiveness aggressiveness; @Comment("아쉬운 점") @@ -54,6 +57,7 @@ public ReviewToOwner(ReviewToOwnerReqDto reviewToOwnerReqDto, Long reviewerId) { this.boardId = reviewToOwnerReqDto.getBoardId(); this.reviewerId = reviewerId; this.reviewTargetId = reviewToOwnerReqDto.getOwnerId(); + this.goodYn = reviewToOwnerReqDto.getGoodYn(); this.content = reviewToOwnerReqDto.getContent(); this.sociality = reviewToOwnerReqDto.getSociality(); this.activity = reviewToOwnerReqDto.getActivity(); diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToOwnerImage.java b/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToOwnerImage.java index 73fe0d8..f70b044 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToOwnerImage.java +++ b/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToOwnerImage.java @@ -6,7 +6,7 @@ import org.hibernate.annotations.Comment; import org.hibernate.annotations.DynamicUpdate; -@Table(name = "review_owner") +@Table(name = "review_to_owner_image") @Entity @NoArgsConstructor @DynamicUpdate diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToWalker.java b/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToWalker.java index 390e1bf..6510ed5 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToWalker.java +++ b/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToWalker.java @@ -8,7 +8,7 @@ import org.jullaene.walkmong_back.api.review.dto.req.ReviewToWalkerReqDto; import org.jullaene.walkmong_back.common.BaseEntity; -@Table(name = "review_walker") +@Table(name = "review_to_walker") @Entity @NoArgsConstructor @DynamicUpdate diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToWalkerImage.java b/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToWalkerImage.java index dfda021..748f45d 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToWalkerImage.java +++ b/src/main/java/org/jullaene/walkmong_back/api/review/domain/ReviewToWalkerImage.java @@ -6,7 +6,7 @@ import org.hibernate.annotations.Comment; import org.hibernate.annotations.DynamicUpdate; -@Table(name = "review_walker") +@Table(name = "review_to_walker_image") @Entity @NoArgsConstructor @DynamicUpdate diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/dto/req/ReviewToOwnerReqDto.java b/src/main/java/org/jullaene/walkmong_back/api/review/dto/req/ReviewToOwnerReqDto.java index f2ea7be..878a64f 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/review/dto/req/ReviewToOwnerReqDto.java +++ b/src/main/java/org/jullaene/walkmong_back/api/review/dto/req/ReviewToOwnerReqDto.java @@ -1,5 +1,6 @@ package org.jullaene.walkmong_back.api.review.dto.req; +import lombok.Builder; import lombok.Getter; import org.jullaene.walkmong_back.api.review.domain.enums.Activity; import org.jullaene.walkmong_back.api.review.domain.enums.Aggressiveness; @@ -10,13 +11,26 @@ @Getter public class ReviewToOwnerReqDto { - private Long ownerId; - private Long boardId; - private String goodYn; - private Sociality sociality; - private Activity activity; - private Aggressiveness aggressiveness; - private String disappointment; - private String content; - private List images; + private final Long ownerId; + private final Long boardId; + private final String goodYn; + private final Sociality sociality; + private final Activity activity; + private final Aggressiveness aggressiveness; + private final String disappointment; + private final String content; + private final List images; + + @Builder + public ReviewToOwnerReqDto(Long ownerId, Long boardId, String goodYn, Sociality sociality, Activity activity, Aggressiveness aggressiveness, String disappointment, String content, List images) { + this.ownerId = ownerId; + this.boardId = boardId; + this.goodYn = goodYn; + this.sociality = sociality; + this.activity = activity; + this.aggressiveness = aggressiveness; + this.disappointment = disappointment; + this.content = content; + this.images = images; + } } diff --git a/src/main/java/org/jullaene/walkmong_back/api/review/service/ReviewToWalkerService.java b/src/main/java/org/jullaene/walkmong_back/api/review/service/ReviewToWalkerService.java index e9b79d1..356c8da 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/review/service/ReviewToWalkerService.java +++ b/src/main/java/org/jullaene/walkmong_back/api/review/service/ReviewToWalkerService.java @@ -36,7 +36,10 @@ public Long registerReviewToWalker(ReviewToWalkerReqDto reviewToWalkerReqDto) { boardService.isValidOwnerByBoardIdAndDelYn(member.getMemberId(), reviewToWalkerReqDto.getBoardId(), "N"); log.info("해당 게시글의 반려인 인증 완료"); - ReviewToWalker reviewToWalker = ReviewToWalker.builder().build(); + ReviewToWalker reviewToWalker = ReviewToWalker.builder() + .reviewToWalkerReqDto(reviewToWalkerReqDto) + .reviewerId(member.getMemberId()) + .build(); Long reviewToWalkerId = reviewToWalkerRepository.save(reviewToWalker).getReviewToWalkerId(); log.info("산책자 리뷰 저장"); From 302ef62781548b6f82bd55ec075c75710008cef7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9D=B4=20=EC=9D=80=EC=A0=95?= Date: Sat, 28 Dec 2024 03:15:32 +0900 Subject: [PATCH 4/4] =?UTF-8?q?fix:=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/board/service/BoardService.java | 87 ------------------- 1 file changed, 87 deletions(-) diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/service/BoardService.java b/src/main/java/org/jullaene/walkmong_back/api/board/service/BoardService.java index 19a359e..389795a 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/board/service/BoardService.java +++ b/src/main/java/org/jullaene/walkmong_back/api/board/service/BoardService.java @@ -2,87 +2,19 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; -import org.jullaene.walkmong_back.api.board.domain.Board; -import org.jullaene.walkmong_back.api.board.dto.req.BoardRequestDto; -import org.jullaene.walkmong_back.api.board.dto.res.BoardDetailResponseDto; -import org.jullaene.walkmong_back.api.board.dto.res.BoardResponseDto; import org.jullaene.walkmong_back.api.board.repository.BoardRepository; -import org.jullaene.walkmong_back.api.dog.domain.Dog; -import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; -import org.jullaene.walkmong_back.api.dog.repository.DogRepository; -import org.jullaene.walkmong_back.api.member.domain.Address; -import org.jullaene.walkmong_back.api.member.domain.Member; -import org.jullaene.walkmong_back.api.member.domain.enums.DistanceRange; -import org.jullaene.walkmong_back.api.member.repository.AddressRepository; -import org.jullaene.walkmong_back.api.member.service.MemberService; import org.jullaene.walkmong_back.common.exception.CustomException; import org.jullaene.walkmong_back.common.exception.ErrorType; import org.springframework.http.HttpStatus; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import java.time.LocalDate; -import java.util.List; @Slf4j @Service @RequiredArgsConstructor public class BoardService { private final BoardRepository boardRepository; - private final AddressRepository addressRepository; - private final MemberService memberService; - private final DogRepository dogRepository; - - /** - * 게시글 리스트 조회 - * */ - @Transactional(readOnly = true) - public List getBoards(LocalDate date, Long addressId, DistanceRange distance, DogSize dogSize, String matchingYn) { - Member member = memberService.getMemberFromUserDetail(); - - // 주소 id가 null이면 기본 주소 반환, 주소 id가 null이 아니면 해당 id를 가진 주소 반환 - Address address; - if (addressId == null) { - address = getBasicAddressAndDelYn(member.getMemberId(), "N"); - } - else { - address = getAddressByIdAndDelYn(addressId, "N"); - } - return boardRepository.getBoardsWithFilters(date, address, distance, dogSize, matchingYn); - } - - @Transactional(readOnly = true) - public BoardDetailResponseDto getBoardDetail(Long boardId) { - Member member = memberService.getMemberFromUserDetail(); - - return boardRepository.getBoardDetailResponse(boardId,member.getMemberId(), "N") - .orElseThrow(()->new CustomException(HttpStatus.BAD_REQUEST,ErrorType.INVALID_ADDRESS)); - } - - @Transactional - public Long createBoard(BoardRequestDto boardRequestDto) { - Member member = memberService.getMemberFromUserDetail(); - - List
addresses = addressRepository.findByMemberIdAndDelYn(member.getMemberId(), "N"); - - boolean isAddressValid = addresses.stream() - .anyMatch(address -> address.getAddressId().equals(boardRequestDto.getAddressId())); - - if (!isAddressValid) { - throw new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_ADDRESS); - } - - Dog dog = dogRepository.findByDogIdAndDelYn(boardRequestDto.getDogId(), "N") - .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.DOG_NOT_FOUND)); - - Board board = Board.builder() - .boardRequestDto(boardRequestDto) - .content(dog.getWalkRequestContent()) - .build(); - - return boardRepository.save(board).getBoardId(); - } - /** * 게시글 아이디와 삭제 여부로 해당 게시글의 유효한 반려인인지 확인 * */ @@ -93,25 +25,6 @@ public void isValidOwnerByBoardIdAndDelYn (Long memberId, Long boardId, String d throw new CustomException(HttpStatus.UNAUTHORIZED, ErrorType.ACCESS_DENIED); } } - /** - * 주어진 멤버가 가진 기본 address를 반환 - * */ - @Transactional(readOnly = true) - protected Address getBasicAddressAndDelYn(Long memberId, String delYn) { - return addressRepository.findByMemberIdAndBasicAddressYnAndDelYn(memberId,"Y", delYn) - .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_ADDRESS)); - } - - /** - * 주어진 addressId를 이용하여 address 반환 - * */ - @Transactional(readOnly = true) - protected Address getAddressByIdAndDelYn (Long addressId, String delYn) { - - return addressRepository.findByAddressIdAndDelYn(addressId, delYn) - .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_ADDRESS)); - - } }