From d2e9b95f78ec08c0d29f3345c47cc19d13097339 Mon Sep 17 00:00:00 2001 From: changha Date: Tue, 30 Apr 2024 15:00:47 +0900 Subject: [PATCH 1/6] =?UTF-8?q?feat:=20=EC=A2=8B=EC=95=84=EC=9A=94=20?= =?UTF-8?q?=EC=97=AC=EB=B6=80=20API=EC=B6=94=EA=B0=80=20(=EC=B9=B4?= =?UTF-8?q?=ED=85=8C=EA=B3=A0=EB=A6=AC=20api=EC=95=88=EB=90=98=EA=B3=A0?= =?UTF-8?q?=EC=9E=88=EC=9D=8C)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sanEseo/like/adapter/LikeAdapter.java | 5 +++ .../sanEseo/like/adapter/LikeController.java | 6 ++++ .../sanEseo/like/adapter/LikeRepository.java | 1 + .../like/application/port/LikePort.java | 1 + .../like/application/service/LikeService.java | 4 +++ .../adapter/PostDistrictAdapter.java | 9 +++++ .../adapter/PostDistrictController.java | 16 ++++++--- .../adapter/PostDistrictRepository.java | 6 ++++ .../application/port/PostDistrictPort.java | 4 +++ .../service/PostDistrictService.java | 36 ++++++++++++++++--- 10 files changed, 78 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/seoultech/sanEseo/like/adapter/LikeAdapter.java b/src/main/java/com/seoultech/sanEseo/like/adapter/LikeAdapter.java index e8dcf49..cbf9410 100644 --- a/src/main/java/com/seoultech/sanEseo/like/adapter/LikeAdapter.java +++ b/src/main/java/com/seoultech/sanEseo/like/adapter/LikeAdapter.java @@ -34,5 +34,10 @@ public int countByPostId(Long postId) { return likeRepository.countByPostId(postId); } + @Override + public boolean existsByPostIdAndMemberId(Long postId, Long memberId) { + return likeRepository.existsByPostIdAndMemberId(postId, memberId); + } + } diff --git a/src/main/java/com/seoultech/sanEseo/like/adapter/LikeController.java b/src/main/java/com/seoultech/sanEseo/like/adapter/LikeController.java index 590418b..f948c4d 100644 --- a/src/main/java/com/seoultech/sanEseo/like/adapter/LikeController.java +++ b/src/main/java/com/seoultech/sanEseo/like/adapter/LikeController.java @@ -35,4 +35,10 @@ public ResponseEntity getLikeCount(@PathVariable Long postId) { return ApiResponse.ok("좋아요 수 조회 성공", new GetLikeResponse(postId, likeCount)); } + @GetMapping("/posts/{postId}/members/{memberId}/likes") + public ResponseEntity hasMemberLikedPost(@PathVariable Long postId, @PathVariable Long memberId) { + boolean hasLiked = likeService.hasMemberLikedPost(memberId, postId); + return ApiResponse.ok("좋아요 여부 조회 성공", hasLiked); + } + } diff --git a/src/main/java/com/seoultech/sanEseo/like/adapter/LikeRepository.java b/src/main/java/com/seoultech/sanEseo/like/adapter/LikeRepository.java index 9b032ad..16a38d8 100644 --- a/src/main/java/com/seoultech/sanEseo/like/adapter/LikeRepository.java +++ b/src/main/java/com/seoultech/sanEseo/like/adapter/LikeRepository.java @@ -14,4 +14,5 @@ public interface LikeRepository extends JpaRepository { int countByPostId(Long postId); void deleteByPostAndMember(Post post, Member member); + boolean existsByPostIdAndMemberId(Long postId, Long memberId); } diff --git a/src/main/java/com/seoultech/sanEseo/like/application/port/LikePort.java b/src/main/java/com/seoultech/sanEseo/like/application/port/LikePort.java index 07b90ad..e117bab 100644 --- a/src/main/java/com/seoultech/sanEseo/like/application/port/LikePort.java +++ b/src/main/java/com/seoultech/sanEseo/like/application/port/LikePort.java @@ -14,4 +14,5 @@ public interface LikePort { int countByPostId(Long postId); + boolean existsByPostIdAndMemberId(Long postId, Long memberId); } diff --git a/src/main/java/com/seoultech/sanEseo/like/application/service/LikeService.java b/src/main/java/com/seoultech/sanEseo/like/application/service/LikeService.java index 1481e6b..159380f 100644 --- a/src/main/java/com/seoultech/sanEseo/like/application/service/LikeService.java +++ b/src/main/java/com/seoultech/sanEseo/like/application/service/LikeService.java @@ -54,4 +54,8 @@ public int getLikeCount(Long postId) { return likePort.countByPostId(postId); } + public boolean hasMemberLikedPost(Long memberId, Long postId) { + return likePort.existsByPostIdAndMemberId(memberId, postId); + } + } diff --git a/src/main/java/com/seoultech/sanEseo/post_district/adapter/PostDistrictAdapter.java b/src/main/java/com/seoultech/sanEseo/post_district/adapter/PostDistrictAdapter.java index 986885f..1905bd3 100644 --- a/src/main/java/com/seoultech/sanEseo/post_district/adapter/PostDistrictAdapter.java +++ b/src/main/java/com/seoultech/sanEseo/post_district/adapter/PostDistrictAdapter.java @@ -4,6 +4,9 @@ import com.seoultech.sanEseo.post.domain.Category; import com.seoultech.sanEseo.post_district.application.port.PostDistrictPort; import com.seoultech.sanEseo.post_district.domain.PostDistrict; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; import org.springframework.stereotype.Component; import java.util.List; @@ -47,4 +50,10 @@ public List findAll() { public List findByPostCategory(Category category) { return postDistrictRepository.findByPostCategory(category); } + +// @Override +// public Slice findByCategory(Category category, Pageable pageable) { +// return postDistrictRepository.findByCategory(category, pageable); +// } + } diff --git a/src/main/java/com/seoultech/sanEseo/post_district/adapter/PostDistrictController.java b/src/main/java/com/seoultech/sanEseo/post_district/adapter/PostDistrictController.java index edc13a1..5dd8a11 100644 --- a/src/main/java/com/seoultech/sanEseo/post_district/adapter/PostDistrictController.java +++ b/src/main/java/com/seoultech/sanEseo/post_district/adapter/PostDistrictController.java @@ -6,6 +6,9 @@ import com.seoultech.sanEseo.post_district.application.service.GetPostDistrictResponse; import com.seoultech.sanEseo.post_district.application.port.PostDistrictPort; import com.seoultech.sanEseo.post_district.application.service.PostDistrictService; +import org.springframework.data.domain.PageRequest; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.*; @@ -29,11 +32,14 @@ public ResponseEntity getPostDistrict(@PathVariable Long districtId) { } //전체 게시글 조회 - @GetMapping("/posts/{category}") - public ResponseEntity getAllPostDistrictByCategory(@PathVariable int category) { - List responses = postDistrictService.getAllPostDistrict(category); - return ApiResponse.ok("전체 게시글 목록 조회 성공", responses); - } +// @GetMapping("/posts") +// public ResponseEntity getAllPostDistrictByCategory(@RequestParam(value = "page", defaultValue = "0") int page, +// @RequestParam(value = "size", defaultValue = "10") int size, +// @RequestParam(value = "category", required = true) int category) { +// Pageable pageable = PageRequest.of(page, size); +// Slice responses = (Slice) postDistrictService.getAllPostDistrict(pageable, category); +// return ApiResponse.ok("전체 게시글 목록 조회 성공", responses); +// } //좋아요 순으로 정렬된 게시글 조회 @GetMapping("/posts/{category}/sorted-by-likes") diff --git a/src/main/java/com/seoultech/sanEseo/post_district/adapter/PostDistrictRepository.java b/src/main/java/com/seoultech/sanEseo/post_district/adapter/PostDistrictRepository.java index c0a4bed..c8016c0 100644 --- a/src/main/java/com/seoultech/sanEseo/post_district/adapter/PostDistrictRepository.java +++ b/src/main/java/com/seoultech/sanEseo/post_district/adapter/PostDistrictRepository.java @@ -1,7 +1,10 @@ package com.seoultech.sanEseo.post_district.adapter; import com.seoultech.sanEseo.post.domain.Category; +import com.seoultech.sanEseo.post.domain.Post; import com.seoultech.sanEseo.post_district.domain.PostDistrict; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; import org.springframework.data.jpa.repository.JpaRepository; import java.util.List; @@ -13,4 +16,7 @@ public interface PostDistrictRepository extends JpaRepository findByPostCategory(Category category); +// Slice findByCategory(Category category, Pageable pageable); + + } diff --git a/src/main/java/com/seoultech/sanEseo/post_district/application/port/PostDistrictPort.java b/src/main/java/com/seoultech/sanEseo/post_district/application/port/PostDistrictPort.java index f24cdd2..0591b2d 100644 --- a/src/main/java/com/seoultech/sanEseo/post_district/application/port/PostDistrictPort.java +++ b/src/main/java/com/seoultech/sanEseo/post_district/application/port/PostDistrictPort.java @@ -2,6 +2,8 @@ import com.seoultech.sanEseo.post.domain.Category; import com.seoultech.sanEseo.post_district.domain.PostDistrict; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; import java.util.List; @@ -19,4 +21,6 @@ public interface PostDistrictPort { List findAll(); List findByPostCategory(Category category); + +// Slice findByCategory(Category category, Pageable pageable); } diff --git a/src/main/java/com/seoultech/sanEseo/post_district/application/service/PostDistrictService.java b/src/main/java/com/seoultech/sanEseo/post_district/application/service/PostDistrictService.java index 1cae8fd..76932b7 100644 --- a/src/main/java/com/seoultech/sanEseo/post_district/application/service/PostDistrictService.java +++ b/src/main/java/com/seoultech/sanEseo/post_district/application/service/PostDistrictService.java @@ -10,6 +10,8 @@ import com.seoultech.sanEseo.post.domain.Post; import com.seoultech.sanEseo.post_district.application.port.PostDistrictPort; import com.seoultech.sanEseo.post_district.domain.PostDistrict; +import org.springframework.data.domain.Pageable; +import org.springframework.data.domain.Slice; import org.springframework.stereotype.Service; import java.util.List; @@ -45,11 +47,13 @@ public List getPostDistrict(Long districtId) { return getPostDistrictResponses(postDistricts); } - public List getAllPostDistrict(int category) { - Category categoryEnum = Category.from(category); - List postDistricts = postDistrictPort.findByPostCategory(categoryEnum); - return getPostDistrictResponses(postDistricts); - } +// public List getAllPostDistrict(Pageable pageable, int category) { +// Category categoryEnum = Category.from(category); +// Slice postDistricts = postDistrictPort.findByCategory(categoryEnum, pageable); +// +// return getPostDistrictResponses(postDistricts); +// } + public List getPostByLikesSortedDesc(int category) { Category categoryEnum = Category.from(category); @@ -88,4 +92,26 @@ private List getPostDistrictResponses(List getPostDistrictResponses(Slice postDistricts) { + List responses = postDistricts.stream().map(postDistrict -> { + Post post = postDistrict.getPost(); + List images = imageService.getPostImages(post.getId()); + List imageResponses = images.stream().map(image -> new GetImageResponse(image.getImageUrl())).collect(Collectors.toList()); + int likeCount = likeService.getLikeCount(post.getId()); + return new GetPostDistrictResponse( + post.getId(), + imageResponses, + post.getTitle(), + post.getSubTitle(), + post.getTime(), + likeCount, // 가정: Post 엔티티에 좋아요 수를 반환하는 getLikes() 메소드가 있음 + post.getDistance(), + post.getLevel(), + postDistrict.getDistrict().getName() + ); + }).collect(Collectors.toList()); + return responses; + } + } From ed29e7e682be959a8685c8a07a9d49ebe30e3c85 Mon Sep 17 00:00:00 2001 From: Hong-Mu Date: Tue, 30 Apr 2024 15:02:34 +0900 Subject: [PATCH 2/6] =?UTF-8?q?fix:=20=EC=A2=8B=EC=95=84=EC=9A=94,=20?= =?UTF-8?q?=EB=A6=AC=EB=B7=B0=20API=20=EC=9D=B8=EC=A6=9D=20=EB=B0=A9?= =?UTF-8?q?=EC=8B=9D=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sanEseo/global/config/jwt/TokenProvider.java | 2 +- .../sanEseo/global/config/web/AuthMember.java | 3 +-- .../config/web/LoginMemberArgumentResolver.java | 4 +++- .../sanEseo/like/adapter/LikeController.java | 10 ++++++---- .../like/application/service/AddLikeRequest.java | 7 +------ .../like/application/service/LikeService.java | 3 +-- .../member/adapter/in/web/AuthController.java | 2 +- .../member/adapter/in/web/MemberController.java | 4 ++-- .../adapter/in/web/dto/UpdateMemberRequest.java | 4 ++-- .../port/in/command/UpdateMemberCommand.java | 6 +++--- .../member/application/service/AuthService.java | 4 ++-- .../member/application/service/MemberService.java | 2 +- .../sanEseo/review/adapter/ReviewController.java | 14 ++++++++------ .../application/service/CreateReviewRequest.java | 6 +----- .../review/application/service/ReviewService.java | 4 ++-- .../java/com/seoultech/sanEseo/like/LikeSteps.java | 2 +- 16 files changed, 36 insertions(+), 41 deletions(-) diff --git a/src/main/java/com/seoultech/sanEseo/global/config/jwt/TokenProvider.java b/src/main/java/com/seoultech/sanEseo/global/config/jwt/TokenProvider.java index 7a5f005..2f38815 100644 --- a/src/main/java/com/seoultech/sanEseo/global/config/jwt/TokenProvider.java +++ b/src/main/java/com/seoultech/sanEseo/global/config/jwt/TokenProvider.java @@ -84,7 +84,7 @@ public Authentication getAuthentication(String token) { Collections.singleton(new SimpleGrantedAuthority("ROLE_MEMBER")); return new UsernamePasswordAuthenticationToken( - new User(claims.getSubject(), "", authorities), token, authorities + new User(claims.get("id").toString(), "", authorities), token, authorities ); } diff --git a/src/main/java/com/seoultech/sanEseo/global/config/web/AuthMember.java b/src/main/java/com/seoultech/sanEseo/global/config/web/AuthMember.java index b8ea1b5..1e827a4 100644 --- a/src/main/java/com/seoultech/sanEseo/global/config/web/AuthMember.java +++ b/src/main/java/com/seoultech/sanEseo/global/config/web/AuthMember.java @@ -7,6 +7,5 @@ @Getter @AllArgsConstructor public class AuthMember { - - private String email; + private Long id; } diff --git a/src/main/java/com/seoultech/sanEseo/global/config/web/LoginMemberArgumentResolver.java b/src/main/java/com/seoultech/sanEseo/global/config/web/LoginMemberArgumentResolver.java index 9c4a83c..6821af1 100644 --- a/src/main/java/com/seoultech/sanEseo/global/config/web/LoginMemberArgumentResolver.java +++ b/src/main/java/com/seoultech/sanEseo/global/config/web/LoginMemberArgumentResolver.java @@ -24,8 +24,10 @@ public boolean supportsParameter(MethodParameter parameter) { @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception { + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); User user = (User) authentication.getPrincipal(); - return new AuthMember(user.getUsername()); + + return new AuthMember(Long.parseLong(user.getUsername())); } } diff --git a/src/main/java/com/seoultech/sanEseo/like/adapter/LikeController.java b/src/main/java/com/seoultech/sanEseo/like/adapter/LikeController.java index 590418b..8bd1ae2 100644 --- a/src/main/java/com/seoultech/sanEseo/like/adapter/LikeController.java +++ b/src/main/java/com/seoultech/sanEseo/like/adapter/LikeController.java @@ -1,5 +1,7 @@ package com.seoultech.sanEseo.like.adapter; +import com.seoultech.sanEseo.global.config.web.AuthMember; +import com.seoultech.sanEseo.global.config.web.LoginMember; import com.seoultech.sanEseo.global.response.ApiResponse; import com.seoultech.sanEseo.like.application.service.AddLikeRequest; import com.seoultech.sanEseo.like.application.service.GetLikeResponse; @@ -18,14 +20,14 @@ public LikeController(LikeService likeService) { } @PostMapping("/likes") - public ResponseEntity addLike(@RequestBody AddLikeRequest request) { - likeService.addLike(request); + public ResponseEntity addLike(@LoginMember AuthMember member, @RequestBody AddLikeRequest request) { + likeService.addLike(member.getId(), request); return ApiResponse.ok("좋아요가 추가되었습니다."); } @DeleteMapping("/posts/{postId}/members/{memberId}/likes") - public ResponseEntity deleteLike(@PathVariable Long postId, @PathVariable Long memberId) { - likeService.deleteLike(postId, memberId); + public ResponseEntity deleteLike(@LoginMember AuthMember member, @PathVariable Long postId) { + likeService.deleteLike(postId, member.getId()); return ApiResponse.ok("좋아요가 삭제되었습니다."); } diff --git a/src/main/java/com/seoultech/sanEseo/like/application/service/AddLikeRequest.java b/src/main/java/com/seoultech/sanEseo/like/application/service/AddLikeRequest.java index ec170a5..7234c3a 100644 --- a/src/main/java/com/seoultech/sanEseo/like/application/service/AddLikeRequest.java +++ b/src/main/java/com/seoultech/sanEseo/like/application/service/AddLikeRequest.java @@ -9,13 +9,8 @@ public class AddLikeRequest { @NotNull(message = "포스트 ID는 필수입니다.") private Long postId; - @NotNull(message = "멤버 ID는 필수입니다.") - private Long memberId; - // 모든 매개변수를 가진 생성자 - public AddLikeRequest(Long postId, Long memberId) { + public AddLikeRequest(Long postId) { this.postId = postId; - this.memberId = memberId; } - } \ No newline at end of file diff --git a/src/main/java/com/seoultech/sanEseo/like/application/service/LikeService.java b/src/main/java/com/seoultech/sanEseo/like/application/service/LikeService.java index 1481e6b..a4944e9 100644 --- a/src/main/java/com/seoultech/sanEseo/like/application/service/LikeService.java +++ b/src/main/java/com/seoultech/sanEseo/like/application/service/LikeService.java @@ -24,11 +24,10 @@ public class LikeService { - public void addLike(AddLikeRequest request) { + public void addLike(Long memberId, AddLikeRequest request) { // request를 Like 객체로 변환 Long postId = request.getPostId(); - Long memberId = request.getMemberId(); Member member = memberPort.loadById(memberId); Post post = postPort.getPost(postId); diff --git a/src/main/java/com/seoultech/sanEseo/member/adapter/in/web/AuthController.java b/src/main/java/com/seoultech/sanEseo/member/adapter/in/web/AuthController.java index 9f9730b..c2b8d61 100644 --- a/src/main/java/com/seoultech/sanEseo/member/adapter/in/web/AuthController.java +++ b/src/main/java/com/seoultech/sanEseo/member/adapter/in/web/AuthController.java @@ -30,7 +30,7 @@ public ResponseEntity login(@RequestBody LoginRequest request) { @PostMapping("/logout") public ResponseEntity logout(@LoginMember AuthMember authMember) { - authService.logout(authMember.getEmail()); + authService.logout(authMember.getId()); return ApiResponse.ok("로그아웃 성공"); } // TODO : 로그아웃 구현 diff --git a/src/main/java/com/seoultech/sanEseo/member/adapter/in/web/MemberController.java b/src/main/java/com/seoultech/sanEseo/member/adapter/in/web/MemberController.java index 81f371d..8ba366b 100644 --- a/src/main/java/com/seoultech/sanEseo/member/adapter/in/web/MemberController.java +++ b/src/main/java/com/seoultech/sanEseo/member/adapter/in/web/MemberController.java @@ -31,12 +31,12 @@ public ResponseEntity register(@RequestBody RegisterRequest request) { @PatchMapping public ResponseEntity updateMember(@LoginMember AuthMember authMember, @ModelAttribute UpdateMemberRequest request) { - return ApiResponse.ok("회원정보 수정 성공", memberService.updateMember(request.toCommand(authMember.getEmail()))); + return ApiResponse.ok("회원정보 수정 성공", memberService.updateMember(request.toCommand(authMember.getId()))); } @GetMapping public ResponseEntity findMember(@LoginMember AuthMember authMember) { - return ApiResponse.ok("사용자 정보 조회 성공", MemberResponse.fromEntity(memberService.loadMemberByEmail(authMember.getEmail()))); + return ApiResponse.ok("사용자 정보 조회 성공", MemberResponse.fromEntity(memberService.loadMember(authMember.getId()))); } @GetMapping("/duplicate") diff --git a/src/main/java/com/seoultech/sanEseo/member/adapter/in/web/dto/UpdateMemberRequest.java b/src/main/java/com/seoultech/sanEseo/member/adapter/in/web/dto/UpdateMemberRequest.java index b9c94ca..de7e452 100644 --- a/src/main/java/com/seoultech/sanEseo/member/adapter/in/web/dto/UpdateMemberRequest.java +++ b/src/main/java/com/seoultech/sanEseo/member/adapter/in/web/dto/UpdateMemberRequest.java @@ -6,9 +6,9 @@ public record UpdateMemberRequest(String name, MultipartFile profile) { - public UpdateMemberCommand toCommand(String email) { + public UpdateMemberCommand toCommand(Long id) { return UpdateMemberCommand.builder() - .email(email) + .memberId(id) .name(name) .profile(profile) .build(); diff --git a/src/main/java/com/seoultech/sanEseo/member/application/port/in/command/UpdateMemberCommand.java b/src/main/java/com/seoultech/sanEseo/member/application/port/in/command/UpdateMemberCommand.java index d2e706d..42be1d7 100644 --- a/src/main/java/com/seoultech/sanEseo/member/application/port/in/command/UpdateMemberCommand.java +++ b/src/main/java/com/seoultech/sanEseo/member/application/port/in/command/UpdateMemberCommand.java @@ -9,13 +9,13 @@ @EqualsAndHashCode(callSuper = false) public class UpdateMemberCommand{ - private final String email; + private final Long memberId; private final String name; private final MultipartFile profile; @Builder - public UpdateMemberCommand(String email, String name, MultipartFile profile) { - this.email = email; + public UpdateMemberCommand(Long memberId, String name, MultipartFile profile) { + this.memberId = memberId; this.name = name; this.profile = profile; } diff --git a/src/main/java/com/seoultech/sanEseo/member/application/service/AuthService.java b/src/main/java/com/seoultech/sanEseo/member/application/service/AuthService.java index 2d93b28..270e1bf 100644 --- a/src/main/java/com/seoultech/sanEseo/member/application/service/AuthService.java +++ b/src/main/java/com/seoultech/sanEseo/member/application/service/AuthService.java @@ -67,8 +67,8 @@ public void register(OAuthRegisterCommand command) { } @Transactional - public void logout(String email) { - Member member = memberPort.loadByEmail(email); + public void logout(Long memberId) { + Member member = memberPort.loadById(memberId); RefreshToken refreshToken = refreshTokenPort.loadByUserId(member.getId()); if(refreshToken == null) { throw new NotLoginedMemberException("로그인이 되어있지 않습니다."); diff --git a/src/main/java/com/seoultech/sanEseo/member/application/service/MemberService.java b/src/main/java/com/seoultech/sanEseo/member/application/service/MemberService.java index 27c9998..7b80839 100644 --- a/src/main/java/com/seoultech/sanEseo/member/application/service/MemberService.java +++ b/src/main/java/com/seoultech/sanEseo/member/application/service/MemberService.java @@ -54,7 +54,7 @@ public String generateName() { @Transactional public MemberResponse updateMember(UpdateMemberCommand command) { - Member member = memberPort.loadByEmail(command.getEmail()); + Member member = memberPort.loadById(command.getMemberId()); if(command.getName() != null) { checkDuplicateName(command.getName()); diff --git a/src/main/java/com/seoultech/sanEseo/review/adapter/ReviewController.java b/src/main/java/com/seoultech/sanEseo/review/adapter/ReviewController.java index a7cd959..41eb255 100644 --- a/src/main/java/com/seoultech/sanEseo/review/adapter/ReviewController.java +++ b/src/main/java/com/seoultech/sanEseo/review/adapter/ReviewController.java @@ -1,6 +1,8 @@ package com.seoultech.sanEseo.review.adapter; +import com.seoultech.sanEseo.global.config.web.AuthMember; +import com.seoultech.sanEseo.global.config.web.LoginMember; import com.seoultech.sanEseo.global.response.ApiResponse; import com.seoultech.sanEseo.review.application.service.CreateReviewRequest; import com.seoultech.sanEseo.review.application.service.GetReviewResponse; @@ -23,20 +25,20 @@ public ReviewController(ReviewService reviewService) { } @PostMapping("/reviews") - public ResponseEntity createReview(@RequestBody @Valid CreateReviewRequest request) { - reviewService.createReview(request); + public ResponseEntity createReview(@LoginMember AuthMember authMember, @RequestBody @Valid CreateReviewRequest request) { + reviewService.createReview(authMember.getId(), request); return ApiResponse.ok("리뷰가 성공적으로 생성되었습니다."); } @DeleteMapping("/posts/{postId}/members/{memberId}/reviews") - public ResponseEntity deleteReview(@PathVariable Long postId, @PathVariable Long memberId) { - reviewService.deleteReview(postId, memberId); + public ResponseEntity deleteReview(@LoginMember AuthMember authMember, @PathVariable Long postId) { + reviewService.deleteReview(postId, authMember.getId()); return ApiResponse.ok("리뷰가 성공적으로 삭제되었습니다."); } @PutMapping("/posts/{postId}/members/{memberId}/reviews") - public ResponseEntity updateReview(@PathVariable Long postId, @PathVariable Long memberId, @RequestBody UpdateReviewRequest request) { - reviewService.updateReview(postId, memberId, request); + public ResponseEntity updateReview(@LoginMember AuthMember authMember, @PathVariable Long postId, @RequestBody UpdateReviewRequest request) { + reviewService.updateReview(postId, authMember.getId(), request); return ApiResponse.ok("리뷰가 성공적으로 업데이트되었습니다."); } diff --git a/src/main/java/com/seoultech/sanEseo/review/application/service/CreateReviewRequest.java b/src/main/java/com/seoultech/sanEseo/review/application/service/CreateReviewRequest.java index 8446310..90b7570 100644 --- a/src/main/java/com/seoultech/sanEseo/review/application/service/CreateReviewRequest.java +++ b/src/main/java/com/seoultech/sanEseo/review/application/service/CreateReviewRequest.java @@ -10,9 +10,6 @@ @Getter public class CreateReviewRequest { - - @NotNull(message = "사용자 ID는 필수입니다.") - Long memberId; @NotNull(message = "게시글 ID는 필수입니다.") Long postId; @NotBlank(message = "리뷰 내용은 필수입니다.") @@ -20,8 +17,7 @@ public class CreateReviewRequest { @NotNull(message = "리뷰 작성일은 필수입니다.") @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime createDate; - public CreateReviewRequest(Long memberId, Long postId, String content, LocalDateTime createDate) { - this.memberId = memberId; + public CreateReviewRequest(Long postId, String content, LocalDateTime createDate) { this.postId = postId; this.content = content; this.createDate = createDate; diff --git a/src/main/java/com/seoultech/sanEseo/review/application/service/ReviewService.java b/src/main/java/com/seoultech/sanEseo/review/application/service/ReviewService.java index d498ae4..b878959 100644 --- a/src/main/java/com/seoultech/sanEseo/review/application/service/ReviewService.java +++ b/src/main/java/com/seoultech/sanEseo/review/application/service/ReviewService.java @@ -25,9 +25,9 @@ class ReviewService { } @Transactional - public void createReview(CreateReviewRequest request) { + public void createReview(Long memberId, CreateReviewRequest request) { - Member member = memberPort.loadById(request.getMemberId()); + Member member = memberPort.loadById(memberId); Post post = postPort.getPost(request.getPostId()); Review review = Review.builder() diff --git a/src/test/java/com/seoultech/sanEseo/like/LikeSteps.java b/src/test/java/com/seoultech/sanEseo/like/LikeSteps.java index d847968..54a7188 100644 --- a/src/test/java/com/seoultech/sanEseo/like/LikeSteps.java +++ b/src/test/java/com/seoultech/sanEseo/like/LikeSteps.java @@ -17,7 +17,7 @@ public class LikeSteps { public static AddLikeRequest 좋아요등록요청_생성() { - return new AddLikeRequest(1L, 1L); + return new AddLikeRequest(1L); } public static ExtractableResponse 좋아요삭제요청(Long likeId) { From 96f3ec956c8b58bb025f4516e666f823ad9616cf Mon Sep 17 00:00:00 2001 From: changha Date: Tue, 30 Apr 2024 15:20:15 +0900 Subject: [PATCH 3/6] =?UTF-8?q?feat:=20pageable=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../adapter/PostDistrictAdapter.java | 8 ++--- .../adapter/PostDistrictController.java | 16 ++++----- .../adapter/PostDistrictRepository.java | 2 +- .../application/port/PostDistrictPort.java | 2 +- .../service/PostDistrictService.java | 34 +++++-------------- 5 files changed, 22 insertions(+), 40 deletions(-) diff --git a/src/main/java/com/seoultech/sanEseo/post_district/adapter/PostDistrictAdapter.java b/src/main/java/com/seoultech/sanEseo/post_district/adapter/PostDistrictAdapter.java index 1905bd3..226baaa 100644 --- a/src/main/java/com/seoultech/sanEseo/post_district/adapter/PostDistrictAdapter.java +++ b/src/main/java/com/seoultech/sanEseo/post_district/adapter/PostDistrictAdapter.java @@ -51,9 +51,9 @@ public List findByPostCategory(Category category) { return postDistrictRepository.findByPostCategory(category); } -// @Override -// public Slice findByCategory(Category category, Pageable pageable) { -// return postDistrictRepository.findByCategory(category, pageable); -// } + @Override + public Slice findByPostCategory(Category category, Pageable pageable) { + return postDistrictRepository.findByPostCategory(category, pageable); + } } diff --git a/src/main/java/com/seoultech/sanEseo/post_district/adapter/PostDistrictController.java b/src/main/java/com/seoultech/sanEseo/post_district/adapter/PostDistrictController.java index 5dd8a11..6a7baaf 100644 --- a/src/main/java/com/seoultech/sanEseo/post_district/adapter/PostDistrictController.java +++ b/src/main/java/com/seoultech/sanEseo/post_district/adapter/PostDistrictController.java @@ -32,14 +32,14 @@ public ResponseEntity getPostDistrict(@PathVariable Long districtId) { } //전체 게시글 조회 -// @GetMapping("/posts") -// public ResponseEntity getAllPostDistrictByCategory(@RequestParam(value = "page", defaultValue = "0") int page, -// @RequestParam(value = "size", defaultValue = "10") int size, -// @RequestParam(value = "category", required = true) int category) { -// Pageable pageable = PageRequest.of(page, size); -// Slice responses = (Slice) postDistrictService.getAllPostDistrict(pageable, category); -// return ApiResponse.ok("전체 게시글 목록 조회 성공", responses); -// } + @GetMapping("/posts") + public ResponseEntity getAllPostDistrictByCategory(@RequestParam(value = "page", defaultValue = "0") int page, + @RequestParam(value = "size", defaultValue = "12") int size, + @RequestParam(value = "category", defaultValue = "1") int category) { + Pageable pageable = PageRequest.of(page, size); + List responses = postDistrictService.getAllPostDistrict(pageable, category); + return ApiResponse.ok("전체 게시글 목록 조회 성공", responses); + } //좋아요 순으로 정렬된 게시글 조회 @GetMapping("/posts/{category}/sorted-by-likes") diff --git a/src/main/java/com/seoultech/sanEseo/post_district/adapter/PostDistrictRepository.java b/src/main/java/com/seoultech/sanEseo/post_district/adapter/PostDistrictRepository.java index c8016c0..175d4dd 100644 --- a/src/main/java/com/seoultech/sanEseo/post_district/adapter/PostDistrictRepository.java +++ b/src/main/java/com/seoultech/sanEseo/post_district/adapter/PostDistrictRepository.java @@ -16,7 +16,7 @@ public interface PostDistrictRepository extends JpaRepository findByPostCategory(Category category); -// Slice findByCategory(Category category, Pageable pageable); + Slice findByPostCategory(Category category, Pageable pageable); } diff --git a/src/main/java/com/seoultech/sanEseo/post_district/application/port/PostDistrictPort.java b/src/main/java/com/seoultech/sanEseo/post_district/application/port/PostDistrictPort.java index 0591b2d..a06bdf3 100644 --- a/src/main/java/com/seoultech/sanEseo/post_district/application/port/PostDistrictPort.java +++ b/src/main/java/com/seoultech/sanEseo/post_district/application/port/PostDistrictPort.java @@ -22,5 +22,5 @@ public interface PostDistrictPort { List findByPostCategory(Category category); -// Slice findByCategory(Category category, Pageable pageable); + Slice findByPostCategory(Category category, Pageable pageable); } diff --git a/src/main/java/com/seoultech/sanEseo/post_district/application/service/PostDistrictService.java b/src/main/java/com/seoultech/sanEseo/post_district/application/service/PostDistrictService.java index 76932b7..12dd504 100644 --- a/src/main/java/com/seoultech/sanEseo/post_district/application/service/PostDistrictService.java +++ b/src/main/java/com/seoultech/sanEseo/post_district/application/service/PostDistrictService.java @@ -47,12 +47,14 @@ public List getPostDistrict(Long districtId) { return getPostDistrictResponses(postDistricts); } -// public List getAllPostDistrict(Pageable pageable, int category) { -// Category categoryEnum = Category.from(category); -// Slice postDistricts = postDistrictPort.findByCategory(categoryEnum, pageable); -// -// return getPostDistrictResponses(postDistricts); -// } + public List getAllPostDistrict(Pageable pageable, int category) { + Category categoryEnum = Category.from(category); + Slice postDistrictsSlice = postDistrictPort.findByPostCategory(categoryEnum, pageable); + + // Slice의 실제 내용을 리스트로 변환하고, 응답 DTO 생성 + List postDistricts = postDistrictsSlice.getContent(); + return getPostDistrictResponses(postDistricts); + } public List getPostByLikesSortedDesc(int category) { @@ -93,25 +95,5 @@ private List getPostDistrictResponses(List getPostDistrictResponses(Slice postDistricts) { - List responses = postDistricts.stream().map(postDistrict -> { - Post post = postDistrict.getPost(); - List images = imageService.getPostImages(post.getId()); - List imageResponses = images.stream().map(image -> new GetImageResponse(image.getImageUrl())).collect(Collectors.toList()); - int likeCount = likeService.getLikeCount(post.getId()); - return new GetPostDistrictResponse( - post.getId(), - imageResponses, - post.getTitle(), - post.getSubTitle(), - post.getTime(), - likeCount, // 가정: Post 엔티티에 좋아요 수를 반환하는 getLikes() 메소드가 있음 - post.getDistance(), - post.getLevel(), - postDistrict.getDistrict().getName() - ); - }).collect(Collectors.toList()); - return responses; - } } From 5c75fed1b4d5da1b84cd86b2af2a04df7345bbe9 Mon Sep 17 00:00:00 2001 From: Hong-Mu Date: Tue, 30 Apr 2024 15:44:58 +0900 Subject: [PATCH 4/6] =?UTF-8?q?fix:=20=EC=A2=8B=EC=95=84=EC=9A=A9=20?= =?UTF-8?q?=EB=B0=8F=20=EB=A6=AC=EB=B7=B0=20API=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/config/jwt/JwtAuthenticationFilter.java | 7 ++++++- .../sanEseo/global/config/jwt/JwtExceptionFilter.java | 2 ++ .../sanEseo/global/exception/GlobalExceptionHandler.java | 5 +++++ .../seoultech/sanEseo/global/response/ApiResponse.java | 8 -------- .../seoultech/sanEseo/like/adapter/LikeController.java | 8 ++++---- .../sanEseo/like/application/service/AddLikeRequest.java | 9 ++++----- .../sanEseo/review/adapter/ReviewController.java | 4 ++-- 7 files changed, 23 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/seoultech/sanEseo/global/config/jwt/JwtAuthenticationFilter.java b/src/main/java/com/seoultech/sanEseo/global/config/jwt/JwtAuthenticationFilter.java index f64e682..a5ba43d 100644 --- a/src/main/java/com/seoultech/sanEseo/global/config/jwt/JwtAuthenticationFilter.java +++ b/src/main/java/com/seoultech/sanEseo/global/config/jwt/JwtAuthenticationFilter.java @@ -51,7 +51,12 @@ protected boolean shouldNotFilter(HttpServletRequest request) { skipPathList.add(new AntPathRequestMatcher("/api/auth/token/refresh", HttpMethod.POST.name())); skipPathList.add(new AntPathRequestMatcher("/api/oauth/kakao", HttpMethod.GET.name())); skipPathList.add(new AntPathRequestMatcher("/api/weather", HttpMethod.GET.name())); - skipPathList.add(new AntPathRequestMatcher("/api/posts/**", HttpMethod.GET.name())); + skipPathList.add(new AntPathRequestMatcher("/api/posts", HttpMethod.POST.name())); + skipPathList.add(new AntPathRequestMatcher("/api/posts", HttpMethod.PUT.name())); + skipPathList.add(new AntPathRequestMatcher("/api/posts", HttpMethod.DELETE.name())); + skipPathList.add(new AntPathRequestMatcher("/api/posts/*/likes", HttpMethod.GET.name())); + skipPathList.add(new AntPathRequestMatcher("/api/posts/*/reviews", HttpMethod.GET.name())); + skipPathList.add(new AntPathRequestMatcher("/api/districts/**", HttpMethod.GET.name())); skipPathList.add(new AntPathRequestMatcher("/h2-console/**")); diff --git a/src/main/java/com/seoultech/sanEseo/global/config/jwt/JwtExceptionFilter.java b/src/main/java/com/seoultech/sanEseo/global/config/jwt/JwtExceptionFilter.java index 8dd1aa5..6924614 100644 --- a/src/main/java/com/seoultech/sanEseo/global/config/jwt/JwtExceptionFilter.java +++ b/src/main/java/com/seoultech/sanEseo/global/config/jwt/JwtExceptionFilter.java @@ -36,9 +36,11 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse filterChain.doFilter(request, response); } catch (BusinessException e) { errorLoggerHelper.log(wrapper, e.getErrorType(), e.getMessage()); + e.printStackTrace(); setErrorResponse(e.getErrorType(), e.getMessage(), response); } catch (Exception e) { errorLoggerHelper.log(wrapper, ErrorType.INTERNAL_ERROR, e.getMessage()); + e.printStackTrace(); setErrorResponse(ErrorType.INTERNAL_ERROR, "서버 에러 ", response); } } diff --git a/src/main/java/com/seoultech/sanEseo/global/exception/GlobalExceptionHandler.java b/src/main/java/com/seoultech/sanEseo/global/exception/GlobalExceptionHandler.java index 6401f91..2b5e017 100644 --- a/src/main/java/com/seoultech/sanEseo/global/exception/GlobalExceptionHandler.java +++ b/src/main/java/com/seoultech/sanEseo/global/exception/GlobalExceptionHandler.java @@ -29,24 +29,28 @@ public class GlobalExceptionHandler { @ExceptionHandler(BusinessException.class) public ResponseEntity handleBusinessException(BusinessException e, RequestWrapper request) throws IOException { errorLoggerHelper.log(request, e.getErrorType(), e.getMessage()); + e.printStackTrace(); return ApiResponse.fail(e.getErrorType(), e.getMessage()); } @ExceptionHandler(ConstraintViolationException.class) public ResponseEntity handleConstraintViolationException(ConstraintViolationException e, RequestWrapper request) throws IOException { errorLoggerHelper.log(request, ErrorType.INVALID_INPUT_VALUE, e.getMessage()); + e.printStackTrace(); return ApiResponse.fail(ErrorType.INVALID_INPUT_VALUE, "잘못된 값입니다."); } @ExceptionHandler(EntityNotFoundException.class) public ResponseEntity handleEntityNotFoundException(EntityNotFoundException e, RequestWrapper request) throws IOException { errorLoggerHelper.log(request, ErrorType.ENTITY_NOT_FOUND, e.getMessage()); + e.printStackTrace(); return ApiResponse.fail(ErrorType.ENTITY_NOT_FOUND, e.getMessage()); } @ExceptionHandler(MethodArgumentNotValidException.class) public ResponseEntity handleIllegalArgumentException(MethodArgumentNotValidException e, RequestWrapper request) throws IOException { errorLoggerHelper.log(request, ErrorType.INVALID_INPUT_VALUE, e.getBindingResult().getAllErrors().get(0).getDefaultMessage()); + e.printStackTrace(); return ApiResponse.fail(ErrorType.INVALID_INPUT_VALUE, e.getBindingResult().getAllErrors().get(0).getDefaultMessage()); } @@ -54,6 +58,7 @@ public ResponseEntity handleIllegalArgumentException(MethodArgumentNotValidEx @ExceptionHandler(Exception.class) public ResponseEntity handleException(Exception e, RequestWrapper request) throws IOException { errorLoggerHelper.log(request, ErrorType.INTERNAL_ERROR, e.getMessage()); + e.printStackTrace(); return ApiResponse.fail(ErrorType.INTERNAL_ERROR, "내부 서버 오류가 발생했습니다."); } } diff --git a/src/main/java/com/seoultech/sanEseo/global/response/ApiResponse.java b/src/main/java/com/seoultech/sanEseo/global/response/ApiResponse.java index 936ef47..d572315 100644 --- a/src/main/java/com/seoultech/sanEseo/global/response/ApiResponse.java +++ b/src/main/java/com/seoultech/sanEseo/global/response/ApiResponse.java @@ -13,18 +13,10 @@ public static ResponseEntity ok(String message){ } public static ResponseEntity ok(String message, Object data){ - if (data instanceof Collection && ((Collection) data).isEmpty()) { - return noContent(message); // 데이터가 없을 때 적절한 응답 반환 - } SuccessResponse response = new SuccessResponse(message, data); return ResponseEntity.ok(response); } - public static ResponseEntity noContent(String message) { - // HTTP 204 No Content 상태와 함께 메시지 반환 - return ResponseEntity.noContent().header("X-Message", message).build(); - } - public static ResponseEntity fail(ErrorType errorType, String message){ FailResponse response = new FailResponse(message, errorType.getErrorCode()); return ResponseEntity.status(errorType.getStatusCode()).body(response); diff --git a/src/main/java/com/seoultech/sanEseo/like/adapter/LikeController.java b/src/main/java/com/seoultech/sanEseo/like/adapter/LikeController.java index b4c2a87..b9b6622 100644 --- a/src/main/java/com/seoultech/sanEseo/like/adapter/LikeController.java +++ b/src/main/java/com/seoultech/sanEseo/like/adapter/LikeController.java @@ -25,7 +25,7 @@ public ResponseEntity addLike(@LoginMember AuthMember member, @RequestBody Ad return ApiResponse.ok("좋아요가 추가되었습니다."); } - @DeleteMapping("/posts/{postId}/members/{memberId}/likes") + @DeleteMapping("/posts/{postId}/members/likes") public ResponseEntity deleteLike(@LoginMember AuthMember member, @PathVariable Long postId) { likeService.deleteLike(postId, member.getId()); return ApiResponse.ok("좋아요가 삭제되었습니다."); @@ -37,9 +37,9 @@ public ResponseEntity getLikeCount(@PathVariable Long postId) { return ApiResponse.ok("좋아요 수 조회 성공", new GetLikeResponse(postId, likeCount)); } - @GetMapping("/posts/{postId}/members/{memberId}/likes") - public ResponseEntity hasMemberLikedPost(@PathVariable Long postId, @PathVariable Long memberId) { - boolean hasLiked = likeService.hasMemberLikedPost(memberId, postId); + @GetMapping("/posts/{postId}/members/likes") + public ResponseEntity hasMemberLikedPost(@LoginMember AuthMember authMember, @PathVariable Long postId) { + boolean hasLiked = likeService.hasMemberLikedPost(authMember.getId(), postId); return ApiResponse.ok("좋아요 여부 조회 성공", hasLiked); } diff --git a/src/main/java/com/seoultech/sanEseo/like/application/service/AddLikeRequest.java b/src/main/java/com/seoultech/sanEseo/like/application/service/AddLikeRequest.java index 7234c3a..0e99d69 100644 --- a/src/main/java/com/seoultech/sanEseo/like/application/service/AddLikeRequest.java +++ b/src/main/java/com/seoultech/sanEseo/like/application/service/AddLikeRequest.java @@ -2,15 +2,14 @@ import jakarta.validation.constraints.NotNull; +import lombok.AllArgsConstructor; import lombok.Getter; +import lombok.NoArgsConstructor; @Getter +@NoArgsConstructor +@AllArgsConstructor public class AddLikeRequest { @NotNull(message = "포스트 ID는 필수입니다.") private Long postId; - - // 모든 매개변수를 가진 생성자 - public AddLikeRequest(Long postId) { - this.postId = postId; - } } \ No newline at end of file diff --git a/src/main/java/com/seoultech/sanEseo/review/adapter/ReviewController.java b/src/main/java/com/seoultech/sanEseo/review/adapter/ReviewController.java index 41eb255..669b1c9 100644 --- a/src/main/java/com/seoultech/sanEseo/review/adapter/ReviewController.java +++ b/src/main/java/com/seoultech/sanEseo/review/adapter/ReviewController.java @@ -30,13 +30,13 @@ public ResponseEntity createReview(@LoginMember AuthMember authMember, @Reque return ApiResponse.ok("리뷰가 성공적으로 생성되었습니다."); } - @DeleteMapping("/posts/{postId}/members/{memberId}/reviews") + @DeleteMapping("/posts/{postId}/members/reviews") public ResponseEntity deleteReview(@LoginMember AuthMember authMember, @PathVariable Long postId) { reviewService.deleteReview(postId, authMember.getId()); return ApiResponse.ok("리뷰가 성공적으로 삭제되었습니다."); } - @PutMapping("/posts/{postId}/members/{memberId}/reviews") + @PutMapping("/posts/{postId}/members/reviews") public ResponseEntity updateReview(@LoginMember AuthMember authMember, @PathVariable Long postId, @RequestBody UpdateReviewRequest request) { reviewService.updateReview(postId, authMember.getId(), request); return ApiResponse.ok("리뷰가 성공적으로 업데이트되었습니다."); From 49464ebbb9b2b116c653728ce40dc90fd0f8a966 Mon Sep 17 00:00:00 2001 From: changha Date: Tue, 30 Apr 2024 16:38:14 +0900 Subject: [PATCH 5/6] =?UTF-8?q?feat:=20=EA=B2=8C=EC=8B=9C=EA=B8=80=20?= =?UTF-8?q?=EC=83=9D=EC=84=B1=EC=8B=9C=20=EC=A2=8C=ED=91=9C=20=EB=8D=B0?= =?UTF-8?q?=EC=9D=B4=ED=84=B0=20=EC=B6=94=EA=B0=80=20=EC=99=84=EB=A3=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/service/AddPostRequest.java | 8 ++++- .../application/service/GetPostResponse.java | 2 +- .../post/application/service/PostService.java | 11 +++++-- .../sanEseo/public_api/Coordinate.java | 12 +++---- .../sanEseo/public_api/CoordinateService.java | 6 ++-- .../public_api/GetCoordinateResponse.java | 4 +-- .../public_api/GetGeometryResponse.java | 2 +- .../seoultech/sanEseo/public_api/LatLng.java | 33 +++++++++++++++++++ .../sanEseo/public_api/PublicDataService.java | 16 ++++----- 9 files changed, 64 insertions(+), 30 deletions(-) create mode 100644 src/main/java/com/seoultech/sanEseo/public_api/LatLng.java diff --git a/src/main/java/com/seoultech/sanEseo/post/application/service/AddPostRequest.java b/src/main/java/com/seoultech/sanEseo/post/application/service/AddPostRequest.java index 526469c..c9e1fa2 100644 --- a/src/main/java/com/seoultech/sanEseo/post/application/service/AddPostRequest.java +++ b/src/main/java/com/seoultech/sanEseo/post/application/service/AddPostRequest.java @@ -2,6 +2,8 @@ import com.seoultech.sanEseo.post.domain.Category; import com.seoultech.sanEseo.image.PostImage; +import com.seoultech.sanEseo.public_api.GetCoordinateResponse; +import com.seoultech.sanEseo.public_api.GetGeometryResponse; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.Getter; @@ -40,9 +42,12 @@ public class AddPostRequest { @NotNull(message = "자치구 ID는 필수입니다.") private Long districtId; + @NotNull(message = "좌표 정보는 필수입니다.") + private GetGeometryResponse geometry; + // 생성자, 게터, 세터 등 추가 필요 - public AddPostRequest(Category category, String title, String subTitle, String description, String level, String time, String distance, String courseDetail, String transportation, Long districtId) { + public AddPostRequest(Category category, String title, String subTitle, String description, String level, String time, String distance, String courseDetail, String transportation, Long districtId, GetGeometryResponse geometry) { this.category = category; this.title = title; this.subTitle = subTitle; @@ -53,5 +58,6 @@ public AddPostRequest(Category category, String title, String subTitle, String d this.courseDetail = courseDetail; this.transportation = transportation; this.districtId = districtId; + this.geometry = geometry; } } \ No newline at end of file diff --git a/src/main/java/com/seoultech/sanEseo/post/application/service/GetPostResponse.java b/src/main/java/com/seoultech/sanEseo/post/application/service/GetPostResponse.java index 0dfd947..0f1927e 100644 --- a/src/main/java/com/seoultech/sanEseo/post/application/service/GetPostResponse.java +++ b/src/main/java/com/seoultech/sanEseo/post/application/service/GetPostResponse.java @@ -5,7 +5,7 @@ import org.springframework.util.Assert; public record GetPostResponse(Long id, Category category, String title, String subTitle, String description, String level, String time, - String distance, String courseDetail, String transportation, String districtName, GetCoordinateResponse coordinate) { + String distance, String courseDetail, String transportation, String districtName, GetCoordinateResponse geometry) { public GetPostResponse { Assert.hasText(title, "제목은 필수입니다."); diff --git a/src/main/java/com/seoultech/sanEseo/post/application/service/PostService.java b/src/main/java/com/seoultech/sanEseo/post/application/service/PostService.java index 4dafb96..3c5d90c 100644 --- a/src/main/java/com/seoultech/sanEseo/post/application/service/PostService.java +++ b/src/main/java/com/seoultech/sanEseo/post/application/service/PostService.java @@ -8,6 +8,7 @@ import com.seoultech.sanEseo.post_district.application.port.PostDistrictPort; import com.seoultech.sanEseo.public_api.CoordinateService; import com.seoultech.sanEseo.public_api.GetCoordinateResponse; +import com.seoultech.sanEseo.public_api.GetGeometryResponse; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -22,6 +23,7 @@ public class PostService { private final PostDistrictPort postDistrictPort; private final CoordinateService coordinateService; + public PostService(PostPort postPort, DistrictPort districtPort, PostDistrictPort postDistrictPort, CoordinateService coordinateService) { this.postPort = postPort; this.districtPort = districtPort; @@ -43,6 +45,9 @@ public Post addPost(AddPostRequest request) { request.getLevel(), request.getTime(), request.getDistance(), request.getCourseDetail(), request.getTransportation()); + GetGeometryResponse geometry = request.getGeometry(); + coordinateService.saveCoordinate(geometry, post); + postPort.save(post); // Post 저장 // 관련 District와 PostDistrict 관계 설정 @@ -60,13 +65,13 @@ public GetPostResponse getPost(Long postId) { Post post = postPort.getPost(postId); List postDistrictList = postDistrictPort.findByPostId(postId); String postDistrictName = postDistrictList.get(0).getDistrict().getName(); - GetCoordinateResponse coordinate = coordinateService.getCoordinateResponse(post); + GetCoordinateResponse geometry = coordinateService.getCoordinateResponse(post); return new GetPostResponse( post.getId(), post.getCategory(), post.getTitle(), post.getSubTitle(), post.getDescription(), post.getLevel(), post.getTime(), post.getDistance(),post.getCourseDetail(), post.getTransportation(), postDistrictName - ,coordinate + , geometry ); } @@ -96,7 +101,7 @@ public void deletePost(Long postId) { postDistrictPort.deleteAll(relations); postPort.deletePost(postId); - } + } diff --git a/src/main/java/com/seoultech/sanEseo/public_api/Coordinate.java b/src/main/java/com/seoultech/sanEseo/public_api/Coordinate.java index d25a1fd..41fbc66 100644 --- a/src/main/java/com/seoultech/sanEseo/public_api/Coordinate.java +++ b/src/main/java/com/seoultech/sanEseo/public_api/Coordinate.java @@ -19,22 +19,18 @@ public class Coordinate { private Long id; private String name; - private String lat; - private String lng; private String type; - @Convert(converter = CoordinatesConverter.class) - @Column(columnDefinition = "TEXT") - private List> coordinates; + @ElementCollection + @CollectionTable(name = "coordinate_points", joinColumns = @JoinColumn(name = "coordinate_id")) + private List coordinates; @OneToOne @JoinColumn(name = "post_id") private Post post; - public Coordinate(String name, String lat, String lng, String type, List> coordinates, Post post) { + public Coordinate(String name, String type, List coordinates, Post post) { this.name = name; - this.lat = lat; - this.lng = lng; this.type = type; this.coordinates = coordinates; this.post = post; diff --git a/src/main/java/com/seoultech/sanEseo/public_api/CoordinateService.java b/src/main/java/com/seoultech/sanEseo/public_api/CoordinateService.java index a6b26ed..a8f2cba 100644 --- a/src/main/java/com/seoultech/sanEseo/public_api/CoordinateService.java +++ b/src/main/java/com/seoultech/sanEseo/public_api/CoordinateService.java @@ -12,11 +12,9 @@ public class CoordinateService { private CoordinateRepository coordinateRepository; @Transactional - public void saveCoordinate(GetLinearResponse linearResponse, GetGeometryResponse geometryResponse, Post post) { + public void saveCoordinate(GetGeometryResponse geometryResponse, Post post) { Coordinate coordinate = new Coordinate( geometryResponse.getName(), - linearResponse.getLat(), // 예시로 첫번째 좌표의 위도를 저장 - linearResponse.getLng(), // 예시로 첫번째 좌표의 경도를 저장 geometryResponse.getType(), geometryResponse.getCoordinates(), post); @@ -25,6 +23,6 @@ public void saveCoordinate(GetLinearResponse linearResponse, GetGeometryResponse public GetCoordinateResponse getCoordinateResponse(Post post) { Coordinate byPost = coordinateRepository.findByPost(post); - return new GetCoordinateResponse(byPost.getLat(), byPost.getLng(), byPost.getType(), byPost.getCoordinates()); + return new GetCoordinateResponse(byPost.getType(), byPost.getCoordinates()); } } \ No newline at end of file diff --git a/src/main/java/com/seoultech/sanEseo/public_api/GetCoordinateResponse.java b/src/main/java/com/seoultech/sanEseo/public_api/GetCoordinateResponse.java index 8e4932d..e9a435c 100644 --- a/src/main/java/com/seoultech/sanEseo/public_api/GetCoordinateResponse.java +++ b/src/main/java/com/seoultech/sanEseo/public_api/GetCoordinateResponse.java @@ -10,8 +10,6 @@ @AllArgsConstructor public class GetCoordinateResponse { - String lat; - String lng; String type; - List> coordinates; + List coordinates; } diff --git a/src/main/java/com/seoultech/sanEseo/public_api/GetGeometryResponse.java b/src/main/java/com/seoultech/sanEseo/public_api/GetGeometryResponse.java index b1e19a4..2e8e709 100644 --- a/src/main/java/com/seoultech/sanEseo/public_api/GetGeometryResponse.java +++ b/src/main/java/com/seoultech/sanEseo/public_api/GetGeometryResponse.java @@ -12,5 +12,5 @@ public class GetGeometryResponse { private String type; private String name; - private List> coordinates; + private List coordinates; } diff --git a/src/main/java/com/seoultech/sanEseo/public_api/LatLng.java b/src/main/java/com/seoultech/sanEseo/public_api/LatLng.java new file mode 100644 index 0000000..917d4d2 --- /dev/null +++ b/src/main/java/com/seoultech/sanEseo/public_api/LatLng.java @@ -0,0 +1,33 @@ +package com.seoultech.sanEseo.public_api; + +import jakarta.persistence.Embeddable; + +@Embeddable +public class LatLng { + private double lat; + private double lng; + + public LatLng() {} + + public LatLng(double lat, double lng) { + this.lat = lat; + this.lng = lng; + } + + // Getter and Setter + public double getLat() { + return lat; + } + + public void setLat(double lat) { + this.lat = lat; + } + + public double getLng() { + return lng; + } + + public void setLng(double lng) { + this.lng = lng; + } +} \ No newline at end of file diff --git a/src/main/java/com/seoultech/sanEseo/public_api/PublicDataService.java b/src/main/java/com/seoultech/sanEseo/public_api/PublicDataService.java index 2788023..2cfab7f 100644 --- a/src/main/java/com/seoultech/sanEseo/public_api/PublicDataService.java +++ b/src/main/java/com/seoultech/sanEseo/public_api/PublicDataService.java @@ -117,16 +117,14 @@ public List parsingCoordinate(int dataIndex) { for (Feature feature : featureCollection.getFeatures()) { MultiLineString multiLineString = (MultiLineString) feature.getGeometry(); String name = feature.getProperty("NAME"); - List> coordinate_list = new ArrayList<>(); for (List coordinates : multiLineString.getCoordinates()) { + List latLngList = new ArrayList<>(); for (LngLatAlt lngLatAlt : coordinates) { - double latitude = lngLatAlt.getLatitude(); double longitude = lngLatAlt.getLongitude(); - coordinate_list.add(List.of(latitude, longitude)); - + latLngList.add(new LatLng(latitude, longitude)); } - responses.add(new GetGeometryResponse("polyline", name, coordinate_list)); + responses.add(new GetGeometryResponse("polyline", name, latLngList)); } } } catch (IOException e) { @@ -171,11 +169,11 @@ public void addPublicData(int dataIndex){ safeSubstring(getCourseResponse.getDescription(), 0, 255), getCourseResponse.getLevel(), getCourseResponse.getTime(), getCourseResponse.getDistance(), safeSubstring(getCourseResponse.getCourseDetail(), 0 ,255), - getCourseResponse.getTransportation(), id)); + getCourseResponse.getTransportation(), id, getGeometryResponse)); - if (post != null){ - coordinateService.saveCoordinate(getLinearResponse, getGeometryResponse, post); - } +// if (post != null){ +// coordinateService.saveCoordinate(getGeometryResponse, post); +// } } } } From d4dd7e097fed5f076341b0f4f64c36868366491d Mon Sep 17 00:00:00 2001 From: changha Date: Tue, 30 Apr 2024 17:30:58 +0900 Subject: [PATCH 6/6] =?UTF-8?q?bugfix:=20enum=20index=EB=A7=9E=EC=B6=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../post/application/service/PostService.java | 7 +++++ .../service/UpdatePostRequest.java | 11 ++++--- .../sanEseo/post/domain/Category.java | 30 ++++++++++++------- .../service/PostDistrictService.java | 2 ++ .../sanEseo/public_api/Coordinate.java | 15 ++++++++++ .../sanEseo/public_api/CoordinateService.java | 5 ++++ .../public_api/CoordinatesConverter.java | 8 ++--- 7 files changed, 60 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/seoultech/sanEseo/post/application/service/PostService.java b/src/main/java/com/seoultech/sanEseo/post/application/service/PostService.java index 3c5d90c..9ac640e 100644 --- a/src/main/java/com/seoultech/sanEseo/post/application/service/PostService.java +++ b/src/main/java/com/seoultech/sanEseo/post/application/service/PostService.java @@ -6,6 +6,7 @@ import com.seoultech.sanEseo.post.domain.Post; import com.seoultech.sanEseo.post_district.domain.PostDistrict; import com.seoultech.sanEseo.post_district.application.port.PostDistrictPort; +import com.seoultech.sanEseo.public_api.Coordinate; import com.seoultech.sanEseo.public_api.CoordinateService; import com.seoultech.sanEseo.public_api.GetCoordinateResponse; import com.seoultech.sanEseo.public_api.GetGeometryResponse; @@ -78,6 +79,12 @@ public GetPostResponse getPost(Long postId) { @Transactional public void updatePost(Long postId, UpdatePostRequest request) { Post post = postPort.getPost(postId); + + // 좌표 정보 업데이트 + Coordinate coordinate = coordinateService.findCoordinate(post); + coordinate.update(request.getGeometry().getName(), request.getGeometry().getType(), request.getGeometry()); + + // 게시글 정보 업데이트 post.update( request.getCategory(), request.getTitle(), request.getSubTitle(), request.getDescription(), request.getLevel(), request.getTime(), diff --git a/src/main/java/com/seoultech/sanEseo/post/application/service/UpdatePostRequest.java b/src/main/java/com/seoultech/sanEseo/post/application/service/UpdatePostRequest.java index d432ea3..3dad015 100644 --- a/src/main/java/com/seoultech/sanEseo/post/application/service/UpdatePostRequest.java +++ b/src/main/java/com/seoultech/sanEseo/post/application/service/UpdatePostRequest.java @@ -2,14 +2,14 @@ import com.seoultech.sanEseo.post.domain.Category; import com.seoultech.sanEseo.image.PostImage; +import com.seoultech.sanEseo.public_api.GetGeometryResponse; import jakarta.validation.constraints.NotBlank; import jakarta.validation.constraints.NotNull; import lombok.Getter; import java.util.List; @Getter -public class UpdatePostRequest { // 자료형과 변수명 변경 - +public class UpdatePostRequest { @NotNull(message = "카테고리는 필수입니다.") private Category category; @@ -37,14 +37,16 @@ public class UpdatePostRequest { // 자료형과 변수명 변경 @NotBlank(message = "교통수단은 필수입니다.") private String transportation; - @NotNull(message = "이미지는 필수입니다.") private List images; @NotNull(message = "자치구 ID는 필수입니다.") private Long districtId; - public UpdatePostRequest(Category category, String title, String subTitle, String description, String level, String time, String distance, String courseDetail, String transportation, List images, Long districtId) { + @NotNull(message = "좌표 정보는 필수입니다.") + private GetGeometryResponse geometry; + + public UpdatePostRequest(Category category, String title, String subTitle, String description, String level, String time, String distance, String courseDetail, String transportation, List images, Long districtId, GetGeometryResponse geometry) { this.category = category; this.title = title; this.subTitle = subTitle; @@ -56,5 +58,6 @@ public UpdatePostRequest(Category category, String title, String subTitle, Strin this.transportation = transportation; this.images = images; this.districtId = districtId; + this.geometry = geometry; } } diff --git a/src/main/java/com/seoultech/sanEseo/post/domain/Category.java b/src/main/java/com/seoultech/sanEseo/post/domain/Category.java index 1d14e6f..1c768b3 100644 --- a/src/main/java/com/seoultech/sanEseo/post/domain/Category.java +++ b/src/main/java/com/seoultech/sanEseo/post/domain/Category.java @@ -1,17 +1,27 @@ package com.seoultech.sanEseo.post.domain; +import com.fasterxml.jackson.annotation.JsonValue; + public enum Category { - DODREAM, CUSTOM; + DODREAM(0), CUSTOM(1); - public static Category from(int category) { - if (category == 1) { - return DODREAM; - } else if (category == 2) { - return CUSTOM; - } else { - throw new IllegalArgumentException("Unknown category: " + category); - } + private final int value; + + Category(int value) { + this.value = value; } + @JsonValue + public int getValue() { + return value; + } -} + public static Category from(int value) { + for (Category category : values()) { + if (category.getValue() == value) { + return category; + } + } + throw new IllegalArgumentException("Unknown category value: " + value); + } +} \ No newline at end of file diff --git a/src/main/java/com/seoultech/sanEseo/post_district/application/service/PostDistrictService.java b/src/main/java/com/seoultech/sanEseo/post_district/application/service/PostDistrictService.java index 12dd504..d89e8d1 100644 --- a/src/main/java/com/seoultech/sanEseo/post_district/application/service/PostDistrictService.java +++ b/src/main/java/com/seoultech/sanEseo/post_district/application/service/PostDistrictService.java @@ -49,7 +49,9 @@ public List getPostDistrict(Long districtId) { public List getAllPostDistrict(Pageable pageable, int category) { Category categoryEnum = Category.from(category); + System.out.println("categoryEnum = " + categoryEnum); Slice postDistrictsSlice = postDistrictPort.findByPostCategory(categoryEnum, pageable); + System.out.println("postDistrictsSlice = " + postDistrictsSlice.getContent()); // Slice의 실제 내용을 리스트로 변환하고, 응답 DTO 생성 List postDistricts = postDistrictsSlice.getContent(); diff --git a/src/main/java/com/seoultech/sanEseo/public_api/Coordinate.java b/src/main/java/com/seoultech/sanEseo/public_api/Coordinate.java index 41fbc66..6b29cff 100644 --- a/src/main/java/com/seoultech/sanEseo/public_api/Coordinate.java +++ b/src/main/java/com/seoultech/sanEseo/public_api/Coordinate.java @@ -7,6 +7,7 @@ import lombok.Getter; import lombok.NoArgsConstructor; +import java.util.ArrayList; import java.util.List; @Entity @@ -35,4 +36,18 @@ public Coordinate(String name, String type, List coordinates, Post post) this.coordinates = coordinates; this.post = post; } + public void update(String name, String type, GetGeometryResponse geometry) { + this.name = name; + this.type = type; + this.coordinates = convertGeometryToLatLngList(geometry); + } + + private List convertGeometryToLatLngList(GetGeometryResponse geometry) { + // geometry의 coordinates를 List로 변환하는 로직 + List newCoordinates = new ArrayList<>(); + for (LatLng coordinatePair : geometry.getCoordinates()) { + newCoordinates.add(new LatLng(coordinatePair.getLat(), coordinatePair.getLng())); + } + return newCoordinates; + } } \ No newline at end of file diff --git a/src/main/java/com/seoultech/sanEseo/public_api/CoordinateService.java b/src/main/java/com/seoultech/sanEseo/public_api/CoordinateService.java index a8f2cba..4ae1878 100644 --- a/src/main/java/com/seoultech/sanEseo/public_api/CoordinateService.java +++ b/src/main/java/com/seoultech/sanEseo/public_api/CoordinateService.java @@ -25,4 +25,9 @@ public GetCoordinateResponse getCoordinateResponse(Post post) { Coordinate byPost = coordinateRepository.findByPost(post); return new GetCoordinateResponse(byPost.getType(), byPost.getCoordinates()); } + + // coordinate찾기 + public Coordinate findCoordinate(Post post) { + return coordinateRepository.findByPost(post); + } } \ No newline at end of file diff --git a/src/main/java/com/seoultech/sanEseo/public_api/CoordinatesConverter.java b/src/main/java/com/seoultech/sanEseo/public_api/CoordinatesConverter.java index dfd51b6..004620e 100644 --- a/src/main/java/com/seoultech/sanEseo/public_api/CoordinatesConverter.java +++ b/src/main/java/com/seoultech/sanEseo/public_api/CoordinatesConverter.java @@ -9,11 +9,11 @@ import java.util.List; @Converter -public class CoordinatesConverter implements AttributeConverter>, String> { +public class CoordinatesConverter implements AttributeConverter, String> { private final static ObjectMapper objectMapper = new ObjectMapper(); @Override - public String convertToDatabaseColumn(List> attribute) { + public String convertToDatabaseColumn(List attribute) { try { return objectMapper.writeValueAsString(attribute); } catch (IOException e) { @@ -22,9 +22,9 @@ public String convertToDatabaseColumn(List> attribute) { } @Override - public List> convertToEntityAttribute(String dbData) { + public List convertToEntityAttribute(String dbData) { try { - return objectMapper.readValue(dbData, new TypeReference>>() {}); + return objectMapper.readValue(dbData, new TypeReference>() {}); } catch (IOException e) { throw new RuntimeException("Conversion error", e); }