66import grep .neogulcoder .domain .alram .repository .AlarmRepository ;
77import grep .neogulcoder .domain .alram .type .AlarmType ;
88import grep .neogulcoder .domain .alram .type .DomainType ;
9+ import grep .neogulcoder .domain .recruitment .post .RecruitmentPost ;
10+ import grep .neogulcoder .domain .recruitment .post .repository .RecruitmentPostRepository ;
911import grep .neogulcoder .domain .study .Study ;
1012import grep .neogulcoder .domain .study .StudyMember ;
1113import grep .neogulcoder .domain .study .enums .StudyMemberRole ;
1517import grep .neogulcoder .domain .study .repository .StudyMemberQueryRepository ;
1618import grep .neogulcoder .domain .study .repository .StudyMemberRepository ;
1719import grep .neogulcoder .domain .study .repository .StudyRepository ;
20+ import grep .neogulcoder .domain .studyapplication .StudyApplication ;
21+ import grep .neogulcoder .domain .studyapplication .event .ApplicationEvent ;
22+ import grep .neogulcoder .domain .studyapplication .event .ApplicationStatusChangedEvent ;
23+ import grep .neogulcoder .domain .studyapplication .repository .ApplicationRepository ;
1824import grep .neogulcoder .domain .timevote .event .TimeVotePeriodCreatedEvent ;
1925import grep .neogulcoder .global .exception .business .BusinessException ;
2026import grep .neogulcoder .global .exception .business .NotFoundException ;
2127import grep .neogulcoder .global .provider .finder .MessageFinder ;
22-
2328import java .util .List ;
24-
2529import lombok .RequiredArgsConstructor ;
2630import org .springframework .context .event .EventListener ;
2731import org .springframework .stereotype .Service ;
2832import org .springframework .transaction .annotation .Transactional ;
2933
34+ import static grep .neogulcoder .domain .recruitment .RecruitmentErrorCode .NOT_FOUND ;
3035import static grep .neogulcoder .domain .study .exception .code .StudyErrorCode .*;
3136import static grep .neogulcoder .domain .studyapplication .exception .code .ApplicationErrorCode .*;
3237
@@ -40,54 +45,59 @@ public class AlarmService {
4045 private final StudyRepository studyRepository ;
4146 private final StudyMemberQueryRepository studyMemberQueryRepository ;
4247 private final StudyMemberRepository studyMemberRepository ;
48+ private final RecruitmentPostRepository recruitmentPostRepository ;
49+ private final ApplicationRepository applicationRepository ;
4350
4451 @ Transactional
45- public void saveAlarm (Long receiverId , AlarmType alarmType , DomainType domainType , Long domainId ) {
52+ public void saveAlarm (Long receiverId , AlarmType alarmType , DomainType domainType ,
53+ Long domainId ) {
4654 String message = messageFinder .findMessage (alarmType , domainType , domainId );
4755 alarmRepository .save (Alarm .init (alarmType , receiverId , domainType , domainId , message ));
4856 }
4957
5058 public List <AlarmResponse > getAllUncheckedAlarms (Long receiverUserId ) {
5159 return alarmRepository .findAllByReceiverUserIdAndCheckedFalse (receiverUserId ).stream ()
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 ();
60+ .map (alarm -> AlarmResponse .toResponse (
61+ alarm .getId (),
62+ alarm .getReceiverUserId (),
63+ alarm .getAlarmType (),
64+ alarm .getDomainType (),
65+ alarm .getDomainId (),
66+ alarm .getMessage (),
67+ alarm .isChecked (),
68+ alarm .getCreatedDate ()))
69+ .toList ();
6170 }
6271
6372 public List <AlarmResponse > getAllAlarms (Long receiverUserId ) {
6473 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 ();
74+ .map (alarm -> AlarmResponse .toResponse (
75+ alarm .getId (),
76+ alarm .getReceiverUserId (),
77+ alarm .getAlarmType (),
78+ alarm .getDomainType (),
79+ alarm .getDomainId (),
80+ alarm .getMessage (),
81+ alarm .isChecked (),
82+ alarm .getCreatedDate ()))
83+ .toList ();
7484 }
7585
7686 @ Transactional
7787 public void checkAllAlarmWithoutInvite (Long receiverUserId ) {
7888 List <Alarm > alarms = alarmRepository .findAllByReceiverUserIdAndCheckedFalse (receiverUserId );
7989 alarms .stream ()
80- .filter (alarm -> alarm .getAlarmType () != AlarmType .INVITE )
81- .forEach (Alarm ::checkAlarm );
90+ .filter (alarm -> alarm .getAlarmType () != AlarmType .INVITE )
91+ .forEach (Alarm ::checkAlarm );
8292 }
8393
8494 @ EventListener
8595 public void handleStudyInviteEvent (StudyInviteEvent event ) {
8696 saveAlarm (
87- event .targetUserId (),
88- AlarmType .INVITE ,
89- DomainType .STUDY ,
90- event .studyId ()
97+ event .targetUserId (),
98+ AlarmType .INVITE ,
99+ DomainType .STUDY ,
100+ event .studyId ()
91101 );
92102 }
93103
@@ -111,36 +121,39 @@ public void rejectInvite(Long alarmId) {
111121
112122 @ EventListener
113123 public void handleStudyExtendEvent (StudyExtendEvent event ) {
114- List <StudyMember > members = studyMemberRepository .findAllByStudyIdAndActivatedTrue (event .studyId ());
124+ List <StudyMember > members = studyMemberRepository .findAllByStudyIdAndActivatedTrue (
125+ event .studyId ());
115126
116127 for (StudyMember member : members ) {
117128 if (!member .isLeader ()) {
118129 saveAlarm (
119- member .getUserId (),
120- AlarmType .STUDY_EXTEND ,
121- DomainType .STUDY ,
122- event .studyId ()
130+ member .getUserId (),
131+ AlarmType .STUDY_EXTEND ,
132+ DomainType .STUDY ,
133+ event .studyId ()
123134 );
124135 }
125136 }
126137 }
127138
128139 @ EventListener
129140 public void handleStudyExtensionReminderEvent (StudyExtensionReminderEvent event ) {
130- StudyMember leader = studyMemberRepository .findByStudyIdAndRoleAndActivatedTrue (event .studyId (), StudyMemberRole .LEADER )
131- .orElseThrow (() -> new BusinessException (STUDY_LEADER_NOT_FOUND ));
141+ StudyMember leader = studyMemberRepository .findByStudyIdAndRoleAndActivatedTrue (
142+ event .studyId (), StudyMemberRole .LEADER )
143+ .orElseThrow (() -> new BusinessException (STUDY_LEADER_NOT_FOUND ));
132144
133145 saveAlarm (
134- leader .getUserId (),
135- AlarmType .STUDY_EXTENSION_REMINDER ,
136- DomainType .STUDY ,
137- event .studyId ()
146+ leader .getUserId (),
147+ AlarmType .STUDY_EXTENSION_REMINDER ,
148+ DomainType .STUDY ,
149+ event .studyId ()
138150 );
139151 }
140152
141153 @ EventListener
142154 public void handleTimeVotePeriodCreatedEvent (TimeVotePeriodCreatedEvent event ) {
143- List <StudyMember > members = studyMemberRepository .findAllByStudyIdAndActivatedTrue (event .studyId ());
155+ List <StudyMember > members = studyMemberRepository .findAllByStudyIdAndActivatedTrue (
156+ event .studyId ());
144157
145158 for (StudyMember member : members ) {
146159 if (!member .getUserId ().equals (event .excludedUserId ())) {
@@ -154,13 +167,40 @@ public void handleTimeVotePeriodCreatedEvent(TimeVotePeriodCreatedEvent event) {
154167 }
155168 }
156169
170+ @ EventListener
171+ public void handleApplicationEvent (ApplicationEvent event ) {
172+ RecruitmentPost recruitmentPost = recruitmentPostRepository .findByIdAndActivatedTrue (event .recruitmentPostId ())
173+ .orElseThrow (() -> new BusinessException (NOT_FOUND ));
174+
175+ saveAlarm (
176+ recruitmentPost .getUserId (),
177+ AlarmType .STUDY_APPLICATION ,
178+ DomainType .RECRUITMENT_POST ,
179+ event .recruitmentPostId ()
180+ );
181+ }
182+
183+ @ EventListener
184+ public void handleApplicationStatusChangedEvent (ApplicationStatusChangedEvent event ) {
185+ StudyApplication application = applicationRepository .findByIdAndActivatedTrue (event .applicationId ())
186+ .orElseThrow (() -> new BusinessException (APPLICATION_NOT_FOUND ));
187+
188+ saveAlarm (
189+ application .getUserId (),
190+ event .alarmType (),
191+ DomainType .STUDY_APPLICATION ,
192+ application .getId ()
193+ );
194+ }
195+
157196 private Alarm findValidAlarm (Long alarmId ) {
158- return alarmRepository .findById (alarmId ).orElseThrow (() -> new NotFoundException (AlarmErrorCode .ALARM_NOT_FOUND ));
197+ return alarmRepository .findById (alarmId )
198+ .orElseThrow (() -> new NotFoundException (AlarmErrorCode .ALARM_NOT_FOUND ));
159199 }
160200
161201 private Study findValidStudy (Long studyId ) {
162202 return studyRepository .findById (studyId )
163- .orElseThrow (() -> new NotFoundException (STUDY_NOT_FOUND ));
203+ .orElseThrow (() -> new NotFoundException (STUDY_NOT_FOUND ));
164204 }
165205
166206 private void validateParticipantStudyLimit (Long userId ) {
0 commit comments