From 23ab59250aee08f7d700f3d26f1f1fa8a19a3cd2 Mon Sep 17 00:00:00 2001 From: marooo326 Date: Sat, 20 Jan 2024 21:15:56 +0900 Subject: [PATCH 1/6] =?UTF-8?q?:sparkles:=20feat:=20=EA=B3=84=EC=B8=B5?= =?UTF-8?q?=EB=B3=84=20=EA=B8=B0=EB=B3=B8=20=ED=81=B4=EB=9E=98=EC=8A=A4=20?= =?UTF-8?q?=EC=9E=91=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../propose/controller/ProposeController.java | 13 +++++++++++++ .../propose/repository/ProposeRepository.java | 8 ++++++++ .../propose/service/ProposeQueryService.java | 15 +++++++++++++++ .../domain/propose/service/ProposeService.java | 15 +++++++++++++++ 4 files changed, 51 insertions(+) create mode 100644 src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeController.java create mode 100644 src/main/java/com/sponus/sponusbe/domain/propose/repository/ProposeRepository.java create mode 100644 src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeQueryService.java create mode 100644 src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeService.java diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeController.java b/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeController.java new file mode 100644 index 00000000..4a67c92f --- /dev/null +++ b/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeController.java @@ -0,0 +1,13 @@ +package com.sponus.sponusbe.domain.propose.controller; + +import org.springframework.web.bind.annotation.RestController; + +import com.sponus.sponusbe.domain.propose.service.ProposeService; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@RestController +public class ProposeController { + private final ProposeService proposeService; +} diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/repository/ProposeRepository.java b/src/main/java/com/sponus/sponusbe/domain/propose/repository/ProposeRepository.java new file mode 100644 index 00000000..2c4161e3 --- /dev/null +++ b/src/main/java/com/sponus/sponusbe/domain/propose/repository/ProposeRepository.java @@ -0,0 +1,8 @@ +package com.sponus.sponusbe.domain.propose.repository; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.sponus.sponusbe.domain.propose.entity.Propose; + +public interface ProposeRepository extends JpaRepository { +} diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeQueryService.java b/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeQueryService.java new file mode 100644 index 00000000..515aa51a --- /dev/null +++ b/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeQueryService.java @@ -0,0 +1,15 @@ +package com.sponus.sponusbe.domain.propose.service; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.sponus.sponusbe.domain.propose.repository.ProposeRepository; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Transactional(readOnly = true) +@Service +public class ProposeQueryService { + private final ProposeRepository proposeRepository; +} diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeService.java b/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeService.java new file mode 100644 index 00000000..55ba92c0 --- /dev/null +++ b/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeService.java @@ -0,0 +1,15 @@ +package com.sponus.sponusbe.domain.propose.service; + +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.sponus.sponusbe.domain.propose.repository.ProposeRepository; + +import lombok.RequiredArgsConstructor; + +@RequiredArgsConstructor +@Transactional +@Service +public class ProposeService { + private final ProposeRepository proposeRepository; +} From 6354a4b6d179583e60f48c8b743ff8066c7c98d2 Mon Sep 17 00:00:00 2001 From: marooo326 Date: Tue, 23 Jan 2024 11:52:48 +0900 Subject: [PATCH 2/6] =?UTF-8?q?:sparkles:=20feat:=20createPropose=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AuthOrganizationArgumentResolver.java | 5 +-- .../organization/entity/Organization.java | 4 ++ .../propose/controller/ProposeController.java | 15 +++++++ .../controller/ProposeCreateRequest.java | 29 ++++++++++++ .../controller/ProposeCreateResponse.java | 6 +++ .../domain/propose/entity/Propose.java | 1 + .../propose/service/ProposeService.java | 45 +++++++++++++++++++ 7 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeCreateRequest.java create mode 100644 src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeCreateResponse.java diff --git a/src/main/java/com/sponus/sponusbe/auth/annotation/AuthOrganizationArgumentResolver.java b/src/main/java/com/sponus/sponusbe/auth/annotation/AuthOrganizationArgumentResolver.java index a7388613..e4e56b18 100644 --- a/src/main/java/com/sponus/sponusbe/auth/annotation/AuthOrganizationArgumentResolver.java +++ b/src/main/java/com/sponus/sponusbe/auth/annotation/AuthOrganizationArgumentResolver.java @@ -36,13 +36,12 @@ public boolean supportsParameter(MethodParameter parameter) { @Override public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) { + // TODO : Access Token 없는 경우 처리 CustomUserDetails userDetails = (CustomUserDetails)SecurityContextHolder.getContext() .getAuthentication() .getPrincipal(); - Organization organization = organizationRepository.findById(userDetails.getId()) + return organizationRepository.findById(userDetails.getId()) .orElseThrow(() -> new OrganizationException(OrganizationErrorCode.ORGANIZATION_NOT_FOUND)); - - return organization; } } diff --git a/src/main/java/com/sponus/sponusbe/domain/organization/entity/Organization.java b/src/main/java/com/sponus/sponusbe/domain/organization/entity/Organization.java index 67bd293f..113d864f 100644 --- a/src/main/java/com/sponus/sponusbe/domain/organization/entity/Organization.java +++ b/src/main/java/com/sponus/sponusbe/domain/organization/entity/Organization.java @@ -94,4 +94,8 @@ public class Organization extends BaseEntity { @Builder.Default @OneToMany(mappedBy = "organization") private List organizationLinks = new ArrayList<>(); + + public boolean isStudentOrganization() { + return this.organizationType == OrganizationType.STUDENT; + } } diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeController.java b/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeController.java index 4a67c92f..e86572e0 100644 --- a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeController.java +++ b/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeController.java @@ -1,13 +1,28 @@ package com.sponus.sponusbe.domain.propose.controller; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; +import com.sponus.sponusbe.auth.annotation.AuthOrganization; +import com.sponus.sponusbe.domain.organization.entity.Organization; import com.sponus.sponusbe.domain.propose.service.ProposeService; +import com.sponus.sponusbe.global.common.ApiResponse; +import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; @RequiredArgsConstructor @RestController public class ProposeController { + private final ProposeService proposeService; + + @PostMapping("/api/v1/propose") + public ApiResponse createPropose( + @AuthOrganization Organization organization, + @RequestBody @Valid ProposeCreateRequest request + ) { + return ApiResponse.onSuccess(proposeService.createPropose(organization, request)); + } } diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeCreateRequest.java b/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeCreateRequest.java new file mode 100644 index 00000000..c41ee065 --- /dev/null +++ b/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeCreateRequest.java @@ -0,0 +1,29 @@ +package com.sponus.sponusbe.domain.propose.controller; + +import com.sponus.sponusbe.domain.announcement.entity.Announcement; +import com.sponus.sponusbe.domain.organization.entity.Organization; +import com.sponus.sponusbe.domain.propose.entity.Propose; +import com.sponus.sponusbe.domain.propose.entity.ProposeStatus; + +public record ProposeCreateRequest( + String title, + String content, + Long announcementId +) { + public Propose toEntity( + Announcement announcement, + Organization proposedOrganization, + Organization studentOrganization, + Organization companyOrganization + ) { + return Propose.builder() + .title(title) + .content(content) + .status(ProposeStatus.PENDING) + .announcement(announcement) + .proposedOrganization(proposedOrganization) + .studentOrganization(studentOrganization) + .companyOrganization(companyOrganization) + .build(); + } +} diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeCreateResponse.java b/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeCreateResponse.java new file mode 100644 index 00000000..224144e0 --- /dev/null +++ b/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeCreateResponse.java @@ -0,0 +1,6 @@ +package com.sponus.sponusbe.domain.propose.controller; + +public record ProposeCreateResponse( + Long proposeId +) { +} diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/entity/Propose.java b/src/main/java/com/sponus/sponusbe/domain/propose/entity/Propose.java index a16ec93b..06f33c34 100644 --- a/src/main/java/com/sponus/sponusbe/domain/propose/entity/Propose.java +++ b/src/main/java/com/sponus/sponusbe/domain/propose/entity/Propose.java @@ -56,6 +56,7 @@ public class Propose { @JoinColumn(name = "proposed_organization_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Organization proposedOrganization; + // TODO : 추후에 연관관계 제거 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "student_organization_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Organization studentOrganization; diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeService.java b/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeService.java index 55ba92c0..859132f7 100644 --- a/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeService.java +++ b/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeService.java @@ -3,6 +3,13 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import com.sponus.sponusbe.domain.announcement.entity.Announcement; +import com.sponus.sponusbe.domain.announcement.entity.enums.AnnouncementCategory; +import com.sponus.sponusbe.domain.announcement.entity.enums.AnnouncementStatus; +import com.sponus.sponusbe.domain.announcement.entity.enums.AnnouncementType; +import com.sponus.sponusbe.domain.organization.entity.Organization; +import com.sponus.sponusbe.domain.propose.controller.ProposeCreateRequest; +import com.sponus.sponusbe.domain.propose.controller.ProposeCreateResponse; import com.sponus.sponusbe.domain.propose.repository.ProposeRepository; import lombok.RequiredArgsConstructor; @@ -11,5 +18,43 @@ @Transactional @Service public class ProposeService { + private final ProposeRepository proposeRepository; + + public ProposeCreateResponse createPropose(Organization organization, ProposeCreateRequest request) { + // TODO : 공지쪽 연관관계로 인해 동작 안함 + Announcement announcement = getAvailableAnnouncement(request.announcementId()); + Organization studentOrganization; + Organization companyOrganization; + if (organization.isStudentOrganization()) { + studentOrganization = organization; + companyOrganization = announcement.getWriter(); + } else { + studentOrganization = announcement.getWriter(); + companyOrganization = organization; + } + return new ProposeCreateResponse( + proposeRepository.save( + request.toEntity( + announcement, + organization, + studentOrganization, + companyOrganization + ) + ).getId() + ); + } + + private Announcement getAvailableAnnouncement(Long announcementId) { + // TODO : announcementId로 announcement를 찾아서 반환 + // return announcementRepository.findById(announcementId) + // .orElseThrow(() -> new AnnouncementException(AnnouncementErrorCode.ANNOUNCEMENT_NOT_FOUND)); + return Announcement.builder() + .title("title") + .type(AnnouncementType.COLLABORATION) + .category(AnnouncementCategory.IDEA) + .content("content") + .status(AnnouncementStatus.POSTED) + .build(); + } } From 394e581fd6ef39f0f0b3f25dc30b6d9dee15d234 Mon Sep 17 00:00:00 2001 From: marooo326 Date: Tue, 23 Jan 2024 13:13:17 +0900 Subject: [PATCH 3/6] =?UTF-8?q?:sparkles:=20feat:=20Propose=20=EC=97=94?= =?UTF-8?q?=ED=8B=B0=ED=8B=B0=20=EC=88=98=EC=A0=95=20(=EC=A0=9C=EC=95=88?= =?UTF-8?q?=20=EB=B0=9B=EB=8A=94=20=EB=8B=A8=EC=B2=B4,=20=EC=A0=9C?= =?UTF-8?q?=EC=95=88=20=ED=95=98=EB=8A=94=20=EB=8B=A8=EC=B2=B4=EB=A1=9C=20?= =?UTF-8?q?=EA=B5=AC=EB=B6=84)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../propose/controller/ProposeCreateRequest.java | 6 ++---- .../sponusbe/domain/propose/entity/Propose.java | 10 +++++++--- .../domain/propose/service/ProposeService.java | 12 +----------- 3 files changed, 10 insertions(+), 18 deletions(-) diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeCreateRequest.java b/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeCreateRequest.java index c41ee065..6ba1a97b 100644 --- a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeCreateRequest.java +++ b/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeCreateRequest.java @@ -13,8 +13,7 @@ public record ProposeCreateRequest( public Propose toEntity( Announcement announcement, Organization proposedOrganization, - Organization studentOrganization, - Organization companyOrganization + Organization proposingOrganization ) { return Propose.builder() .title(title) @@ -22,8 +21,7 @@ public Propose toEntity( .status(ProposeStatus.PENDING) .announcement(announcement) .proposedOrganization(proposedOrganization) - .studentOrganization(studentOrganization) - .companyOrganization(companyOrganization) + .proposingOrganization(proposingOrganization) .build(); } } diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/entity/Propose.java b/src/main/java/com/sponus/sponusbe/domain/propose/entity/Propose.java index 06f33c34..0c160326 100644 --- a/src/main/java/com/sponus/sponusbe/domain/propose/entity/Propose.java +++ b/src/main/java/com/sponus/sponusbe/domain/propose/entity/Propose.java @@ -48,15 +48,19 @@ public class Propose { @Column(name = "propose_status", nullable = false) private ProposeStatus status; - @ManyToOne(fetch = FetchType.LAZY, optional = false) + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "announcement_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Announcement announcement; - @ManyToOne(fetch = FetchType.LAZY, optional = false) + @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "proposed_organization_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Organization proposedOrganization; - // TODO : 추후에 연관관계 제거 + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "proposing_organization_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + private Organization proposingOrganization; + + // TODO : 추후에 연관관계 제거 -> 그냥 proposingOrganizationType, getStudentOrganization 메서드로 대체하는게 좋을 것 같음 @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "student_organization_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Organization studentOrganization; diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeService.java b/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeService.java index 859132f7..eca88c9c 100644 --- a/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeService.java +++ b/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeService.java @@ -24,22 +24,12 @@ public class ProposeService { public ProposeCreateResponse createPropose(Organization organization, ProposeCreateRequest request) { // TODO : 공지쪽 연관관계로 인해 동작 안함 Announcement announcement = getAvailableAnnouncement(request.announcementId()); - Organization studentOrganization; - Organization companyOrganization; - if (organization.isStudentOrganization()) { - studentOrganization = organization; - companyOrganization = announcement.getWriter(); - } else { - studentOrganization = announcement.getWriter(); - companyOrganization = organization; - } return new ProposeCreateResponse( proposeRepository.save( request.toEntity( announcement, organization, - studentOrganization, - companyOrganization + announcement.getWriter() ) ).getId() ); From af60b985cea8be07014a443bb33ca15cfd75b6f5 Mon Sep 17 00:00:00 2001 From: marooo326 Date: Tue, 23 Jan 2024 18:10:46 +0900 Subject: [PATCH 4/6] =?UTF-8?q?:sparkles:=20feat:=20=EC=A0=9C=EC=95=88=20?= =?UTF-8?q?=EB=AA=A9=EB=A1=9D=20=EC=A1=B0=ED=9A=8C,=20=EC=83=81=EC=84=B8?= =?UTF-8?q?=20=EC=A1=B0=ED=9A=8C=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../propose/controller/ProposeController.java | 24 ++++++++++- .../controller/ProposeDetailGetResponse.java | 42 +++++++++++++++++++ .../controller/ProposeGetCondition.java | 17 ++++++++ .../controller/ProposeSummaryGetResponse.java | 40 ++++++++++++++++++ .../propose/controller/ProposeType.java | 6 +++ .../domain/propose/entity/Propose.java | 3 +- .../domain/propose/entity/ProposeStatus.java | 2 +- .../propose/exception/ProposeErrorCode.java | 26 ++++++++++++ .../propose/exception/ProposeException.java | 11 +++++ .../propose/repository/ProposeRepository.java | 9 ++++ .../propose/service/ProposeQueryService.java | 39 +++++++++++++++++ .../propose/service/ProposeService.java | 4 +- .../common/exception/CustomException.java | 2 +- 13 files changed, 218 insertions(+), 7 deletions(-) create mode 100644 src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeDetailGetResponse.java create mode 100644 src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeGetCondition.java create mode 100644 src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeSummaryGetResponse.java create mode 100644 src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeType.java create mode 100644 src/main/java/com/sponus/sponusbe/domain/propose/exception/ProposeErrorCode.java create mode 100644 src/main/java/com/sponus/sponusbe/domain/propose/exception/ProposeException.java diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeController.java b/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeController.java index e86572e0..0650813c 100644 --- a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeController.java +++ b/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeController.java @@ -1,11 +1,17 @@ package com.sponus.sponusbe.domain.propose.controller; +import java.util.List; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import com.sponus.sponusbe.auth.annotation.AuthOrganization; import com.sponus.sponusbe.domain.organization.entity.Organization; +import com.sponus.sponusbe.domain.propose.service.ProposeQueryService; import com.sponus.sponusbe.domain.propose.service.ProposeService; import com.sponus.sponusbe.global.common.ApiResponse; @@ -17,12 +23,26 @@ public class ProposeController { private final ProposeService proposeService; + private final ProposeQueryService proposeQueryService; @PostMapping("/api/v1/propose") public ApiResponse createPropose( - @AuthOrganization Organization organization, + @AuthOrganization Organization authOrganization, @RequestBody @Valid ProposeCreateRequest request ) { - return ApiResponse.onSuccess(proposeService.createPropose(organization, request)); + return ApiResponse.onSuccess(proposeService.createPropose(authOrganization, request)); + } + + @GetMapping("/api/v1/propose/me") + public ApiResponse> getMyProposes( + @AuthOrganization Organization authOrganization, + @ModelAttribute @Valid ProposeGetCondition condition + ) { + return ApiResponse.onSuccess(proposeQueryService.getProposes(authOrganization, condition)); + } + + @GetMapping("/api/v1/propose/{proposeId}") + public ApiResponse getProposeDetail(@PathVariable Long proposeId) { + return ApiResponse.onSuccess(proposeQueryService.getProposeDetail(proposeId)); } } diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeDetailGetResponse.java b/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeDetailGetResponse.java new file mode 100644 index 00000000..ae0dced3 --- /dev/null +++ b/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeDetailGetResponse.java @@ -0,0 +1,42 @@ +package com.sponus.sponusbe.domain.propose.controller; + +import java.time.format.DateTimeFormatter; +import java.util.Locale; + +import com.sponus.sponusbe.domain.propose.entity.Propose; + +public record ProposeDetailGetResponse( + Long proposeId, + String title, + String content, + String status, + String proposeImageUrl, + Long proposedOrganizationId, + String proposedOrganizationName, + Long proposingOrganizationId, + String proposingOrganizationName, + + // TODO : 공고 상세 정보 (공고에서 묶기!) + Long announcementId, + String createdDate, + String createdDay +) { + public static ProposeDetailGetResponse from(Propose propose) { + DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("MM.dd"); + DateTimeFormatter dayFormatter = DateTimeFormatter.ofPattern("EEE", Locale.ENGLISH); + return new ProposeDetailGetResponse( + propose.getId(), + propose.getTitle(), + propose.getContent(), + propose.getStatus().name(), + null, // TODO : 제안 이미지 URL + propose.getProposedOrganization().getId(), + propose.getProposedOrganization().getName(), + propose.getProposingOrganization().getId(), + propose.getProposingOrganization().getName(), + propose.getAnnouncement().getId(), + propose.getCreatedAt().format(dateFormatter), + propose.getUpdatedAt().format(dayFormatter) + ); + } +} diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeGetCondition.java b/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeGetCondition.java new file mode 100644 index 00000000..2a8c091d --- /dev/null +++ b/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeGetCondition.java @@ -0,0 +1,17 @@ +package com.sponus.sponusbe.domain.propose.controller; + +import jakarta.validation.constraints.NotNull; + +public record ProposeGetCondition( + @NotNull + ProposeType proposeType, + Long announcementId +) { + public boolean isSentPropose() { + return proposeType == ProposeType.SEND; + } + + public boolean isReceivedPropose() { + return proposeType == ProposeType.RECEIVED; + } +} diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeSummaryGetResponse.java b/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeSummaryGetResponse.java new file mode 100644 index 00000000..674bf14b --- /dev/null +++ b/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeSummaryGetResponse.java @@ -0,0 +1,40 @@ +package com.sponus.sponusbe.domain.propose.controller; + +import java.time.format.DateTimeFormatter; +import java.util.Locale; + +import com.sponus.sponusbe.domain.propose.entity.Propose; + +public record ProposeSummaryGetResponse( + Long proposeId, + String title, + String status, + String proposeImageUrl, + Long proposedOrganizationId, + String proposedOrganizationName, + Long proposingOrganizationId, + String proposingOrganizationName, + + // TODO : 공고 간략 정보 (공고에서 묶기!) + Long announcementId, + String createdDate, + String createdDay +) { + public static ProposeSummaryGetResponse from(Propose propose) { + DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("MM.dd"); + DateTimeFormatter dayFormatter = DateTimeFormatter.ofPattern("EEE", Locale.ENGLISH); + return new ProposeSummaryGetResponse( + propose.getId(), + propose.getTitle(), + propose.getStatus().name(), + null, // TODO : 제안 이미지 URL + propose.getProposedOrganization().getId(), + propose.getProposedOrganization().getName(), + propose.getProposingOrganization().getId(), + propose.getProposingOrganization().getName(), + propose.getAnnouncement().getId(), + propose.getCreatedAt().format(dateFormatter), + propose.getUpdatedAt().format(dayFormatter) + ); + } +} diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeType.java b/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeType.java new file mode 100644 index 00000000..2f7e73fb --- /dev/null +++ b/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeType.java @@ -0,0 +1,6 @@ +package com.sponus.sponusbe.domain.propose.controller; + +public enum ProposeType { + SEND, RECEIVED; + +} diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/entity/Propose.java b/src/main/java/com/sponus/sponusbe/domain/propose/entity/Propose.java index 0c160326..310a1a82 100644 --- a/src/main/java/com/sponus/sponusbe/domain/propose/entity/Propose.java +++ b/src/main/java/com/sponus/sponusbe/domain/propose/entity/Propose.java @@ -6,6 +6,7 @@ import com.sponus.sponusbe.domain.announcement.entity.Announcement; import com.sponus.sponusbe.domain.organization.entity.Organization; import com.sponus.sponusbe.domain.report.entity.Report; +import com.sponus.sponusbe.global.common.BaseEntity; import jakarta.persistence.Column; import jakarta.persistence.ConstraintMode; @@ -32,7 +33,7 @@ @Getter @Entity @Table(name = "propose") -public class Propose { +public class Propose extends BaseEntity { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/entity/ProposeStatus.java b/src/main/java/com/sponus/sponusbe/domain/propose/entity/ProposeStatus.java index 6a198ae6..e9410d75 100644 --- a/src/main/java/com/sponus/sponusbe/domain/propose/entity/ProposeStatus.java +++ b/src/main/java/com/sponus/sponusbe/domain/propose/entity/ProposeStatus.java @@ -1,5 +1,5 @@ package com.sponus.sponusbe.domain.propose.entity; public enum ProposeStatus { - PENDING, ACCEPTED, REJECTED, CANCELED + PENDING, ACCEPTED, REJECTED, SUSPENDED, CANCELED, ACCEPTED_AND_PAID; } diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/exception/ProposeErrorCode.java b/src/main/java/com/sponus/sponusbe/domain/propose/exception/ProposeErrorCode.java new file mode 100644 index 00000000..ac2963b9 --- /dev/null +++ b/src/main/java/com/sponus/sponusbe/domain/propose/exception/ProposeErrorCode.java @@ -0,0 +1,26 @@ +package com.sponus.sponusbe.domain.propose.exception; + +import org.springframework.http.HttpStatus; + +import com.sponus.sponusbe.global.common.ApiResponse; +import com.sponus.sponusbe.global.common.BaseErrorCode; + +import lombok.AllArgsConstructor; +import lombok.Getter; + +@Getter +@AllArgsConstructor +public enum ProposeErrorCode implements BaseErrorCode { + ANNOUNCEMENT_ID_IS_REQUIRED(HttpStatus.BAD_REQUEST, "4001", "공고 ID가 필요합니다."), + PROPOSE_NOT_FOUND(HttpStatus.NOT_FOUND, "4041", "해당 제안이 존재하지 않습니다."), + INTERNAL_PROPOSE_EXCEPTION(HttpStatus.INTERNAL_SERVER_ERROR, "5001", "서버 에러가 발생했습니다. 관리자에게 문의해주세요."); + + private final HttpStatus httpStatus; + private final String code; + private final String message; + + @Override + public ApiResponse getErrorResponse() { + return ApiResponse.onFailure(code, message); + } +} diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/exception/ProposeException.java b/src/main/java/com/sponus/sponusbe/domain/propose/exception/ProposeException.java new file mode 100644 index 00000000..389f3103 --- /dev/null +++ b/src/main/java/com/sponus/sponusbe/domain/propose/exception/ProposeException.java @@ -0,0 +1,11 @@ +package com.sponus.sponusbe.domain.propose.exception; + +import com.sponus.sponusbe.global.common.BaseErrorCode; +import com.sponus.sponusbe.global.common.exception.CustomException; + +public class ProposeException extends CustomException { + + public ProposeException(BaseErrorCode errorCode) { + super(errorCode); + } +} diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/repository/ProposeRepository.java b/src/main/java/com/sponus/sponusbe/domain/propose/repository/ProposeRepository.java index 2c4161e3..3195bbeb 100644 --- a/src/main/java/com/sponus/sponusbe/domain/propose/repository/ProposeRepository.java +++ b/src/main/java/com/sponus/sponusbe/domain/propose/repository/ProposeRepository.java @@ -1,8 +1,17 @@ package com.sponus.sponusbe.domain.propose.repository; +import java.util.List; + import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Query; import com.sponus.sponusbe.domain.propose.entity.Propose; public interface ProposeRepository extends JpaRepository { + @Query("SELECT p FROM Propose p WHERE p.proposingOrganization.id = :id") + List findSentPropose(Long id); + + @Query("SELECT p FROM Propose p WHERE p.proposedOrganization.id = :organizationId AND p.announcement.id = :announcementId") + List findReceivedProposeWithAnnouncementId(Long organizationId, Long announcementId); + } diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeQueryService.java b/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeQueryService.java index 515aa51a..a8568b3c 100644 --- a/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeQueryService.java +++ b/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeQueryService.java @@ -1,8 +1,17 @@ package com.sponus.sponusbe.domain.propose.service; +import java.util.List; + import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import com.sponus.sponusbe.domain.organization.entity.Organization; +import com.sponus.sponusbe.domain.propose.controller.ProposeDetailGetResponse; +import com.sponus.sponusbe.domain.propose.controller.ProposeGetCondition; +import com.sponus.sponusbe.domain.propose.controller.ProposeSummaryGetResponse; +import com.sponus.sponusbe.domain.propose.entity.Propose; +import com.sponus.sponusbe.domain.propose.exception.ProposeErrorCode; +import com.sponus.sponusbe.domain.propose.exception.ProposeException; import com.sponus.sponusbe.domain.propose.repository.ProposeRepository; import lombok.RequiredArgsConstructor; @@ -11,5 +20,35 @@ @Transactional(readOnly = true) @Service public class ProposeQueryService { + private final ProposeRepository proposeRepository; + + public List getProposes(Organization organization, ProposeGetCondition condition) { + // TODO : 추후에 QueryDSL 이용 + List response; + if (condition.isSentPropose()) { + // 내가 보낸 제안은 그냥 반환 + response = proposeRepository.findSentPropose(organization.getId()).stream() + .map(ProposeSummaryGetResponse::from) + .toList(); + } else { + // 내가 받은 제안은 공지 id 별로 보여줘야 함 + if (condition.announcementId() == null) { + throw new ProposeException(ProposeErrorCode.ANNOUNCEMENT_ID_IS_REQUIRED); + } + response = proposeRepository.findReceivedProposeWithAnnouncementId( + organization.getId(), + condition.announcementId()) + .stream() + .map(ProposeSummaryGetResponse::from) + .toList(); + } + return response; + } + + public ProposeDetailGetResponse getProposeDetail(Long proposeId) { + final Propose propose = proposeRepository.findById(proposeId) + .orElseThrow(() -> new ProposeException(ProposeErrorCode.PROPOSE_NOT_FOUND)); + return ProposeDetailGetResponse.from(propose); + } } diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeService.java b/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeService.java index eca88c9c..405ed3c9 100644 --- a/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeService.java +++ b/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeService.java @@ -21,14 +21,14 @@ public class ProposeService { private final ProposeRepository proposeRepository; - public ProposeCreateResponse createPropose(Organization organization, ProposeCreateRequest request) { + public ProposeCreateResponse createPropose(Organization authOrganization, ProposeCreateRequest request) { // TODO : 공지쪽 연관관계로 인해 동작 안함 Announcement announcement = getAvailableAnnouncement(request.announcementId()); return new ProposeCreateResponse( proposeRepository.save( request.toEntity( announcement, - organization, + authOrganization, announcement.getWriter() ) ).getId() diff --git a/src/main/java/com/sponus/sponusbe/global/common/exception/CustomException.java b/src/main/java/com/sponus/sponusbe/global/common/exception/CustomException.java index 03c69fa6..0510765e 100644 --- a/src/main/java/com/sponus/sponusbe/global/common/exception/CustomException.java +++ b/src/main/java/com/sponus/sponusbe/global/common/exception/CustomException.java @@ -7,7 +7,7 @@ @Getter public class CustomException extends RuntimeException { - private final transient BaseErrorCode errorCode; + private final BaseErrorCode errorCode; public CustomException(BaseErrorCode errorCode) { this.errorCode = errorCode; From f4903fa36cdee8eee0101e6437c056e5527c22d5 Mon Sep 17 00:00:00 2001 From: marooo326 Date: Tue, 23 Jan 2024 18:12:16 +0900 Subject: [PATCH 5/6] =?UTF-8?q?:recycle:=20refactor:=20DTO=20=EC=9C=84?= =?UTF-8?q?=EC=B9=98=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/propose/controller/ProposeController.java | 5 +++++ .../domain/propose/controller/ProposeCreateResponse.java | 6 ------ .../sponusbe/domain/propose/controller/ProposeType.java | 6 ------ .../controller/{ => dto/request}/ProposeCreateRequest.java | 2 +- .../controller/{ => dto/request}/ProposeGetCondition.java | 2 +- .../domain/propose/controller/dto/request/ProposeType.java | 6 ++++++ .../controller/dto/response/ProposeCreateResponse.java | 6 ++++++ .../{ => dto/response}/ProposeDetailGetResponse.java | 2 +- .../{ => dto/response}/ProposeSummaryGetResponse.java | 2 +- .../domain/propose/service/ProposeQueryService.java | 6 +++--- .../sponusbe/domain/propose/service/ProposeService.java | 4 ++-- 11 files changed, 26 insertions(+), 21 deletions(-) delete mode 100644 src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeCreateResponse.java delete mode 100644 src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeType.java rename src/main/java/com/sponus/sponusbe/domain/propose/controller/{ => dto/request}/ProposeCreateRequest.java (91%) rename src/main/java/com/sponus/sponusbe/domain/propose/controller/{ => dto/request}/ProposeGetCondition.java (82%) create mode 100644 src/main/java/com/sponus/sponusbe/domain/propose/controller/dto/request/ProposeType.java create mode 100644 src/main/java/com/sponus/sponusbe/domain/propose/controller/dto/response/ProposeCreateResponse.java rename src/main/java/com/sponus/sponusbe/domain/propose/controller/{ => dto/response}/ProposeDetailGetResponse.java (94%) rename src/main/java/com/sponus/sponusbe/domain/propose/controller/{ => dto/response}/ProposeSummaryGetResponse.java (94%) diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeController.java b/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeController.java index 0650813c..e247bb36 100644 --- a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeController.java +++ b/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeController.java @@ -11,6 +11,11 @@ import com.sponus.sponusbe.auth.annotation.AuthOrganization; import com.sponus.sponusbe.domain.organization.entity.Organization; +import com.sponus.sponusbe.domain.propose.controller.dto.request.ProposeCreateRequest; +import com.sponus.sponusbe.domain.propose.controller.dto.request.ProposeGetCondition; +import com.sponus.sponusbe.domain.propose.controller.dto.response.ProposeCreateResponse; +import com.sponus.sponusbe.domain.propose.controller.dto.response.ProposeDetailGetResponse; +import com.sponus.sponusbe.domain.propose.controller.dto.response.ProposeSummaryGetResponse; import com.sponus.sponusbe.domain.propose.service.ProposeQueryService; import com.sponus.sponusbe.domain.propose.service.ProposeService; import com.sponus.sponusbe.global.common.ApiResponse; diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeCreateResponse.java b/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeCreateResponse.java deleted file mode 100644 index 224144e0..00000000 --- a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeCreateResponse.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.sponus.sponusbe.domain.propose.controller; - -public record ProposeCreateResponse( - Long proposeId -) { -} diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeType.java b/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeType.java deleted file mode 100644 index 2f7e73fb..00000000 --- a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeType.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.sponus.sponusbe.domain.propose.controller; - -public enum ProposeType { - SEND, RECEIVED; - -} diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeCreateRequest.java b/src/main/java/com/sponus/sponusbe/domain/propose/controller/dto/request/ProposeCreateRequest.java similarity index 91% rename from src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeCreateRequest.java rename to src/main/java/com/sponus/sponusbe/domain/propose/controller/dto/request/ProposeCreateRequest.java index 6ba1a97b..f32d9126 100644 --- a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeCreateRequest.java +++ b/src/main/java/com/sponus/sponusbe/domain/propose/controller/dto/request/ProposeCreateRequest.java @@ -1,4 +1,4 @@ -package com.sponus.sponusbe.domain.propose.controller; +package com.sponus.sponusbe.domain.propose.controller.dto.request; import com.sponus.sponusbe.domain.announcement.entity.Announcement; import com.sponus.sponusbe.domain.organization.entity.Organization; diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeGetCondition.java b/src/main/java/com/sponus/sponusbe/domain/propose/controller/dto/request/ProposeGetCondition.java similarity index 82% rename from src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeGetCondition.java rename to src/main/java/com/sponus/sponusbe/domain/propose/controller/dto/request/ProposeGetCondition.java index 2a8c091d..4c4b3875 100644 --- a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeGetCondition.java +++ b/src/main/java/com/sponus/sponusbe/domain/propose/controller/dto/request/ProposeGetCondition.java @@ -1,4 +1,4 @@ -package com.sponus.sponusbe.domain.propose.controller; +package com.sponus.sponusbe.domain.propose.controller.dto.request; import jakarta.validation.constraints.NotNull; diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/controller/dto/request/ProposeType.java b/src/main/java/com/sponus/sponusbe/domain/propose/controller/dto/request/ProposeType.java new file mode 100644 index 00000000..3efd0aa7 --- /dev/null +++ b/src/main/java/com/sponus/sponusbe/domain/propose/controller/dto/request/ProposeType.java @@ -0,0 +1,6 @@ +package com.sponus.sponusbe.domain.propose.controller.dto.request; + +public enum ProposeType { + SEND, RECEIVED; + +} diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/controller/dto/response/ProposeCreateResponse.java b/src/main/java/com/sponus/sponusbe/domain/propose/controller/dto/response/ProposeCreateResponse.java new file mode 100644 index 00000000..0b35dc24 --- /dev/null +++ b/src/main/java/com/sponus/sponusbe/domain/propose/controller/dto/response/ProposeCreateResponse.java @@ -0,0 +1,6 @@ +package com.sponus.sponusbe.domain.propose.controller.dto.response; + +public record ProposeCreateResponse( + Long proposeId +) { +} diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeDetailGetResponse.java b/src/main/java/com/sponus/sponusbe/domain/propose/controller/dto/response/ProposeDetailGetResponse.java similarity index 94% rename from src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeDetailGetResponse.java rename to src/main/java/com/sponus/sponusbe/domain/propose/controller/dto/response/ProposeDetailGetResponse.java index ae0dced3..d539d747 100644 --- a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeDetailGetResponse.java +++ b/src/main/java/com/sponus/sponusbe/domain/propose/controller/dto/response/ProposeDetailGetResponse.java @@ -1,4 +1,4 @@ -package com.sponus.sponusbe.domain.propose.controller; +package com.sponus.sponusbe.domain.propose.controller.dto.response; import java.time.format.DateTimeFormatter; import java.util.Locale; diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeSummaryGetResponse.java b/src/main/java/com/sponus/sponusbe/domain/propose/controller/dto/response/ProposeSummaryGetResponse.java similarity index 94% rename from src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeSummaryGetResponse.java rename to src/main/java/com/sponus/sponusbe/domain/propose/controller/dto/response/ProposeSummaryGetResponse.java index 674bf14b..f97df404 100644 --- a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeSummaryGetResponse.java +++ b/src/main/java/com/sponus/sponusbe/domain/propose/controller/dto/response/ProposeSummaryGetResponse.java @@ -1,4 +1,4 @@ -package com.sponus.sponusbe.domain.propose.controller; +package com.sponus.sponusbe.domain.propose.controller.dto.response; import java.time.format.DateTimeFormatter; import java.util.Locale; diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeQueryService.java b/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeQueryService.java index a8568b3c..9df14abb 100644 --- a/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeQueryService.java +++ b/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeQueryService.java @@ -6,9 +6,9 @@ import org.springframework.transaction.annotation.Transactional; import com.sponus.sponusbe.domain.organization.entity.Organization; -import com.sponus.sponusbe.domain.propose.controller.ProposeDetailGetResponse; -import com.sponus.sponusbe.domain.propose.controller.ProposeGetCondition; -import com.sponus.sponusbe.domain.propose.controller.ProposeSummaryGetResponse; +import com.sponus.sponusbe.domain.propose.controller.dto.request.ProposeGetCondition; +import com.sponus.sponusbe.domain.propose.controller.dto.response.ProposeDetailGetResponse; +import com.sponus.sponusbe.domain.propose.controller.dto.response.ProposeSummaryGetResponse; import com.sponus.sponusbe.domain.propose.entity.Propose; import com.sponus.sponusbe.domain.propose.exception.ProposeErrorCode; import com.sponus.sponusbe.domain.propose.exception.ProposeException; diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeService.java b/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeService.java index 405ed3c9..4242a7dd 100644 --- a/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeService.java +++ b/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeService.java @@ -8,8 +8,8 @@ import com.sponus.sponusbe.domain.announcement.entity.enums.AnnouncementStatus; import com.sponus.sponusbe.domain.announcement.entity.enums.AnnouncementType; import com.sponus.sponusbe.domain.organization.entity.Organization; -import com.sponus.sponusbe.domain.propose.controller.ProposeCreateRequest; -import com.sponus.sponusbe.domain.propose.controller.ProposeCreateResponse; +import com.sponus.sponusbe.domain.propose.controller.dto.request.ProposeCreateRequest; +import com.sponus.sponusbe.domain.propose.controller.dto.response.ProposeCreateResponse; import com.sponus.sponusbe.domain.propose.repository.ProposeRepository; import lombok.RequiredArgsConstructor; From 8a66d57bd6a1927d15f96ada1ef3a5c36abd2268 Mon Sep 17 00:00:00 2001 From: marooo326 Date: Tue, 23 Jan 2024 18:34:59 +0900 Subject: [PATCH 6/6] =?UTF-8?q?:sparkles:=20feat:=20=EC=A0=9C=EC=95=88=20?= =?UTF-8?q?=EC=97=85=EB=8D=B0=EC=9D=B4=ED=8A=B8=20=EA=B8=B0=EB=8A=A5=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../propose/controller/ProposeController.java | 12 ++++++++++++ .../dto/request/ProposeUpdateRequest.java | 10 ++++++++++ .../domain/propose/entity/Propose.java | 6 ++++++ .../propose/exception/ProposeErrorCode.java | 1 + .../propose/service/ProposeQueryService.java | 2 +- .../propose/service/ProposeService.java | 19 +++++++++++++++++++ 6 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/sponus/sponusbe/domain/propose/controller/dto/request/ProposeUpdateRequest.java diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeController.java b/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeController.java index e247bb36..453ca976 100644 --- a/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeController.java +++ b/src/main/java/com/sponus/sponusbe/domain/propose/controller/ProposeController.java @@ -4,6 +4,7 @@ import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.ModelAttribute; +import org.springframework.web.bind.annotation.PatchMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -13,6 +14,7 @@ import com.sponus.sponusbe.domain.organization.entity.Organization; import com.sponus.sponusbe.domain.propose.controller.dto.request.ProposeCreateRequest; import com.sponus.sponusbe.domain.propose.controller.dto.request.ProposeGetCondition; +import com.sponus.sponusbe.domain.propose.controller.dto.request.ProposeUpdateRequest; import com.sponus.sponusbe.domain.propose.controller.dto.response.ProposeCreateResponse; import com.sponus.sponusbe.domain.propose.controller.dto.response.ProposeDetailGetResponse; import com.sponus.sponusbe.domain.propose.controller.dto.response.ProposeSummaryGetResponse; @@ -50,4 +52,14 @@ public ApiResponse> getMyProposes( public ApiResponse getProposeDetail(@PathVariable Long proposeId) { return ApiResponse.onSuccess(proposeQueryService.getProposeDetail(proposeId)); } + + @PatchMapping("/api/v1/propose/{proposeId}") + public ApiResponse updatePropose( + @AuthOrganization Organization authOrganization, + @PathVariable Long proposeId, + @RequestBody @Valid ProposeUpdateRequest request + ) { + proposeService.updatePropose(authOrganization, proposeId, request); + return ApiResponse.onSuccess(null); + } } diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/controller/dto/request/ProposeUpdateRequest.java b/src/main/java/com/sponus/sponusbe/domain/propose/controller/dto/request/ProposeUpdateRequest.java new file mode 100644 index 00000000..bf5332e3 --- /dev/null +++ b/src/main/java/com/sponus/sponusbe/domain/propose/controller/dto/request/ProposeUpdateRequest.java @@ -0,0 +1,10 @@ +package com.sponus.sponusbe.domain.propose.controller.dto.request; + +import com.sponus.sponusbe.domain.propose.entity.ProposeStatus; + +public record ProposeUpdateRequest( + String title, + String content, + ProposeStatus status +) { +} diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/entity/Propose.java b/src/main/java/com/sponus/sponusbe/domain/propose/entity/Propose.java index 310a1a82..9d7f440b 100644 --- a/src/main/java/com/sponus/sponusbe/domain/propose/entity/Propose.java +++ b/src/main/java/com/sponus/sponusbe/domain/propose/entity/Propose.java @@ -77,4 +77,10 @@ public class Propose extends BaseEntity { @Builder.Default @OneToMany(mappedBy = "propose") private List proposeAttachments = new ArrayList<>(); + + public void update(String title, String content, ProposeStatus status) { + this.title = title == null ? this.title : title; + this.content = content == null ? this.content : content; + this.status = status == null ? this.status : status; + } } diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/exception/ProposeErrorCode.java b/src/main/java/com/sponus/sponusbe/domain/propose/exception/ProposeErrorCode.java index ac2963b9..ebaa6d5a 100644 --- a/src/main/java/com/sponus/sponusbe/domain/propose/exception/ProposeErrorCode.java +++ b/src/main/java/com/sponus/sponusbe/domain/propose/exception/ProposeErrorCode.java @@ -12,6 +12,7 @@ @AllArgsConstructor public enum ProposeErrorCode implements BaseErrorCode { ANNOUNCEMENT_ID_IS_REQUIRED(HttpStatus.BAD_REQUEST, "4001", "공고 ID가 필요합니다."), + INVALID_ORGANIZATION(HttpStatus.BAD_REQUEST, "4002", "해당 단체의 제안이 아닙니다."), PROPOSE_NOT_FOUND(HttpStatus.NOT_FOUND, "4041", "해당 제안이 존재하지 않습니다."), INTERNAL_PROPOSE_EXCEPTION(HttpStatus.INTERNAL_SERVER_ERROR, "5001", "서버 에러가 발생했습니다. 관리자에게 문의해주세요."); diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeQueryService.java b/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeQueryService.java index 9df14abb..a6d3a806 100644 --- a/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeQueryService.java +++ b/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeQueryService.java @@ -32,7 +32,7 @@ public List getProposes(Organization organization, Pr .map(ProposeSummaryGetResponse::from) .toList(); } else { - // 내가 받은 제안은 공지 id 별로 보여줘야 함 + // 내가 받은 제안은 공고 id 별로 보여줘야하고, 공고 id가 없으면 안됨 if (condition.announcementId() == null) { throw new ProposeException(ProposeErrorCode.ANNOUNCEMENT_ID_IS_REQUIRED); } diff --git a/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeService.java b/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeService.java index 4242a7dd..b32ec749 100644 --- a/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeService.java +++ b/src/main/java/com/sponus/sponusbe/domain/propose/service/ProposeService.java @@ -9,7 +9,11 @@ import com.sponus.sponusbe.domain.announcement.entity.enums.AnnouncementType; import com.sponus.sponusbe.domain.organization.entity.Organization; import com.sponus.sponusbe.domain.propose.controller.dto.request.ProposeCreateRequest; +import com.sponus.sponusbe.domain.propose.controller.dto.request.ProposeUpdateRequest; import com.sponus.sponusbe.domain.propose.controller.dto.response.ProposeCreateResponse; +import com.sponus.sponusbe.domain.propose.entity.Propose; +import com.sponus.sponusbe.domain.propose.exception.ProposeErrorCode; +import com.sponus.sponusbe.domain.propose.exception.ProposeException; import com.sponus.sponusbe.domain.propose.repository.ProposeRepository; import lombok.RequiredArgsConstructor; @@ -35,6 +39,20 @@ public ProposeCreateResponse createPropose(Organization authOrganization, Propos ); } + public void updatePropose(Organization authOrganization, Long proposeId, ProposeUpdateRequest request) { + final Propose propose = proposeRepository.findById(proposeId) + .orElseThrow(() -> new ProposeException(ProposeErrorCode.PROPOSE_NOT_FOUND)); + + if (!isOrganizationsPropose(authOrganization.getId(), propose)) + throw new ProposeException(ProposeErrorCode.INVALID_ORGANIZATION); + + propose.update(request.title(), request.content(), request.status()); + } + + private boolean isOrganizationsPropose(Long organizationId, Propose propose) { + return propose.getProposingOrganization().getId().equals(organizationId); + } + private Announcement getAvailableAnnouncement(Long announcementId) { // TODO : announcementId로 announcement를 찾아서 반환 // return announcementRepository.findById(announcementId) @@ -47,4 +65,5 @@ private Announcement getAvailableAnnouncement(Long announcementId) { .status(AnnouncementStatus.POSTED) .build(); } + }