Skip to content
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 @@ -11,7 +11,7 @@
import hs.kr.backend.devpals.domain.user.repository.UserRepository;
import hs.kr.backend.devpals.domain.user.service.AlarmService;
import hs.kr.backend.devpals.global.common.ApiResponse;
import hs.kr.backend.devpals.global.common.enums.AlramFilter;
import hs.kr.backend.devpals.global.common.enums.AlarmFilter;
import hs.kr.backend.devpals.global.common.enums.ApplicantStatus;
import hs.kr.backend.devpals.global.exception.CustomException;
import hs.kr.backend.devpals.global.exception.ErrorException;
Expand Down Expand Up @@ -52,7 +52,7 @@ public ResponseEntity<ApiResponse<String>> projectApply(Long projectId, ProjectA

ApplicantEntity applicant = ApplicantEntity.createApplicant(user, project, request);
applicantRepository.save(applicant);
alarmService.sendAlarm(project,applicant, AlramFilter.APPLICANT_CHECK);
alarmService.sendAlarm(project,applicant);

return ResponseEntity.ok(new ApiResponse<>(true, "프로젝트 지원 되었습니다." , null));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import hs.kr.backend.devpals.domain.project.repository.RecommentRepository;
import hs.kr.backend.devpals.domain.user.entity.UserEntity;
import hs.kr.backend.devpals.domain.user.repository.UserRepository;
import hs.kr.backend.devpals.domain.user.service.AlarmService;
import hs.kr.backend.devpals.global.common.ApiResponse;
import hs.kr.backend.devpals.global.exception.CustomException;
import hs.kr.backend.devpals.global.exception.ErrorException;
Expand All @@ -28,6 +29,7 @@
@RequiredArgsConstructor
public class ProjectCommentService {
private final JwtTokenValidator jwtTokenValidator;
private final AlarmService alarmService;
private final CommentRepoisitory commentRepoisitory;
private final RecommentRepository recommentRepository;
private final ProjectRepository projectRepository;
Expand All @@ -43,6 +45,7 @@ public ResponseEntity<ApiResponse<String>> writeComment(String token, Long proje

CommentEntity comment = CommentEntity.from(dto, project, user);
commentRepoisitory.save(comment);
alarmService.sendAlarm(comment,project,user);

return ResponseEntity.ok(new ApiResponse<>(true, "댓글 작성 성공", null));
}
Expand Down Expand Up @@ -124,6 +127,7 @@ public ResponseEntity<ApiResponse<String>> writeRecomment(String token, Long pro
RecommentEntity recomment = RecommentEntity.from(dto, project, user, comment);

recommentRepository.save(recomment);
alarmService.sendAlarm(recomment,comment,project);

return ResponseEntity.ok(new ApiResponse<>(true, "대댓글 작성 성공", null));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@
import hs.kr.backend.devpals.domain.user.repository.UserRepository;
import hs.kr.backend.devpals.domain.user.service.AlarmService;
import hs.kr.backend.devpals.global.common.ApiResponse;
import hs.kr.backend.devpals.global.common.enums.AlramFilter;
import hs.kr.backend.devpals.global.common.enums.AlarmFilter;
import hs.kr.backend.devpals.global.common.enums.ApplicantStatus;
import hs.kr.backend.devpals.global.exception.CustomException;
import hs.kr.backend.devpals.global.exception.ErrorException;
Expand Down Expand Up @@ -190,7 +190,7 @@ public ResponseEntity<ApiResponse<ProjectCloseResponse>> closeProject(Long proje

MethodTypeResponse methodTypeResponse = projectFacade.getMethodTypeResponse(project.getMethodTypeId());

alarmService.sendAlarm(applicants,AlramFilter.APPLIED_PROJECTS,projectId);
alarmService.sendAlarm(applicants,project);
return ResponseEntity.ok(new ApiResponse<>(true, "프로젝트 모집 종료 성공", ProjectCloseResponse.fromEntity(project, methodTypeResponse)));
}

Expand All @@ -217,7 +217,7 @@ public CompletableFuture<Void> closeProject(List<ProjectEntity> projects) {
projects.forEach(project -> {
List<ApplicantEntity> applicants = projectApplicantsMap.get(project);
authEmailService.sendEmailsAsync(applicants, project);
alarmService.sendAlarm(applicants,AlramFilter.APPLIED_PROJECTS, project.getId());
alarmService.sendAlarm(applicants, project);
});
}, emailExecutor));
}
Expand Down
17 changes: 12 additions & 5 deletions src/main/java/hs/kr/backend/devpals/domain/user/dto/AlarmDto.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package hs.kr.backend.devpals.domain.user.dto;

import hs.kr.backend.devpals.domain.user.entity.AlramEntity;
import hs.kr.backend.devpals.global.common.enums.AlramFilter;
import hs.kr.backend.devpals.domain.user.entity.alarm.AlarmEntity;
import hs.kr.backend.devpals.domain.user.entity.alarm.CommentAlarmEntity;
import hs.kr.backend.devpals.domain.user.dto.CommentAlarmDto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
Expand All @@ -21,14 +22,20 @@ public class AlarmDto {
private Integer alarmFilterId;
private LocalDateTime createdAt;

public static AlarmDto fromEntity(AlramEntity entity) {
public static AlarmDto fromEntity(AlarmEntity entity) {
//TODO: 추후 타입에 따라 전달하는 데이터가 다를 수 있으므로 ApplicantAlarmDto, ProjectAlarmDto 작성 가능성여부 검토필요
if (entity instanceof CommentAlarmEntity) {
return new CommentAlarmDto((CommentAlarmEntity) entity);
}
return AlarmDto.builder()
.id(entity.getId())
.routingId(entity.getProject().getId())
.routingId(entity.getRoutingId())
.content(entity.getContent())
.enabled(entity.isEnabled())
.alarmFilterId(entity.getAlramFilter().getValue())
.alarmFilterId(entity.getAlarmFilterIntValue())
.createdAt(entity.getCreatedAt())
.build();
Comment thread
coderabbitai[bot] marked this conversation as resolved.
}


}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package hs.kr.backend.devpals.domain.user.dto;

import hs.kr.backend.devpals.domain.user.entity.alarm.CommentAlarmEntity;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor
@AllArgsConstructor
public class CommentAlarmDto extends AlarmDto{

private Boolean replier;
private Long reCommentUserId;

public CommentAlarmDto(CommentAlarmEntity entity) {
super(entity.getId(), entity.getRoutingId(), entity.getContent(), entity.isEnabled(), entity.getAlarmFilterIntValue(), entity.getCreatedAt());
this.replier = entity.getReplier();
this.reCommentUserId = getReCommentUserIdIfNotNull(entity);
}

//대댓글이 존재하면 유저id 반환 없으면 0 반환
private Long getReCommentUserIdIfNotNull(CommentAlarmEntity entity) {
if(entity.getRecomment() != null && entity.getRecomment().getUser() != null) return entity.getRecomment().getUser().getId();
else return 0L;
}
}

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package hs.kr.backend.devpals.domain.user.entity.alarm;

import hs.kr.backend.devpals.domain.project.entity.ApplicantEntity;
import hs.kr.backend.devpals.domain.project.entity.CommentEntity;
import hs.kr.backend.devpals.domain.project.entity.ProjectEntity;
import hs.kr.backend.devpals.domain.user.entity.UserEntity;
import hs.kr.backend.devpals.global.common.enums.AlarmFilter;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;

@Entity
@Getter
@NoArgsConstructor
@Inheritance(strategy = InheritanceType.JOINED)
@DiscriminatorColumn(name = "ALARM_FILTER",
discriminatorType = DiscriminatorType.STRING)

@Table(name = "Alarm")
public abstract class AlarmEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;


@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "receiver_id", nullable = false)
private UserEntity receiver;


@Column(length = 255)
private String content;

@Column(nullable = false, columnDefinition = "BOOLEAN DEFAULT FALSE")
private boolean enabled = false;

@Column
private Long routingId; //AlarmFilter마다


// @Enumerated(EnumType.STRING)
// private AlarmFilter alarmFilter;

@Column(updatable = false)
private LocalDateTime createdAt = LocalDateTime.now();

public AlarmEntity(UserEntity receiver, String content, Long routingId) {
this.receiver = receiver;
this.content = content;
this.routingId = routingId;
}

public abstract Integer getAlarmFilterIntValue();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package hs.kr.backend.devpals.domain.user.entity.alarm;

import hs.kr.backend.devpals.domain.project.entity.ApplicantEntity;
import hs.kr.backend.devpals.domain.project.entity.ProjectEntity;
import jakarta.persistence.*;
import lombok.NoArgsConstructor;

import static hs.kr.backend.devpals.domain.user.entity.alarm.constants.AlarmFilterConstants.APPLIED_PROJECTS;
import static hs.kr.backend.devpals.domain.user.entity.alarm.constants.AlarmFilterConstants.APPLIED_PROJECT_INT_VALUE;

@Entity
@DiscriminatorValue(APPLIED_PROJECTS)
@NoArgsConstructor
@Table(name = "ApplicantAlarm") // 테이블 이름 지정
public class ApplicantAlarmEntity extends AlarmEntity {
//"지원한 프로젝트" 알람 (지원 결과)
//공고 지원자가 지원한 프로젝트에 합격, 불합격 여부를 전달하는 알람
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "project_id", nullable = false)
private ProjectEntity project;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "applicant_id", nullable = false)
private ApplicantEntity applicant;

public ApplicantAlarmEntity(ApplicantEntity applicantEntity, String content, ProjectEntity project) {
super(applicantEntity.getUser(),content,project.getId());
this.project = project;
this.applicant = applicantEntity;

}

public Integer getAlarmFilterIntValue() {
return APPLIED_PROJECT_INT_VALUE;
}
Comment on lines +33 to +35
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

필터 값 중복 확인 필요

getAlarmFilterIntValue() 메서드가 반환하는 APPLIED_PROJECT_INT_VALUE 값이 다른 필터 값(APPLICANT_CHECK_INT_VALUE, COMMENT_AND_REPLY_INT_VALUE)과 모두 1로 동일합니다. 이로 인해 프론트엔드에서 필터링 시 구분이 어려울 수 있습니다.


🏁 Script executed:

#!/bin/bash
# 필터 상수 파일의 내용을 확인합니다.
cat src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/constants/AlarmFilterConstants.java

Length of output: 597


다른 AlarmEntity 클래스들의 getAlarmFilterIntValue() 반환 상수를 확인합니다.


🏁 Script executed:

#!/bin/bash
# 각 AlarmEntity 클래스의 getAlarmFilterIntValue 반환 값을 조사합니다.
rg -n "getAlarmFilterIntValue" -A2 src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm

Length of output: 1404


AlarmFilterConstants의 필터 값에 고유한 정수 할당 필요

현재 모든 필터 상수(APPLIED_PROJECT_INT_VALUE, APPLICANT_CHECK_INT_VALUE, COMMENT_AND_REPLY_INT_VALUE)가 1로 중복되어 있어, 프론트엔드에서 필터링 시 구분이 불가능합니다.

조치 사항:

  • src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/constants/AlarmFilterConstants.java
    • 각 상수에 서로 다른 정수 값 할당 (예: APPLIED_PROJECT_INT_VALUE = 1, APPLICANT_CHECK_INT_VALUE = 2, COMMENT_AND_REPLY_INT_VALUE = 3)

엔티티 클래스의 getAlarmFilterIntValue()는 상수를 그대로 반환하므로, 상수 값만 수정하면 됩니다.

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package hs.kr.backend.devpals.domain.user.entity.alarm;

import hs.kr.backend.devpals.domain.project.entity.CommentEntity;
import hs.kr.backend.devpals.domain.project.entity.ProjectEntity;
import hs.kr.backend.devpals.domain.project.entity.RecommentEntity;
import hs.kr.backend.devpals.domain.user.entity.UserEntity;
import jakarta.persistence.*;
import lombok.Getter;
import lombok.NoArgsConstructor;

import static hs.kr.backend.devpals.domain.user.entity.alarm.constants.AlarmFilterConstants.*;

@Entity
@DiscriminatorValue(COMMENT_AND_REPLY)
@NoArgsConstructor
@Getter
@Table(name = "CommentAlarm") // 테이블 이름 지정
public class CommentAlarmEntity extends AlarmEntity {
// 댓글 알람 -> 공고에 댓글을 달았을 시, 댓글에 답변을 달았을 시 전달되는 알람

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "project_id", nullable = false)
private ProjectEntity project;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "comment_id", nullable = false)
private CommentEntity comment;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "recomment_id")
private RecommentEntity recomment;

@Column
private Boolean replier;

//공고에 댓글 달았을 시 공고 게시자에게 알람 전송
public CommentAlarmEntity(CommentEntity comment, String content, ProjectEntity project, UserEntity projectAuthor) {
super(projectAuthor,content,project.getId());
this.comment = comment;
this.project = project;
this.replier = false;
}

public CommentAlarmEntity(CommentEntity comment, String content, ProjectEntity project, RecommentEntity recomment,UserEntity receiver) {
super(receiver,content,project.getId());
this.comment = comment;
this.project = project;
this.recomment = recomment;
this.replier = true;
}

public Integer getAlarmFilterIntValue() {
return COMMENT_AND_REPLY_INT_VALUE;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
package hs.kr.backend.devpals.domain.user.entity.alarm;

import hs.kr.backend.devpals.domain.project.entity.ApplicantEntity;
import hs.kr.backend.devpals.domain.project.entity.ProjectEntity;
import hs.kr.backend.devpals.domain.user.entity.UserEntity;
import jakarta.persistence.*;
import lombok.NoArgsConstructor;

import static hs.kr.backend.devpals.domain.user.entity.alarm.constants.AlarmFilterConstants.*;

@Entity
@DiscriminatorValue(APPLICANT_CHECK)
@NoArgsConstructor
@Table(name = "ProjectAlarm") // 테이블 이름 지정
public class ProjectAlarmEntity extends AlarmEntity{
//공고에 지원자가 지원할 시 공고생성자가 수신받는 알림

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "project_id", nullable = false)
private ProjectEntity project;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "applicant_id", nullable = false)
private ApplicantEntity applicant;


public ProjectAlarmEntity(ProjectEntity project, UserEntity author, String content,ApplicantEntity applicant) {
super(author,content, project.getId());
this.project = project;
this.applicant = applicant;
}

public Integer getAlarmFilterIntValue() {
return APPLICANT_CHECK_INT_VALUE;
}
Comment on lines +33 to +35
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

필터 값 중복 확인 필요

getAlarmFilterIntValue() 메서드가 반환하는 APPLICANT_CHECK_INT_VALUE 값이 다른 필터 값(APPLIED_PROJECT_INT_VALUE, COMMENT_AND_REPLY_INT_VALUE)과 모두 1로 동일합니다. 이는 알림 유형 구분에 혼란을 줄 수 있습니다.

#!/bin/bash
# AlarmEntity의 자식 클래스들이 반환하는 필터 값을 확인합니다.
echo "ApplicantAlarmEntity returns:"
grep -n "return.*INT_VALUE" src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/ApplicantAlarmEntity.java

echo -e "\nProjectAlarmEntity returns:"
grep -n "return.*INT_VALUE" src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/ProjectAlarmEntity.java

echo -e "\nCommentAlarmEntity returns:"
grep -n "return.*INT_VALUE" src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/CommentAlarmEntity.java

echo -e "\nAlarmFilterConstants defines:"
grep -n "INT_VALUE" src/main/java/hs/kr/backend/devpals/domain/user/entity/alarm/constants/AlarmFilterConstants.java

}
Loading