-
Notifications
You must be signed in to change notification settings - Fork 6
Expand file tree
/
Copy pathRoleExpirationNotifier.java
More file actions
74 lines (62 loc) · 3.02 KB
/
RoleExpirationNotifier.java
File metadata and controls
74 lines (62 loc) · 3.02 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package invite.cron;
import invite.mail.MailBox;
import invite.manage.Manage;
import invite.model.GroupedProviders;
import invite.model.UserRole;
import invite.repository.UserRoleRepository;
import lombok.Getter;
import net.javacrumbs.shedlock.spring.annotation.SchedulerLock;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import java.time.Instant;
import java.time.temporal.ChronoUnit;
import java.util.List;
@Component
public class RoleExpirationNotifier {
public static final String LOCK_NAME = "role_expiration_notifier_user_level_lock";
private static final Log LOG = LogFactory.getLog(RoleExpirationNotifier.class);
private final UserRoleRepository userRoleRepository;
@Getter
private final Manage manage;
private final MailBox mailBox;
private final int roleExpirationNotificationDays;
public RoleExpirationNotifier(UserRoleRepository userRoleRepository,
Manage manage,
MailBox mailBox,
@Value("${cron.role-expiration-notifier-duration-days}") int roleExpirationNotificationDays) {
this.userRoleRepository = userRoleRepository;
this.manage = manage;
this.mailBox = mailBox;
this.roleExpirationNotificationDays = roleExpirationNotificationDays;
}
@Scheduled(cron = "${cron.role-expiration-notifier-expression}")
@SchedulerLock(name = LOCK_NAME, lockAtLeastFor = "${cron.role-expiration-notifier-lock-at-least-for}",
lockAtMostFor = "${cron.role-expiration-notifier-lock-at-most-for}")
@Transactional
public void sweep() {
if (roleExpirationNotificationDays == -1) {
return;
}
this.doSweep();
}
public List<String> doSweep() {
Instant now = Instant.now();
Instant futureDate = now.plus(roleExpirationNotificationDays, ChronoUnit.DAYS);
List<UserRole> userRoles = userRoleRepository.findByEndDateBeforeAndExpiryNotifications(futureDate, 0);
return userRoles.stream().map(userRole -> {
List<GroupedProviders> groupedProviders = manage.getGroupedProviders(List.of(userRole.getRole()));
GroupedProviders groupedProvider = groupedProviders.isEmpty() ? null : groupedProviders.get(0);
Instant endDate = userRole.getEndDate();
long daysBetween = ChronoUnit.DAYS.between(now, endDate) + 1;
String mail = mailBox.sendUserRoleExpirationNotificationMail(userRole, groupedProvider, (int) daysBetween);
//https://stackoverflow.com/a/75121707
userRoleRepository.updateExpiryNotifications(1, userRole.getId());
LOG.info("Send expiration notification mail to " + userRole.getUser().getEmail());
return mail;
}).toList();
}
}