Skip to content

Commit 04c85cc

Browse files
authored
feat: 보낸 제안 목록 조회 기능 개발 (#340)
1 parent 8176f7b commit 04c85cc

File tree

7 files changed

+94
-22
lines changed

7 files changed

+94
-22
lines changed

api/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeController.java

+14-10
Original file line numberDiff line numberDiff line change
@@ -2,26 +2,21 @@
22

33
import static com.sponus.sponusbe.global.enums.ApiPath.*;
44

5-
import java.io.IOException;
6-
import java.util.List;
7-
8-
import org.springframework.web.bind.annotation.DeleteMapping;
95
import org.springframework.web.bind.annotation.GetMapping;
10-
import org.springframework.web.bind.annotation.PatchMapping;
11-
import org.springframework.web.bind.annotation.PathVariable;
6+
import org.springframework.web.bind.annotation.ModelAttribute;
127
import org.springframework.web.bind.annotation.PostMapping;
138
import org.springframework.web.bind.annotation.RequestBody;
149
import org.springframework.web.bind.annotation.RequestMapping;
15-
import org.springframework.web.bind.annotation.RequestParam;
16-
import org.springframework.web.bind.annotation.RequestPart;
1710
import org.springframework.web.bind.annotation.RestController;
18-
import org.springframework.web.multipart.MultipartFile;
1911

2012
import com.sponus.coredomain.domain.common.ApiResponse;
2113
import com.sponus.coredomain.domain.organization.Organization;
2214
import com.sponus.coreinfrasecurity.annotation.AuthOrganization;
15+
import com.sponus.sponusbe.domain.organization.dto.request.PageCondition;
16+
import com.sponus.sponusbe.domain.organization.dto.response.PageResponse;
2317
import com.sponus.sponusbe.domain.propose.dto.request.ProposeCreateRequest;
2418
import com.sponus.sponusbe.domain.propose.dto.response.ProposeCreateResponse;
19+
import com.sponus.sponusbe.domain.propose.dto.response.ProposeGetResponse;
2520
import com.sponus.sponusbe.domain.propose.service.ProposeQueryService;
2621
import com.sponus.sponusbe.domain.propose.service.ProposeService;
2722

@@ -36,12 +31,21 @@
3631
public class ProposeController {
3732

3833
private final ProposeService proposeService;
34+
private final ProposeQueryService proposequeryService;
3935

4036
@PostMapping()
4137
public ApiResponse<ProposeCreateResponse> createPropose(
4238
@AuthOrganization Organization authOrganization,
4339
@RequestBody @Valid ProposeCreateRequest request
44-
){
40+
) {
4541
return ApiResponse.onSuccess(proposeService.createPropose(authOrganization, request));
4642
}
43+
44+
@GetMapping("/send")
45+
public ApiResponse<PageResponse<ProposeGetResponse>> getSendPropose(
46+
@AuthOrganization Organization authOrganization,
47+
@ModelAttribute @Valid PageCondition pageCondition
48+
) {
49+
return ApiResponse.onSuccess(proposequeryService.getSendPropose(authOrganization, pageCondition));
50+
}
4751
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.sponus.sponusbe.domain.propose.dto.response;
2+
3+
import java.time.LocalDate;
4+
5+
import com.sponus.coredomain.domain.propose.Propose;
6+
import com.sponus.coredomain.domain.propose.ProposeStatus;
7+
8+
import lombok.Builder;
9+
10+
@Builder
11+
public record ProposeGetResponse(
12+
Long id,
13+
Long organizationId,
14+
Long target,
15+
String targetName,
16+
String targetImageUrl,
17+
ProposeStatus status,
18+
LocalDate createdAt
19+
) {
20+
21+
public static ProposeGetResponse from(Propose propose) {
22+
return ProposeGetResponse.builder()
23+
.id(propose.getId())
24+
.organizationId(propose.getOrganization().getId())
25+
.target(propose.getTarget().getId())
26+
.targetName(propose.getTarget().getName())
27+
.targetImageUrl(propose.getTarget().getImageUrl())
28+
.status(propose.getStatus())
29+
.createdAt(propose.getCreatedAt().toLocalDate())
30+
.build();
31+
}
32+
}
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,38 @@
11
package com.sponus.sponusbe.domain.propose.service;
22

3+
import java.util.List;
4+
5+
import org.springframework.data.domain.PageRequest;
6+
import org.springframework.data.domain.Pageable;
7+
import org.springframework.data.support.PageableExecutionUtils;
38
import org.springframework.stereotype.Service;
49
import org.springframework.transaction.annotation.Transactional;
510

11+
import com.sponus.coredomain.domain.organization.Organization;
12+
import com.sponus.coredomain.domain.propose.repository.ProposeRepository;
13+
import com.sponus.sponusbe.domain.organization.dto.request.PageCondition;
14+
import com.sponus.sponusbe.domain.organization.dto.response.PageResponse;
15+
import com.sponus.sponusbe.domain.propose.dto.response.ProposeGetResponse;
16+
617
import lombok.RequiredArgsConstructor;
718

819
@RequiredArgsConstructor
920
@Transactional(readOnly = true)
1021
@Service
1122
public class ProposeQueryService {
23+
24+
private final ProposeRepository proposeRepository;
25+
26+
public PageResponse<ProposeGetResponse> getSendPropose(Organization organization, PageCondition pageCondition) {
27+
Pageable pageable = PageRequest.of(pageCondition.getPage() - 1, pageCondition.getSize());
28+
List<ProposeGetResponse> organizations = proposeRepository.findByOrganizationOrderByCreatedAtDesc(
29+
organization, pageable)
30+
.stream()
31+
.map(ProposeGetResponse::from)
32+
.toList();
33+
34+
return PageResponse.of(
35+
PageableExecutionUtils.getPage(organizations, pageable,
36+
() -> proposeRepository.countByOrganization(organization)));
37+
}
1238
}

api/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeService.java

-7
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,14 @@
11
package com.sponus.sponusbe.domain.propose.service;
22

3-
import java.lang.annotation.Target;
43
import java.time.LocalDateTime;
54

65
import org.springframework.stereotype.Service;
76
import org.springframework.transaction.annotation.Transactional;
87

9-
import com.sponus.coredomain.domain.bookmark.Bookmark;
108
import com.sponus.coredomain.domain.organization.Organization;
119
import com.sponus.coredomain.domain.organization.repository.OrganizationRepository;
1210
import com.sponus.coredomain.domain.propose.Propose;
1311
import com.sponus.coredomain.domain.propose.repository.ProposeRepository;
14-
import com.sponus.coreinfrafirebase.FirebaseService;
15-
import com.sponus.coreinfras3.S3Service;
16-
import com.sponus.sponusbe.domain.bookmark.dto.response.BookmarkToggleResponse;
17-
import com.sponus.sponusbe.domain.bookmark.exception.BookmarkErrorCode;
18-
import com.sponus.sponusbe.domain.bookmark.exception.BookmarkException;
1912
import com.sponus.sponusbe.domain.organization.exception.OrganizationErrorCode;
2013
import com.sponus.sponusbe.domain.organization.exception.OrganizationException;
2114
import com.sponus.sponusbe.domain.propose.dto.request.ProposeCreateRequest;

core/core-domain/src/main/java/com/sponus/coredomain/domain/propose/Propose.java

+13
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,18 @@
11
package com.sponus.coredomain.domain.propose;
22

3+
import org.hibernate.annotations.ColumnDefault;
4+
import org.hibernate.annotations.DynamicInsert;
5+
import org.hibernate.annotations.DynamicUpdate;
6+
37
import com.sponus.coredomain.domain.common.BaseEntity;
48
import com.sponus.coredomain.domain.organization.Organization;
59

610
import jakarta.persistence.CascadeType;
711
import jakarta.persistence.Column;
812
import jakarta.persistence.ConstraintMode;
913
import jakarta.persistence.Entity;
14+
import jakarta.persistence.EnumType;
15+
import jakarta.persistence.Enumerated;
1016
import jakarta.persistence.FetchType;
1117
import jakarta.persistence.ForeignKey;
1218
import jakarta.persistence.GeneratedValue;
@@ -26,6 +32,8 @@
2632
@AllArgsConstructor(access = AccessLevel.PRIVATE)
2733
@Getter
2834
@Entity
35+
@DynamicUpdate
36+
@DynamicInsert
2937
@Table(name = "propose")
3038
public class Propose extends BaseEntity {
3139

@@ -41,4 +49,9 @@ public class Propose extends BaseEntity {
4149
@ManyToOne(fetch = FetchType.LAZY, cascade = CascadeType.REMOVE)
4250
@JoinColumn(name = "target_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT))
4351
private Organization target;
52+
53+
@Enumerated(EnumType.STRING)
54+
@ColumnDefault("'WAITING'")
55+
@Column(name = "propose_status")
56+
private ProposeStatus status;
4457
}

core/core-domain/src/main/java/com/sponus/coredomain/domain/propose/ProposeStatus.java

+1-3
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
11
package com.sponus.coredomain.domain.propose;
22

33
public enum ProposeStatus {
4-
// 제안을 보낸 측: PENDING
5-
// 제안을 받은 측: VIEWED, ACCEPTED, REJECTED, SUSPENDED, PAID
6-
PENDING, VIEWED, ACCEPTED, REJECTED, SUSPENDED, PAID, COMPLETED;
4+
ACCEPTED, REJECTED, WAITING;
75

86
public static ProposeStatus of(String input) {
97
return ProposeStatus.valueOf(input.toUpperCase());

core/core-domain/src/main/java/com/sponus/coredomain/domain/propose/repository/ProposeRepository.java

+8-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package com.sponus.coredomain.domain.propose.repository;
22

33
import java.time.LocalDateTime;
4-
import java.util.Optional;
54

5+
import org.springframework.data.domain.Page;
6+
import org.springframework.data.domain.Pageable;
67
import org.springframework.data.jpa.repository.JpaRepository;
78
import org.springframework.data.jpa.repository.Query;
89
import org.springframework.data.repository.query.Param;
@@ -17,5 +18,10 @@ public interface ProposeRepository extends JpaRepository<Propose, Long> {
1718
// Optional<Propose> findByOrganization(Organization organization);
1819

1920
@Query("SELECT COUNT(p) FROM Propose p WHERE p.organization = :organization AND p.createdAt >= :startOfDay")
20-
Long countProposesByOrganizationToday(@Param("organization") Organization organization, @Param("startOfDay") LocalDateTime startOfDay);
21+
Long countProposesByOrganizationToday(@Param("organization") Organization organization,
22+
@Param("startOfDay") LocalDateTime startOfDay);
23+
24+
Page<Propose> findByOrganizationOrderByCreatedAtDesc(Organization organization, Pageable pageable);
25+
26+
Long countByOrganization(Organization organization);
2127
}

0 commit comments

Comments
 (0)