Skip to content

Commit 641d94f

Browse files
committed
Merge branch 'develop' of https://github.com/prgrms-web-devcourse-final-project/WEB5_6_NeogulCoder_BE into feature/EA3-190-recruitment-post-edit
2 parents 24490e3 + 0cc34db commit 641d94f

31 files changed

+145
-120
lines changed

src/main/java/grep/neogulcoder/domain/alram/controller/AlarmController.java

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,19 @@ public class AlarmController implements AlarmSpecification {
2121
private final AlarmService alarmService;
2222

2323
@GetMapping("/my")
24-
public ApiResponse<List<AlarmResponse>> getAllAlarm(
25-
@AuthenticationPrincipal Principal userDetails) {
24+
public ApiResponse<List<AlarmResponse>> getAllAlarms(@AuthenticationPrincipal Principal userDetails) {
2625
return ApiResponse.success(alarmService.getAllAlarms(userDetails.getUserId()));
2726
}
2827

28+
@GetMapping("/unchecked/my")
29+
public ApiResponse<List<AlarmResponse>> getAllUncheckedAlarm(
30+
@AuthenticationPrincipal Principal userDetails) {
31+
return ApiResponse.success(alarmService.getAllUncheckedAlarms(userDetails.getUserId()));
32+
}
33+
2934
@PostMapping("/my/check/all")
3035
public ApiResponse<Void> checkAlarm(@AuthenticationPrincipal Principal userDetails) {
31-
alarmService.checkAllAlarm(userDetails.getUserId());
36+
alarmService.checkAllAlarmWithoutInvite(userDetails.getUserId());
3237
return ApiResponse.noContent();
3338
}
3439

src/main/java/grep/neogulcoder/domain/alram/controller/AlarmSpecification.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,11 @@
1111
@Tag(name = "Alarm", description = "알림 관련 API 명세")
1212
public interface AlarmSpecification {
1313

14-
@Operation(summary = "내 알림 목록 조회", description = "로그인한 사용자의 알림 목록을 조회합니다.")
15-
ApiResponse<List<AlarmResponse>> getAllAlarm(@AuthenticationPrincipal Principal userDetails);
14+
@Operation(summary = "읽음 여부 관련 없이 내 전체 알림 목록 조회", description = "로그인한 사용자의 전체 알림 목록을 조회합니다.")
15+
ApiResponse<List<AlarmResponse>> getAllAlarms(@AuthenticationPrincipal Principal userDetails);
16+
17+
@Operation(summary = "내 읽지 않은 알림 목록 조회", description = "로그인한 사용자의 읽지 않은 알림 목록을 조회합니다.")
18+
ApiResponse<List<AlarmResponse>> getAllUncheckedAlarm(@AuthenticationPrincipal Principal userDetails);
1619

1720
@Operation(summary = "내 알림 전체 읽음 처리", description = "로그인한 사용자의 모든 알림을 읽음 처리합니다.")
1821
ApiResponse<Void> checkAlarm(@AuthenticationPrincipal Principal userDetails);

src/main/java/grep/neogulcoder/domain/alram/controller/dto/response/AlarmResponse.java

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package grep.neogulcoder.domain.alram.controller.dto.response;
22

3-
import grep.neogulcoder.domain.alram.entity.Alarm;
43
import grep.neogulcoder.domain.alram.type.AlarmType;
54
import grep.neogulcoder.domain.alram.type.DomainType;
65
import lombok.Builder;
@@ -21,26 +20,30 @@ public class AlarmResponse {
2120

2221
private String message;
2322

23+
private boolean checked;
24+
2425
public static AlarmResponse toResponse(Long id, Long receiverUserId, AlarmType alarmType, DomainType domainType,
25-
Long domainId, String message) {
26+
Long domainId, String message, boolean checked) {
2627
return AlarmResponse.builder()
27-
.id(id)
28-
.receiverUserId(receiverUserId)
29-
.alarmType(alarmType)
30-
.domainType(domainType)
31-
.domainId(domainId)
32-
.message(message)
33-
.build();
28+
.id(id)
29+
.receiverUserId(receiverUserId)
30+
.alarmType(alarmType)
31+
.domainType(domainType)
32+
.domainId(domainId)
33+
.message(message)
34+
.checked(checked)
35+
.build();
3436
}
3537

3638
@Builder
3739
private AlarmResponse(Long id, Long receiverUserId, AlarmType alarmType, DomainType domainType,
38-
Long domainId, String message) {
40+
Long domainId, String message, boolean checked) {
3941
this.id = id;
4042
this.receiverUserId = receiverUserId;
4143
this.alarmType = alarmType;
4244
this.domainType = domainType;
4345
this.domainId = domainId;
4446
this.message = message;
47+
this.checked = checked;
4548
}
4649
}

src/main/java/grep/neogulcoder/domain/alram/repository/AlarmRepository.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,6 @@
66

77
public interface AlarmRepository extends JpaRepository<Alarm, Long> {
88
List<Alarm> findAllByReceiverUserIdAndCheckedFalse(Long receiverUserId);
9+
List<Alarm> findAllByReceiverUserId(Long receiverUserId);
910

1011
}

src/main/java/grep/neogulcoder/domain/alram/service/AlarmService.java

Lines changed: 60 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,13 @@
1515
import grep.neogulcoder.domain.study.repository.StudyMemberQueryRepository;
1616
import grep.neogulcoder.domain.study.repository.StudyMemberRepository;
1717
import grep.neogulcoder.domain.study.repository.StudyRepository;
18+
import grep.neogulcoder.domain.timevote.event.TimeVotePeriodCreatedEvent;
1819
import grep.neogulcoder.global.exception.business.BusinessException;
1920
import grep.neogulcoder.global.exception.business.NotFoundException;
2021
import grep.neogulcoder.global.provider.finder.MessageFinder;
22+
2123
import java.util.List;
24+
2225
import lombok.RequiredArgsConstructor;
2326
import org.springframework.context.event.EventListener;
2427
import org.springframework.stereotype.Service;
@@ -44,33 +47,47 @@ public void saveAlarm(Long receiverId, AlarmType alarmType, DomainType domainTyp
4447
alarmRepository.save(Alarm.init(alarmType, receiverId, domainType, domainId, message));
4548
}
4649

47-
public List<AlarmResponse> getAllAlarms(Long receiverUserId) {
50+
public List<AlarmResponse> getAllUncheckedAlarms(Long receiverUserId) {
4851
return alarmRepository.findAllByReceiverUserIdAndCheckedFalse(receiverUserId).stream()
49-
.map(alarm -> AlarmResponse.toResponse(
50-
alarm.getId(),
51-
alarm.getReceiverUserId(),
52-
alarm.getAlarmType(),
53-
alarm.getDomainType(),
54-
alarm.getDomainId(),
55-
alarm.getMessage()))
56-
.toList();
52+
.map(alarm -> AlarmResponse.toResponse(
53+
alarm.getId(),
54+
alarm.getReceiverUserId(),
55+
alarm.getAlarmType(),
56+
alarm.getDomainType(),
57+
alarm.getDomainId(),
58+
alarm.getMessage(),
59+
alarm.isChecked()))
60+
.toList();
61+
}
62+
63+
public List<AlarmResponse> getAllAlarms(Long receiverUserId) {
64+
return alarmRepository.findAllByReceiverUserId(receiverUserId).stream()
65+
.map(alarm -> AlarmResponse.toResponse(
66+
alarm.getId(),
67+
alarm.getReceiverUserId(),
68+
alarm.getAlarmType(),
69+
alarm.getDomainType(),
70+
alarm.getDomainId(),
71+
alarm.getMessage(),
72+
alarm.isChecked()))
73+
.toList();
5774
}
5875

5976
@Transactional
60-
public void checkAllAlarm(Long receiverUserId) {
77+
public void checkAllAlarmWithoutInvite(Long receiverUserId) {
6178
List<Alarm> alarms = alarmRepository.findAllByReceiverUserIdAndCheckedFalse(receiverUserId);
6279
alarms.stream()
63-
.filter(alarm -> alarm.getAlarmType() != AlarmType.INVITE)
64-
.forEach(Alarm::checkAlarm);
80+
.filter(alarm -> alarm.getAlarmType() != AlarmType.INVITE)
81+
.forEach(Alarm::checkAlarm);
6582
}
6683

6784
@EventListener
6885
public void handleStudyInviteEvent(StudyInviteEvent event) {
6986
saveAlarm(
70-
event.targetUserId(),
71-
AlarmType.INVITE,
72-
DomainType.STUDY,
73-
event.studyId()
87+
event.targetUserId(),
88+
AlarmType.INVITE,
89+
DomainType.STUDY,
90+
event.studyId()
7491
);
7592
}
7693

@@ -82,7 +99,7 @@ public void acceptInvite(Long targetUserId, Long alarmId) {
8299
Alarm alarm = findValidAlarm(alarmId);
83100
Long studyId = alarm.getDomainId();
84101
Study study = findValidStudy(studyId);
85-
StudyMember.createMember(study,targetUserId);
102+
StudyMember.createMember(study, targetUserId);
86103
alarm.checkAlarm();
87104
}
88105

@@ -99,10 +116,10 @@ public void handleStudyExtendEvent(StudyExtendEvent event) {
99116
for (StudyMember member : members) {
100117
if (!member.isLeader()) {
101118
saveAlarm(
102-
member.getUserId(),
103-
AlarmType.STUDY_EXTEND,
104-
DomainType.STUDY,
105-
event.studyId()
119+
member.getUserId(),
120+
AlarmType.STUDY_EXTEND,
121+
DomainType.STUDY,
122+
event.studyId()
106123
);
107124
}
108125
}
@@ -111,23 +128,39 @@ public void handleStudyExtendEvent(StudyExtendEvent event) {
111128
@EventListener
112129
public void handleStudyExtensionReminderEvent(StudyExtensionReminderEvent event) {
113130
StudyMember leader = studyMemberRepository.findByStudyIdAndRoleAndActivatedTrue(event.studyId(), StudyMemberRole.LEADER)
114-
.orElseThrow(() -> new BusinessException(STUDY_LEADER_NOT_FOUND));
131+
.orElseThrow(() -> new BusinessException(STUDY_LEADER_NOT_FOUND));
115132

116133
saveAlarm(
117-
leader.getUserId(),
118-
AlarmType.STUDY_EXTENSION_REMINDER,
119-
DomainType.STUDY,
120-
event.studyId()
134+
leader.getUserId(),
135+
AlarmType.STUDY_EXTENSION_REMINDER,
136+
DomainType.STUDY,
137+
event.studyId()
121138
);
122139
}
123140

141+
@EventListener
142+
public void handleTimeVotePeriodCreatedEvent(TimeVotePeriodCreatedEvent event) {
143+
List<StudyMember> members = studyMemberRepository.findAllByStudyIdAndActivatedTrue(event.studyId());
144+
145+
for (StudyMember member : members) {
146+
if (!member.getUserId().equals(event.excludedUserId())) {
147+
saveAlarm(
148+
member.getUserId(),
149+
AlarmType.TIME_VOTE_REQUEST,
150+
DomainType.TIME_VOTE,
151+
event.studyId()
152+
);
153+
}
154+
}
155+
}
156+
124157
private Alarm findValidAlarm(Long alarmId) {
125158
return alarmRepository.findById(alarmId).orElseThrow(() -> new NotFoundException(AlarmErrorCode.ALARM_NOT_FOUND));
126159
}
127160

128161
private Study findValidStudy(Long studyId) {
129162
return studyRepository.findById(studyId)
130-
.orElseThrow(() -> new NotFoundException(STUDY_NOT_FOUND));
163+
.orElseThrow(() -> new NotFoundException(STUDY_NOT_FOUND));
131164
}
132165

133166
private void validateParticipantStudyLimit(Long userId) {

src/main/java/grep/neogulcoder/domain/recruitment/comment/controller/RecruitmentPostCommentController.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,29 +10,30 @@
1010
import org.springframework.security.core.annotation.AuthenticationPrincipal;
1111
import org.springframework.web.bind.annotation.*;
1212

13-
@RequestMapping("/recruitment-posts/comments")
13+
@RequestMapping("/recruitment-posts")
1414
@RequiredArgsConstructor
1515
@RestController
1616
public class RecruitmentPostCommentController implements RecruitmentPostCommentSpecification {
1717

1818
private final RecruitmentPostCommentService commentService;
1919

20-
@PostMapping
21-
public ApiResponse<Long> save(@RequestBody @Valid RecruitmentCommentSaveRequest request,
20+
@PostMapping("/{post-id}/comments")
21+
public ApiResponse<Long> save(@PathVariable("post-id") long postId,
22+
@RequestBody @Valid RecruitmentCommentSaveRequest request,
2223
@AuthenticationPrincipal Principal userDetails) {
23-
long commentId = commentService.save(request, userDetails.getUserId());
24+
long commentId = commentService.save(postId, request, userDetails.getUserId());
2425
return ApiResponse.success(commentId);
2526
}
2627

27-
@PutMapping("/{comment-id}")
28+
@PutMapping("/comments/{comment-id}")
2829
public ApiResponse<Void> update(@PathVariable("comment-id") long commentId,
2930
@RequestBody RecruitmentCommentUpdateRequest request,
3031
@AuthenticationPrincipal Principal userDetails) {
3132
commentService.update(request, commentId, userDetails.getUserId());
3233
return ApiResponse.noContent();
3334
}
3435

35-
@DeleteMapping("/{comment-id}")
36+
@DeleteMapping("/comments/{comment-id}")
3637
public ApiResponse<Void> delete(@PathVariable("comment-id") long commentId,
3738
@AuthenticationPrincipal Principal userDetails) {
3839
commentService.delete(commentId, userDetails.getUserId());

src/main/java/grep/neogulcoder/domain/recruitment/comment/controller/RecruitmentPostCommentSpecification.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
public interface RecruitmentPostCommentSpecification {
1212

1313
@Operation(summary = "모집글 댓글 작성", description = "모집글에 대한 댓글을 작성 합니다.")
14-
ApiResponse<Long> save(RecruitmentCommentSaveRequest request, Principal userDetails);
14+
ApiResponse<Long> save(long postId, RecruitmentCommentSaveRequest request, Principal userDetails);
1515

1616
@Operation(summary = "모집글 댓글 수정", description = "모집글에 대한 댓글을 수정 합니다.")
1717
ApiResponse<Void> update(long commentId, RecruitmentCommentUpdateRequest request, Principal userDetails);

src/main/java/grep/neogulcoder/domain/recruitment/comment/controller/dto/request/RecruitmentCommentSaveRequest.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,13 @@
88
@Getter
99
public class RecruitmentCommentSaveRequest {
1010

11-
@Schema(example = "2", description = "모집글 ID")
12-
private long postId;
13-
1411
@Schema(example = "저도 참여 할래요!", description = "모집글 내용")
1512
private String content;
1613

1714
private RecruitmentCommentSaveRequest() {
1815
}
1916

20-
public RecruitmentPostComment toEntity(RecruitmentPost post, long userId){
17+
public RecruitmentPostComment toEntity(RecruitmentPost post, long userId) {
2118
return RecruitmentPostComment.builder()
2219
.recruitmentPost(post)
2320
.userId(userId)

src/main/java/grep/neogulcoder/domain/recruitment/comment/service/RecruitmentPostCommentService.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,8 @@ public class RecruitmentPostCommentService {
2525
private final RecruitmentPostCommentQueryRepository commentQueryRepository;
2626

2727
@Transactional
28-
public long save(RecruitmentCommentSaveRequest request, long userId) {
29-
RecruitmentPost post = postRepository.findPostBy(request.getPostId())
28+
public long save(long postId, RecruitmentCommentSaveRequest request, long userId) {
29+
RecruitmentPost post = postRepository.findPostBy(postId)
3030
.orElseThrow(() -> new NotFoundException(NOT_FOUND));
3131

3232
return commentRepository.save(request.toEntity(post, userId)).getId();

src/main/java/grep/neogulcoder/domain/studyapplication/controller/dto/response/MyApplicationPagingResponse.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public class MyApplicationPagingResponse {
1313
@Schema(
1414
description = "내가 신청한 스터디 목록",
1515
example = "[{" +
16-
"\"applicationId\": 1," +
16+
"\"recruitmentPostId\": 1," +
1717
"\"name\": \"자바 스터디\"," +
1818
"\"leaderNickname\": \"너굴\"," +
1919
"\"capacity\": 4," +

0 commit comments

Comments
 (0)