Skip to content
Closed
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
19 changes: 19 additions & 0 deletions src/main/java/meltingpot/server/auth/service/MailService.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@
import lombok.RequiredArgsConstructor;
import meltingpot.server.auth.controller.dto.MailVerificationRequestDto;
import meltingpot.server.auth.controller.dto.VerificationCodeRequestDto;
import meltingpot.server.domain.entity.Account;
import meltingpot.server.domain.entity.UserReportCount;
import meltingpot.server.util.Constants;
import meltingpot.server.domain.entity.MailVerification;
import meltingpot.server.domain.repository.AccountRepository;
Expand Down Expand Up @@ -118,4 +120,21 @@ public void checkUserName(String username) {
}
}

@Transactional
public ResponseCode sendReportAlertEmail(Account account, int reportCount) {
String title = "누적 신고 5회 이상 알림";
String to = "[email protected]";
String templateName = "ReportAlertTemplate.html";

Map<String, String> mailValues = Map.of(
"username", account.getName(),
"userEmail",account.getUsername(),
"userId", account.getId().toString(),
"reportCount", String.valueOf(reportCount)
);

mailUtil.sendMimeMessageMailWithValues(title, to, templateName, mailValues);
return ResponseCode.MAIL_REPORT_ALRERT_SEND_SUCCESS;
}

}
3 changes: 3 additions & 0 deletions src/main/java/meltingpot/server/domain/entity/Account.java
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,9 @@ public class Account extends BaseEntity {
@OneToMany(mappedBy = "account")
private List<AccountRole> accountRoles = new ArrayList<>();

@OneToOne(mappedBy = "account", cascade = CascadeType.ALL)
private UserReportCount userReportCount;

public List<String> toAuthStringList() {
return accountRoles.stream().map(a -> a.getRole().getAuthority())
.collect(Collectors.toList());
Expand Down
8 changes: 8 additions & 0 deletions src/main/java/meltingpot/server/domain/entity/Report.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import jakarta.persistence.*;
import lombok.*;
import meltingpot.server.domain.entity.comment.Comment;
import meltingpot.server.domain.entity.common.BaseEntity;
import meltingpot.server.domain.entity.post.Post;

Expand All @@ -16,13 +17,20 @@ public class Report extends BaseEntity {
@Column(name = "report_id")
private Long id;

@Column(length = 1500)
private String content;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "post_id")
private Post post;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "comment_id")
private Comment comment;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private Account account;


}
33 changes: 33 additions & 0 deletions src/main/java/meltingpot/server/domain/entity/UserReportCount.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package meltingpot.server.domain.entity;

import jakarta.persistence.*;
import lombok.*;

@Entity
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@AllArgsConstructor(access = AccessLevel.PROTECTED)
@Builder
@Getter
@Setter
public class UserReportCount {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_report_count_id")
private Long id;

@Column(name = "report_count")
private int reportCount;

@OneToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "account_id")
private Account account;

public void incrementReportCount() {
this.reportCount++;
}

public UserReportCount(Account account, int reportCount) {
this.account = account;
this.reportCount = reportCount;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,12 +21,15 @@ public class Comment extends BaseEntity {
@Column(name = "comment_id")
private Long id;

@Size(min = 10, max = 500)
@Column(length = 1500)
private String content;

@Column(name = "is_anonymous")
private boolean isAnonymous = false;

@Column(name = "report_count")
private int reportCount;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "post_id")
private Post post;
Expand Down Expand Up @@ -104,4 +107,8 @@ public void setParent(Comment parent) {
public void setChildren(List<Comment> children) {
this.children = children;
}

public void incrementReportCount() {
this.reportCount++;
}
}
13 changes: 11 additions & 2 deletions src/main/java/meltingpot/server/domain/entity/post/Post.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,17 +29,22 @@ public class Post extends BaseEntity {
@Column(name = "post_id")
private Long id;

@Size(min = 10, max = 500)
@Column(length = 500)
@Size(max = 500, message = "제목은 한글 기준 500자 이내로 입력해주세요.")
private String title;

@Size(min = 10, max = 500)
@Column(length = 500)
@Size(max = 500, message = "내용은 한글 기준 500자 이내로 입력해주세요.")
private String content;

@Enumerated(EnumType.STRING)
private PostType postType;

private Boolean isDraft;

@Column(name = "report_count")
private int reportCount;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private Account account;
Expand Down Expand Up @@ -69,4 +74,8 @@ public void setPostImages(List<PostImage> postImages) {
public void setIsDraft(boolean isDraft) {
this.isDraft = isDraft;
}

public void incrementReportCount() {
this.reportCount++;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package meltingpot.server.domain.repository;

import meltingpot.server.domain.entity.UserReportCount;
import org.springframework.data.jpa.repository.JpaRepository;

public interface UserReportCountRepository extends JpaRepository<UserReportCount, Long> {
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package meltingpot.server.post.dto;

import lombok.*;
import meltingpot.server.domain.entity.enums.PostType;
import meltingpot.server.domain.entity.post.Post;
import java.time.LocalDateTime;
import java.util.List;
Expand All @@ -13,14 +14,14 @@
public class PostDetailResponse {
private Long postId;
private Long userId;
private PostType postType;
private String name;
private String title;
private String content;
private List<ImageData> imgData; // Image data including ID and URL
private List<ImageData> imgData;
private Integer commentCount;
private LocalDateTime updatedAt;

// Static nested class to hold image data
@Getter
@AllArgsConstructor
@NoArgsConstructor
Expand All @@ -41,6 +42,7 @@ public static PostDetailResponse of(Post post) {
return PostDetailResponse.builder()
.postId(post.getId())
.userId(post.getAccount().getId())
.postType(post.getPostType())
.name(post.getAccount().getName())
.title(post.getTitle())
.content(post.getContent())
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor;
import meltingpot.server.domain.entity.Account;
import meltingpot.server.report.dto.ReportRequestDTO;
import meltingpot.server.report.dto.ReportRequest;
import meltingpot.server.report.service.ReportService;
import meltingpot.server.util.*;
import org.springframework.http.ResponseEntity;
Expand All @@ -17,11 +17,22 @@
public class ReportController {
private final ReportService reportService;

@Operation(summary = "신고 작성")
@Operation(summary = "게시글 신고 작성")
@PostMapping("/{postId}")
public ResponseEntity<ResponseData> createPost(@CurrentUser Account account, @RequestBody ReportRequestDTO.CreateReportDTO createReportDTO, @PathVariable Long postId) {
public ResponseEntity<ResponseData> createPostReport (@CurrentUser Account account, @RequestBody ReportRequest reportRequest, @PathVariable Long postId) {
try{
reportService.createReport(createReportDTO, account, postId);
reportService.createReport(reportRequest, account, postId,null);
return ResponseData.toResponseEntity (ResponseCode.REPORT_CREATE_SUCCESS);
}catch (NoSuchElementException e) {
return ResponseData.toResponseEntity( ResponseCode.REPORT_CREATE_FAIL);
}
}

@Operation(summary = "댓글 신고 작성")
@PostMapping("/{commentId}")
public ResponseEntity<ResponseData> createCommentReport(@CurrentUser Account account, @RequestBody ReportRequest reportRequest, @PathVariable Long commentId) {
try{
reportService.createReport(reportRequest, account, null ,commentId);
return ResponseData.toResponseEntity (ResponseCode.REPORT_CREATE_SUCCESS);
}catch (NoSuchElementException e) {
return ResponseData.toResponseEntity( ResponseCode.REPORT_CREATE_FAIL);
Expand Down

This file was deleted.

34 changes: 34 additions & 0 deletions src/main/java/meltingpot/server/report/dto/ReportRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package meltingpot.server.report.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import meltingpot.server.domain.entity.Account;
import meltingpot.server.domain.entity.Report;
import meltingpot.server.domain.entity.comment.Comment;
import meltingpot.server.domain.entity.post.Post;

@Getter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class ReportRequest {
private String content;

public Report toEntity(Account account, Post post){
return Report.builder()
.content(content)
.post(post)
.account(account)
.build();
}

public Report toEntity(Account account, Comment comment){
return Report.builder()
.content(content)
.comment(comment)
.account(account)
.build();
}
}
11 changes: 0 additions & 11 deletions src/main/java/meltingpot/server/report/dto/ReportRequestDTO.java

This file was deleted.

84 changes: 81 additions & 3 deletions src/main/java/meltingpot/server/report/service/ReportService.java
Original file line number Diff line number Diff line change
@@ -1,9 +1,87 @@
package meltingpot.server.report.service;

import lombok.RequiredArgsConstructor;
import meltingpot.server.auth.service.MailService;
import meltingpot.server.domain.entity.Account;
import meltingpot.server.report.dto.ReportRequestDTO;
import meltingpot.server.domain.entity.Report;
import meltingpot.server.domain.entity.UserReportCount;
import meltingpot.server.domain.entity.comment.Comment;
import meltingpot.server.domain.entity.post.Post;
import meltingpot.server.domain.repository.CommentRepository;
import meltingpot.server.domain.repository.PostRepository;
import meltingpot.server.domain.repository.ReportRepository;
import meltingpot.server.domain.repository.UserReportCountRepository;
import meltingpot.server.report.dto.ReportRequest;
import meltingpot.server.util.ResponseCode;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Service
@RequiredArgsConstructor
@Transactional
public class ReportService {
private final PostRepository postRepository;
private final ReportRepository reportRepository;
private final CommentRepository commentRepository;
private final UserReportCountRepository userReportCountRepository;
private final MailService mailService;

public ResponseCode createReport (ReportRequest reportRequest, Account account, Long postId, Long commentId){
if (postId != null) {
handlePostReport(reportRequest, postId);
} else if (commentId != null) {
handleCommentReport(reportRequest, commentId);
}
return ResponseCode.REPORT_CREATE_SUCCESS;
}

private void updateUserReportCount(Account account){
UserReportCount userReportCount = userReportCountRepository.findById(account.getId())
.orElse(new UserReportCount(account, 0));
userReportCount.incrementReportCount();
userReportCountRepository.save(userReportCount);

if (userReportCount.getReportCount() >= 5) {
mailService.sendReportAlertEmail(account,userReportCount.getReportCount());
}

}
private void handlePostReport(ReportRequest reportRequest,Long postId){
Post post = findPostById(postId);
Report report = reportRequest.toEntity(post.getAccount(),post);
reportRepository.save(report);

post.incrementReportCount();
postRepository.save(post);
updateUserReportCount(post.getAccount());

if(post.getReportCount()>=5){
mailService.sendReportAlertEmail(post.getAccount(),post.getReportCount());
}
}

private void handleCommentReport(ReportRequest reportRequest,Long commentId){
Comment comment = findCommentById(commentId);
Report report = reportRequest.toEntity(comment.getAccount(),comment);
reportRepository.save(report);

comment.incrementReportCount();
commentRepository.save(comment);
updateUserReportCount(comment.getAccount());

if(comment.getReportCount()>=5){
mailService.sendReportAlertEmail(comment.getAccount(),comment.getReportCount());
}
}

private Post findPostById(Long postId) {
return postRepository.findById(postId)
.orElseThrow(() -> new RuntimeException("게시물을 찾을 수 없습니다."));
}
private Comment findCommentById(Long commentId){
return commentRepository.findById(commentId)
.orElseThrow(()->new RuntimeException("댓글을 찾을 수 없습니다."));
}

public interface ReportService {

void createReport (ReportRequestDTO.CreateReportDTO createReportDTO, Account account, Long postId);
}
Loading
Loading