Skip to content

Commit e72708b

Browse files
authored
Merge pull request #167 from o-ddong/refactor/campaign-service
Refactor: campaign service
2 parents a506355 + 5909dc8 commit e72708b

15 files changed

+128
-87
lines changed

src/main/java/com/example/cherrydan/campaign/controller/BookmarkController.java

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package com.example.cherrydan.campaign.controller;
22

33
import com.example.cherrydan.campaign.dto.BookmarkDeleteDTO;
4+
import com.example.cherrydan.campaign.dto.BookmarkCancelDTO;
45
import com.example.cherrydan.campaign.dto.BookmarkResponseDTO;
56
import com.example.cherrydan.campaign.service.BookmarkService;
67
import com.example.cherrydan.common.response.ApiResponse;
@@ -24,6 +25,7 @@
2425
import org.springframework.data.domain.PageRequest;
2526
import com.example.cherrydan.common.response.PageListResponseDTO;
2627
import com.example.cherrydan.campaign.dto.BookmarkSplitResponseDTO;
28+
import jakarta.validation.Valid;
2729

2830
@Tag(name = "Bookmark", description = "캠페인 북마크(찜) 관련 API")
2931
@RestController
@@ -42,13 +44,13 @@ public ResponseEntity<ApiResponse<EmptyResponse>> addBookmark(
4244
return ResponseEntity.ok(ApiResponse.success("북마크 추가 성공"));
4345
}
4446

45-
@Operation(summary = "북마크 취소", description = "캠페인 북마크(찜)를 취소합니다. (is_active=0)")
46-
@PatchMapping("/{campaignId}/bookmark")
47+
@Operation(summary = "북마크 취소", description = "여러 캠페인 북마크(찜)를 한 번에 취소합니다. (is_active=0)")
48+
@PatchMapping("/bookmark")
4749
public ResponseEntity<ApiResponse<EmptyResponse>> cancelBookmark(
48-
@Parameter(description = "캠페인 ID", required = true) @PathVariable Long campaignId,
50+
@Parameter(description = "북마크 취소 요청", required = true) @Valid @RequestBody BookmarkCancelDTO request,
4951
@Parameter(hidden = true) @AuthenticationPrincipal UserDetailsImpl currentUser
5052
) {
51-
bookmarkService.cancelBookmark(currentUser.getId(), campaignId);
53+
bookmarkService.cancelBookmarks(currentUser.getId(), request);
5254
return ResponseEntity.ok(ApiResponse.success("북마크 취소 성공"));
5355
}
5456

@@ -81,7 +83,7 @@ public ResponseEntity<ApiResponse<PageListResponseDTO<BookmarkResponseDTO>>> get
8183
@Operation(summary = "북마크 완전 삭제", description = "캠페인 북마크(찜) 정보를 완전히 삭제합니다.")
8284
@DeleteMapping("/bookmark")
8385
public ResponseEntity<ApiResponse<EmptyResponse>> deleteBookmark(
84-
@RequestBody BookmarkDeleteDTO request,
86+
@Parameter(description = "북마크 삭제 요청", required = true) @Valid @RequestBody BookmarkDeleteDTO request,
8587
@Parameter(hidden = true) @AuthenticationPrincipal UserDetailsImpl currentUser
8688
) {
8789
bookmarkService.deleteBookmark(currentUser.getId(), request);

src/main/java/com/example/cherrydan/campaign/controller/CampaignStatusController.java

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
import com.example.cherrydan.campaign.dto.CampaignStatusRequestDTO;
44
import com.example.cherrydan.campaign.dto.CampaignStatusResponseDTO;
55
import com.example.cherrydan.campaign.dto.CampaignStatusListResponseDTO;
6-
import com.example.cherrydan.campaign.dto.CampaignStatusPopupResponseDTO;
76
import com.example.cherrydan.campaign.dto.CampaignStatusCountResponseDTO;
87
import com.example.cherrydan.campaign.domain.CampaignStatusType;
98
import com.example.cherrydan.common.response.EmptyResponse;
@@ -27,6 +26,8 @@
2726
import com.example.cherrydan.common.exception.ErrorMessage;
2827
import com.example.cherrydan.campaign.dto.CampaignStatusBatchRequestDTO;
2928
import com.example.cherrydan.campaign.dto.CampaignStatusDeleteRequestDTO;
29+
import com.example.cherrydan.campaign.dto.CampaignStatusPopupByTypeResponseDTO;
30+
import io.swagger.v3.oas.annotations.Parameter;
3031

3132
import java.util.List;
3233

@@ -78,7 +79,7 @@ public ResponseEntity<ApiResponse<CampaignStatusResponseDTO>> createOrRecoverSta
7879
@Operation(summary = "내 체험단 상태 변경", description = "배치로 여러 캠페인 상태 변경")
7980
@PatchMapping
8081
public ResponseEntity<ApiResponse<List<CampaignStatusResponseDTO>>> updateStatus(
81-
@RequestBody CampaignStatusBatchRequestDTO requestDTO,
82+
@Valid @RequestBody CampaignStatusBatchRequestDTO requestDTO,
8283
@AuthenticationPrincipal UserDetailsImpl currentUser
8384
) {
8485
List<CampaignStatusResponseDTO> results = campaignStatusService.updateStatusBatch(requestDTO, currentUser.getId());
@@ -95,12 +96,21 @@ public ResponseEntity<ApiResponse<EmptyResponse>> deleteStatus(
9596
return ResponseEntity.ok(ApiResponse.success("체험단 상태 삭제 성공"));
9697
}
9798

98-
@Operation(summary = "내 체험단 노출 팝업 조회", description = "지원한 공고/선정 결과/리뷰 작성 중 상태 중 기간이 지난 데이터만 최대 4개씩, 각 상태별 총 개수와 함께 반환")
99+
@Operation(summary = "내 체험단 노출 팝업 조회", description = "지정된 상태의 기간이 지난 데이터만 최대 4개씩 반환")
99100
@GetMapping("/popup")
100-
public ResponseEntity<ApiResponse<CampaignStatusPopupResponseDTO>> getPopupStatus(
101-
@AuthenticationPrincipal UserDetailsImpl currentUser
101+
public ResponseEntity<ApiResponse<CampaignStatusPopupByTypeResponseDTO>> getPopupStatus(
102+
@Parameter(description = "상태 타입 (APPLY, SELECTED, REVIEWING, ENDED)", required = true)
103+
@RequestParam String status,
104+
@AuthenticationPrincipal UserDetailsImpl currentUser
102105
) {
103-
CampaignStatusPopupResponseDTO result = campaignStatusService.getPopupStatusByUser(currentUser.getId());
104-
return ResponseEntity.ok(ApiResponse.success(result));
106+
CampaignStatusType statusType;
107+
try {
108+
statusType = CampaignStatusType.valueOf(status.toUpperCase());
109+
} catch (IllegalArgumentException e) {
110+
throw new CampaignException(ErrorMessage.CAMPAIGN_STATUS_INVALID);
111+
}
112+
113+
CampaignStatusPopupByTypeResponseDTO result = campaignStatusService.getPopupStatusByType(currentUser.getId(), statusType);
114+
return ResponseEntity.ok(ApiResponse.success("팝업 상태 조회 성공", result));
105115
}
106116
}
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package com.example.cherrydan.campaign.dto;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import lombok.Getter;
5+
import lombok.NoArgsConstructor;
6+
7+
import jakarta.validation.constraints.NotEmpty;
8+
import java.util.List;
9+
10+
@Getter
11+
@NoArgsConstructor
12+
@Schema(description = "북마크 취소 요청 DTO")
13+
public class BookmarkCancelDTO {
14+
15+
@NotEmpty(message = "캠페인 ID 목록은 필수입니다.")
16+
@Schema(description = "취소할 캠페인 ID 목록", example = "[1, 2, 3]", required = true)
17+
private List<Long> campaignIds;
18+
}

src/main/java/com/example/cherrydan/campaign/dto/BookmarkDeleteDTO.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,12 +4,16 @@
44
import lombok.Getter;
55
import lombok.NoArgsConstructor;
66

7+
import jakarta.validation.constraints.NotEmpty;
78
import java.util.List;
89

910

1011
@Getter
1112
@NoArgsConstructor
13+
@Schema(description = "북마크 삭제 요청 DTO")
1214
public class BookmarkDeleteDTO {
15+
16+
@NotEmpty(message = "캠페인 ID 목록은 필수입니다.")
1317
@Schema(description = "북마크 삭제 DTO ", example = "[1, 2, 3]")
1418
private List<Long> campaignIds;
1519
}

src/main/java/com/example/cherrydan/campaign/dto/CampaignStatusBatchRequestDTO.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,16 @@
66
import lombok.Getter;
77
import lombok.NoArgsConstructor;
88

9+
import jakarta.validation.constraints.NotEmpty;
910
import java.util.List;
1011

1112
@Getter
1213
@NoArgsConstructor
1314
@AllArgsConstructor
1415
@Schema(description = "캠페인 상태 배치 업데이트 요청")
1516
public class CampaignStatusBatchRequestDTO {
17+
18+
@NotEmpty(message = "캠페인 ID 목록은 필수입니다.")
1619
@Schema(description = "업데이트할 캠페인 ID 목록", example = "[1, 2, 3]", required = true)
1720
private List<Long> campaignIds;
1821

src/main/java/com/example/cherrydan/campaign/dto/CampaignStatusDeleteRequestDTO.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,16 @@
55
import lombok.Getter;
66
import lombok.NoArgsConstructor;
77

8+
import jakarta.validation.constraints.NotEmpty;
89
import java.util.List;
910

1011
@Getter
1112
@NoArgsConstructor
1213
@AllArgsConstructor
1314
@Schema(description = "캠페인 상태 배치 삭제 요청")
1415
public class CampaignStatusDeleteRequestDTO {
16+
17+
@NotEmpty(message = "캠페인 ID 목록은 필수입니다.")
1518
@Schema(description = "삭제할 캠페인 ID 목록", example = "[1, 2, 3]", required = true)
1619
private List<Long> campaignIds;
1720
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package com.example.cherrydan.campaign.dto;
2+
3+
import com.example.cherrydan.campaign.domain.CampaignStatusType;
4+
import io.swagger.v3.oas.annotations.media.Schema;
5+
import lombok.Builder;
6+
import lombok.Getter;
7+
import java.util.List;
8+
9+
@Getter
10+
@Builder
11+
@Schema(description = "특정 상태의 내 체험단 팝업용 응답 DTO")
12+
public class CampaignStatusPopupByTypeResponseDTO {
13+
@Schema(description = "상태 타입", example = "APPLY")
14+
private CampaignStatusType statusType;
15+
16+
@Schema(description = "총 개수", example = "4")
17+
private long totalCount;
18+
19+
@Schema(description = "팝업 아이템 리스트 (최대 4개)")
20+
private List<CampaignStatusPopupItemDTO> items;
21+
}

src/main/java/com/example/cherrydan/campaign/dto/CampaignStatusPopupItemDTO.java

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package com.example.cherrydan.campaign.dto;
22

3+
import com.example.cherrydan.campaign.domain.CampaignStatus;
4+
35
import lombok.Builder;
46
import lombok.Getter;
57

@@ -11,9 +13,8 @@ public class CampaignStatusPopupItemDTO {
1113
private String imageUrl;
1214
private String reviewerAnnouncementStatus;
1315
private String benefit;
14-
private String statusLabel;
1516

16-
public static CampaignStatusPopupItemDTO fromEntity(com.example.cherrydan.campaign.domain.CampaignStatus status) {
17+
public static CampaignStatusPopupItemDTO fromEntity(CampaignStatus status) {
1718
String reviewerAnnouncementStatus = null;
1819
switch (status.getStatus()) {
1920
case APPLY:
@@ -22,9 +23,6 @@ public static CampaignStatusPopupItemDTO fromEntity(com.example.cherrydan.campai
2223
case SELECTED:
2324
reviewerAnnouncementStatus = CampaignStatusResponseDTO.getStatusMessage(status.getCampaign().getContentSubmissionEnd(), "selected");
2425
break;
25-
case NOT_SELECTED:
26-
reviewerAnnouncementStatus = CampaignStatusResponseDTO.getStatusMessage(status.getCampaign().getContentSubmissionEnd(), "not_selected");
27-
break;
2826
case REVIEWING:
2927
reviewerAnnouncementStatus = CampaignStatusResponseDTO.getStatusMessage(status.getCampaign().getContentSubmissionEnd(), "reviewing");
3028
break;
@@ -40,7 +38,6 @@ public static CampaignStatusPopupItemDTO fromEntity(com.example.cherrydan.campai
4038
.imageUrl(status.getCampaign().getImageUrl())
4139
.reviewerAnnouncementStatus(reviewerAnnouncementStatus)
4240
.benefit(status.getCampaign().getBenefit())
43-
.statusLabel(status.getStatus().getLabel())
4441
.build();
4542
}
4643
}

src/main/java/com/example/cherrydan/campaign/dto/CampaignStatusPopupResponseDTO.java

Lines changed: 0 additions & 25 deletions
This file was deleted.

src/main/java/com/example/cherrydan/campaign/repository/BookmarkRepository.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ public interface BookmarkRepository extends JpaRepository<Bookmark, Long> {
2727
Page<Bookmark> findByUserIdAndIsActiveTrueAndCampaign_ApplyEndGreaterThanEqual(Long userId, LocalDate date, Pageable pageable);
2828
Page<Bookmark> findByUserIdAndIsActiveTrueAndCampaign_ApplyEndLessThan(Long userId, LocalDate date, Pageable pageable);
2929

30+
/**
31+
* 특정 사용자의 여러 캠페인 ID에 대한 북마크를 조회
32+
*/
33+
List<Bookmark> findByUserAndCampaignIdIn(User user, List<Long> campaignIds);
34+
3035
/**
3136
* 특정 날짜에 마감되는 활성 캠페인의 북마크들을 조회 (페치 조인 포함)
3237
*/

0 commit comments

Comments
 (0)