Skip to content

Commit 8176f7b

Browse files
authored
feat: 제안 생성 기능 개발 (#300)
1 parent ef1e011 commit 8176f7b

22 files changed

+127
-567
lines changed

api/src/main/java/com/sponus/sponusbe/domain/bookmark/dto/request/BookmarkToggleRequest.java

+3
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
import com.sponus.coredomain.domain.bookmark.Bookmark;
44
import com.sponus.coredomain.domain.organization.Organization;
55

6+
import jakarta.validation.constraints.NotNull;
7+
68
public record BookmarkToggleRequest(
9+
@NotNull
710
Long target
811
) {
912

api/src/main/java/com/sponus/sponusbe/domain/bookmark/service/BookmarkService.java

-1
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,4 @@ public BookmarkToggleResponse bookmarkToggle(Organization organization, Bookmark
4343
return BookmarkToggleResponse.from(bookmark, true);
4444
});
4545
}
46-
4746
}

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

+4-77
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,7 @@
2121
import com.sponus.coredomain.domain.organization.Organization;
2222
import com.sponus.coreinfrasecurity.annotation.AuthOrganization;
2323
import com.sponus.sponusbe.domain.propose.dto.request.ProposeCreateRequest;
24-
import com.sponus.sponusbe.domain.propose.dto.request.ProposeStatusUpdateRequest;
25-
import com.sponus.sponusbe.domain.propose.dto.request.ProposeUpdateRequest;
26-
import com.sponus.sponusbe.domain.propose.dto.response.DateGroupedProposeResponse;
2724
import com.sponus.sponusbe.domain.propose.dto.response.ProposeCreateResponse;
28-
import com.sponus.sponusbe.domain.propose.dto.response.ProposeDetailGetResponse;
2925
import com.sponus.sponusbe.domain.propose.service.ProposeQueryService;
3026
import com.sponus.sponusbe.domain.propose.service.ProposeService;
3127

@@ -40,81 +36,12 @@
4036
public class ProposeController {
4137

4238
private final ProposeService proposeService;
43-
private final ProposeQueryService proposeQueryService;
4439

45-
@PostMapping(consumes = "multipart/form-data")
40+
@PostMapping()
4641
public ApiResponse<ProposeCreateResponse> createPropose(
4742
@AuthOrganization Organization authOrganization,
48-
@RequestPart("request") @Valid ProposeCreateRequest request,
49-
@RequestPart(value = "attachments", required = false) List<MultipartFile> attachments
50-
) throws IOException {
51-
return ApiResponse.onSuccess(
52-
proposeService.createPropose(
53-
authOrganization,
54-
request,
55-
attachments == null ? List.of() : attachments
56-
)
57-
);
43+
@RequestBody @Valid ProposeCreateRequest request
44+
){
45+
return ApiResponse.onSuccess(proposeService.createPropose(authOrganization, request));
5846
}
59-
60-
@GetMapping("/sent")
61-
public ApiResponse<List<DateGroupedProposeResponse>> getSentProposes(
62-
@AuthOrganization Organization authOrganization
63-
) {
64-
return ApiResponse.onSuccess(proposeQueryService.getSentProposes(authOrganization));
65-
}
66-
67-
@GetMapping("/received")
68-
public ApiResponse<List<DateGroupedProposeResponse>> getReceivedProposes(
69-
@AuthOrganization Organization authOrganization,
70-
@RequestParam(required = false) Long announcementId
71-
) {
72-
return ApiResponse.onSuccess(proposeQueryService.getReceivedProposes(authOrganization, announcementId));
73-
}
74-
75-
@GetMapping("/{proposeId}")
76-
public ApiResponse<ProposeDetailGetResponse> getProposeDetail(
77-
@AuthOrganization Organization authOrganization,
78-
@PathVariable Long proposeId
79-
) {
80-
return ApiResponse.onSuccess(proposeService.getProposeDetail(authOrganization, proposeId));
81-
}
82-
83-
@PatchMapping(value = "/{proposeId}", consumes = "multipart/form-data")
84-
public ApiResponse<Void> updatePropose(
85-
@AuthOrganization Organization authOrganization,
86-
@PathVariable Long proposeId,
87-
@RequestPart @Valid ProposeUpdateRequest request,
88-
@RequestPart(value = "attachments", required = false) List<MultipartFile> attachments
89-
) {
90-
proposeService.updatePropose(
91-
authOrganization,
92-
proposeId,
93-
request,
94-
attachments == null ? List.of() : attachments);
95-
return ApiResponse.onSuccess(null);
96-
}
97-
98-
@PatchMapping(value = "/{proposeId}/status")
99-
public ApiResponse<Void> acceptPropose(
100-
@AuthOrganization Organization authOrganization,
101-
@PathVariable Long proposeId,
102-
@RequestBody @Valid ProposeStatusUpdateRequest request
103-
) {
104-
proposeService.updateProposeStatus(
105-
authOrganization,
106-
proposeId,
107-
request);
108-
return ApiResponse.onSuccess(null);
109-
}
110-
111-
@DeleteMapping("/{proposeId}")
112-
public ApiResponse<Void> deletePropose(
113-
@AuthOrganization Organization authOrganization,
114-
@PathVariable Long proposeId
115-
) {
116-
proposeService.deletePropose(authOrganization, proposeId);
117-
return ApiResponse.onSuccess(null);
118-
}
119-
12047
}
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.sponus.sponusbe.domain.propose.dto.request;
22

3+
import com.sponus.coredomain.domain.bookmark.Bookmark;
34
import com.sponus.coredomain.domain.organization.Organization;
45
import com.sponus.coredomain.domain.propose.Propose;
56
import com.sponus.coredomain.domain.propose.ProposeStatus;
@@ -8,26 +9,13 @@
89
import jakarta.validation.constraints.NotNull;
910

1011
public record ProposeCreateRequest(
11-
12-
@NotBlank(message = "[ERROR] 제안 제목 입력은 필수 입니다.")
13-
String title,
14-
15-
@NotBlank(message = "[ERROR] 제안 내용 입력은 필수 입니다.")
16-
String content,
17-
18-
@NotNull(message = "[ERROR] 제안 대상 공고 입력은 필수 입니다.")
19-
Long announcementId
12+
@NotNull
13+
Long target
2014
) {
21-
public Propose toEntity(
22-
Organization proposedOrganization,
23-
Organization proposingOrganization
24-
) {
15+
public Propose toEntity(Organization organization, Organization target) {
2516
return Propose.builder()
26-
.title(title)
27-
.content(content)
28-
.status(ProposeStatus.PENDING)
29-
.proposedOrganization(proposedOrganization)
30-
.proposingOrganization(proposingOrganization)
17+
.organization(organization)
18+
.target(target)
3119
.build();
3220
}
3321
}

api/src/main/java/com/sponus/sponusbe/domain/propose/dto/request/ProposeStatusUpdateRequest.java

-9
This file was deleted.

api/src/main/java/com/sponus/sponusbe/domain/propose/dto/request/ProposeUpdateRequest.java

-7
This file was deleted.

api/src/main/java/com/sponus/sponusbe/domain/propose/dto/response/DateGroupedProposeResponse.java

-21
This file was deleted.

api/src/main/java/com/sponus/sponusbe/domain/propose/dto/response/ProposeAttachmentResponse.java

-20
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,21 @@
11
package com.sponus.sponusbe.domain.propose.dto.response;
22

3+
import com.sponus.coredomain.domain.propose.Propose;
4+
5+
import lombok.Builder;
6+
7+
@Builder
38
public record ProposeCreateResponse(
4-
Long proposeId
9+
Long id,
10+
Long organizationId,
11+
Long target
512
) {
13+
14+
public static ProposeCreateResponse from(Propose propose) {
15+
return ProposeCreateResponse.builder()
16+
.id(propose.getId())
17+
.organizationId(propose.getOrganization().getId())
18+
.target(propose.getTarget().getId())
19+
.build();
20+
}
621
}

api/src/main/java/com/sponus/sponusbe/domain/propose/dto/response/ProposeDetailGetResponse.java

-47
This file was deleted.

api/src/main/java/com/sponus/sponusbe/domain/propose/dto/response/ProposeSummaryGetResponse.java

-36
This file was deleted.

api/src/main/java/com/sponus/sponusbe/domain/propose/exception/ProposeErrorCode.java

+2-4
Original file line numberDiff line numberDiff line change
@@ -12,11 +12,9 @@
1212
@AllArgsConstructor
1313
public enum ProposeErrorCode implements BaseErrorCode {
1414
PROPOSE_ERROR(HttpStatus.BAD_REQUEST, "PROP4000", "제안 관련 에러"),
15-
ANNOUNCEMENT_ID_IS_REQUIRED(HttpStatus.BAD_REQUEST, "PROP4001", "공고 ID가 필요합니다."),
16-
INVALID_PROPOSING_ORGANIZATION(HttpStatus.BAD_REQUEST, "PROP4002", "해당 단체가 작성한 제안이 아닙니다."),
17-
INVALID_PROPOSED_ORGANIZATION(HttpStatus.BAD_REQUEST, "PROP4003", "제안을 받은 단체만 접근이 가능합니다."),
18-
PROPOSE_STATUS_NOT_PENDING(HttpStatus.BAD_REQUEST, "PROP4004", "수락 대기 중인 제안만 수정이 가능합니다."),
1915
INVALID_PROPOSE_STATUS(HttpStatus.BAD_REQUEST, "PROP4005", "유효하지 않은 제안 상태입니다."),
16+
PROPOSE_LIMIT_ERROR(HttpStatus.CONFLICT, "PROP4009", "하루 제안 5회 초과하였습니다."),
17+
PROFILE_NOT_COMPLETED(HttpStatus.BAD_REQUEST, "PROP4010", "프로필이 작성되지 않았습니다."),
2018
PROPOSE_NOT_FOUND(HttpStatus.NOT_FOUND, "PROP4040", "해당 제안이 존재하지 않습니다.");
2119

2220
private final HttpStatus httpStatus;
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,12 @@
11
package com.sponus.sponusbe.domain.propose.service;
22

3-
import java.util.List;
4-
53
import org.springframework.stereotype.Service;
64
import org.springframework.transaction.annotation.Transactional;
75

8-
import com.sponus.coredomain.domain.organization.Organization;
9-
import com.sponus.coreinfradb.propose.ProposeCustomRepository;
10-
import com.sponus.sponusbe.domain.propose.dto.response.DateGroupedProposeResponse;
11-
import com.sponus.sponusbe.domain.propose.dto.response.ProposeSummaryGetResponse;
12-
136
import lombok.RequiredArgsConstructor;
147

158
@RequiredArgsConstructor
169
@Transactional(readOnly = true)
1710
@Service
1811
public class ProposeQueryService {
19-
20-
private final ProposeCustomRepository proposeCustomRepository;
21-
22-
public List<DateGroupedProposeResponse> getSentProposes(Organization organization) {
23-
return DateGroupedProposeResponse.from(
24-
proposeCustomRepository.findSentPropose(organization.getId()).stream()
25-
.map(ProposeSummaryGetResponse::from)
26-
.toList());
27-
}
28-
29-
public List<DateGroupedProposeResponse> getReceivedProposes(Organization organization, Long announcementId) {
30-
return DateGroupedProposeResponse.from(
31-
proposeCustomRepository.findReceivedProposeWithAnnouncementId(organization.getId(), announcementId).stream()
32-
.map(ProposeSummaryGetResponse::from)
33-
.toList());
34-
}
3512
}

0 commit comments

Comments
 (0)