1111import com .itasocialacademy .oitassist .core .enums .ErrorCode ;
1212import com .itasocialacademy .oitassist .core .exceptions .AuthorizationException ;
1313import com .itasocialacademy .oitassist .participation .components .saver .ApplicationDecisionsSaver ;
14+ import com .itasocialacademy .oitassist .participation .dao .dto .event .ApplicationDecisionListEvent ;
1415import com .itasocialacademy .oitassist .participation .dao .dto .event .ApplicationDecisionEvent ;
1516import com .itasocialacademy .oitassist .participation .dao .dto .request .AcceptApplicationListRequest ;
1617import com .itasocialacademy .oitassist .participation .dao .dto .request .RejectApplicationListRequest ;
@@ -106,15 +107,16 @@ public ProcessApplicationResponse acceptRequest(Long applicationId) {
106107 }
107108
108109 @ Override
109- public AcceptedApplicationListResponse acceptApplications (
110- AcceptApplicationListRequest request ,
111- Long competitionId ,
112- Long stageId ) {
110+ public AcceptedApplicationListResponse acceptApplicationList (AcceptApplicationListRequest request ) {
113111 Long userId = getCurrentUserIdOrThrow ();
114112 List <Long > applicationIds = validateNoDuplicatesOrThrow (request .applicationIds ());
115113
116114 List <Application > applications = applicationRepository .findAll (
117115 ApplicationSpecification .applicationIdIn (applicationIds ));
116+ validateApplicationsBelongToTheSameCompetitionAndStage (applications );
117+ Long competitionId = applications .getFirst ().getCompetitionId ();
118+ Long stageId = applications .getFirst ().getStageId ();
119+
118120 List <SucceededApplicationAcceptingItemResponse > succeeded = new ArrayList <>();
119121 List <FailedApplicationDecisionItemResponse > failed = new ArrayList <>();
120122
@@ -152,7 +154,10 @@ public AcceptedApplicationListResponse acceptApplications(
152154 .build ();
153155
154156 if (!succeeded .isEmpty ()) {
155-
157+ scheduleAcceptedEmailList (
158+ competitionId ,
159+ stageId ,
160+ succeeded .stream ().map (SucceededApplicationAcceptingItemResponse ::participantId ).toList ());
156161 }
157162
158163 return response ;
@@ -180,15 +185,16 @@ public ProcessApplicationResponse rejectRequest(Long applicationId, RejectEnroll
180185 }
181186
182187 @ Override
183- public RejectedApplicationListResponse rejectApplications (
184- RejectApplicationListRequest request ,
185- Long competitionId ,
186- Long stageId ) {
188+ public RejectedApplicationListResponse rejectApplicationList (RejectApplicationListRequest request ) {
187189 Long userId = getCurrentUserIdOrThrow ();
188190 List <Long > applicationIds = validateNoDuplicatesOrThrow (request .applicationIds ());
189191
190192 List <Application > applications = applicationRepository .findAll (
191193 ApplicationSpecification .applicationIdIn (applicationIds ));
194+ validateApplicationsBelongToTheSameCompetitionAndStage (applications );
195+ Long competitionId = applications .getFirst ().getCompetitionId ();
196+ Long stageId = applications .getFirst ().getStageId ();
197+
192198 List <SucceededApplicationRejectingItemResponse > succeeded = new ArrayList <>();
193199 List <FailedApplicationDecisionItemResponse > failed = new ArrayList <>();
194200
@@ -207,7 +213,7 @@ public RejectedApplicationListResponse rejectApplications(
207213 Application savedApplication = applicationSaver .saveRejectedApplication (
208214 userId , application , request .rejectionReason ());
209215 succeeded .add (new SucceededApplicationRejectingItemResponse (
210- savedApplication .getId (), RequestStatus .REJECTED ));
216+ savedApplication .getId (), savedApplication . getUserId (), RequestStatus .REJECTED ));
211217 } catch (DataIntegrityViolationException e ) {
212218 throw new UnexpectedConstraintViolationException (
213219 "Unexpected database constraint violation while accepting application" ,
@@ -221,7 +227,11 @@ public RejectedApplicationListResponse rejectApplications(
221227 .build ();
222228
223229 if (!succeeded .isEmpty ()) {
224-
230+ scheduleRejectedEmailList (
231+ competitionId ,
232+ stageId ,
233+ succeeded .stream ().map (SucceededApplicationRejectingItemResponse ::studentId ).toList (),
234+ request .rejectionReason ());
225235 }
226236
227237 return response ;
@@ -384,6 +394,15 @@ private void scheduleRejectedEmail(Long competitionId, Long stageId, Long userId
384394 scheduleDecisionEmailAfterCommit (competitionId , stageId , userId , rejectionReason , RequestStatus .REJECTED );
385395 }
386396
397+ private void scheduleAcceptedEmailList (Long competitionId , Long stageId , List <Long > userIds ) {
398+ scheduleApplicationDecisionEmails (competitionId , stageId , userIds , null , RequestStatus .ACCEPTED );
399+ }
400+
401+ private void scheduleRejectedEmailList (
402+ Long competitionId , Long stageId , List <Long > userIds , String rejectionReason ) {
403+ scheduleApplicationDecisionEmails (competitionId , stageId , userIds , rejectionReason , RequestStatus .REJECTED );
404+ }
405+
387406 private List <Long > validateNoDuplicatesOrThrow (List <Long > rawIds ) {
388407 Set <Long > seen = new HashSet <>();
389408 Set <Long > duplicates = rawIds .stream ()
@@ -401,4 +420,37 @@ private boolean isUniqueParticipationConstraint(DataIntegrityViolationException
401420 }
402421 return false ;
403422 }
423+
424+ private void scheduleApplicationDecisionEmails (
425+ Long competitionId ,
426+ Long stageId ,
427+ List <Long > succeededIds ,
428+ String rejectionReason ,
429+ RequestStatus status ) {
430+ String competitionTitle = getCompetitionInfoOrThrow (competitionId ).title ();
431+ String stageTitle = getStageInfoOrThrow (stageId ).title ();
432+ List <UserProfileDetails > users = userFacade .findProfilesByIds (succeededIds );
433+
434+ ApplicationDecisionListEvent event = new ApplicationDecisionListEvent (
435+ competitionTitle , stageTitle , users , rejectionReason , status );
436+ emailSender .sendDecisionEmailList (event );
437+ }
438+
439+ private void validateApplicationsBelongToTheSameCompetitionAndStage (List <Application > applications ) {
440+ if (applications .isEmpty ()) {
441+ throw new ApplicationNotFoundException ("None of the requested applications were found" );
442+ }
443+
444+ Long expectedCompetitionId = applications .getFirst ().getCompetitionId ();
445+ Long expectedStageId = applications .getFirst ().getStageId ();
446+
447+ boolean allMatch =
448+ applications .stream ().allMatch (app -> Objects .equals (app .getCompetitionId (), expectedCompetitionId )
449+ && Objects .equals (app .getStageId (), expectedStageId ));
450+
451+ if (!allMatch ) {
452+ throw new UnableToProcessApplicationException (
453+ "The applications don't belong to the same competition stage" );
454+ }
455+ }
404456}
0 commit comments