diff --git a/src/main/java/com/sponus/sponusbe/domain/notification/controller/FirebaseTestController.java b/src/main/java/com/sponus/sponusbe/domain/notification/controller/FirebaseTestController.java index 7fc13b25..2f49b91e 100644 --- a/src/main/java/com/sponus/sponusbe/domain/notification/controller/FirebaseTestController.java +++ b/src/main/java/com/sponus/sponusbe/domain/notification/controller/FirebaseTestController.java @@ -26,7 +26,7 @@ public class FirebaseTestController { @PostMapping("/fcm") public String testNotification(@RequestBody NotificationTestRequest request, @AuthOrganization Organization organization) throws IOException { - firebaseService.sendMessageTo(organization, request.title(), request.body(), null, null); + firebaseService.sendMessageTo(organization, request.title(), request.body(), null, null, null); return "Notification test is successful !"; } } diff --git a/src/main/java/com/sponus/sponusbe/domain/notification/dto/response/NotificationSummaryResponse.java b/src/main/java/com/sponus/sponusbe/domain/notification/dto/response/NotificationSummaryResponse.java index 440f0416..32ea3f8e 100644 --- a/src/main/java/com/sponus/sponusbe/domain/notification/dto/response/NotificationSummaryResponse.java +++ b/src/main/java/com/sponus/sponusbe/domain/notification/dto/response/NotificationSummaryResponse.java @@ -1,8 +1,11 @@ package com.sponus.sponusbe.domain.notification.dto.response; +import static com.sponus.sponusbe.domain.report.entity.QReport.*; + import com.sponus.sponusbe.domain.announcement.entity.Announcement; import com.sponus.sponusbe.domain.notification.entity.Notification; import com.sponus.sponusbe.domain.propose.entity.Propose; +import com.sponus.sponusbe.domain.report.entity.Report; import lombok.Builder; @@ -14,11 +17,13 @@ public record NotificationSummaryResponse( Long organizationId, Long announcementId, Long proposeId, + Long reportId, boolean isRead ) { public static NotificationSummaryResponse from(Notification notification) { Announcement announcement = notification.getAnnouncement(); Propose propose = notification.getPropose(); + Report report = notification.getReport(); return NotificationSummaryResponse.builder() .id(notification.getId()) @@ -27,6 +32,7 @@ public static NotificationSummaryResponse from(Notification notification) { .organizationId(notification.getOrganization().getId()) .announcementId(announcement != null ? announcement.getId() : null) .proposeId(propose != null ? propose.getId() : null) + .reportId(report != null ? report.getId() : null) .isRead(notification.isRead()) .build(); } diff --git a/src/main/java/com/sponus/sponusbe/domain/notification/entity/Notification.java b/src/main/java/com/sponus/sponusbe/domain/notification/entity/Notification.java index 56bf406a..352b8c3d 100644 --- a/src/main/java/com/sponus/sponusbe/domain/notification/entity/Notification.java +++ b/src/main/java/com/sponus/sponusbe/domain/notification/entity/Notification.java @@ -7,6 +7,7 @@ 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.report.entity.Report; import jakarta.persistence.Column; import jakarta.persistence.ConstraintMode; @@ -62,7 +63,9 @@ public class Notification { @JoinColumn(name = "propose_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Propose propose; - // TODO 보고서 추가 + @ManyToOne(fetch = FetchType.LAZY) + @JoinColumn(name = "report_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + private Report report; public void setOrganization(Organization organization) { this.organization = organization; @@ -76,6 +79,8 @@ public void setPropose(Propose propose) { this.propose = propose; } + public void setReport(Report report) {this.report = report;} + public void setRead(boolean read) { isRead = read; } diff --git a/src/main/java/com/sponus/sponusbe/domain/notification/service/FirebaseService.java b/src/main/java/com/sponus/sponusbe/domain/notification/service/FirebaseService.java index 1ed7b388..1e2496bb 100644 --- a/src/main/java/com/sponus/sponusbe/domain/notification/service/FirebaseService.java +++ b/src/main/java/com/sponus/sponusbe/domain/notification/service/FirebaseService.java @@ -18,6 +18,7 @@ import com.sponus.sponusbe.domain.notification.repository.NotificationRepository; import com.sponus.sponusbe.domain.organization.entity.Organization; import com.sponus.sponusbe.domain.propose.entity.Propose; +import com.sponus.sponusbe.domain.report.entity.Report; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; @@ -48,7 +49,7 @@ public class FirebaseService { private final RedisUtil redisUtil; public void sendMessageTo(Organization targetOrganization, String title, String body, Announcement announcement, - Propose propose) throws IOException { + Propose propose, Report report) throws IOException { String token = getFcmToken(targetOrganization.getEmail()); @@ -60,6 +61,7 @@ public void sendMessageTo(Organization targetOrganization, String title, String notification.setOrganization(targetOrganization); notification.setAnnouncement(announcement); notification.setPropose(propose); + notification.setReport(report); String message = makeFcmMessage(token, notificationRepository.save(notification)); 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 38abe38d..75481e25 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 @@ -65,7 +65,7 @@ public ProposeCreateResponse createPropose( }); firebaseService.sendMessageTo(announcement.getWriter(), "제안서 도착", - authOrganization.getName() + " 담당자님이 제안서를 보냈습니다.", announcement, propose); + authOrganization.getName() + " 담당자님이 제안서를 보냈습니다.", announcement, propose, null); return new ProposeCreateResponse( proposeRepository.save(propose).getId() diff --git a/src/main/java/com/sponus/sponusbe/domain/report/controller/ReportController.java b/src/main/java/com/sponus/sponusbe/domain/report/controller/ReportController.java index 8c60030e..92acbb68 100644 --- a/src/main/java/com/sponus/sponusbe/domain/report/controller/ReportController.java +++ b/src/main/java/com/sponus/sponusbe/domain/report/controller/ReportController.java @@ -1,5 +1,6 @@ package com.sponus.sponusbe.domain.report.controller; +import java.io.IOException; import java.util.List; import org.springframework.web.bind.annotation.GetMapping; @@ -13,11 +14,11 @@ import com.sponus.sponusbe.auth.annotation.AuthOrganization; import com.sponus.sponusbe.domain.organization.entity.Organization; -import com.sponus.sponusbe.domain.report.dto.ReportCreateRequest; -import com.sponus.sponusbe.domain.report.dto.ReportCreateResponse; -import com.sponus.sponusbe.domain.report.dto.ReportGetResponse; -import com.sponus.sponusbe.domain.report.dto.ReportUpdateRequest; -import com.sponus.sponusbe.domain.report.dto.ReportUpdateResponse; +import com.sponus.sponusbe.domain.report.dto.request.ReportCreateRequest; +import com.sponus.sponusbe.domain.report.dto.response.ReportCreateResponse; +import com.sponus.sponusbe.domain.report.dto.response.ReportGetResponse; +import com.sponus.sponusbe.domain.report.dto.request.ReportUpdateRequest; +import com.sponus.sponusbe.domain.report.dto.response.ReportUpdateResponse; import com.sponus.sponusbe.domain.report.service.ReportQueryService; import com.sponus.sponusbe.domain.report.service.ReportService; import com.sponus.sponusbe.global.common.ApiResponse; @@ -38,7 +39,7 @@ public ApiResponse createReport( @AuthOrganization Organization authOrganization, @RequestPart("request") @Valid ReportCreateRequest request, @RequestPart(value = "images") List images, - @RequestPart(value = "attachments") List attachments) { + @RequestPart(value = "attachments") List attachments) throws IOException { return ApiResponse.onSuccess( reportService.createReport( authOrganization, diff --git a/src/main/java/com/sponus/sponusbe/domain/report/dto/ReportCreateRequest.java b/src/main/java/com/sponus/sponusbe/domain/report/dto/request/ReportCreateRequest.java similarity index 84% rename from src/main/java/com/sponus/sponusbe/domain/report/dto/ReportCreateRequest.java rename to src/main/java/com/sponus/sponusbe/domain/report/dto/request/ReportCreateRequest.java index 85e2f5d7..49c748d7 100644 --- a/src/main/java/com/sponus/sponusbe/domain/report/dto/ReportCreateRequest.java +++ b/src/main/java/com/sponus/sponusbe/domain/report/dto/request/ReportCreateRequest.java @@ -1,4 +1,4 @@ -package com.sponus.sponusbe.domain.report.dto; +package com.sponus.sponusbe.domain.report.dto.request; import java.util.ArrayList; @@ -11,7 +11,8 @@ public record ReportCreateRequest( @NotNull(message = "[ERROR] 보고서 제목 입력은 필수 입니다.") String title, @NotNull(message = "[ERROR] 보고서 내용 입력은 필수 입니다.") - String content + String content, + Long proposeId ) { public Report toEntity(Organization writer) { @@ -19,6 +20,7 @@ public Report toEntity(Organization writer) { .writer(writer) .title(title) .content(content) + .propose(null) .reportAttachments(new ArrayList<>()) .build(); } diff --git a/src/main/java/com/sponus/sponusbe/domain/report/dto/ReportUpdateRequest.java b/src/main/java/com/sponus/sponusbe/domain/report/dto/request/ReportUpdateRequest.java similarity index 57% rename from src/main/java/com/sponus/sponusbe/domain/report/dto/ReportUpdateRequest.java rename to src/main/java/com/sponus/sponusbe/domain/report/dto/request/ReportUpdateRequest.java index 6640162b..9ce5cc82 100644 --- a/src/main/java/com/sponus/sponusbe/domain/report/dto/ReportUpdateRequest.java +++ b/src/main/java/com/sponus/sponusbe/domain/report/dto/request/ReportUpdateRequest.java @@ -1,4 +1,4 @@ -package com.sponus.sponusbe.domain.report.dto; +package com.sponus.sponusbe.domain.report.dto.request; public record ReportUpdateRequest( String title, diff --git a/src/main/java/com/sponus/sponusbe/domain/report/dto/ReportAttachmentResponse.java b/src/main/java/com/sponus/sponusbe/domain/report/dto/response/ReportAttachmentResponse.java similarity index 79% rename from src/main/java/com/sponus/sponusbe/domain/report/dto/ReportAttachmentResponse.java rename to src/main/java/com/sponus/sponusbe/domain/report/dto/response/ReportAttachmentResponse.java index 457fe9c9..bf5678dd 100644 --- a/src/main/java/com/sponus/sponusbe/domain/report/dto/ReportAttachmentResponse.java +++ b/src/main/java/com/sponus/sponusbe/domain/report/dto/response/ReportAttachmentResponse.java @@ -1,7 +1,6 @@ -package com.sponus.sponusbe.domain.report.dto; +package com.sponus.sponusbe.domain.report.dto.response; import com.sponus.sponusbe.domain.report.entity.ReportAttachment; -import com.sponus.sponusbe.domain.report.entity.ReportImage; import lombok.Builder; diff --git a/src/main/java/com/sponus/sponusbe/domain/report/dto/ReportCreateResponse.java b/src/main/java/com/sponus/sponusbe/domain/report/dto/response/ReportCreateResponse.java similarity index 88% rename from src/main/java/com/sponus/sponusbe/domain/report/dto/ReportCreateResponse.java rename to src/main/java/com/sponus/sponusbe/domain/report/dto/response/ReportCreateResponse.java index 830236e4..d2a73b0c 100644 --- a/src/main/java/com/sponus/sponusbe/domain/report/dto/ReportCreateResponse.java +++ b/src/main/java/com/sponus/sponusbe/domain/report/dto/response/ReportCreateResponse.java @@ -1,4 +1,4 @@ -package com.sponus.sponusbe.domain.report.dto; +package com.sponus.sponusbe.domain.report.dto.response; import com.sponus.sponusbe.domain.report.entity.Report; diff --git a/src/main/java/com/sponus/sponusbe/domain/report/dto/ReportGetResponse.java b/src/main/java/com/sponus/sponusbe/domain/report/dto/response/ReportGetResponse.java similarity index 81% rename from src/main/java/com/sponus/sponusbe/domain/report/dto/ReportGetResponse.java rename to src/main/java/com/sponus/sponusbe/domain/report/dto/response/ReportGetResponse.java index 9d13cd0f..9b3ff65c 100644 --- a/src/main/java/com/sponus/sponusbe/domain/report/dto/ReportGetResponse.java +++ b/src/main/java/com/sponus/sponusbe/domain/report/dto/response/ReportGetResponse.java @@ -1,9 +1,7 @@ -package com.sponus.sponusbe.domain.report.dto; +package com.sponus.sponusbe.domain.report.dto.response; import java.util.List; -import com.sponus.sponusbe.domain.announcement.dto.response.AnnouncementImageResponse; -import com.sponus.sponusbe.domain.report.entity.QReportAttachment; import com.sponus.sponusbe.domain.report.entity.Report; import lombok.Builder; diff --git a/src/main/java/com/sponus/sponusbe/domain/report/dto/ReportImageResponse.java b/src/main/java/com/sponus/sponusbe/domain/report/dto/response/ReportImageResponse.java similarity index 86% rename from src/main/java/com/sponus/sponusbe/domain/report/dto/ReportImageResponse.java rename to src/main/java/com/sponus/sponusbe/domain/report/dto/response/ReportImageResponse.java index 0c3065cf..d08538c0 100644 --- a/src/main/java/com/sponus/sponusbe/domain/report/dto/ReportImageResponse.java +++ b/src/main/java/com/sponus/sponusbe/domain/report/dto/response/ReportImageResponse.java @@ -1,4 +1,4 @@ -package com.sponus.sponusbe.domain.report.dto; +package com.sponus.sponusbe.domain.report.dto.response; import com.sponus.sponusbe.domain.report.entity.ReportImage; diff --git a/src/main/java/com/sponus/sponusbe/domain/report/dto/ReportUpdateResponse.java b/src/main/java/com/sponus/sponusbe/domain/report/dto/response/ReportUpdateResponse.java similarity index 88% rename from src/main/java/com/sponus/sponusbe/domain/report/dto/ReportUpdateResponse.java rename to src/main/java/com/sponus/sponusbe/domain/report/dto/response/ReportUpdateResponse.java index 431453a8..c0fe80ac 100644 --- a/src/main/java/com/sponus/sponusbe/domain/report/dto/ReportUpdateResponse.java +++ b/src/main/java/com/sponus/sponusbe/domain/report/dto/response/ReportUpdateResponse.java @@ -1,4 +1,4 @@ -package com.sponus.sponusbe.domain.report.dto; +package com.sponus.sponusbe.domain.report.dto.response; import com.sponus.sponusbe.domain.report.entity.Report; diff --git a/src/main/java/com/sponus/sponusbe/domain/report/entity/Report.java b/src/main/java/com/sponus/sponusbe/domain/report/entity/Report.java index ccadf2aa..4deb05f6 100644 --- a/src/main/java/com/sponus/sponusbe/domain/report/entity/Report.java +++ b/src/main/java/com/sponus/sponusbe/domain/report/entity/Report.java @@ -7,6 +7,7 @@ import org.hibernate.annotations.DynamicUpdate; import com.sponus.sponusbe.domain.organization.entity.Organization; +import com.sponus.sponusbe.domain.propose.entity.Propose; import jakarta.persistence.CascadeType; import jakarta.persistence.Column; @@ -20,6 +21,7 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.ManyToOne; import jakarta.persistence.OneToMany; +import jakarta.persistence.OneToOne; import jakarta.persistence.Table; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -52,6 +54,10 @@ public class Report { @JoinColumn(name = "organization_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) private Organization writer; + @OneToOne + @JoinColumn(name = "propose_id", foreignKey = @ForeignKey(ConstraintMode.NO_CONSTRAINT)) + private Propose propose; + @Builder.Default @OneToMany(mappedBy = "report", cascade = CascadeType.ALL, orphanRemoval = true) private List reportImages = new ArrayList<>(); @@ -60,6 +66,8 @@ public class Report { @OneToMany(mappedBy = "report", cascade = CascadeType.ALL) private List reportAttachments = new ArrayList<>(); + public void setPropose(Propose propose) {this.propose = propose;} + public void update(String title, String content) { this.title = title == null ? this.title : title; this.content = content == null ? this.content : content; diff --git a/src/main/java/com/sponus/sponusbe/domain/report/service/ReportQueryService.java b/src/main/java/com/sponus/sponusbe/domain/report/service/ReportQueryService.java index 0b191214..2f1abf0b 100644 --- a/src/main/java/com/sponus/sponusbe/domain/report/service/ReportQueryService.java +++ b/src/main/java/com/sponus/sponusbe/domain/report/service/ReportQueryService.java @@ -3,9 +3,7 @@ import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import com.sponus.sponusbe.domain.organization.entity.Organization; -import com.sponus.sponusbe.domain.report.dto.ReportCreateResponse; -import com.sponus.sponusbe.domain.report.dto.ReportGetResponse; +import com.sponus.sponusbe.domain.report.dto.response.ReportGetResponse; import com.sponus.sponusbe.domain.report.entity.Report; import com.sponus.sponusbe.domain.report.exception.ReportErrorCode; import com.sponus.sponusbe.domain.report.exception.ReportException; diff --git a/src/main/java/com/sponus/sponusbe/domain/report/service/ReportService.java b/src/main/java/com/sponus/sponusbe/domain/report/service/ReportService.java index efbb9f78..e0b4cedc 100644 --- a/src/main/java/com/sponus/sponusbe/domain/report/service/ReportService.java +++ b/src/main/java/com/sponus/sponusbe/domain/report/service/ReportService.java @@ -1,15 +1,25 @@ package com.sponus.sponusbe.domain.report.service; +import static com.sponus.sponusbe.domain.propose.entity.QPropose.*; + +import java.io.IOException; import java.util.List; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; +import com.sponus.sponusbe.domain.announcement.entity.Announcement; +import com.sponus.sponusbe.domain.announcement.exception.AnnouncementErrorCode; +import com.sponus.sponusbe.domain.announcement.exception.AnnouncementException; +import com.sponus.sponusbe.domain.notification.service.FirebaseService; import com.sponus.sponusbe.domain.organization.entity.Organization; -import com.sponus.sponusbe.domain.report.dto.ReportCreateRequest; -import com.sponus.sponusbe.domain.report.dto.ReportCreateResponse; -import com.sponus.sponusbe.domain.report.dto.ReportUpdateRequest; -import com.sponus.sponusbe.domain.report.dto.ReportUpdateResponse; +import com.sponus.sponusbe.domain.propose.entity.Propose; +import com.sponus.sponusbe.domain.propose.exception.ProposeErrorCode; +import com.sponus.sponusbe.domain.propose.repository.ProposeRepository; +import com.sponus.sponusbe.domain.report.dto.request.ReportCreateRequest; +import com.sponus.sponusbe.domain.report.dto.response.ReportCreateResponse; +import com.sponus.sponusbe.domain.report.dto.request.ReportUpdateRequest; +import com.sponus.sponusbe.domain.report.dto.response.ReportUpdateResponse; import com.sponus.sponusbe.domain.report.entity.Report; import com.sponus.sponusbe.domain.report.entity.ReportAttachment; import com.sponus.sponusbe.domain.report.entity.ReportImage; @@ -25,18 +35,30 @@ @RequiredArgsConstructor @Service public class ReportService { + private final ReportRepository reportRepository; + private final ProposeRepository proposeRepository; private final S3Service s3Service; + private final FirebaseService firebaseService; public ReportCreateResponse createReport( Organization authOrganization, ReportCreateRequest request, List images, List attachments - ) { + ) throws IOException { final Report report = request.toEntity(authOrganization); setReportImages(images, report); setReportAttachments(attachments, report); + + final Propose propose = proposeRepository.findById(request.proposeId()) + .orElseThrow(() -> new ReportException(ProposeErrorCode.PROPOSE_NOT_FOUND)); + + report.setPropose(propose); + + firebaseService.sendMessageTo(propose.getAnnouncement().getWriter(), "보고서 도착", + authOrganization.getName() + " 담당자님이 보고서를 보냈습니다.", report.getPropose().getAnnouncement(), propose, report); + return ReportCreateResponse.from(reportRepository.save(report)); }