From 6a7619b813da1de8b6220fd38d0036572123e071 Mon Sep 17 00:00:00 2001 From: jungeun Date: Mon, 5 Aug 2024 17:02:59 +0900 Subject: [PATCH 1/3] =?UTF-8?q?feat=20:=20GetSocialringSearchResponse=20dt?= =?UTF-8?q?o=20=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../GetSocialringSearchResponse.java | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 src/main/java/com/example/likelion12/dto/socialring/GetSocialringSearchResponse.java diff --git a/src/main/java/com/example/likelion12/dto/socialring/GetSocialringSearchResponse.java b/src/main/java/com/example/likelion12/dto/socialring/GetSocialringSearchResponse.java new file mode 100644 index 0000000..8aec2ae --- /dev/null +++ b/src/main/java/com/example/likelion12/dto/socialring/GetSocialringSearchResponse.java @@ -0,0 +1,23 @@ +package com.example.likelion12.dto.socialring; + +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.time.LocalDate; +import java.util.List; + +@AllArgsConstructor +@Data +public class GetSocialringSearchResponse { + + private long socialringId; + private String socialringName; + private String socialringImg; + private int totalRecruits; + private int currentMembers; + private LocalDate socialringDate; + private int socialringCost; + private String commentSimple; + private String ActivityRegionName; + +} From b16513805931e3fef4e345350805f74160315244 Mon Sep 17 00:00:00 2001 From: jungeun Date: Mon, 5 Aug 2024 17:03:16 +0900 Subject: [PATCH 2/3] =?UTF-8?q?feat=20:=20=EC=86=8C=EC=85=9C=EB=A7=81=20?= =?UTF-8?q?=EA=B2=80=EC=83=89=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../controller/SocialringController.java | 19 +++++++- .../repository/SocialringRepository.java | 20 ++++++++ .../likelion12/service/SocialringService.java | 48 +++++++++++++++++++ 3 files changed, 86 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/likelion12/controller/SocialringController.java b/src/main/java/com/example/likelion12/controller/SocialringController.java index badcbb6..e05bbea 100644 --- a/src/main/java/com/example/likelion12/controller/SocialringController.java +++ b/src/main/java/com/example/likelion12/controller/SocialringController.java @@ -7,8 +7,10 @@ import com.example.likelion12.util.*; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; import org.springframework.web.bind.annotation.*; +import java.time.LocalDate; import java.util.List; @Slf4j @@ -75,7 +77,7 @@ public BaseResponse> joinBeforeSocialring( Long memberId = jwtProvider.extractIdFromHeader(authorization); return new BaseResponse<>(socialringService.joinBeforeSocialring(memberId)); } - /** + /** * 소셜링 삭제하기 */ @PatchMapping("/delete") @@ -86,4 +88,19 @@ public BaseResponse deleteSocialring(@RequestHeader("Authorization") Strin socialringService.deleteSocialring(memberId, socialringId); return new BaseResponse<>(BaseExceptionResponseStatus.SUCCESS, null); } + + /** + * 소셜링 검색하기 + */ + @GetMapping("/search") + public BaseResponse> searchSocialrings( + @RequestHeader("Authorization") String authorization, + @RequestParam(required = false) String keyWord, + @RequestParam(required = false) LocalDate socialringDate, + @RequestParam(required = false) String activityRegionName, + @RequestParam(defaultValue = "0") int page + ) { + Page responses = socialringService.searchSocialrings(keyWord, socialringDate, activityRegionName, page, 9); + return new BaseResponse<>(BaseExceptionResponseStatus.SUCCESS, responses); + } } diff --git a/src/main/java/com/example/likelion12/repository/SocialringRepository.java b/src/main/java/com/example/likelion12/repository/SocialringRepository.java index c71a7b2..e2b27ec 100644 --- a/src/main/java/com/example/likelion12/repository/SocialringRepository.java +++ b/src/main/java/com/example/likelion12/repository/SocialringRepository.java @@ -2,11 +2,13 @@ import com.example.likelion12.domain.Socialring; import com.example.likelion12.domain.base.BaseStatus; +import org.springframework.data.domain.Page; import org.springframework.data.domain.Pageable; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.Query; import org.springframework.data.repository.query.Param; +import java.time.LocalDate; import java.util.List; import java.util.Optional; @@ -23,4 +25,22 @@ public interface SocialringRepository extends JpaRepository { @Query("SELECT c FROM Socialring c WHERE c.activityRegion.id = :activityRegionId AND c.status = :status ORDER BY c.socialringId ASC") List findTop3ByActivityRegionIdAndStatus(@Param("activityRegionId") Long activityRegionId, @Param("status") BaseStatus status, Pageable pageable); + /** 정적쿼리가 동적쿼리보다 빠르기때문에 정적쿼리 + * JPA에서 제공하는 페이징 이용!*/ + @Query("SELECT s, COUNT(ms) AS memberCount FROM Socialring s " + + "LEFT JOIN MemberSocialring ms ON s.id = ms.socialring.id " + + "WHERE (:keyWord IS NULL OR s.socialringName LIKE %:keyWord% " + + "OR s.commentSimple LIKE %:keyWord%) " + + "AND (:socialringDate IS NULL OR s.socialringDate = :socialringDate) " + + "AND (:activityRegionId IS NULL OR (s.activityRegion.id = :activityRegionId AND s.activityRegion.status = :status)) " + + "AND s.status = :status " + + "GROUP BY s.id " + + "ORDER BY s.socialringDate DESC") + Page searchSocialringsWithMemberCount( + @Param("keyWord") String keyWord, + @Param("socialringDate") LocalDate socialringDate, + @Param("activityRegionId") Long activityRegionId, + @Param("status") BaseStatus status, + Pageable pageable + ); } diff --git a/src/main/java/com/example/likelion12/service/SocialringService.java b/src/main/java/com/example/likelion12/service/SocialringService.java index 9296ca2..f729fca 100644 --- a/src/main/java/com/example/likelion12/service/SocialringService.java +++ b/src/main/java/com/example/likelion12/service/SocialringService.java @@ -9,6 +9,8 @@ import com.example.likelion12.repository.*; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; +import org.springframework.data.domain.Page; +import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; @@ -16,6 +18,7 @@ import java.time.LocalDate; import java.util.ArrayList; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; import static com.example.likelion12.common.response.status.BaseExceptionResponseStatus.*; @@ -24,6 +27,7 @@ @Slf4j @Service @RequiredArgsConstructor +@Transactional(readOnly = true) public class SocialringService { private final SocialringRepository socialringRepository; private final MemberRepository memberRepository; @@ -315,4 +319,48 @@ public void deleteSocialring(Long memberId, Long socialringId) { memberSocialringRepository.save(memberSocialringEntry); } } + + /** + * 소셜링 검색 + */ + @Transactional(readOnly = true) /** 클래스 선언부에 붙이면 떼어도되는 애노테이션! */ + public Page searchSocialrings(String keyWord, LocalDate socialringDate, String activityRegionName, int page, int size) { + Long activityRegionId = getActivityRegionIdByName(activityRegionName, BaseStatus.ACTIVE); + + Pageable pageable = PageRequest.of(page, size); + Page results = socialringRepository.searchSocialringsWithMemberCount( + keyWord, socialringDate, activityRegionId, BaseStatus.ACTIVE, pageable + ); + return results.map(result -> { + Socialring socialring = (Socialring) result[0]; + long memberCount = (Long) result[1]; + return new GetSocialringSearchResponse( + socialring.getSocialringId(), + socialring.getSocialringName(), + socialring.getSocialringImg(), + socialring.getTotalRecruits(), + (int) memberCount, + socialring.getSocialringDate(), + socialring.getSocialringCost(), + socialring.getCommentSimple(), + socialring.getActivityRegion().getActivityRegionName() + ); + }); + } + + /** 추후 삭제된것도 조회 가능하게 상태를 파라메터로 받기 + * 재사용성 증가*/ + private Long getActivityRegionIdByName(String name, BaseStatus status){ + Long activityRegionId = null; + /** 이름으로 지역아이디 얻기 */ + if (name != null) { + Optional activityRegionOpt = activityRegionRepository.findByActivityRegionNameAndStatus(name, status); + if (activityRegionOpt.isPresent()) { + activityRegionId = activityRegionOpt.get().getActivityRegionId(); + } + } + return activityRegionId; + } + + } From 38427fb9acec028bc08f10ac7d2fc5891d0a9056 Mon Sep 17 00:00:00 2001 From: jungeun Date: Mon, 5 Aug 2024 17:11:28 +0900 Subject: [PATCH 3/3] =?UTF-8?q?feat=20:=20=EC=86=8C=EC=85=9C=EB=A7=81=20?= =?UTF-8?q?=EA=B2=80=EC=83=89=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/example/likelion12/service/SocialringService.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/main/java/com/example/likelion12/service/SocialringService.java b/src/main/java/com/example/likelion12/service/SocialringService.java index f729fca..0f41058 100644 --- a/src/main/java/com/example/likelion12/service/SocialringService.java +++ b/src/main/java/com/example/likelion12/service/SocialringService.java @@ -323,7 +323,6 @@ public void deleteSocialring(Long memberId, Long socialringId) { /** * 소셜링 검색 */ - @Transactional(readOnly = true) /** 클래스 선언부에 붙이면 떼어도되는 애노테이션! */ public Page searchSocialrings(String keyWord, LocalDate socialringDate, String activityRegionName, int page, int size) { Long activityRegionId = getActivityRegionIdByName(activityRegionName, BaseStatus.ACTIVE); @@ -348,8 +347,6 @@ public Page searchSocialrings(String keyWord, Local }); } - /** 추후 삭제된것도 조회 가능하게 상태를 파라메터로 받기 - * 재사용성 증가*/ private Long getActivityRegionIdByName(String name, BaseStatus status){ Long activityRegionId = null; /** 이름으로 지역아이디 얻기 */