Skip to content

Commit 8e6ca81

Browse files
Changes for purging.
1 parent f3e6eb0 commit 8e6ca81

7 files changed

+188
-35
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
package ca.bc.gov.educ.api.edx.model.v1;
2+
3+
import jakarta.persistence.*;
4+
import jakarta.validation.constraints.PastOrPresent;
5+
import lombok.Data;
6+
import lombok.EqualsAndHashCode;
7+
import lombok.ToString;
8+
import org.hibernate.annotations.DynamicUpdate;
9+
import org.hibernate.annotations.GenericGenerator;
10+
import org.hibernate.annotations.Parameter;
11+
12+
import java.time.LocalDateTime;
13+
import java.util.HashSet;
14+
import java.util.Set;
15+
import java.util.UUID;
16+
17+
18+
/**
19+
* The type Edx user district entity.
20+
*/
21+
@Data
22+
@Entity
23+
@Table(name = "EDX_USER_DISTRICT" , uniqueConstraints = {@UniqueConstraint(name = "EDX_USER_ID_DISTRICT_ID_UK", columnNames = {"EDX_USER_ID", "DISTRICT_ID"})})
24+
@DynamicUpdate
25+
public class EdxUserDistrictLightEntity {
26+
27+
@Id
28+
@GeneratedValue(generator = "UUID")
29+
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator", parameters = {
30+
@Parameter(name = "uuid_gen_strategy_class", value = "org.hibernate.id.uuid.CustomVersionOneStrategy")})
31+
@Column(name = "EDX_USER_DISTRICT_ID", updatable = false, columnDefinition = "BINARY(16)")
32+
UUID edxUserDistrictID;
33+
34+
@Column(name = "EDX_USER_ID", columnDefinition = "BINARY(16)")
35+
UUID edxUserID;
36+
37+
@Column(name = "DISTRICT_ID", columnDefinition = "BINARY(16)")
38+
UUID districtID;
39+
40+
@Column(name = "EXPIRY_DATE")
41+
LocalDateTime expiryDate;
42+
43+
@Column(name = "CREATE_USER", updatable = false)
44+
String createUser;
45+
46+
@PastOrPresent
47+
@Column(name = "CREATE_DATE", updatable = false)
48+
LocalDateTime createDate;
49+
50+
@Column(name = "update_user")
51+
String updateUser;
52+
53+
@PastOrPresent
54+
@Column(name = "update_date")
55+
LocalDateTime updateDate;
56+
57+
public Set<EdxUserDistrictRoleEntity> getEdxUserDistrictRoleEntities() {
58+
if(this.edxUserDistrictRoleEntities == null){
59+
this.edxUserDistrictRoleEntities = new HashSet<>();
60+
}
61+
return this.edxUserDistrictRoleEntities;
62+
}
63+
64+
@ToString.Exclude
65+
@EqualsAndHashCode.Exclude
66+
@OneToMany(mappedBy = "edxUserDistrictEntity", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true, targetEntity = EdxUserDistrictRoleEntity.class)
67+
private Set<EdxUserDistrictRoleEntity> edxUserDistrictRoleEntities;
68+
69+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
package ca.bc.gov.educ.api.edx.model.v1;
2+
3+
import jakarta.persistence.*;
4+
import jakarta.validation.constraints.PastOrPresent;
5+
import lombok.Data;
6+
import lombok.EqualsAndHashCode;
7+
import lombok.ToString;
8+
import org.hibernate.annotations.DynamicUpdate;
9+
import org.hibernate.annotations.GenericGenerator;
10+
import org.hibernate.annotations.Parameter;
11+
12+
import java.time.LocalDateTime;
13+
import java.util.HashSet;
14+
import java.util.Set;
15+
import java.util.UUID;
16+
17+
18+
@Data
19+
@Entity
20+
@Table(name = "EDX_USER_SCHOOL", uniqueConstraints = {@UniqueConstraint(name = "EDX_USER_ID_SCHOOL_ID_UK", columnNames = {"EDX_USER_ID", "SCHOOL_ID"})})
21+
@DynamicUpdate
22+
public class EdxUserSchoolLightEntity {
23+
@Id
24+
@GeneratedValue(generator = "UUID")
25+
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator", parameters = {
26+
@Parameter(name = "uuid_gen_strategy_class", value = "org.hibernate.id.uuid.CustomVersionOneStrategy")})
27+
@Column(name = "EDX_USER_SCHOOL_ID", updatable = false, columnDefinition = "BINARY(16)")
28+
UUID edxUserSchoolID;
29+
30+
@Column(name = "EDX_USER_ID", columnDefinition = "BINARY(16)")
31+
UUID edxUserID;
32+
33+
@Column(name = "SCHOOL_ID", columnDefinition = "BINARY(16)")
34+
UUID schoolID;
35+
36+
@Column(name = "EXPIRY_DATE")
37+
LocalDateTime expiryDate;
38+
39+
@Column(name = "CREATE_USER", updatable = false)
40+
String createUser;
41+
42+
@PastOrPresent
43+
@Column(name = "CREATE_DATE", updatable = false)
44+
LocalDateTime createDate;
45+
46+
@Column(name = "update_user")
47+
String updateUser;
48+
49+
@PastOrPresent
50+
@Column(name = "update_date")
51+
LocalDateTime updateDate;
52+
53+
@ToString.Exclude
54+
@EqualsAndHashCode.Exclude
55+
@OneToMany(mappedBy = "edxUserSchoolEntity", fetch = FetchType.EAGER, cascade = CascadeType.ALL, orphanRemoval = true, targetEntity = EdxUserSchoolRoleEntity.class)
56+
private Set<EdxUserSchoolRoleEntity> edxUserSchoolRoleEntities;
57+
58+
public Set<EdxUserSchoolRoleEntity> getEdxUserSchoolRoleEntities() {
59+
if (this.edxUserSchoolRoleEntities == null) {
60+
this.edxUserSchoolRoleEntities = new HashSet<>();
61+
}
62+
return this.edxUserSchoolRoleEntities;
63+
}
64+
65+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package ca.bc.gov.educ.api.edx.repository;
2+
3+
import ca.bc.gov.educ.api.edx.model.v1.EdxUserDistrictLightEntity;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.stereotype.Repository;
6+
7+
import java.time.LocalDateTime;
8+
import java.util.List;
9+
import java.util.UUID;
10+
11+
@Repository
12+
public interface EdxUserDistrictLightRepository extends JpaRepository<EdxUserDistrictLightEntity, UUID> {
13+
List<EdxUserDistrictLightEntity> findAllByExpiryDateBefore(LocalDateTime dateTime);
14+
}

api/src/main/java/ca/bc/gov/educ/api/edx/repository/EdxUserDistrictRepository.java

-3
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
import org.springframework.data.jpa.repository.Query;
77
import org.springframework.stereotype.Repository;
88

9-
import java.time.LocalDateTime;
109
import java.util.List;
1110
import java.util.Optional;
1211
import java.util.UUID;
@@ -25,6 +24,4 @@ public interface EdxUserDistrictRepository extends JpaRepository<EdxUserDistrict
2524
WHERE permission.EDX_PERMISSION_CODE = :permissionCode"""
2625
, nativeQuery = true)
2726
List<EdxUserDistrictEntity> findDistrictsByPermission(String permissionCode);
28-
29-
List<EdxUserDistrictEntity> findAllByExpiryDateBefore(LocalDateTime dateTime);
3027
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package ca.bc.gov.educ.api.edx.repository;
2+
3+
import ca.bc.gov.educ.api.edx.model.v1.EdxUserSchoolLightEntity;
4+
import org.springframework.data.jpa.repository.JpaRepository;
5+
import org.springframework.stereotype.Repository;
6+
7+
import java.time.LocalDateTime;
8+
import java.util.List;
9+
import java.util.UUID;
10+
11+
@Repository
12+
public interface EdxUserSchoolLightRepository extends JpaRepository<EdxUserSchoolLightEntity, UUID> {
13+
List<EdxUserSchoolLightEntity> findAllByExpiryDateBefore(LocalDateTime dateTime);
14+
}

api/src/main/java/ca/bc/gov/educ/api/edx/repository/EdxUserSchoolRepository.java

+1-5
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,13 @@
66
import org.springframework.data.jpa.repository.Query;
77
import org.springframework.stereotype.Repository;
88

9-
import java.time.LocalDateTime;
109
import java.util.List;
1110
import java.util.Optional;
1211
import java.util.UUID;
1312

1413
@Repository
1514
public interface EdxUserSchoolRepository extends JpaRepository<EdxUserSchoolEntity, UUID> {
15+
1616
@Query(value = " SELECT userSchool.*\n" +
1717
" FROM EDX_USER_SCHOOL userSchool inner join EDX_USER_SCHOOL_ROLE userSchoolRole on userSchool.EDX_USER_SCHOOL_ID = userSchoolRole.EDX_USER_SCHOOL_ID\n" +
1818
" inner join EDX_ROLE role on role.EDX_ROLE_CODE = userSchoolRole.EDX_ROLE_CODE\n" +
@@ -27,8 +27,4 @@ public interface EdxUserSchoolRepository extends JpaRepository<EdxUserSchoolEnti
2727

2828
List<EdxUserSchoolEntity> findAllBySchoolIDIn(List<UUID> schoolIDs);
2929

30-
List<EdxUserSchoolEntity> findAllByExpiryDateBefore(LocalDateTime dateTime);
31-
32-
List<EdxUserSchoolEntity> findAllBySchoolIDAndExpiryDateIsNull(UUID schoolID);
33-
3430
}
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
package ca.bc.gov.educ.api.edx.schedulers;
22

3-
import ca.bc.gov.educ.api.edx.model.v1.EdxUserDistrictEntity;
4-
import ca.bc.gov.educ.api.edx.model.v1.EdxUserSchoolEntity;
5-
import ca.bc.gov.educ.api.edx.repository.*;
3+
import ca.bc.gov.educ.api.edx.model.v1.EdxUserDistrictLightEntity;
4+
import ca.bc.gov.educ.api.edx.model.v1.EdxUserSchoolLightEntity;
5+
import ca.bc.gov.educ.api.edx.repository.EdxUserDistrictLightRepository;
6+
import ca.bc.gov.educ.api.edx.repository.EdxUserSchoolLightRepository;
67
import lombok.extern.slf4j.Slf4j;
78
import net.javacrumbs.shedlock.core.LockAssert;
89
import net.javacrumbs.shedlock.spring.annotation.SchedulerLock;
@@ -17,32 +18,29 @@
1718
@Component
1819
@Slf4j
1920
public class EdxUserScheduler {
20-
private final EdxUserSchoolRepository edxUserSchoolRepository;
21-
private final EdxUserDistrictRepository edxUserDistrictRepository;
21+
private final EdxUserSchoolLightRepository edxUserSchoolLightRepository;
22+
private final EdxUserDistrictLightRepository edxUserDistrictLightRepository;
2223

23-
public EdxUserScheduler(
24-
EdxUserSchoolRepository edxUserSchoolRepository,
25-
EdxUserDistrictRepository edxUserDistrictRepository
26-
) {
27-
this.edxUserSchoolRepository = edxUserSchoolRepository;
28-
this.edxUserDistrictRepository = edxUserDistrictRepository;
29-
}
24+
public EdxUserScheduler(EdxUserSchoolLightRepository edxUserSchoolLightRepository, EdxUserDistrictLightRepository edxUserDistrictLightRepository) {
25+
this.edxUserSchoolLightRepository = edxUserSchoolLightRepository;
26+
this.edxUserDistrictLightRepository = edxUserDistrictLightRepository;
27+
}
3028

31-
@Scheduled(cron = "${scheduled.jobs.purge.edx.users.cron}")
32-
@SchedulerLock(name = "PurgeEdxUsers", lockAtLeastFor = "PT4H", lockAtMostFor = "PT4H")
33-
@Transactional(propagation = Propagation.REQUIRES_NEW)
34-
public void purgeExpiredEdxUsers() {
35-
LockAssert.assertLocked();
29+
@Scheduled(cron = "${scheduled.jobs.purge.edx.users.cron}")
30+
@SchedulerLock(name = "PurgeEdxUsers", lockAtLeastFor = "PT4H", lockAtMostFor = "PT4H")
31+
@Transactional(propagation = Propagation.REQUIRES_NEW)
32+
public void purgeExpiredEdxUsers() {
33+
LockAssert.assertLocked();
3634

37-
final LocalDateTime now = LocalDateTime.now();
38-
List<EdxUserSchoolEntity> expiredSchoolUsers = this.edxUserSchoolRepository.findAllByExpiryDateBefore(now);
39-
List<EdxUserDistrictEntity> expiredDistrictUsers = this.edxUserDistrictRepository.findAllByExpiryDateBefore(now);
35+
final LocalDateTime now = LocalDateTime.now();
36+
List<EdxUserSchoolLightEntity> expiredSchoolUsers = this.edxUserSchoolLightRepository.findAllByExpiryDateBefore(now);
37+
List<EdxUserDistrictLightEntity> expiredDistrictUsers = this.edxUserDistrictLightRepository.findAllByExpiryDateBefore(now);
4038

41-
log.info("Purging expired school users");
42-
expiredSchoolUsers.forEach(edxUserSchoolEntity -> log.info("Removing EDX user " + edxUserSchoolEntity.getEdxUserEntity().getEdxUserID() + " from school ID: " + edxUserSchoolEntity.getSchoolID()));
43-
this.edxUserSchoolRepository.deleteAll(expiredSchoolUsers);
44-
log.info("Purging expired district users");
45-
expiredDistrictUsers.forEach(edxUserDistrictEntity -> log.info("Removing EDX user " + edxUserDistrictEntity.getEdxUserEntity().getEdxUserID() + " from district ID: " + edxUserDistrictEntity.getDistrictID()));
46-
this.edxUserDistrictRepository.deleteAll(expiredDistrictUsers);
47-
}
39+
log.info("Purging expired school users");
40+
expiredSchoolUsers.forEach(edxUserSchoolEntity -> log.info("Removing EDX user " + edxUserSchoolEntity.getEdxUserID() + " from school ID: " + edxUserSchoolEntity.getSchoolID()));
41+
this.edxUserSchoolLightRepository.deleteAll(expiredSchoolUsers);
42+
log.info("Purging expired district users");
43+
expiredDistrictUsers.forEach(edxUserDistrictEntity -> log.info("Removing EDX user " + edxUserDistrictEntity.getEdxUserID() + " from district ID: " + edxUserDistrictEntity.getDistrictID()));
44+
this.edxUserDistrictLightRepository.deleteAll(expiredDistrictUsers);
45+
}
4846
}

0 commit comments

Comments
 (0)