diff --git a/src/main/java/org/jullaene/walkmong_back/api/apply/domain/Apply.java b/src/main/java/org/jullaene/walkmong_back/api/apply/domain/Apply.java index 4bc0c1a..c0914ef 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/apply/domain/Apply.java +++ b/src/main/java/org/jullaene/walkmong_back/api/apply/domain/Apply.java @@ -3,20 +3,21 @@ import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Builder; +import lombok.Getter; import lombok.NoArgsConstructor; import org.hibernate.annotations.Comment; import org.hibernate.annotations.DynamicUpdate; import org.jullaene.walkmong_back.api.apply.domain.enums.MatchingStatus; +import org.jullaene.walkmong_back.api.apply.dto.req.ApplyRequestDto; import org.jullaene.walkmong_back.common.BaseEntity; @Table(name = "apply") @Entity @NoArgsConstructor -@AllArgsConstructor -@Builder @DynamicUpdate public class Apply extends BaseEntity { @Id + @Getter @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "apply_id") private Long applyId; @@ -55,7 +56,7 @@ public class Apply extends BaseEntity { @Comment("입마개 필요 여부") @Column(columnDefinition = "VARCHAR(1) default 'Y'") - private String nuzzleYn; + private String muzzleYn; @Comment("리드줄 필요 여부") @Column(columnDefinition = "VARCHAR(1) default 'Y'") @@ -67,4 +68,23 @@ public class Apply extends BaseEntity { @Comment("반려인에게 전달할 메시지") private String memoToOwner; + + @Builder + public Apply (Long memberId, Long boardId, ApplyRequestDto applyRequestDto) { + this.memberId = memberId; + this.boardId = boardId; + matchingStatus = MatchingStatus.PENDING; + dongAddress = applyRequestDto.getDongAddress(); + roadAddress = applyRequestDto.getRoadAddress(); + latitude = applyRequestDto.getLatitude(); + longitude = applyRequestDto.getLongitude(); + addressDetail = applyRequestDto.getAddressDetail(); + addressMemo = applyRequestDto.getAddressMemo(); + poopBagYn = applyRequestDto.getPoopBagYn(); + muzzleYn = applyRequestDto.getMuzzleYn(); + dogCollarYn = applyRequestDto.getDogCollarYn(); + preMeetingYn = applyRequestDto.getPreMeetingYn(); + memoToOwner = applyRequestDto.getMessageToOwner(); + } + } diff --git a/src/main/java/org/jullaene/walkmong_back/api/apply/domain/enums/MatchingStatus.java b/src/main/java/org/jullaene/walkmong_back/api/apply/domain/enums/MatchingStatus.java index bf0ca83..a95168b 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/apply/domain/enums/MatchingStatus.java +++ b/src/main/java/org/jullaene/walkmong_back/api/apply/domain/enums/MatchingStatus.java @@ -3,5 +3,5 @@ public enum MatchingStatus { PENDING, // 매칭 대기 중 CONFIRMED, // 매칭 확정 - REJECTED // 매칭 거절 + REJECTED // 매칭 거절 } diff --git a/src/main/java/org/jullaene/walkmong_back/api/apply/dto/req/ApplyRequestDto.java b/src/main/java/org/jullaene/walkmong_back/api/apply/dto/req/ApplyRequestDto.java new file mode 100644 index 0000000..66b37e5 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/apply/dto/req/ApplyRequestDto.java @@ -0,0 +1,23 @@ +package org.jullaene.walkmong_back.api.apply.dto.req; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class ApplyRequestDto { + private String dongAddress; + private String roadAddress; + private Double latitude; + private Double longitude; + private String addressDetail; + private String addressMemo; + private String poopBagYn; + private String muzzleYn; + private String dogCollarYn; + private String preMeetingYn; + private String messageToOwner; +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/apply/dto/res/ApplyInfoDto.java b/src/main/java/org/jullaene/walkmong_back/api/apply/dto/res/ApplyInfoDto.java new file mode 100644 index 0000000..834c8d8 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/apply/dto/res/ApplyInfoDto.java @@ -0,0 +1,30 @@ +package org.jullaene.walkmong_back.api.apply.dto.res; + +import lombok.AllArgsConstructor; +import lombok.Getter; +import lombok.RequiredArgsConstructor; +import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; +import org.jullaene.walkmong_back.common.enums.Gender; + +import java.time.LocalDateTime; + +@Getter +@RequiredArgsConstructor +@AllArgsConstructor +public class ApplyInfoDto { + private String dogName; + private Gender dogGender; + private String breed; + private DogSize dogSize; + private String ownerName; + private String memberProfile; + private Gender memberGender; + private String dongAddress; + private String addressDetail; + private String muzzleYn; + private String poopBagYn; + private String preMeetingYn; + private String memoToOwner; + private LocalDateTime startTime; + private LocalDateTime endTime; +} 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..6d2c872 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 { +public interface ApplyRepository extends JpaRepository ,ApplyRepositoryCustom{ + 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/repository/ApplyRepositoryCustom.java b/src/main/java/org/jullaene/walkmong_back/api/apply/repository/ApplyRepositoryCustom.java new file mode 100644 index 0000000..d0d6ba5 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/apply/repository/ApplyRepositoryCustom.java @@ -0,0 +1,7 @@ +package org.jullaene.walkmong_back.api.apply.repository; +import org.jullaene.walkmong_back.api.apply.dto.res.ApplyInfoDto; +import java.util.Optional; + +public interface ApplyRepositoryCustom { + Optional getApplyInfoResponse(Long boardId, Long memberId, String delYn); +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/apply/repository/impl/ApplyRepositoryImpl.java b/src/main/java/org/jullaene/walkmong_back/api/apply/repository/impl/ApplyRepositoryImpl.java new file mode 100644 index 0000000..7b5a800 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/apply/repository/impl/ApplyRepositoryImpl.java @@ -0,0 +1,59 @@ +package org.jullaene.walkmong_back.api.apply.repository.impl; + +import com.querydsl.core.types.Projections; +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.RequiredArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.jullaene.walkmong_back.api.apply.domain.QApply; +import org.jullaene.walkmong_back.api.apply.dto.res.ApplyInfoDto; +import org.jullaene.walkmong_back.api.apply.repository.ApplyRepository; +import org.jullaene.walkmong_back.api.apply.repository.ApplyRepositoryCustom; +import org.jullaene.walkmong_back.api.board.domain.QBoard; +import org.jullaene.walkmong_back.api.dog.domain.QDog; +import org.jullaene.walkmong_back.api.member.domain.QMember; + +import java.util.Optional; + +@RequiredArgsConstructor +@Slf4j +public class ApplyRepositoryImpl implements ApplyRepositoryCustom { + private final JPAQueryFactory queryFactory; + + //산책 지원 최종 내역 확인하기 + @Override + public Optional getApplyInfoResponse(Long boardId, Long memberId, String delYn) { + QDog dog= QDog.dog; + QMember member=QMember.member; + QBoard board=QBoard.board; + QApply apply= QApply.apply; + + Optional applyInfoDto= + Optional.ofNullable(queryFactory.selectDistinct( + Projections.constructor(ApplyInfoDto.class, + dog.name.as("dogName"), + dog.gender.as("dogGender"), + dog.breed.as("breed"), + dog.dogSize.as("dogSize"), + member.name.as("ownerName"), + member.profile.as("memberProfile"), + member.gender.as("memberGender"), + apply.dongAddress.as("dongAddress"), + apply.addressDetail.as("addressDetail"), + apply.muzzleYn.as("muzzleYn"), + apply.poopBagYn.as("poopBagYn"), + apply.preMeetingYn.as("preMeetingYn"), + apply.memoToOwner.as("memoToOwner"), + board.startTime.as("startTime"), + board.endTime.as("endTime") + )) + .from(board) + .leftJoin(dog).on(dog.dogId.eq(board.dogId)) + .leftJoin(member).on(dog.memberId.eq(member.memberId)) + .leftJoin(apply).on(apply.boardId.eq(boardId)) + .where(board.boardId.eq(boardId) + .and(board.delYn.eq(delYn))) + .fetchOne()); + + return applyInfoDto; + } +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/apply/rest/ApplyController.java b/src/main/java/org/jullaene/walkmong_back/api/apply/rest/ApplyController.java index d259ac9..3157721 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/apply/rest/ApplyController.java +++ b/src/main/java/org/jullaene/walkmong_back/api/apply/rest/ApplyController.java @@ -1,13 +1,31 @@ package org.jullaene.walkmong_back.api.apply.rest; import lombok.RequiredArgsConstructor; +import org.jullaene.walkmong_back.api.apply.dto.req.ApplyRequestDto; +import org.jullaene.walkmong_back.api.apply.dto.res.ApplyInfoDto; import org.jullaene.walkmong_back.api.apply.service.ApplyService; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.jullaene.walkmong_back.common.BasicResponse; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; @RestController @RequiredArgsConstructor -@RequestMapping("/api/v1/apply") +@RequestMapping("/api/v1/walking/apply") public class ApplyController { private final ApplyService applyService; + + @PostMapping("/{boardId}") + public ResponseEntity> saveApply( + @PathVariable("boardId") Long boardId, + @RequestBody ApplyRequestDto applyRequestDto){ + return ResponseEntity.ok(BasicResponse.ofCreateSuccess(applyService.saveApply(boardId, applyRequestDto))); + } + + @GetMapping("/{boardId}") + public ResponseEntity> getApplyInfo( + @PathVariable("boardId") Long boardId + ){ + ApplyInfoDto applyInfoDto=applyService.getApplyInfo(boardId); + return ResponseEntity.ok(BasicResponse.ofSuccess(applyInfoDto)); + } } 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..09abd06 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,65 @@ package org.jullaene.walkmong_back.api.apply.service; import lombok.RequiredArgsConstructor; +import org.jullaene.walkmong_back.api.apply.domain.Apply; +import org.jullaene.walkmong_back.api.apply.domain.enums.MatchingStatus; +import org.jullaene.walkmong_back.api.apply.dto.req.ApplyRequestDto; +import org.jullaene.walkmong_back.api.apply.dto.res.ApplyInfoDto; import org.jullaene.walkmong_back.api.apply.repository.ApplyRepository; +import org.jullaene.walkmong_back.api.board.domain.Board; +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.repository.DogRepository; +import org.jullaene.walkmong_back.api.member.domain.Member; +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; @Service @RequiredArgsConstructor public class ApplyService { private final ApplyRepository applyRepository; + private final BoardRepository boardRepository; + private final DogRepository dogRepository; + private final MemberService memberService; + + @Transactional + public Long saveApply(Long boardId, ApplyRequestDto applyRequestDto) { + Member member = memberService.getMemberFromUserDetail(); + + // 본인이 쓴 게시글에는 지원 불가 + if (boardRepository.existsByBoardIdAndMemberIdAndDelYn(boardId, member.getMemberId(), "N")) { + throw new CustomException(HttpStatus.FORBIDDEN, ErrorType.CANNOT_SELF_APPLY); + } + + // 한 게시글에 여러 번 지원 불가 + if (applyRepository.existsByBoardIdAndMemberIdAndDelYn(boardId, member.getMemberId(), "N")) { + throw new CustomException(HttpStatus.FORBIDDEN, ErrorType.CANNOT_DUPLICATED_APPLY); + } + + Apply apply = Apply.builder() + .memberId(member.getMemberId()) + .boardId(boardId) + .applyRequestDto(applyRequestDto) + .build(); + + return applyRepository.save(apply).getApplyId(); + } + + @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); + } + } + + @Transactional + public ApplyInfoDto getApplyInfo(Long boardId) { + Member member = memberService.getMemberFromUserDetail(); + return applyRepository.getApplyInfoResponse(boardId,member.getMemberId(),"N") + .orElseThrow(()->new CustomException(HttpStatus.BAD_REQUEST,ErrorType.INVALID_ADDRESS)); + } } 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/BoardRepositoryCustom.java b/src/main/java/org/jullaene/walkmong_back/api/board/repository/BoardRepositoryCustom.java new file mode 100644 index 0000000..7b7dfb1 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/board/repository/BoardRepositoryCustom.java @@ -0,0 +1,14 @@ +package org.jullaene.walkmong_back.api.board.repository; + +import org.jullaene.walkmong_back.api.board.dto.res.BoardResponseDto; +import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; +import org.jullaene.walkmong_back.api.member.domain.Address; +import org.jullaene.walkmong_back.api.member.domain.enums.DistanceRange; + +import java.time.LocalDate; +import java.util.List; + +public interface BoardRepositoryCustom { + List getBoardsWithFilters(LocalDate date, Address walkerAddress, DistanceRange distance, DogSize dogSize, String matchingYn); + boolean existsByBoardIdAndMemberIdAndDelYn(Long boardId, Long memberId, String delYn); +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/repository/impl/BoardRepositoryImpl.java b/src/main/java/org/jullaene/walkmong_back/api/board/repository/impl/BoardRepositoryImpl.java new file mode 100644 index 0000000..ab396e5 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/board/repository/impl/BoardRepositoryImpl.java @@ -0,0 +1,138 @@ +package org.jullaene.walkmong_back.api.board.repository.impl; + +import com.querydsl.core.BooleanBuilder; +import com.querydsl.core.types.Projections; +import com.querydsl.core.types.dsl.BooleanExpression; +import com.querydsl.core.types.dsl.Expressions; +import com.querydsl.core.types.dsl.NumberTemplate; +import com.querydsl.core.types.dsl.StringTemplate; +import com.querydsl.jpa.JPAExpressions; +import com.querydsl.jpa.impl.JPAQueryFactory; +import lombok.extern.slf4j.Slf4j; +import org.jullaene.walkmong_back.api.board.domain.QBoard; +import org.jullaene.walkmong_back.api.board.dto.res.BoardResponseDto; +import org.jullaene.walkmong_back.api.board.repository.BoardRepositoryCustom; +import org.jullaene.walkmong_back.api.dog.domain.QDog; +import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; +import org.jullaene.walkmong_back.api.member.domain.Address; +import org.jullaene.walkmong_back.api.member.domain.QAddress; +import org.jullaene.walkmong_back.api.member.domain.enums.DistanceRange; + +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.util.List; + +@Slf4j +public class BoardRepositoryImpl implements BoardRepositoryCustom { + + private final JPAQueryFactory queryFactory; + + public BoardRepositoryImpl(JPAQueryFactory queryFactory) { + this.queryFactory = queryFactory; + } + + /** + * 게시글 리스트 조회 + * date, walkerAddress, distance, dogSize, matchingYn을 기준으로 적용 + * */ + @Override + public List getBoardsWithFilters(LocalDate date, Address walkerAddress, DistanceRange distance, DogSize dogSize, String matchingYn) { + QBoard board = QBoard.board; + QDog dog = QDog.dog; + QAddress ownerAddress = QAddress.address; + + BooleanBuilder builder = new BooleanBuilder(); + + // date가 null이면 당일을 조건에 삽입 + if (date == null) { + date = LocalDate.now(); + } + LocalDateTime startOfDay = date.atStartOfDay(); + LocalDateTime endOfDay = date.atTime(23, 59, 59, 999_999_999); // 23:59:59.999999 + + builder.and(board.startTime.between(startOfDay, endOfDay)); + + if (dogSize != null) { + builder.and(board.dogId.in( + JPAExpressions.select(dog.dogId) + .from(dog) + .where(dog.dogSize.eq(dogSize)))); + } + + if (matchingYn != null) { + builder.and(board.matchingYn.eq(matchingYn)); + } + + if (distance == null) { + distance = walkerAddress.getDistanceRange(); + } + + // 거리 계산 + NumberTemplate distanceExpression = Expressions.numberTemplate( + Double.class, + "ST_Distance_Sphere(point({0}, {1}), point({2}, {3}))", + JPAExpressions.select(ownerAddress.longitude) + .from(ownerAddress) + .where(ownerAddress.addressId.eq(board.ownerAddressId)), + JPAExpressions.select(ownerAddress.latitude) + .from(ownerAddress) + .where(ownerAddress.addressId.eq(board.ownerAddressId)), walkerAddress.getLongitude(), walkerAddress.getLatitude() + ); + + BooleanExpression isWithinRange = distanceExpression.lt(distance.getRange()); + + // 거리 결과를 실제로 조회할 때 + Double distanceResult = queryFactory.select(distanceExpression).from(board).fetchOne(); + log.info("Calculated Distance: " + distanceResult); + + StringTemplate startTimeExpression = Expressions.stringTemplate("DATE_FORMAT({0}, '%H:%i')", board.startTime); + StringTemplate endTimeExpression = Expressions.stringTemplate("DATE_FORMAT({0}, '%H:%i')", board.endTime); + + return queryFactory.select( + Projections.constructor(BoardResponseDto.class, + startTimeExpression.as("startTime"), + endTimeExpression.as("endTime"), + board.matchingYn.as("matchingYn"), + dog.name.as("dogName"), + dog.profile.as("dogProfile"), + dog.gender.as("dogGender"), + dog.breed.as("breed"), + dog.weight.as("weight"), + dog.dogSize.as("dogSize"), + board.content.as("content"), + ownerAddress.dongAddress.as("dongAddress"), + distanceExpression.as("distance") + ) + ) + .from(board) + .leftJoin(dog).on(dog.dogId.eq(board.dogId)) + .leftJoin(ownerAddress).on(ownerAddress.addressId.eq(board.ownerAddressId)) + .where(builder) + .where(isWithinRange) + .orderBy(board.startTime.asc()) + .fetch(); + } + + /** + * boardId와 memberId를 기준으로 해당 게시글의 작성자인지 확인 + * */ + @Override + public boolean existsByBoardIdAndMemberIdAndDelYn(Long boardId, Long memberId, String delYn) { + QBoard board = QBoard.board; + QDog dog = QDog.dog; + + BooleanBuilder builder = new BooleanBuilder(); + builder.and(board.boardId.eq(boardId)); + builder.and(board.delYn.eq(delYn)); + builder.and(dog.memberId.eq(memberId)); + + long count = queryFactory + .selectFrom(board) + .join(dog).on(board.dogId.eq(dog.dogId).and(dog.delYn.eq(delYn))) + .where(builder) + .fetch() + .size(); + + return count > 0; + } +} 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..a9eef88 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,11 +1,60 @@ package org.jullaene.walkmong_back.api.board.service; import lombok.RequiredArgsConstructor; +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.enums.DogSize; +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 java.time.LocalDate; +import java.util.List; + @Service @RequiredArgsConstructor public class BoardService { private final BoardRepository boardRepository; + private final AddressRepository addressRepository; + private final MemberService memberService; + + /** + * 게시글 리스트 조회 + * */ + 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, "Y"); + } + return boardRepository.getBoardsWithFilters(date, address, distance, dogSize, matchingYn); + } + + /** + * 주어진 멤버가 가진 기본 address를 반환 + * */ + private Address getBasicAddressAndDelYn(Long memberId, String delYn) { + return addressRepository.findByMemberIdAndBasicAddressYnAndDelYn(memberId,"Y", delYn) + .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_ADDRESS)); + } + + /** + * 주어진 addressId를 이용하여 address 반환 + * */ + private 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/common/exception/ErrorType.java b/src/main/java/org/jullaene/walkmong_back/common/exception/ErrorType.java index 3a81491..1816bc3 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,23 @@ 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 저장소에 존재하지 않는 파일입니다."), + APPLY_NOT_FOUND("존재하지 않는 지원입니다"), + POST_NOT_FOUND("존재하지 않는 산책글입니다") ; private String message;