Skip to content

Commit 4eec2f5

Browse files
authored
[refactor] 펀딩 목록 카테고리 필터 추가, 커뮤니티 조회 시 작성자 이메일 포함 (#345)
1 parent 9bdf24b commit 4eec2f5

File tree

7 files changed

+52
-9
lines changed

7 files changed

+52
-9
lines changed

src/main/java/com/back/domain/funding/controller/FundingCommunityController.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import com.back.domain.funding.service.FundingCommunityService;
55
import com.back.global.rsData.RsData;
66
import io.swagger.v3.oas.annotations.Operation;
7+
import io.swagger.v3.oas.annotations.tags.Tag;
78
import jakarta.validation.Valid;
89
import jakarta.validation.constraints.Positive;
910
import lombok.RequiredArgsConstructor;
@@ -16,6 +17,7 @@
1617
@RestController
1718
@RequiredArgsConstructor
1819
@RequestMapping("/api/fundings")
20+
@Tag(name = "펀딩 커뮤니티", description = "펀딩 커뮤니티 API 컨트롤러")
1921
public class FundingCommunityController {
2022

2123
private final FundingCommunityService fundingCommunityService;

src/main/java/com/back/domain/funding/controller/FundingController.java

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import com.back.global.rsData.RsData;
1212
import io.swagger.v3.oas.annotations.Operation;
1313
import io.swagger.v3.oas.annotations.Parameter;
14+
import io.swagger.v3.oas.annotations.media.Content;
15+
import io.swagger.v3.oas.annotations.media.ExampleObject;
1416
import io.swagger.v3.oas.annotations.tags.Tag;
1517
import jakarta.validation.Valid;
1618
import jakarta.validation.constraints.Positive;
@@ -34,8 +36,31 @@ public class FundingController {
3436

3537
@PostMapping
3638
@PreAuthorize("hasAuthority('ROLE_ARTIST') or hasAuthority('ROLE_ADMIN') or hasAuthority('ROLE_ROOT')")
37-
@Operation(summary = "펀딩 생성")
38-
public ResponseEntity<RsData<FundingCreateResponse>> createFunding(
39+
@Operation(summary = "펀딩 생성",
40+
requestBody = @io.swagger.v3.oas.annotations.parameters.RequestBody(
41+
content = @Content(
42+
mediaType = "application/json",
43+
examples = {
44+
@ExampleObject(
45+
name = "기본 예시",
46+
value = """
47+
{
48+
"title": "한정판 키링 펀딩",
49+
"description": "한정판 키링입니다.",
50+
"categoryId": 1,
51+
"imageUrl": "https://testImage.jpg",
52+
"targetAmount": 500000,
53+
"price": 30000,
54+
"stock": 200,
55+
"startDate": "2025-11-01 00:00:00",
56+
"endDate": "2025-12-15 23:59:59"
57+
}
58+
"""
59+
)
60+
}
61+
)
62+
)
63+
) public ResponseEntity<RsData<FundingCreateResponse>> createFunding(
3964
@Valid @RequestBody FundingCreateRequest request,
4065
@AuthenticationPrincipal(expression = "username") String userEmail) {
4166

@@ -56,7 +81,7 @@ public ResponseEntity<RsData<FundingDetailResponse>> getFunding(@PathVariable @P
5681
@GetMapping
5782
@Operation(summary = "펀딩 목록 조회")
5883
public ResponseEntity<RsData<Page<FundingCardDto>>> getFundingList(
59-
@Parameter(description = "[필터링] 펀딩 상태 목록. 진행중(OPEN), 종료(CLOSED), 성공(SUCCESS), 실패(FAILED), 취소(CANCELED)",
84+
@Parameter(description = "[필터링] 펀딩 상태 목록. 심사중(PENDING), 승인됨(APPROVED), 거절됨(REJECTED), 진행중(OPEN), 종료(CLOSED), 성공(SUCCESS), 실패(FAILED), 취소(CANCELED)",
6085
example = "OPEN,CLOSED")
6186
@RequestParam(required = false) Set<FundingStatus> status,
6287

@@ -68,6 +93,10 @@ public ResponseEntity<RsData<Page<FundingCardDto>>> getFundingList(
6893
example = "키링")
6994
@RequestParam(required = false) String keyword,
7095

96+
@Parameter(description = "[필터링] 카테고리 ID (상위 카테고리)",
97+
example = "1")
98+
@RequestParam(required = false) Long categoryId,
99+
71100
@Parameter(description = "[필터링] 최소 가격 (원 단위)",
72101
example = "10000")
73102
@RequestParam(required = false) Long minPrice,
@@ -85,7 +114,7 @@ public ResponseEntity<RsData<Page<FundingCardDto>>> getFundingList(
85114
@RequestParam(defaultValue = "12") int size
86115
) {
87116
Page<FundingCardDto> fundingList = fundingService.getFundingList(
88-
status, sortBy, keyword, minPrice, maxPrice, page, size
117+
status, sortBy, keyword, categoryId, minPrice, maxPrice, page, size
89118
);
90119

91120
RsData<Page<FundingCardDto>> body = RsData.of("200", "펀딩 목록 조회 성공", fundingList);

src/main/java/com/back/domain/funding/dto/response/FundingCardDto.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ public record FundingCardDto(
88
String imageUrl, // 썸네일 이미지
99
String categoryName, // 카테고리 이름
1010
String authorName, // 작성자명
11+
long price, // 가격
1112
long targetAmount, // 목표 금액
1213
long currentAmount, // 현재 금액
1314
double progress, // 달성률
@@ -20,6 +21,7 @@ public FundingCardDto(Funding funding, long currentAmount, double progress, int
2021
funding.getImageUrl(),
2122
funding.getCategory().getCategoryName(),
2223
funding.getUser().getName(),
24+
funding.getPrice(),
2325
funding.getTargetAmount(),
2426
currentAmount,
2527
progress,

src/main/java/com/back/domain/funding/dto/response/FundingDetailResponse.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,13 +87,14 @@ public FundingNewsDto(FundingNews update) {
8787
public record FundingCommunityDto(
8888
Long id,
8989
String writerName,
90+
String writerEmail,
9091
String profileImageUrl,
9192
String content,
9293
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
9394
LocalDateTime createDate
9495
) {
9596
public FundingCommunityDto(FundingCommunity community) {
96-
this(community.getId(), community.getAuthor().getName(), community.getAuthor().getProfileImageUrl(), community.getContent(), community.getCreateDate());
97+
this(community.getId(), community.getAuthor().getName(), community.getAuthor().getEmail(), community.getAuthor().getProfileImageUrl(), community.getContent(), community.getCreateDate());
9798
}
9899
}
99100
}

src/main/java/com/back/domain/funding/repository/FundingCustomRepository.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ public interface FundingCustomRepository {
2222
Page<Funding> findByFilters(
2323
Set<FundingStatus> statuses,
2424
String keyword,
25+
Long categoryId,
2526
Long minPrice,
2627
Long maxPrice,
2728
Pageable pageable

src/main/java/com/back/domain/funding/repository/FundingCustomRepositoryImpl.java

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public class FundingCustomRepositoryImpl implements FundingCustomRepository {
2727
public Page<Funding> findByFilters(
2828
Set<FundingStatus> statuses,
2929
String keyword,
30+
Long categoryId,
3031
Long minPrice,
3132
Long maxPrice,
3233
Pageable pageable
@@ -41,7 +42,7 @@ public Page<Funding> findByFilters(
4142
funding.fetch("user", JoinType.LEFT);
4243

4344
// WHERE 조건 생성
44-
List<Predicate> predicates = buildPredicates(cb, funding, statuses, keyword, minPrice, maxPrice);
45+
List<Predicate> predicates = buildPredicates(cb, funding, statuses, keyword, categoryId, minPrice, maxPrice);
4546
query.where(predicates.toArray(new Predicate[0]));
4647

4748
// 정렬 적용
@@ -58,7 +59,7 @@ public Page<Funding> findByFilters(
5859
List<Funding> results = typedQuery.getResultList();
5960

6061
// 카운트 쿼리 (페이징을 위한 전체 개수)
61-
long total = countByFilters(cb, statuses, keyword, minPrice, maxPrice);
62+
long total = countByFilters(cb, statuses, keyword, categoryId, minPrice, maxPrice);
6263

6364
return new PageImpl<>(results, pageable, total);
6465
}
@@ -71,6 +72,7 @@ private List<Predicate> buildPredicates(
7172
Root<Funding> funding,
7273
Set<FundingStatus> statuses,
7374
String keyword,
75+
Long categoryId,
7476
Long minPrice,
7577
Long maxPrice
7678
) {
@@ -89,6 +91,10 @@ private List<Predicate> buildPredicates(
8991
));
9092
}
9193

94+
if (categoryId != null) {
95+
predicates.add(cb.equal(funding.get("category").get("id"), categoryId));
96+
}
97+
9298
// 가격 범위 필터 (Funding 엔티티의 price 필드 사용)
9399
if (minPrice != null) {
94100
predicates.add(cb.greaterThanOrEqualTo(funding.get("price"), minPrice));
@@ -126,14 +132,15 @@ private long countByFilters(
126132
CriteriaBuilder cb,
127133
Set<FundingStatus> statuses,
128134
String keyword,
135+
Long categoryId,
129136
Long minPrice,
130137
Long maxPrice
131138
) {
132139
CriteriaQuery<Long> countQuery = cb.createQuery(Long.class);
133140
Root<Funding> funding = countQuery.from(Funding.class);
134141

135142
// WHERE 조건 동일하게 적용
136-
List<Predicate> predicates = buildPredicates(cb, funding, statuses, keyword, minPrice, maxPrice);
143+
List<Predicate> predicates = buildPredicates(cb, funding, statuses, keyword, categoryId, minPrice, maxPrice);
137144
countQuery.select(cb.count(funding));
138145
countQuery.where(predicates.toArray(new Predicate[0]));
139146

src/main/java/com/back/domain/funding/service/FundingService.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,7 @@ public Page<FundingCardDto> getFundingList(
120120
Set<FundingStatus> statuses,
121121
String sortBy,
122122
String keyword,
123+
Long categoryId,
123124
Long minPrice,
124125
Long maxPrice,
125126
int page,
@@ -131,7 +132,7 @@ public Page<FundingCardDto> getFundingList(
131132

132133
// Custom Repository 메서드 호출
133134
Page<Funding> fundingPage = fundingRepository.findByFilters(
134-
statuses, keyword, minPrice, maxPrice, pageable
135+
statuses, keyword, categoryId, minPrice, maxPrice, pageable
135136
);
136137

137138
// DTO 변환

0 commit comments

Comments
 (0)