Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

✨ feat: 보고서 작성 기능 알람 추가 #178

Merged
merged 4 commits into from
Feb 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading