From f4ac8d9f8a2ca3667c7057a31b7200e364ab425a Mon Sep 17 00:00:00 2001 From: sangeun Date: Tue, 7 May 2024 20:52:06 +0900 Subject: [PATCH 1/2] =?UTF-8?q?feat=20:=20=ED=99=9C=EB=8F=99=20=EA=B2=80?= =?UTF-8?q?=EC=83=89=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../activity/api/ActivityController.java | 11 ++-- .../application/ActivitySearchService.java | 59 +++++++++++++++++++ .../activity/converter/ActivityConverter.java | 21 +++++-- .../dto/ActivitySearchRequestDto.java | 11 ++++ .../dto/ActivitySearchResponseDto.java | 20 +++++++ .../repository/ActivityRepository.java | 3 + 6 files changed, 116 insertions(+), 9 deletions(-) create mode 100644 src/main/java/com/hobak/happinessql/domain/activity/application/ActivitySearchService.java create mode 100644 src/main/java/com/hobak/happinessql/domain/activity/dto/ActivitySearchRequestDto.java create mode 100644 src/main/java/com/hobak/happinessql/domain/activity/dto/ActivitySearchResponseDto.java diff --git a/src/main/java/com/hobak/happinessql/domain/activity/api/ActivityController.java b/src/main/java/com/hobak/happinessql/domain/activity/api/ActivityController.java index 4c039ca..6c74673 100644 --- a/src/main/java/com/hobak/happinessql/domain/activity/api/ActivityController.java +++ b/src/main/java/com/hobak/happinessql/domain/activity/api/ActivityController.java @@ -1,10 +1,7 @@ package com.hobak.happinessql.domain.activity.api; -import com.hobak.happinessql.domain.activity.application.ActivityCreateService; -import com.hobak.happinessql.domain.activity.application.ActivityDeleteService; -import com.hobak.happinessql.domain.activity.application.ActivityUpdateService; +import com.hobak.happinessql.domain.activity.application.*; import com.hobak.happinessql.domain.activity.dto.*; -import com.hobak.happinessql.domain.activity.application.ActivityListService; import com.hobak.happinessql.global.response.DataResponseDto; import lombok.RequiredArgsConstructor; import org.springframework.web.bind.annotation.*; @@ -18,6 +15,7 @@ public class ActivityController { private final ActivityCreateService activityCreateService; private final ActivityDeleteService activityDeleteService; private final ActivityUpdateService activityUpdateService; + private final ActivitySearchService activitySearchService; @GetMapping public DataResponseDto getActivitiesByUserId(@RequestParam Long userId) { ActivityListResponseDto response = activityListService.getActivitiesByUserId(userId); @@ -38,4 +36,9 @@ public DataResponseDto updateActicity(@PathVariable L ActivityUpdateResponseDto responseDto = activityUpdateService.updateActivity(activityId,requestDto); return DataResponseDto.of(responseDto,"활동을 성공적으로 수정했습니다."); } + @PostMapping("/search") + public DataResponseDto searchActivities(@RequestBody ActivitySearchRequestDto requestDto, @RequestParam Long userId) { + ActivitySearchResponseDto responseDto = activitySearchService.searchActivities(requestDto.getSearch(), userId); + return DataResponseDto.of(responseDto, "활동을 성공적으로 검색했습니다."); + } } \ No newline at end of file diff --git a/src/main/java/com/hobak/happinessql/domain/activity/application/ActivitySearchService.java b/src/main/java/com/hobak/happinessql/domain/activity/application/ActivitySearchService.java new file mode 100644 index 0000000..fa2dc17 --- /dev/null +++ b/src/main/java/com/hobak/happinessql/domain/activity/application/ActivitySearchService.java @@ -0,0 +1,59 @@ +package com.hobak.happinessql.domain.activity.application; + +import com.hobak.happinessql.domain.activity.converter.ActivityConverter; +import com.hobak.happinessql.domain.activity.domain.Activity; +import com.hobak.happinessql.domain.activity.domain.Category; +import com.hobak.happinessql.domain.activity.dto.ActivityDto; +import com.hobak.happinessql.domain.activity.dto.ActivitySearchResponseDto; +import com.hobak.happinessql.domain.activity.dto.CategoryDto; +import com.hobak.happinessql.domain.activity.repository.ActivityRepository; +import lombok.RequiredArgsConstructor; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +@Service +@Transactional(readOnly = true) +@RequiredArgsConstructor +public class ActivitySearchService { + private final ActivityRepository activityRepository; + + public ActivitySearchResponseDto searchActivities(String keyword, Long userId) { + List activitiesByCategory = activityRepository.findByCategoryNameContaining(keyword); + List activitiesByName = activityRepository.findByNameContaining(keyword); + + Map categoryDtoMap = new HashMap<>(); + + for (Activity activity : activitiesByCategory) { + Category category = activity.getCategory(); + if(category.getUserId() == null || category.getUserId().equals(userId)){ + CategoryDto categoryDto = categoryDtoMap.getOrDefault(category.getCategoryId(), ActivityConverter.toCategoryDto(category)); + categoryDto.getActivities().add(ActivityConverter.toActivityDto(activity)); + categoryDtoMap.put(category.getCategoryId(), categoryDto); + } + } + + for (Activity activity : activitiesByName) { + Category category = activity.getCategory(); + if(categoryDtoMap.containsKey(category.getCategoryId())){ + continue; + } + if(category.getUserId() == null || category.getUserId().equals(userId)){ + CategoryDto categoryDto = categoryDtoMap.getOrDefault(category.getCategoryId(), ActivityConverter.toCategoryDto(category)); + ActivityDto activityDto = ActivityConverter.toActivityDto(activity); + if (!categoryDto.getActivities().contains(activityDto)) { + categoryDto.getActivities().add(activityDto); + } + categoryDtoMap.put(category.getCategoryId(), categoryDto); + } + } + + return ActivityConverter + .toActivitySearchResponseDto(new ArrayList<>(categoryDtoMap.values())); + } + +} diff --git a/src/main/java/com/hobak/happinessql/domain/activity/converter/ActivityConverter.java b/src/main/java/com/hobak/happinessql/domain/activity/converter/ActivityConverter.java index d9ca745..829c8e0 100644 --- a/src/main/java/com/hobak/happinessql/domain/activity/converter/ActivityConverter.java +++ b/src/main/java/com/hobak/happinessql/domain/activity/converter/ActivityConverter.java @@ -2,11 +2,9 @@ import com.hobak.happinessql.domain.activity.domain.Activity; import com.hobak.happinessql.domain.activity.domain.Category; -import com.hobak.happinessql.domain.activity.dto.ActivityCreateResponseDto; -import com.hobak.happinessql.domain.activity.dto.ActivityDto; -import com.hobak.happinessql.domain.activity.dto.ActivityUpdateResponseDto; -import com.hobak.happinessql.domain.activity.dto.CategoryDto; +import com.hobak.happinessql.domain.activity.dto.*; +import java.util.ArrayList; import java.util.List; import java.util.stream.Collectors; @@ -19,7 +17,6 @@ public static ActivityDto toActivityDto(Activity activity) { .build(); } - public static List toActivityDtoList(List activities) { return activities.stream() .map(ActivityConverter::toActivityDto) @@ -33,6 +30,14 @@ public static CategoryDto toCategoryDto(Category category, List ac .activities(activityDtos) .build(); } + public static CategoryDto toCategoryDto(Category category) { + return CategoryDto.builder() + .id(category.getCategoryId()) + .name(category.getName()) + .activities(new ArrayList<>()) + .build(); + } + public static ActivityCreateResponseDto toActivityCreateResponseDto(Long activityId){ return ActivityCreateResponseDto.builder() @@ -47,4 +52,10 @@ public static ActivityUpdateResponseDto toActivityUpdateResponseDto(Activity act .activityName(activity.getName()) .build(); } + + public static ActivitySearchResponseDto toActivitySearchResponseDto(List categories){ + return ActivitySearchResponseDto.builder() + .categories(categories) + .build(); + } } \ No newline at end of file diff --git a/src/main/java/com/hobak/happinessql/domain/activity/dto/ActivitySearchRequestDto.java b/src/main/java/com/hobak/happinessql/domain/activity/dto/ActivitySearchRequestDto.java new file mode 100644 index 0000000..66f6871 --- /dev/null +++ b/src/main/java/com/hobak/happinessql/domain/activity/dto/ActivitySearchRequestDto.java @@ -0,0 +1,11 @@ +package com.hobak.happinessql.domain.activity.dto; + +import lombok.AccessLevel; +import lombok.Getter; +import lombok.NoArgsConstructor; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ActivitySearchRequestDto { + private String search; +} diff --git a/src/main/java/com/hobak/happinessql/domain/activity/dto/ActivitySearchResponseDto.java b/src/main/java/com/hobak/happinessql/domain/activity/dto/ActivitySearchResponseDto.java new file mode 100644 index 0000000..36702df --- /dev/null +++ b/src/main/java/com/hobak/happinessql/domain/activity/dto/ActivitySearchResponseDto.java @@ -0,0 +1,20 @@ +package com.hobak.happinessql.domain.activity.dto; + +import lombok.AccessLevel; +import lombok.Builder; +import lombok.Getter; +import lombok.NoArgsConstructor; + +import java.util.List; + +@Getter +@NoArgsConstructor(access = AccessLevel.PROTECTED) +public class ActivitySearchResponseDto { + private List categories; + + @Builder + public ActivitySearchResponseDto(List categories) { + this.categories = categories; + } + +} diff --git a/src/main/java/com/hobak/happinessql/domain/activity/repository/ActivityRepository.java b/src/main/java/com/hobak/happinessql/domain/activity/repository/ActivityRepository.java index 434f4fb..27b87ae 100644 --- a/src/main/java/com/hobak/happinessql/domain/activity/repository/ActivityRepository.java +++ b/src/main/java/com/hobak/happinessql/domain/activity/repository/ActivityRepository.java @@ -11,4 +11,7 @@ public interface ActivityRepository extends JpaRepository { List findByCategory(Category category); @Query(value = "SELECT MAX(a.activityId) + 1 FROM Activity a") Long findNextActivityId(); + + List findByCategoryNameContaining(String keyword); + List findByNameContaining(String keyword); } From 0527f7e598d9cb3df0499fd850e790eb8ac97d38 Mon Sep 17 00:00:00 2001 From: sangeun Date: Tue, 7 May 2024 20:52:44 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix=20:=20=EC=82=AC=EC=9A=A9=EB=90=98?= =?UTF-8?q?=EC=A7=80=20=EC=95=8A=EB=8A=94=20@Builder=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/activity/dto/ActivityCreateRequestDto.java | 6 ------ .../domain/activity/dto/ActivityUpdateRequestDto.java | 5 ----- 2 files changed, 11 deletions(-) diff --git a/src/main/java/com/hobak/happinessql/domain/activity/dto/ActivityCreateRequestDto.java b/src/main/java/com/hobak/happinessql/domain/activity/dto/ActivityCreateRequestDto.java index ae0d7f6..3288ce0 100644 --- a/src/main/java/com/hobak/happinessql/domain/activity/dto/ActivityCreateRequestDto.java +++ b/src/main/java/com/hobak/happinessql/domain/activity/dto/ActivityCreateRequestDto.java @@ -1,7 +1,6 @@ package com.hobak.happinessql.domain.activity.dto; import lombok.AccessLevel; -import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -10,9 +9,4 @@ public class ActivityCreateRequestDto { private String category; private String activityName; - @Builder - ActivityCreateRequestDto(String category, String activityName){ - this.category = category; - this.activityName = activityName; - } } diff --git a/src/main/java/com/hobak/happinessql/domain/activity/dto/ActivityUpdateRequestDto.java b/src/main/java/com/hobak/happinessql/domain/activity/dto/ActivityUpdateRequestDto.java index 4636ed5..26d3370 100644 --- a/src/main/java/com/hobak/happinessql/domain/activity/dto/ActivityUpdateRequestDto.java +++ b/src/main/java/com/hobak/happinessql/domain/activity/dto/ActivityUpdateRequestDto.java @@ -1,7 +1,6 @@ package com.hobak.happinessql.domain.activity.dto; import lombok.AccessLevel; -import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -9,8 +8,4 @@ @NoArgsConstructor(access = AccessLevel.PROTECTED) public class ActivityUpdateRequestDto { String name; - @Builder - ActivityUpdateRequestDto(String name){ - this.name = name; - } }