Skip to content

Commit

Permalink
✨ feat: 보고서 작성 기능 알람 추가 (#178)
Browse files Browse the repository at this point in the history
  • Loading branch information
xxoznge authored Feb 12, 2024
1 parent 977d63d commit bf6f701
Show file tree
Hide file tree
Showing 16 changed files with 70 additions and 29 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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 !";
}
}
Original file line number Diff line number Diff line change
@@ -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;

Expand All @@ -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())
Expand All @@ -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();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand All @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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());

Expand All @@ -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));

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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;
Expand All @@ -38,7 +39,7 @@ public ApiResponse<ReportCreateResponse> createReport(
@AuthOrganization Organization authOrganization,
@RequestPart("request") @Valid ReportCreateRequest request,
@RequestPart(value = "images") List<MultipartFile> images,
@RequestPart(value = "attachments") List<MultipartFile> attachments) {
@RequestPart(value = "attachments") List<MultipartFile> attachments) throws IOException {
return ApiResponse.onSuccess(
reportService.createReport(
authOrganization,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.sponus.sponusbe.domain.report.dto;
package com.sponus.sponusbe.domain.report.dto.request;

import java.util.ArrayList;

Expand All @@ -11,14 +11,16 @@ public record ReportCreateRequest(
@NotNull(message = "[ERROR] 보고서 제목 입력은 필수 입니다.")
String title,
@NotNull(message = "[ERROR] 보고서 내용 입력은 필수 입니다.")
String content
String content,
Long proposeId
) {

public Report toEntity(Organization writer) {
return Report.builder()
.writer(writer)
.title(title)
.content(content)
.propose(null)
.reportAttachments(new ArrayList<>())
.build();
}
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.sponus.sponusbe.domain.report.dto;
package com.sponus.sponusbe.domain.report.dto.request;

public record ReportUpdateRequest(
String title,
Expand Down
Original file line number Diff line number Diff line change
@@ -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;

Expand Down
Original file line number Diff line number Diff line change
@@ -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;

Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;

Expand Down
Original file line number Diff line number Diff line change
@@ -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;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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<ReportImage> reportImages = new ArrayList<>();
Expand All @@ -60,6 +66,8 @@ public class Report {
@OneToMany(mappedBy = "report", cascade = CascadeType.ALL)
private List<ReportAttachment> 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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand All @@ -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<MultipartFile> images,
List<MultipartFile> 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));
}

Expand Down

0 comments on commit bf6f701

Please sign in to comment.