From 6fe0fd9d25b768c50418a6e1d4479cc2bbddb0a8 Mon Sep 17 00:00:00 2001 From: Eunjeong Lee Date: Fri, 15 Nov 2024 21:06:32 +0900 Subject: [PATCH 01/14] =?UTF-8?q?feat:=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=A1=B0=ED=9A=8C=20api=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20[#2]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../walkmong_back/api/board/dto/res/.gitkeep | 0 .../api/board/dto/res/BoardRes.java | 16 +++ .../api/board/repository/BoardRepository.java | 3 +- .../repository/BoardRepositoryCustom.java | 13 ++ .../repository/impl/BoardRepositoryImpl.java | 111 ++++++++++++++++++ .../api/board/rest/BoardController.java | 22 ++++ .../api/board/service/BoardService.java | 36 ++++++ .../api/member/domain/Address.java | 12 +- .../member/domain/enums/DistanceRange.java | 6 +- .../member/repository/AddressRepository.java | 3 + .../api/member/service/MemberService.java | 20 ++++ .../common/exception/ErrorType.java | 2 + 12 files changed, 234 insertions(+), 10 deletions(-) delete mode 100644 src/main/java/org/jullaene/walkmong_back/api/board/dto/res/.gitkeep create mode 100644 src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardRes.java create mode 100644 src/main/java/org/jullaene/walkmong_back/api/board/repository/BoardRepositoryCustom.java create mode 100644 src/main/java/org/jullaene/walkmong_back/api/board/repository/impl/BoardRepositoryImpl.java diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/.gitkeep b/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardRes.java b/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardRes.java new file mode 100644 index 0000000..135ba99 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardRes.java @@ -0,0 +1,16 @@ +package org.jullaene.walkmong_back.api.board.dto.res; + +import lombok.Builder; +import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; +import org.jullaene.walkmong_back.common.enums.Gender; + +public record BoardRes(String startTime, String endTime, String matchingYn, + String dogName, String dogProfile, + Gender dogGender, String breed, Double weight, + DogSize dogSize, String content, + String dongAddress, Double distance) { + + @Builder + public BoardRes { + } +} 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..e5a67a1 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 { + } 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..3bfbad6 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/board/repository/BoardRepositoryCustom.java @@ -0,0 +1,13 @@ +package org.jullaene.walkmong_back.api.board.repository; + +import org.jullaene.walkmong_back.api.board.dto.res.BoardRes; +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); +} 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..24c7a38 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/board/repository/impl/BoardRepositoryImpl.java @@ -0,0 +1,111 @@ +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.BoardRes; +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; + } + + @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(BoardRes.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(); + } +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/rest/BoardController.java b/src/main/java/org/jullaene/walkmong_back/api/board/rest/BoardController.java index dad0f9b..43b5a9e 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/board/rest/BoardController.java +++ b/src/main/java/org/jullaene/walkmong_back/api/board/rest/BoardController.java @@ -2,14 +2,36 @@ import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +import org.jullaene.walkmong_back.api.board.dto.res.BoardRes; import org.jullaene.walkmong_back.api.board.service.BoardService; +import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; +import org.jullaene.walkmong_back.api.member.domain.enums.DistanceRange; +import org.jullaene.walkmong_back.common.BasicResponse; +import org.springframework.http.ResponseEntity; +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 java.time.LocalDate; +import java.util.List; + @Tag(name = "Board", description = "게시글 정보 관련 api 입니다.") @RestController @RequiredArgsConstructor @RequestMapping("/api/v1/board") public class BoardController { private final BoardService boardService; + + @GetMapping("/list") + public ResponseEntity>> getBoards ( + @RequestParam(name = "date", required = false) LocalDate date, + @RequestParam(name = "addressId", required = false) Long addressId, + @RequestParam(name = "distance", required = false) DistanceRange distance, + @RequestParam(name = "dogSize", required = false) DogSize dogSize, + @RequestParam(name = "matchingYn", required = false) String matchingYn + ) { + return ResponseEntity.ok(BasicResponse.ofSuccess(boardService.getBoards(date, addressId, distance, dogSize, matchingYn))); + } + } 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..522af18 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,47 @@ package org.jullaene.walkmong_back.api.board.service; import lombok.RequiredArgsConstructor; +import org.jullaene.walkmong_back.api.board.dto.res.BoardRes; 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.security.core.parameters.P; 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 = addressRepository.findByMemberIdAndBasicAddressYn(member.getMemberId(), "Y") + .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_ADDRESS)); + } + else { + address = addressRepository.findById(addressId) + .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_ADDRESS)); + } + + return boardRepository.getBoardsWithFilters(date, address, distance, dogSize, matchingYn); + } } diff --git a/src/main/java/org/jullaene/walkmong_back/api/member/domain/Address.java b/src/main/java/org/jullaene/walkmong_back/api/member/domain/Address.java index 89ae4f7..40262a3 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/member/domain/Address.java +++ b/src/main/java/org/jullaene/walkmong_back/api/member/domain/Address.java @@ -1,11 +1,7 @@ package org.jullaene.walkmong_back.api.member.domain; -import jakarta.persistence.Column; -import jakarta.persistence.Entity; -import jakarta.persistence.GeneratedValue; -import jakarta.persistence.GenerationType; -import jakarta.persistence.Id; -import jakarta.persistence.Table; +import jakarta.persistence.*; +import lombok.Getter; import org.hibernate.annotations.Comment; import org.hibernate.annotations.DynamicUpdate; import org.jullaene.walkmong_back.api.member.domain.enums.DistanceRange; @@ -16,6 +12,7 @@ @DynamicUpdate public class Address extends BaseEntity { @Id + @Getter @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "address_id") private Long addressId; @@ -23,9 +20,11 @@ public class Address extends BaseEntity { @Comment("사용자 아이디") private Long memberId; + @Getter @Comment("위도") private Double latitude; + @Getter @Comment("경도") private Double longitude; @@ -35,6 +34,7 @@ public class Address extends BaseEntity { @Comment("동 주소") private String dongAddress; + @Getter @Comment("거리 범위") private DistanceRange distanceRange; diff --git a/src/main/java/org/jullaene/walkmong_back/api/member/domain/enums/DistanceRange.java b/src/main/java/org/jullaene/walkmong_back/api/member/domain/enums/DistanceRange.java index 8493ab1..09340d4 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/member/domain/enums/DistanceRange.java +++ b/src/main/java/org/jullaene/walkmong_back/api/member/domain/enums/DistanceRange.java @@ -1,9 +1,9 @@ package org.jullaene.walkmong_back.api.member.domain.enums; public enum DistanceRange { - SMALL(0.5), - MEDIUM(1.0), - BIG(1.5), + SMALL(500.0), + MEDIUM(1000.0), + BIG(1500.0), ; private final Double range; diff --git a/src/main/java/org/jullaene/walkmong_back/api/member/repository/AddressRepository.java b/src/main/java/org/jullaene/walkmong_back/api/member/repository/AddressRepository.java index 676f36b..7db13fd 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/member/repository/AddressRepository.java +++ b/src/main/java/org/jullaene/walkmong_back/api/member/repository/AddressRepository.java @@ -4,6 +4,9 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.Optional; + @Repository public interface AddressRepository extends JpaRepository { + Optional
findByMemberIdAndBasicAddressYn(Long memberId, String basicAddressYn); } diff --git a/src/main/java/org/jullaene/walkmong_back/api/member/service/MemberService.java b/src/main/java/org/jullaene/walkmong_back/api/member/service/MemberService.java index bf50eab..a91e894 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/member/service/MemberService.java +++ b/src/main/java/org/jullaene/walkmong_back/api/member/service/MemberService.java @@ -1,11 +1,31 @@ package org.jullaene.walkmong_back.api.member.service; import lombok.RequiredArgsConstructor; +import org.jullaene.walkmong_back.api.member.domain.Member; import org.jullaene.walkmong_back.api.member.repository.MemberRepository; +import org.jullaene.walkmong_back.common.exception.CustomException; +import org.jullaene.walkmong_back.common.user.CustomUserDetail; +import org.springframework.http.HttpStatus; +import org.springframework.security.core.Authentication; +import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; +import static org.jullaene.walkmong_back.common.exception.ErrorType.USER_NOT_AUTHENTICATED; + @Service @RequiredArgsConstructor public class MemberService { private final MemberRepository memberRepository; + + /** + * CustomUserDetail에서 member 가져오기 + * */ + public Member getMemberFromUserDetail () { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication != null && authentication.getPrincipal() instanceof CustomUserDetail customUserDetail) { + return customUserDetail.getMember(); // member 객체 가져오기 + } + throw new CustomException(HttpStatus.UNAUTHORIZED, USER_NOT_AUTHENTICATED); + } } 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..c01bf27 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 @@ -18,6 +18,8 @@ public enum ErrorType { INVALID_TOKEN("유효하지 않은 토큰입니다."), INTERNAL_SERVER("서버 오류입니다."), UNAUTHORIZED_UPDATE("수정 권한이 없는 유저입니다."), + DOG_NOT_FOUND("존재하지 않는 강아지입니다."), + INVALID_ADDRESS("유효하지 않은 주소입니다."), ; private String message; From 8059b0199147bd1d3c3d916ea246405af628ca3d Mon Sep 17 00:00:00 2001 From: Eunjeong Lee Date: Fri, 15 Nov 2024 22:01:06 +0900 Subject: [PATCH 02/14] =?UTF-8?q?feat:=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=A1=B0=ED=9A=8C=20api=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84[#2]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/board/dto/res/BoardRes.java | 16 ---------- .../api/board/dto/res/BoardResponseDto.java | 16 ++++++++++ .../repository/BoardRepositoryCustom.java | 4 +-- .../repository/impl/BoardRepositoryImpl.java | 6 ++-- .../api/board/rest/BoardController.java | 4 +-- .../api/board/service/BoardService.java | 30 ++++++++++++++----- .../member/repository/AddressRepository.java | 3 +- 7 files changed, 47 insertions(+), 32 deletions(-) delete mode 100644 src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardRes.java create mode 100644 src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardResponseDto.java diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardRes.java b/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardRes.java deleted file mode 100644 index 135ba99..0000000 --- a/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardRes.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.jullaene.walkmong_back.api.board.dto.res; - -import lombok.Builder; -import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; -import org.jullaene.walkmong_back.common.enums.Gender; - -public record BoardRes(String startTime, String endTime, String matchingYn, - String dogName, String dogProfile, - Gender dogGender, String breed, Double weight, - DogSize dogSize, String content, - String dongAddress, Double distance) { - - @Builder - public BoardRes { - } -} diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardResponseDto.java b/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardResponseDto.java new file mode 100644 index 0000000..19680fc --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardResponseDto.java @@ -0,0 +1,16 @@ +package org.jullaene.walkmong_back.api.board.dto.res; + +import lombok.Builder; +import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; +import org.jullaene.walkmong_back.common.enums.Gender; + +public record BoardResponseDto(String startTime, String endTime, String matchingYn, + String dogName, String dogProfile, + Gender dogGender, String breed, Double weight, + DogSize dogSize, String content, + String dongAddress, Double distance) { + + @Builder + public BoardResponseDto { + } +} 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 index 3bfbad6..13c700a 100644 --- 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 @@ -1,6 +1,6 @@ package org.jullaene.walkmong_back.api.board.repository; -import org.jullaene.walkmong_back.api.board.dto.res.BoardRes; +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; @@ -9,5 +9,5 @@ import java.util.List; public interface BoardRepositoryCustom { - List getBoardsWithFilters(LocalDate date, Address walkerAddress, DistanceRange distance, DogSize dogSize, String matchingYn); + List getBoardsWithFilters(LocalDate date, Address walkerAddress, DistanceRange distance, DogSize dogSize, String matchingYn); } 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 index 24c7a38..922404b 100644 --- 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 @@ -10,7 +10,7 @@ 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.BoardRes; +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; @@ -32,7 +32,7 @@ public BoardRepositoryImpl(JPAQueryFactory queryFactory) { } @Override - public List getBoardsWithFilters(LocalDate date, Address walkerAddress, DistanceRange distance, DogSize dogSize, String matchingYn) { + 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; @@ -85,7 +85,7 @@ public List getBoardsWithFilters(LocalDate date, Address walkerAddress StringTemplate endTimeExpression = Expressions.stringTemplate("DATE_FORMAT({0}, '%H:%i')", board.endTime); return queryFactory.select( - Projections.constructor(BoardRes.class, + Projections.constructor(BoardResponseDto.class, startTimeExpression.as("startTime"), endTimeExpression.as("endTime"), board.matchingYn.as("matchingYn"), diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/rest/BoardController.java b/src/main/java/org/jullaene/walkmong_back/api/board/rest/BoardController.java index 43b5a9e..aa8186f 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/board/rest/BoardController.java +++ b/src/main/java/org/jullaene/walkmong_back/api/board/rest/BoardController.java @@ -2,7 +2,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; -import org.jullaene.walkmong_back.api.board.dto.res.BoardRes; +import org.jullaene.walkmong_back.api.board.dto.res.BoardResponseDto; import org.jullaene.walkmong_back.api.board.service.BoardService; import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; import org.jullaene.walkmong_back.api.member.domain.enums.DistanceRange; @@ -24,7 +24,7 @@ public class BoardController { private final BoardService boardService; @GetMapping("/list") - public ResponseEntity>> getBoards ( + public ResponseEntity>> getBoards ( @RequestParam(name = "date", required = false) LocalDate date, @RequestParam(name = "addressId", required = false) Long addressId, @RequestParam(name = "distance", required = false) DistanceRange distance, 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 522af18..1908080 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,7 +1,7 @@ package org.jullaene.walkmong_back.api.board.service; import lombok.RequiredArgsConstructor; -import org.jullaene.walkmong_back.api.board.dto.res.BoardRes; +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; @@ -12,7 +12,6 @@ import org.jullaene.walkmong_back.common.exception.CustomException; import org.jullaene.walkmong_back.common.exception.ErrorType; import org.springframework.http.HttpStatus; -import org.springframework.security.core.parameters.P; import org.springframework.stereotype.Service; import java.time.LocalDate; @@ -28,20 +27,35 @@ public class BoardService { /** * 게시글 리스트 조회 * */ - public List getBoards(LocalDate date, Long addressId, DistanceRange distance, DogSize dogSize, String matchingYn) { + 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 = addressRepository.findByMemberIdAndBasicAddressYn(member.getMemberId(), "Y") - .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_ADDRESS)); - } + address = getBasicAddressAndDelYn(member.getMemberId(), "N"); + } else { - address = addressRepository.findById(addressId) - .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_ADDRESS)); + 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/api/member/repository/AddressRepository.java b/src/main/java/org/jullaene/walkmong_back/api/member/repository/AddressRepository.java index 7db13fd..31e2805 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/member/repository/AddressRepository.java +++ b/src/main/java/org/jullaene/walkmong_back/api/member/repository/AddressRepository.java @@ -8,5 +8,6 @@ @Repository public interface AddressRepository extends JpaRepository { - Optional
findByMemberIdAndBasicAddressYn(Long memberId, String basicAddressYn); + Optional
findByAddressIdAndDelYn(Long addressId, String delYn); + Optional
findByMemberIdAndBasicAddressYnAndDelYn(Long memberId, String basicAddressYn, String delYn); } From e337a37b52ea775a4c9f84af6828afe9b6402d03 Mon Sep 17 00:00:00 2001 From: Eunjeong Lee Date: Fri, 15 Nov 2024 21:06:32 +0900 Subject: [PATCH 03/14] =?UTF-8?q?feat:=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=A1=B0=ED=9A=8C=20api=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20[#2]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/board/dto/res/BoardRes.java | 16 ++++++++++ .../repository/BoardRepositoryCustom.java | 4 +-- .../repository/impl/BoardRepositoryImpl.java | 6 ++-- .../api/board/rest/BoardController.java | 8 +---- .../api/board/service/BoardService.java | 30 +++++-------------- .../member/repository/AddressRepository.java | 3 +- 6 files changed, 31 insertions(+), 36 deletions(-) create mode 100644 src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardRes.java diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardRes.java b/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardRes.java new file mode 100644 index 0000000..135ba99 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardRes.java @@ -0,0 +1,16 @@ +package org.jullaene.walkmong_back.api.board.dto.res; + +import lombok.Builder; +import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; +import org.jullaene.walkmong_back.common.enums.Gender; + +public record BoardRes(String startTime, String endTime, String matchingYn, + String dogName, String dogProfile, + Gender dogGender, String breed, Double weight, + DogSize dogSize, String content, + String dongAddress, Double distance) { + + @Builder + public BoardRes { + } +} 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 index 13c700a..3bfbad6 100644 --- 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 @@ -1,6 +1,6 @@ package org.jullaene.walkmong_back.api.board.repository; -import org.jullaene.walkmong_back.api.board.dto.res.BoardResponseDto; +import org.jullaene.walkmong_back.api.board.dto.res.BoardRes; 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; @@ -9,5 +9,5 @@ import java.util.List; public interface BoardRepositoryCustom { - List getBoardsWithFilters(LocalDate date, Address walkerAddress, DistanceRange distance, DogSize dogSize, String matchingYn); + List getBoardsWithFilters(LocalDate date, Address walkerAddress, DistanceRange distance, DogSize dogSize, String matchingYn); } 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 index 922404b..24c7a38 100644 --- 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 @@ -10,7 +10,7 @@ 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.dto.res.BoardRes; 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; @@ -32,7 +32,7 @@ public BoardRepositoryImpl(JPAQueryFactory queryFactory) { } @Override - public List getBoardsWithFilters(LocalDate date, Address walkerAddress, DistanceRange distance, DogSize dogSize, String matchingYn) { + 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; @@ -85,7 +85,7 @@ public List getBoardsWithFilters(LocalDate date, Address walke StringTemplate endTimeExpression = Expressions.stringTemplate("DATE_FORMAT({0}, '%H:%i')", board.endTime); return queryFactory.select( - Projections.constructor(BoardResponseDto.class, + Projections.constructor(BoardRes.class, startTimeExpression.as("startTime"), endTimeExpression.as("endTime"), board.matchingYn.as("matchingYn"), diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/rest/BoardController.java b/src/main/java/org/jullaene/walkmong_back/api/board/rest/BoardController.java index aa8186f..558384a 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/board/rest/BoardController.java +++ b/src/main/java/org/jullaene/walkmong_back/api/board/rest/BoardController.java @@ -2,13 +2,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; -import org.jullaene.walkmong_back.api.board.dto.res.BoardResponseDto; import org.jullaene.walkmong_back.api.board.service.BoardService; -import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; -import org.jullaene.walkmong_back.api.member.domain.enums.DistanceRange; -import org.jullaene.walkmong_back.common.BasicResponse; -import org.springframework.http.ResponseEntity; -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; @@ -24,7 +18,7 @@ public class BoardController { private final BoardService boardService; @GetMapping("/list") - public ResponseEntity>> getBoards ( + public ResponseEntity>> getBoards ( @RequestParam(name = "date", required = false) LocalDate date, @RequestParam(name = "addressId", required = false) Long addressId, @RequestParam(name = "distance", required = false) DistanceRange distance, 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 1908080..522af18 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,7 +1,7 @@ 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.dto.res.BoardRes; 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; @@ -12,6 +12,7 @@ import org.jullaene.walkmong_back.common.exception.CustomException; import org.jullaene.walkmong_back.common.exception.ErrorType; import org.springframework.http.HttpStatus; +import org.springframework.security.core.parameters.P; import org.springframework.stereotype.Service; import java.time.LocalDate; @@ -27,35 +28,20 @@ public class BoardService { /** * 게시글 리스트 조회 * */ - public List getBoards(LocalDate date, Long addressId, DistanceRange distance, DogSize dogSize, String matchingYn) { + 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"); - } + address = addressRepository.findByMemberIdAndBasicAddressYn(member.getMemberId(), "Y") + .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_ADDRESS)); + } else { - address = getAddressByIdAndDelYn(addressId, "Y"); + address = addressRepository.findById(addressId) + .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_ADDRESS)); } 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/api/member/repository/AddressRepository.java b/src/main/java/org/jullaene/walkmong_back/api/member/repository/AddressRepository.java index 31e2805..7db13fd 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/member/repository/AddressRepository.java +++ b/src/main/java/org/jullaene/walkmong_back/api/member/repository/AddressRepository.java @@ -8,6 +8,5 @@ @Repository public interface AddressRepository extends JpaRepository { - Optional
findByAddressIdAndDelYn(Long addressId, String delYn); - Optional
findByMemberIdAndBasicAddressYnAndDelYn(Long memberId, String basicAddressYn, String delYn); + Optional
findByMemberIdAndBasicAddressYn(Long memberId, String basicAddressYn); } From a58e953d9548cc7450d56638da7d84065698015f Mon Sep 17 00:00:00 2001 From: Eunjeong Lee Date: Fri, 15 Nov 2024 22:01:06 +0900 Subject: [PATCH 04/14] =?UTF-8?q?feat:=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=A1=B0=ED=9A=8C=20api=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84[#2]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/board/dto/res/BoardRes.java | 16 ---------- .../repository/BoardRepositoryCustom.java | 4 +-- .../repository/impl/BoardRepositoryImpl.java | 6 ++-- .../api/board/rest/BoardController.java | 8 ++++- .../api/board/service/BoardService.java | 30 ++++++++++++++----- .../member/repository/AddressRepository.java | 3 +- 6 files changed, 36 insertions(+), 31 deletions(-) delete mode 100644 src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardRes.java diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardRes.java b/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardRes.java deleted file mode 100644 index 135ba99..0000000 --- a/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardRes.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.jullaene.walkmong_back.api.board.dto.res; - -import lombok.Builder; -import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; -import org.jullaene.walkmong_back.common.enums.Gender; - -public record BoardRes(String startTime, String endTime, String matchingYn, - String dogName, String dogProfile, - Gender dogGender, String breed, Double weight, - DogSize dogSize, String content, - String dongAddress, Double distance) { - - @Builder - public BoardRes { - } -} 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 index 3bfbad6..13c700a 100644 --- 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 @@ -1,6 +1,6 @@ package org.jullaene.walkmong_back.api.board.repository; -import org.jullaene.walkmong_back.api.board.dto.res.BoardRes; +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; @@ -9,5 +9,5 @@ import java.util.List; public interface BoardRepositoryCustom { - List getBoardsWithFilters(LocalDate date, Address walkerAddress, DistanceRange distance, DogSize dogSize, String matchingYn); + List getBoardsWithFilters(LocalDate date, Address walkerAddress, DistanceRange distance, DogSize dogSize, String matchingYn); } 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 index 24c7a38..922404b 100644 --- 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 @@ -10,7 +10,7 @@ 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.BoardRes; +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; @@ -32,7 +32,7 @@ public BoardRepositoryImpl(JPAQueryFactory queryFactory) { } @Override - public List getBoardsWithFilters(LocalDate date, Address walkerAddress, DistanceRange distance, DogSize dogSize, String matchingYn) { + 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; @@ -85,7 +85,7 @@ public List getBoardsWithFilters(LocalDate date, Address walkerAddress StringTemplate endTimeExpression = Expressions.stringTemplate("DATE_FORMAT({0}, '%H:%i')", board.endTime); return queryFactory.select( - Projections.constructor(BoardRes.class, + Projections.constructor(BoardResponseDto.class, startTimeExpression.as("startTime"), endTimeExpression.as("endTime"), board.matchingYn.as("matchingYn"), diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/rest/BoardController.java b/src/main/java/org/jullaene/walkmong_back/api/board/rest/BoardController.java index 558384a..aa8186f 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/board/rest/BoardController.java +++ b/src/main/java/org/jullaene/walkmong_back/api/board/rest/BoardController.java @@ -2,7 +2,13 @@ import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +import org.jullaene.walkmong_back.api.board.dto.res.BoardResponseDto; import org.jullaene.walkmong_back.api.board.service.BoardService; +import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; +import org.jullaene.walkmong_back.api.member.domain.enums.DistanceRange; +import org.jullaene.walkmong_back.common.BasicResponse; +import org.springframework.http.ResponseEntity; +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; @@ -18,7 +24,7 @@ public class BoardController { private final BoardService boardService; @GetMapping("/list") - public ResponseEntity>> getBoards ( + public ResponseEntity>> getBoards ( @RequestParam(name = "date", required = false) LocalDate date, @RequestParam(name = "addressId", required = false) Long addressId, @RequestParam(name = "distance", required = false) DistanceRange distance, 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 522af18..1908080 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,7 +1,7 @@ package org.jullaene.walkmong_back.api.board.service; import lombok.RequiredArgsConstructor; -import org.jullaene.walkmong_back.api.board.dto.res.BoardRes; +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; @@ -12,7 +12,6 @@ import org.jullaene.walkmong_back.common.exception.CustomException; import org.jullaene.walkmong_back.common.exception.ErrorType; import org.springframework.http.HttpStatus; -import org.springframework.security.core.parameters.P; import org.springframework.stereotype.Service; import java.time.LocalDate; @@ -28,20 +27,35 @@ public class BoardService { /** * 게시글 리스트 조회 * */ - public List getBoards(LocalDate date, Long addressId, DistanceRange distance, DogSize dogSize, String matchingYn) { + 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 = addressRepository.findByMemberIdAndBasicAddressYn(member.getMemberId(), "Y") - .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_ADDRESS)); - } + address = getBasicAddressAndDelYn(member.getMemberId(), "N"); + } else { - address = addressRepository.findById(addressId) - .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_ADDRESS)); + 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/api/member/repository/AddressRepository.java b/src/main/java/org/jullaene/walkmong_back/api/member/repository/AddressRepository.java index 7db13fd..31e2805 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/member/repository/AddressRepository.java +++ b/src/main/java/org/jullaene/walkmong_back/api/member/repository/AddressRepository.java @@ -8,5 +8,6 @@ @Repository public interface AddressRepository extends JpaRepository { - Optional
findByMemberIdAndBasicAddressYn(Long memberId, String basicAddressYn); + Optional
findByAddressIdAndDelYn(Long addressId, String delYn); + Optional
findByMemberIdAndBasicAddressYnAndDelYn(Long memberId, String basicAddressYn, String delYn); } From 6ee3bd6a9a5a845fccdcc68ae7af166aca95eb3b Mon Sep 17 00:00:00 2001 From: Seung Ik Lee Date: Sat, 16 Nov 2024 02:30:58 +0900 Subject: [PATCH 05/14] =?UTF-8?q?feat:=20#4=20=EC=82=B0=EC=B1=85=EC=9E=90?= =?UTF-8?q?=20=EC=A3=BC=EC=86=8C=20=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=A1=B0?= =?UTF-8?q?=ED=9A=8C=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../walkmong_back/api/member/domain/Address.java | 9 +++++++++ .../api/member/dto/res/AddressResponseDto.java | 11 +++++++++++ .../api/member/repository/AddressRepository.java | 2 ++ .../api/member/rest/AddressController.java | 14 ++++++++++++++ .../api/member/service/AddressService.java | 11 +++++++++++ 5 files changed, 47 insertions(+) create mode 100644 src/main/java/org/jullaene/walkmong_back/api/member/dto/res/AddressResponseDto.java diff --git a/src/main/java/org/jullaene/walkmong_back/api/member/domain/Address.java b/src/main/java/org/jullaene/walkmong_back/api/member/domain/Address.java index 40262a3..7dbb1b0 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/member/domain/Address.java +++ b/src/main/java/org/jullaene/walkmong_back/api/member/domain/Address.java @@ -5,6 +5,7 @@ import org.hibernate.annotations.Comment; import org.hibernate.annotations.DynamicUpdate; import org.jullaene.walkmong_back.api.member.domain.enums.DistanceRange; +import org.jullaene.walkmong_back.api.member.dto.res.AddressResponseDto; import org.jullaene.walkmong_back.common.BaseEntity; @Table(name = "address") @@ -35,6 +36,7 @@ public class Address extends BaseEntity { private String dongAddress; @Getter + @Enumerated(EnumType.STRING) @Comment("거리 범위") private DistanceRange distanceRange; @@ -42,4 +44,11 @@ public class Address extends BaseEntity { @Column(columnDefinition = "VARCHAR(1) default 'Y'") private String basicAddressYn; + public final AddressResponseDto toAddressResponseDto() { + return AddressResponseDto.builder() + .addressId(this.addressId) + .dongAddress(this.dongAddress) + .build(); + } + } diff --git a/src/main/java/org/jullaene/walkmong_back/api/member/dto/res/AddressResponseDto.java b/src/main/java/org/jullaene/walkmong_back/api/member/dto/res/AddressResponseDto.java new file mode 100644 index 0000000..9e8cc38 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/member/dto/res/AddressResponseDto.java @@ -0,0 +1,11 @@ +package org.jullaene.walkmong_back.api.member.dto.res; + +import lombok.Builder; +import lombok.Getter; + +@Builder +@Getter +public class AddressResponseDto { + private Long addressId; + private String dongAddress; +} diff --git a/src/main/java/org/jullaene/walkmong_back/api/member/repository/AddressRepository.java b/src/main/java/org/jullaene/walkmong_back/api/member/repository/AddressRepository.java index 31e2805..a24a329 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/member/repository/AddressRepository.java +++ b/src/main/java/org/jullaene/walkmong_back/api/member/repository/AddressRepository.java @@ -1,5 +1,6 @@ package org.jullaene.walkmong_back.api.member.repository; +import java.util.List; import org.jullaene.walkmong_back.api.member.domain.Address; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; @@ -10,4 +11,5 @@ public interface AddressRepository extends JpaRepository { Optional
findByAddressIdAndDelYn(Long addressId, String delYn); Optional
findByMemberIdAndBasicAddressYnAndDelYn(Long memberId, String basicAddressYn, String delYn); + List
findByMemberIdAndDelYn(Long memberId, String delYn); } diff --git a/src/main/java/org/jullaene/walkmong_back/api/member/rest/AddressController.java b/src/main/java/org/jullaene/walkmong_back/api/member/rest/AddressController.java index 5007828..ae939e5 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/member/rest/AddressController.java +++ b/src/main/java/org/jullaene/walkmong_back/api/member/rest/AddressController.java @@ -1,8 +1,15 @@ package org.jullaene.walkmong_back.api.member.rest; import io.swagger.v3.oas.annotations.tags.Tag; +import java.util.List; import lombok.RequiredArgsConstructor; +import org.jullaene.walkmong_back.api.member.domain.Member; +import org.jullaene.walkmong_back.api.member.dto.res.AddressResponseDto; import org.jullaene.walkmong_back.api.member.service.AddressService; +import org.jullaene.walkmong_back.api.member.service.MemberService; +import org.jullaene.walkmong_back.common.BasicResponse; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @@ -12,4 +19,11 @@ @RequestMapping("/api/v1/address") public class AddressController { private final AddressService addressService; + private final MemberService memberService; + + @GetMapping("/list") + public ResponseEntity>> getAddressList() { + Member member = memberService.getMemberFromUserDetail(); + return ResponseEntity.ok(BasicResponse.ofSuccess(addressService.getAddresses(member.getMemberId()))); + } } diff --git a/src/main/java/org/jullaene/walkmong_back/api/member/service/AddressService.java b/src/main/java/org/jullaene/walkmong_back/api/member/service/AddressService.java index 2edca05..b669feb 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/member/service/AddressService.java +++ b/src/main/java/org/jullaene/walkmong_back/api/member/service/AddressService.java @@ -1,6 +1,10 @@ package org.jullaene.walkmong_back.api.member.service; +import java.util.List; +import java.util.stream.Collectors; import lombok.RequiredArgsConstructor; +import org.jullaene.walkmong_back.api.member.domain.Address; +import org.jullaene.walkmong_back.api.member.dto.res.AddressResponseDto; import org.jullaene.walkmong_back.api.member.repository.AddressRepository; import org.springframework.stereotype.Service; @@ -8,4 +12,11 @@ @RequiredArgsConstructor public class AddressService { private final AddressRepository addressRepository; + + public List getAddresses(Long memberId) { + List
addresses = addressRepository.findByMemberIdAndDelYn(memberId, "N"); + return addresses.stream() + .map(Address::toAddressResponseDto) + .collect(Collectors.toList()); + } } From d4e239a280a47e6df3c5086c4af7e152758ad6a5 Mon Sep 17 00:00:00 2001 From: Eunjeong Lee Date: Fri, 15 Nov 2024 21:06:32 +0900 Subject: [PATCH 06/14] =?UTF-8?q?feat:=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=A1=B0=ED=9A=8C=20api=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84=20[#2]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/board/dto/res/BoardRes.java | 16 ++++++++++++++++ .../board/repository/BoardRepositoryCustom.java | 1 + .../api/board/service/BoardService.java | 2 +- 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardRes.java diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardRes.java b/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardRes.java new file mode 100644 index 0000000..135ba99 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardRes.java @@ -0,0 +1,16 @@ +package org.jullaene.walkmong_back.api.board.dto.res; + +import lombok.Builder; +import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; +import org.jullaene.walkmong_back.common.enums.Gender; + +public record BoardRes(String startTime, String endTime, String matchingYn, + String dogName, String dogProfile, + Gender dogGender, String breed, Double weight, + DogSize dogSize, String content, + String dongAddress, Double distance) { + + @Builder + public BoardRes { + } +} 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 index 13c700a..2b05a7f 100644 --- 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 @@ -1,6 +1,7 @@ package org.jullaene.walkmong_back.api.board.repository; import org.jullaene.walkmong_back.api.board.dto.res.BoardResponseDto; +import org.jullaene.walkmong_back.api.board.dto.res.BoardRes; 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; 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 1908080..1fdb0c1 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,7 @@ import lombok.RequiredArgsConstructor; import org.jullaene.walkmong_back.api.board.dto.res.BoardResponseDto; +import org.jullaene.walkmong_back.api.board.dto.res.BoardRes; 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; @@ -38,7 +39,6 @@ public List getBoards(LocalDate date, Long addressId, Distance else { address = getAddressByIdAndDelYn(addressId, "Y"); } - return boardRepository.getBoardsWithFilters(date, address, distance, dogSize, matchingYn); } From ddfd55811b8132f5c287016cd7285a2cfa672d9c Mon Sep 17 00:00:00 2001 From: Eunjeong Lee Date: Fri, 15 Nov 2024 22:01:06 +0900 Subject: [PATCH 07/14] =?UTF-8?q?feat:=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=A1=B0=ED=9A=8C=20api=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84[#2]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/board/dto/res/BoardRes.java | 16 ---------------- .../board/repository/BoardRepositoryCustom.java | 1 - .../api/board/service/BoardService.java | 1 - 3 files changed, 18 deletions(-) delete mode 100644 src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardRes.java diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardRes.java b/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardRes.java deleted file mode 100644 index 135ba99..0000000 --- a/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardRes.java +++ /dev/null @@ -1,16 +0,0 @@ -package org.jullaene.walkmong_back.api.board.dto.res; - -import lombok.Builder; -import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; -import org.jullaene.walkmong_back.common.enums.Gender; - -public record BoardRes(String startTime, String endTime, String matchingYn, - String dogName, String dogProfile, - Gender dogGender, String breed, Double weight, - DogSize dogSize, String content, - String dongAddress, Double distance) { - - @Builder - public BoardRes { - } -} 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 index 2b05a7f..13c700a 100644 --- 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 @@ -1,7 +1,6 @@ package org.jullaene.walkmong_back.api.board.repository; import org.jullaene.walkmong_back.api.board.dto.res.BoardResponseDto; -import org.jullaene.walkmong_back.api.board.dto.res.BoardRes; 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; 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 1fdb0c1..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 @@ -2,7 +2,6 @@ import lombok.RequiredArgsConstructor; import org.jullaene.walkmong_back.api.board.dto.res.BoardResponseDto; -import org.jullaene.walkmong_back.api.board.dto.res.BoardRes; 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; From 45fc831355fc7aff1269c9f815a3e66475d8ad9d Mon Sep 17 00:00:00 2001 From: Eunjeong Lee Date: Sat, 16 Nov 2024 06:51:26 +0900 Subject: [PATCH 08/14] =?UTF-8?q?fix:=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=A1=B0=ED=9A=8C=20sql=20?= =?UTF-8?q?=EC=97=90=EB=9F=AC=20=ED=95=B4=EA=B2=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../repository/impl/BoardRepositoryImpl.java | 21 ++++++++++++------- .../api/board/service/BoardService.java | 2 +- 2 files changed, 14 insertions(+), 9 deletions(-) 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 index 922404b..b950abb 100644 --- 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 @@ -44,7 +44,7 @@ public List getBoardsWithFilters(LocalDate date, Address walke date = LocalDate.now(); } LocalDateTime startOfDay = date.atStartOfDay(); - LocalDateTime endOfDay = date.atTime(23, 59, 59, 999_999_999); // 23:59:59.999999 + LocalDateTime endOfDay = date.atTime(23, 59, 59, 999_999_999); builder.and(board.startTime.between(startOfDay, endOfDay)); @@ -72,18 +72,23 @@ public List getBoardsWithFilters(LocalDate date, Address walke .where(ownerAddress.addressId.eq(board.ownerAddressId)), JPAExpressions.select(ownerAddress.latitude) .from(ownerAddress) - .where(ownerAddress.addressId.eq(board.ownerAddressId)), walkerAddress.getLongitude(), walkerAddress.getLatitude() + .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); + StringTemplate startTimeExpression = Expressions.stringTemplate( + "DATE_FORMAT({0}, '%H:%i')", + board.startTime + ); + StringTemplate endTimeExpression = Expressions.stringTemplate( + "DATE_FORMAT({0}, '%H:%i')", + board.endTime + ); + // 필터링된 board들을 바로 결과로 조회 return queryFactory.select( Projections.constructor(BoardResponseDto.class, startTimeExpression.as("startTime"), 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 a9eef88..d74a717 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 @@ -36,7 +36,7 @@ public List getBoards(LocalDate date, Long addressId, Distance address = getBasicAddressAndDelYn(member.getMemberId(), "N"); } else { - address = getAddressByIdAndDelYn(addressId, "Y"); + address = getAddressByIdAndDelYn(addressId, "N"); } return boardRepository.getBoardsWithFilters(date, address, distance, dogSize, matchingYn); } From 28c8d901bcce0505dd133a7174aea41c54f6f57a Mon Sep 17 00:00:00 2001 From: Eunjeong Lee Date: Sat, 16 Nov 2024 12:40:59 +0900 Subject: [PATCH 09/14] =?UTF-8?q?fix:=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=A1=B0=ED=9A=8C=EC=97=90=20?= =?UTF-8?q?=EA=B2=8C=EC=8B=9C=EA=B8=80=20=EC=9E=91=EC=84=B1=20=EC=8B=9C?= =?UTF-8?q?=EA=B0=84=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../walkmong_back/api/board/dto/res/BoardResponseDto.java | 4 +++- .../api/board/repository/impl/BoardRepositoryImpl.java | 3 ++- src/main/resources/application.yml | 2 +- 3 files changed, 6 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardResponseDto.java b/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardResponseDto.java index 19680fc..c338daf 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardResponseDto.java +++ b/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardResponseDto.java @@ -4,11 +4,13 @@ import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; import org.jullaene.walkmong_back.common.enums.Gender; +import java.time.LocalDateTime; + public record BoardResponseDto(String startTime, String endTime, String matchingYn, String dogName, String dogProfile, Gender dogGender, String breed, Double weight, DogSize dogSize, String content, - String dongAddress, Double distance) { + String dongAddress, Double distance, LocalDateTime createdAt) { @Builder public BoardResponseDto { 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 index b950abb..7639722 100644 --- 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 @@ -102,7 +102,8 @@ public List getBoardsWithFilters(LocalDate date, Address walke dog.dogSize.as("dogSize"), board.content.as("content"), ownerAddress.dongAddress.as("dongAddress"), - distanceExpression.as("distance") + distanceExpression.as("distance"), + board.createdAt.as("createdAt") ) ) .from(board) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index e3dd542..d4b2aba 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,3 +1,3 @@ spring: application.name: walkmong_back - profiles.active: local \ No newline at end of file + profiles.active: dev \ No newline at end of file From e2aca70a6dd1abd5f8fef212b34b28034f9135e5 Mon Sep 17 00:00:00 2001 From: Eunjeong Lee Date: Sat, 16 Nov 2024 14:05:30 +0900 Subject: [PATCH 10/14] =?UTF-8?q?feat:=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EC=A1=B0=ED=9A=8C=20api=20=EA=B5=AC?= =?UTF-8?q?=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../board/dto/res/BoardDetailResponseDto.java | 40 ++++++ .../repository/BoardRepositoryCustom.java | 4 + .../repository/impl/BoardRepositoryImpl.java | 114 +++++++++++++++++- .../api/board/rest/BoardController.java | 10 +- .../api/board/service/BoardService.java | 9 ++ src/main/resources/application.yml | 2 +- 6 files changed, 173 insertions(+), 6 deletions(-) create mode 100644 src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardDetailResponseDto.java diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardDetailResponseDto.java b/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardDetailResponseDto.java new file mode 100644 index 0000000..2554898 --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardDetailResponseDto.java @@ -0,0 +1,40 @@ +package org.jullaene.walkmong_back.api.board.dto.res; + +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; +import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; +import org.jullaene.walkmong_back.common.enums.Gender; + +import java.time.LocalDateTime; + +@Getter +@NoArgsConstructor +@AllArgsConstructor +@Builder +public class BoardDetailResponseDto { + + private Long dogId; + private String dogName; + private String dogProfile; + private Gender dogGender; + private Integer dogAge; + private String breed; + private Double weight; + private DogSize dogSize; + private String dongAddress; + private Double distance; + private String startTime; + private String endTime; + private String locationNegotiationYn; + private String suppliesProvidedYn; + private String preMeetAvailableYn; + private String walkNote; + private String walkRequest; + private String additionalRequest; + private String ownerName; + private Integer ownerAge; + private Gender ownerGender; + private String ownerProfile; +} 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 index 13c700a..f7a0edb 100644 --- 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 @@ -1,5 +1,6 @@ package org.jullaene.walkmong_back.api.board.repository; +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.dog.domain.enums.DogSize; import org.jullaene.walkmong_back.api.member.domain.Address; @@ -7,7 +8,10 @@ import java.time.LocalDate; import java.util.List; +import java.util.Optional; public interface BoardRepositoryCustom { List getBoardsWithFilters(LocalDate date, Address walkerAddress, DistanceRange distance, DogSize dogSize, String matchingYn); + boolean existsByBoardIdAndMemberIdAndDelYn(Long boardId, Long memberId, String delYn); + Optional getBoardDetailResponse(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 index 7639722..8410a2b 100644 --- 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 @@ -1,6 +1,8 @@ package org.jullaene.walkmong_back.api.board.repository.impl; import com.querydsl.core.BooleanBuilder; +import com.querydsl.core.types.Expression; +import com.querydsl.core.types.Ops; import com.querydsl.core.types.Projections; import com.querydsl.core.types.dsl.BooleanExpression; import com.querydsl.core.types.dsl.Expressions; @@ -9,18 +11,25 @@ import com.querydsl.jpa.JPAExpressions; import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.extern.slf4j.Slf4j; +import org.jullaene.walkmong_back.api.apply.domain.QApply; import org.jullaene.walkmong_back.api.board.domain.QBoard; +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.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.Member; import org.jullaene.walkmong_back.api.member.domain.QAddress; +import org.jullaene.walkmong_back.api.member.domain.QMember; import org.jullaene.walkmong_back.api.member.domain.enums.DistanceRange; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; +import java.util.Optional; + +import static com.querydsl.core.types.dsl.Expressions.numberTemplate; @Slf4j public class BoardRepositoryImpl implements BoardRepositoryCustom { @@ -64,7 +73,7 @@ public List getBoardsWithFilters(LocalDate date, Address walke } // 거리 계산 - NumberTemplate distanceExpression = Expressions.numberTemplate( + NumberTemplate distanceExpression = numberTemplate( Double.class, "ST_Distance_Sphere(point({0}, {1}), point({2}, {3}))", JPAExpressions.select(ownerAddress.longitude) @@ -114,4 +123,107 @@ public List getBoardsWithFilters(LocalDate date, Address walke .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; + } + + + @Override + public Optional getBoardDetailResponse(Long boardId, Long memberId, String delYn) { + QDog dog= QDog.dog; + QAddress address=QAddress.address; + QBoard board= QBoard.board; + QMember member=QMember.member; + int currentYear = LocalDate.now().getYear() + 1; + + + StringTemplate startTimeExpression = Expressions.stringTemplate( + "DATE_FORMAT({0}, '%H:%i')", + board.startTime + ); + StringTemplate endTimeExpression = Expressions.stringTemplate( + "DATE_FORMAT({0}, '%H:%i')", + board.endTime + ); + + // 숫자 형식의 생년월일에서 연도 추출 (YYYYMMDD / 10000 = YYYY) + NumberTemplate birthYearExpression = Expressions.numberTemplate(Integer.class, + "FLOOR({0} / 10000)", + member.birthDate + ); + +// // 거리 계산 +// NumberTemplate distanceExpression = 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() +// ); + double distance = 500; + + System.out.println(currentYear); + return + Optional.ofNullable(queryFactory.select( + Projections.constructor(BoardDetailResponseDto.class, + dog.dogId.as("dogId"), + dog.name.as("dogName"), + dog.profile.as("dogProfile"), + dog.gender.as("dogGender"), + Expressions.numberOperation(Integer.class, Ops.SUB, + Expressions.constant(currentYear), dog.birthYear).as("dogAge"), + dog.breed.as("breed"), + dog.weight.as("weight"), + dog.dogSize.as("dogSize"), + address.dongAddress.as("dongAddress"), + Expressions.constant(distance), + startTimeExpression.as("startTime"), + endTimeExpression.as("endTime"), + board.locationNegotiationYn.as("locationNegotiationYn"), + board.suppliesProvideYn.as("suppliesProvideYn"), + board.preMeetAvailableYn.as("preMeetAvailableYn"), + dog.walkNote.as("walkNote"), + dog.walkRequest.as("walkRequest"), + dog.additionalRequest.as("additionalRequest"), + member.name.as("ownerName"), + Expressions.numberOperation(Integer.class, Ops.SUB, + Expressions.constant(currentYear), + birthYearExpression).as("ownerAge"), + member.gender.as("ownerGender"), + member.profile.as("ownerProfile") + + )) + .from(board) + .leftJoin(member).on(member.memberId.eq(memberId)) + .leftJoin(dog).on(dog.dogId.eq(board.dogId)) + .leftJoin(address).on(address.addressId.eq(board.ownerAddressId)) + .where(board.boardId.eq(boardId) + .and(board.delYn.eq(delYn))) + .fetchOne()); + } } diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/rest/BoardController.java b/src/main/java/org/jullaene/walkmong_back/api/board/rest/BoardController.java index aa8186f..c2bd1c8 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/board/rest/BoardController.java +++ b/src/main/java/org/jullaene/walkmong_back/api/board/rest/BoardController.java @@ -2,16 +2,14 @@ import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +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.service.BoardService; import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; import org.jullaene.walkmong_back.api.member.domain.enums.DistanceRange; import org.jullaene.walkmong_back.common.BasicResponse; import org.springframework.http.ResponseEntity; -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.time.LocalDate; import java.util.List; @@ -34,4 +32,8 @@ public ResponseEntity>> getBoards ( return ResponseEntity.ok(BasicResponse.ofSuccess(boardService.getBoards(date, addressId, distance, dogSize, matchingYn))); } + @GetMapping("/detail/{boardId}") + public ResponseEntity> getBoardDetails(@PathVariable("boardId") Long boardId){ + return ResponseEntity.ok(BasicResponse.ofSuccess(boardService.getBoardDetail(boardId))); + } } 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 d74a717..3e8e0f0 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,6 +1,7 @@ package org.jullaene.walkmong_back.api.board.service; import lombok.RequiredArgsConstructor; +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.enums.DogSize; @@ -41,6 +42,13 @@ public List getBoards(LocalDate date, Long addressId, Distance return boardRepository.getBoardsWithFilters(date, address, distance, dogSize, matchingYn); } + 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)); + } + /** * 주어진 멤버가 가진 기본 address를 반환 * */ @@ -53,6 +61,7 @@ private Address getBasicAddressAndDelYn(Long memberId, String delYn) { * 주어진 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/resources/application.yml b/src/main/resources/application.yml index d4b2aba..e3dd542 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,3 +1,3 @@ spring: application.name: walkmong_back - profiles.active: dev \ No newline at end of file + profiles.active: local \ No newline at end of file From 1cd4c6d927c1168de7e5f9863d7fa14add9f5165 Mon Sep 17 00:00:00 2001 From: Eunjeong Lee Date: Sat, 30 Nov 2024 14:06:06 +0900 Subject: [PATCH 11/14] =?UTF-8?q?feat:=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EC=83=81=EC=84=B8=20=EC=A0=95=EB=B3=B4=20=EC=A1=B0=ED=9A=8C=20?= =?UTF-8?q?api=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/board/dto/res/BoardDetailResponseDto.java | 2 ++ .../api/board/dto/res/BoardResponseDto.java | 2 +- .../api/board/repository/impl/BoardRepositoryImpl.java | 10 +++++++++- src/main/resources/application.yml | 2 +- 4 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardDetailResponseDto.java b/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardDetailResponseDto.java index 2554898..74c8b7d 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardDetailResponseDto.java +++ b/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardDetailResponseDto.java @@ -7,6 +7,7 @@ import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; import org.jullaene.walkmong_back.common.enums.Gender; +import java.time.LocalDate; import java.time.LocalDateTime; @Getter @@ -25,6 +26,7 @@ public class BoardDetailResponseDto { private DogSize dogSize; private String dongAddress; private Double distance; + private String date; private String startTime; private String endTime; private String locationNegotiationYn; diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardResponseDto.java b/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardResponseDto.java index c338daf..9b34e4b 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardResponseDto.java +++ b/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardResponseDto.java @@ -6,7 +6,7 @@ import java.time.LocalDateTime; -public record BoardResponseDto(String startTime, String endTime, String matchingYn, +public record BoardResponseDto(Long boardId, String startTime, String endTime, String matchingYn, String dogName, String dogProfile, Gender dogGender, String breed, Double weight, DogSize dogSize, String content, 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 index 8410a2b..8a9be38 100644 --- 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 @@ -97,9 +97,11 @@ public List getBoardsWithFilters(LocalDate date, Address walke board.endTime ); + // 필터링된 board들을 바로 결과로 조회 return queryFactory.select( Projections.constructor(BoardResponseDto.class, + board.boardId.as("boardId"), startTimeExpression.as("startTime"), endTimeExpression.as("endTime"), board.matchingYn.as("matchingYn"), @@ -166,6 +168,11 @@ public Optional getBoardDetailResponse(Long boardId, Lon board.endTime ); + StringTemplate dateExpression = Expressions.stringTemplate( + "DATE_FORMAT({0}, '%Y-%m-%d')", + board.startTime + ); + // 숫자 형식의 생년월일에서 연도 추출 (YYYYMMDD / 10000 = YYYY) NumberTemplate birthYearExpression = Expressions.numberTemplate(Integer.class, "FLOOR({0} / 10000)", @@ -202,6 +209,7 @@ public Optional getBoardDetailResponse(Long boardId, Lon dog.dogSize.as("dogSize"), address.dongAddress.as("dongAddress"), Expressions.constant(distance), + dateExpression.as("date"), startTimeExpression.as("startTime"), endTimeExpression.as("endTime"), board.locationNegotiationYn.as("locationNegotiationYn"), @@ -219,8 +227,8 @@ public Optional getBoardDetailResponse(Long boardId, Lon )) .from(board) - .leftJoin(member).on(member.memberId.eq(memberId)) .leftJoin(dog).on(dog.dogId.eq(board.dogId)) + .leftJoin(member).on(dog.memberId.eq(member.memberId)) .leftJoin(address).on(address.addressId.eq(board.ownerAddressId)) .where(board.boardId.eq(boardId) .and(board.delYn.eq(delYn))) diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index e3dd542..d4b2aba 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -1,3 +1,3 @@ spring: application.name: walkmong_back - profiles.active: local \ No newline at end of file + profiles.active: dev \ No newline at end of file From 131f1c16cfa9ef26d9f2a44e7bfebc8c6ab6cf0f Mon Sep 17 00:00:00 2001 From: Seung Ik Lee Date: Sun, 1 Dec 2024 01:08:43 +0900 Subject: [PATCH 12/14] =?UTF-8?q?feat:=20#20=20=EA=B2=8C=EC=8B=9C=EA=B8=80?= =?UTF-8?q?=20=EC=83=9D=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 --- .../walkmong_back/api/board/domain/Board.java | 16 ++++- .../api/board/dto/req/BoardRequestDto.java | 28 +++++++++ .../board/dto/res/BoardDetailResponseDto.java | 4 -- .../repository/impl/BoardRepositoryImpl.java | 4 -- .../api/board/rest/BoardController.java | 7 +++ .../api/board/service/BoardService.java | 23 +++++++ .../walkmong_back/api/dog/domain/Dog.java | 60 +++++++++++++++++++ 7 files changed, 131 insertions(+), 11 deletions(-) create mode 100644 src/main/java/org/jullaene/walkmong_back/api/board/dto/req/BoardRequestDto.java diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/domain/Board.java b/src/main/java/org/jullaene/walkmong_back/api/board/domain/Board.java index d0ee707..f37fccf 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/board/domain/Board.java +++ b/src/main/java/org/jullaene/walkmong_back/api/board/domain/Board.java @@ -26,9 +26,6 @@ public class Board extends BaseEntity { @Comment("반려동물 아이디") private Long dogId; - @Comment("반려인 아이디") - private Long ownerId; - @Comment("반려인 주소 아이디") private Long ownerAddressId; @@ -57,5 +54,18 @@ public class Board extends BaseEntity { @Enumerated(EnumType.STRING) private WalkingStatus walkingStatus; + @Builder + public Board (BoardRequestDto boardRequestDto, String content) { + this.dogId = boardRequestDto.getDogId(); + this.ownerAddressId = boardRequestDto.getAddressId(); + this.content = content; + this.matchingYn = "N"; + this.startTime = boardRequestDto.getStartTime(); + this.endTime = boardRequestDto.getEndTime(); + this.locationNegotiationYn = boardRequestDto.getLocationNegotiationYn(); + this.preMeetAvailableYn = boardRequestDto.getPreMeetAvailableYn(); + this.walkingStatus = WalkingStatus.BEFORE; + } + } diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/dto/req/BoardRequestDto.java b/src/main/java/org/jullaene/walkmong_back/api/board/dto/req/BoardRequestDto.java new file mode 100644 index 0000000..17ecd3b --- /dev/null +++ b/src/main/java/org/jullaene/walkmong_back/api/board/dto/req/BoardRequestDto.java @@ -0,0 +1,28 @@ +package org.jullaene.walkmong_back.api.board.dto.req; + +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.time.LocalDateTime; +import lombok.NoArgsConstructor; + +@Getter +@AllArgsConstructor +@NoArgsConstructor +public class BoardRequestDto { + private Long dogId; + + private Long addressId; + + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") + private LocalDateTime startTime; + + @JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss") + private LocalDateTime endTime; + + private String locationNegotiationYn; + + private String preMeetAvailableYn; +} + diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardDetailResponseDto.java b/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardDetailResponseDto.java index 74c8b7d..e3cbfef 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardDetailResponseDto.java +++ b/src/main/java/org/jullaene/walkmong_back/api/board/dto/res/BoardDetailResponseDto.java @@ -7,9 +7,6 @@ import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; import org.jullaene.walkmong_back.common.enums.Gender; -import java.time.LocalDate; -import java.time.LocalDateTime; - @Getter @NoArgsConstructor @AllArgsConstructor @@ -30,7 +27,6 @@ public class BoardDetailResponseDto { private String startTime; private String endTime; private String locationNegotiationYn; - private String suppliesProvidedYn; private String preMeetAvailableYn; private String walkNote; private String walkRequest; 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 index 8a9be38..663123b 100644 --- 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 @@ -1,7 +1,6 @@ package org.jullaene.walkmong_back.api.board.repository.impl; import com.querydsl.core.BooleanBuilder; -import com.querydsl.core.types.Expression; import com.querydsl.core.types.Ops; import com.querydsl.core.types.Projections; import com.querydsl.core.types.dsl.BooleanExpression; @@ -11,7 +10,6 @@ import com.querydsl.jpa.JPAExpressions; import com.querydsl.jpa.impl.JPAQueryFactory; import lombok.extern.slf4j.Slf4j; -import org.jullaene.walkmong_back.api.apply.domain.QApply; import org.jullaene.walkmong_back.api.board.domain.QBoard; import org.jullaene.walkmong_back.api.board.dto.res.BoardDetailResponseDto; import org.jullaene.walkmong_back.api.board.dto.res.BoardResponseDto; @@ -19,7 +17,6 @@ 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.Member; import org.jullaene.walkmong_back.api.member.domain.QAddress; import org.jullaene.walkmong_back.api.member.domain.QMember; import org.jullaene.walkmong_back.api.member.domain.enums.DistanceRange; @@ -213,7 +210,6 @@ public Optional getBoardDetailResponse(Long boardId, Lon startTimeExpression.as("startTime"), endTimeExpression.as("endTime"), board.locationNegotiationYn.as("locationNegotiationYn"), - board.suppliesProvideYn.as("suppliesProvideYn"), board.preMeetAvailableYn.as("preMeetAvailableYn"), dog.walkNote.as("walkNote"), dog.walkRequest.as("walkRequest"), diff --git a/src/main/java/org/jullaene/walkmong_back/api/board/rest/BoardController.java b/src/main/java/org/jullaene/walkmong_back/api/board/rest/BoardController.java index c2bd1c8..6187ce4 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/board/rest/BoardController.java +++ b/src/main/java/org/jullaene/walkmong_back/api/board/rest/BoardController.java @@ -2,6 +2,7 @@ import io.swagger.v3.oas.annotations.tags.Tag; import lombok.RequiredArgsConstructor; +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.service.BoardService; @@ -36,4 +37,10 @@ public ResponseEntity>> getBoards ( public ResponseEntity> getBoardDetails(@PathVariable("boardId") Long boardId){ return ResponseEntity.ok(BasicResponse.ofSuccess(boardService.getBoardDetail(boardId))); } + + @PostMapping("/register") + public ResponseEntity> createBoard(@RequestBody BoardRequestDto boardRequestDto) { + return ResponseEntity.ok(BasicResponse.ofCreateSuccess(boardService.createBoard(boardRequestDto))); + } + } 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 3e8e0f0..b1cdae6 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,10 +1,15 @@ package org.jullaene.walkmong_back.api.board.service; +import jakarta.transaction.Transactional; import lombok.RequiredArgsConstructor; +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; @@ -24,6 +29,7 @@ public class BoardService { private final BoardRepository boardRepository; private final AddressRepository addressRepository; private final MemberService memberService; + private final DogRepository dogRepository; /** * 게시글 리스트 조회 @@ -66,4 +72,21 @@ private Address getAddressByIdAndDelYn (Long addressId, String delYn) { .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_ADDRESS)); } + + @Transactional + public Long createBoard(BoardRequestDto boardRequestDto) { + Dog dog = dogRepository.findByDogIdAndDelYn(boardRequestDto.getDogId(), "N") + .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.DOG_NOT_FOUND)); + + addressRepository.findByAddressIdAndDelYn(boardRequestDto.getAddressId(), "N") + .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_ADDRESS)); + + Board board = Board.builder() + .boardRequestDto(boardRequestDto) + .content(dog.getWalkRequestContent()) + .build(); + + return boardRepository.save(board).getBoardId(); + } + } diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java b/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java index 21055b3..6480802 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java @@ -2,21 +2,31 @@ import jakarta.persistence.Column; import jakarta.persistence.Entity; +import jakarta.persistence.EnumType; +import jakarta.persistence.Enumerated; import jakarta.persistence.GeneratedValue; import jakarta.persistence.GenerationType; import jakarta.persistence.Id; import jakarta.persistence.Table; +import java.time.LocalDate; + +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.dog.domain.enums.DogSize; +import org.jullaene.walkmong_back.api.dog.dto.res.DogProfileResponseDto; import org.jullaene.walkmong_back.common.enums.Gender; import org.jullaene.walkmong_back.common.BaseEntity; @Table(name = "dog") @Entity +@NoArgsConstructor @DynamicUpdate public class Dog extends BaseEntity { @Id + @Getter @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "dog_id") private Long dogId; @@ -28,6 +38,7 @@ public class Dog extends BaseEntity { private String name; @Comment("성별") + @Enumerated(EnumType.STRING) private Gender gender; @Comment("출생년도") @@ -40,6 +51,7 @@ public class Dog extends BaseEntity { private String breed; @Comment("사이즈") + @Enumerated(EnumType.STRING) private DogSize dogSize; @Comment("프로필 url") @@ -74,4 +86,52 @@ public class Dog extends BaseEntity { @Comment("추가 안내 사항") private String additionalRequest; + + public final String getWalkRequestContent() { + return this.walkRequest; + } + + public final DogProfileResponseDto toDogProfileResponseDto() { + int currentYear = LocalDate.now().getYear(); + int dogAge = currentYear - this.birthYear + 1; // 나이 계산 + + return DogProfileResponseDto.builder() + .dogId(this.dogId) + .dogName(this.name) + .dogProfile(this.profile) + .dogGender(this.gender) + .dogAge(dogAge) + .breed(this.breed) + .weight(this.weight) + .neuteringYn(this.neuteringYn) + .bite(this.bite) + .friendly(this.friendly) + .barking(this.barking) + .rabiesYn(this.rabiesYn) + .build(); + } + + @Builder + public Dog(Long memberId,String name, + DogSize dogSize, String profile, + Gender gender, Integer birthYear, + String breed, Double weight, + String neuteringYn, String bite, + String friendly, String barking, + String rabiesYn, String adultYn){ + this.name=name; + this.memberId=memberId; + this.dogSize=dogSize; + this.profile=profile; + this.gender=gender; + this.birthYear=birthYear; + this.breed=breed; + this.weight=weight; + this.neuteringYn=neuteringYn; + this.bite = bite; + this.friendly=friendly; + this.barking = barking; + this.rabiesYn=rabiesYn; + this.adultYn=adultYn; + } } From 5d399adc09a7c2ed21eadc5b5f62492f68622a77 Mon Sep 17 00:00:00 2001 From: Seung Ik Lee Date: Mon, 2 Dec 2024 17:05:42 +0900 Subject: [PATCH 13/14] =?UTF-8?q?feat:=20#20=20=EC=9C=A0=ED=9A=A8=ED=95=9C?= =?UTF-8?q?=20=EC=A3=BC=EC=86=8C=EC=9D=B8=EC=A7=80=20=EC=B2=B4=ED=81=AC?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EB=A1=9C=EC=A7=81=20=EC=B6=94=EA=B0=80=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/board/service/BoardService.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 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 b1cdae6..080369b 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 @@ -75,12 +75,20 @@ private Address getAddressByIdAndDelYn (Long addressId, String delYn) { @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)); - addressRepository.findByAddressIdAndDelYn(boardRequestDto.getAddressId(), "N") - .orElseThrow(() -> new CustomException(HttpStatus.NOT_FOUND, ErrorType.INVALID_ADDRESS)); - Board board = Board.builder() .boardRequestDto(boardRequestDto) .content(dog.getWalkRequestContent()) From f984f0166d5313b20fc9474974935f72fd58a016 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 01:39:22 +0900 Subject: [PATCH 14/14] =?UTF-8?q?fix:=20=EA=B0=95=EC=95=84=C3=A3=EC=A7=80?= =?UTF-8?q?=20=EA=B4=80=EB=A0=A8=20=EC=A0=95=EB=B3=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../walkmong_back/api/dog/domain/Dog.java | 21 ------------------- .../api/dog/repository/DogRepository.java | 3 +++ 2 files changed, 3 insertions(+), 21 deletions(-) diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java b/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java index 6480802..9d83225 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/domain/Dog.java @@ -16,7 +16,6 @@ import org.hibernate.annotations.Comment; import org.hibernate.annotations.DynamicUpdate; import org.jullaene.walkmong_back.api.dog.domain.enums.DogSize; -import org.jullaene.walkmong_back.api.dog.dto.res.DogProfileResponseDto; import org.jullaene.walkmong_back.common.enums.Gender; import org.jullaene.walkmong_back.common.BaseEntity; @@ -91,26 +90,6 @@ public final String getWalkRequestContent() { return this.walkRequest; } - public final DogProfileResponseDto toDogProfileResponseDto() { - int currentYear = LocalDate.now().getYear(); - int dogAge = currentYear - this.birthYear + 1; // 나이 계산 - - return DogProfileResponseDto.builder() - .dogId(this.dogId) - .dogName(this.name) - .dogProfile(this.profile) - .dogGender(this.gender) - .dogAge(dogAge) - .breed(this.breed) - .weight(this.weight) - .neuteringYn(this.neuteringYn) - .bite(this.bite) - .friendly(this.friendly) - .barking(this.barking) - .rabiesYn(this.rabiesYn) - .build(); - } - @Builder public Dog(Long memberId,String name, DogSize dogSize, String profile, diff --git a/src/main/java/org/jullaene/walkmong_back/api/dog/repository/DogRepository.java b/src/main/java/org/jullaene/walkmong_back/api/dog/repository/DogRepository.java index 04e7fb4..7544fbc 100644 --- a/src/main/java/org/jullaene/walkmong_back/api/dog/repository/DogRepository.java +++ b/src/main/java/org/jullaene/walkmong_back/api/dog/repository/DogRepository.java @@ -4,6 +4,9 @@ import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.util.Optional; + @Repository public interface DogRepository extends JpaRepository { + Optional findByDogIdAndDelYn(Long dogId, String delYn); }