diff --git a/src/main/java/com/example/likelion12/controller/SocialringController.java b/src/main/java/com/example/likelion12/controller/SocialringController.java index 9787c5f..c30f7d9 100644 --- a/src/main/java/com/example/likelion12/controller/SocialringController.java +++ b/src/main/java/com/example/likelion12/controller/SocialringController.java @@ -8,8 +8,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 @@ -82,7 +84,7 @@ public BaseResponse> searchFilterSocialr * 참가 예정인 소셜링 */ @GetMapping("/join/before") - public BaseResponse> joinBeforeSocialring(@RequestHeader("Authorization") String authorization){ + public BaseResponse> joinBeforeSocialring(@RequestHeader("Authorization") String authorization) { log.info("[SocialringController.joinBeforeSocialring]"); Long memberId = jwtProvider.extractIdFromHeader(authorization); return new BaseResponse<>(socialringService.joinBeforeSocialring(memberId)); @@ -110,6 +112,21 @@ public BaseResponse deleteSocialring(@RequestHeader("Authorization") Strin 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/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; + +} diff --git a/src/main/java/com/example/likelion12/repository/SocialringRepository.java b/src/main/java/com/example/likelion12/repository/SocialringRepository.java index 2bb9cf5..f8e820c 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,5 +25,23 @@ 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 + ); List findAllByStatus(BaseStatus baseStatus); } diff --git a/src/main/java/com/example/likelion12/service/SocialringService.java b/src/main/java/com/example/likelion12/service/SocialringService.java index 39fbc0f..f78d05e 100644 --- a/src/main/java/com/example/likelion12/service/SocialringService.java +++ b/src/main/java/com/example/likelion12/service/SocialringService.java @@ -11,6 +11,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; @@ -18,6 +20,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.*; @@ -26,6 +29,7 @@ @Slf4j @Service @RequiredArgsConstructor +@Transactional(readOnly = true) public class SocialringService { private final SocialringRepository socialringRepository; private final MemberRepository memberRepository; @@ -466,6 +470,45 @@ public void deleteSocialring(Long memberId, Long socialringId) { } } + /** + * 소셜링 검색 + */ + 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; + } + /** * 소셜링 취소 */