diff --git a/src/main/java/com/igot/cios/plugins/DataTransformUtility.java b/src/main/java/com/igot/cios/plugins/DataTransformUtility.java index 7791ab3..3ebcdbd 100644 --- a/src/main/java/com/igot/cios/plugins/DataTransformUtility.java +++ b/src/main/java/com/igot/cios/plugins/DataTransformUtility.java @@ -358,6 +358,14 @@ public void updateProcessedDataInDb(JsonNode processedData, String partnerCode, processedData.forEach(eachContentData -> { JsonNode transformData = transformData(eachContentData, contentJson); Timestamp currentTime = new Timestamp(System.currentTimeMillis()); + if (transformData != null && + transformData.path(Constants.CONTENT) != null && + transformData.path(Constants.CONTENT).get(Constants.DURATION) != null) { + String durationString = transformData.path(Constants.CONTENT).get(Constants.DURATION).textValue(); + String[] parts = durationString.split(" "); + String duration = String.valueOf(Integer.parseInt(parts[0])); + ((ObjectNode) transformData.path(Constants.CONTENT)).put(Constants.DURATION, duration).asText(); + } ((ObjectNode) transformData.path(Constants.CONTENT)).put(Constants.FILE_ID, fileId).asText(); ((ObjectNode) transformData.path(Constants.CONTENT)).put(Constants.SOURCE, fileName).asText(); ((ObjectNode) transformData.path(Constants.CONTENT)).put(Constants.PARTNER_CODE, partnerCode).asText(); @@ -389,7 +397,7 @@ public CornellContentEntity saveOrUpdateCornellContent(String externalId, JsonNo Optional optExternalContent = cornellContentRepository.findByExternalIdAndPartnerId(externalId,partnerId); if (optExternalContent.isPresent()) { CornellContentEntity externalContent = optExternalContent.get(); - if(!externalContent.getCiosData().get("content").get("status").equals("live")||externalContent.getCiosData().get("content").get("status").equals("draft")) { + if(!(externalContent.getCiosData().get("content").get("status").equals("live")||externalContent.getCiosData().get("content").get("status").equals("draft"))){ externalContent.setExternalId(externalId); externalContent.setCiosData(transformData); externalContent.setIsActive(externalContent.getIsActive()); @@ -399,6 +407,8 @@ public CornellContentEntity saveOrUpdateCornellContent(String externalId, JsonNo externalContent.setFileId(fileId); externalContent.setPartnerId(partnerId); externalContent.setPartnerCode((partnerCode)); + }else{ + //kafka changes need to add } return externalContent; } else { @@ -440,10 +450,9 @@ private void cornellBulkSave(List cornellContentEntityList Long totalCourseCount = cornellContentRepository.countByPartnerCode(partnerCode); log.info("Total courses onboarded {} for partner {}",totalCourseCount,partnerCode); JsonNode response = fetchPartnerInfoUsingApi(partnerCode); - JsonNode resultData = response.path(Constants.RESULT); - JsonNode data = resultData.path(Constants.DATA); - ((ObjectNode) data).put(Constants.TOTAL_COURSES_COUNT, totalCourseCount); - updatingPartnerInfo(resultData); + JsonNode resultData = response.path(Constants.DATA); + ((ObjectNode) resultData).put(Constants.TOTAL_COURSES_COUNT, totalCourseCount); + updatingPartnerInfo(response); } public void flattenContentData(Map entityMap) { diff --git a/src/main/java/com/igot/cios/scheduler/CornellSchedulerService.java b/src/main/java/com/igot/cios/scheduler/CornellSchedulerService.java index 6de4113..f6a9490 100644 --- a/src/main/java/com/igot/cios/scheduler/CornellSchedulerService.java +++ b/src/main/java/com/igot/cios/scheduler/CornellSchedulerService.java @@ -31,7 +31,7 @@ @Slf4j @Service -public class CornellSchedulerService implements SchedulerInterface { +public class CornellSchedulerService{ @Autowired private ObjectMapper objectMapper; @@ -48,14 +48,10 @@ public class CornellSchedulerService implements SchedulerInterface { @Autowired private DataTransformUtility dataTransformUtility; - public void callEnrollmentAPI(String partnerCode, JsonNode rawContentData) { + private void callEnrollmentAPI(String partnerCode, String partnerId, JsonNode transformData) { try { log.info("CornellSchedulerService::callEnrollmentAPI"); - JsonNode entity = dataTransformUtility.fetchPartnerInfoUsingApi(partnerCode); - List contentJson = objectMapper.convertValue(entity.get("transformProgressViaApi"), new TypeReference>() {}); - JsonNode transformData = dataTransformUtility.transformData(rawContentData, contentJson); String extCourseId = transformData.get("courseid").asText(); - String partnerId = entity.get("id").asText(); JsonNode result = dataTransformUtility.callCiosReadApi(extCourseId,partnerId); String courseId = result.path("content").get("contentId").asText(); String[] parts = transformData.get("userid").asText().split("@"); @@ -72,7 +68,7 @@ public void callEnrollmentAPI(String partnerCode, JsonNode rawContentData) { String formatedDate = updateDateFormatFromTimestamp(date); ((ObjectNode) transformData).put("completedon", formatedDate); ((ObjectNode) transformData).put("partnerCode", partnerCode); - ((ObjectNode) transformData).put("partnerId", entity.get("id").asText()); + ((ObjectNode) transformData).put("partnerId", partnerId); payloadValidation.validatePayload(Constants.PROGRESS_DATA_VALIDATION_FILE, transformData); kafkaProducer.push(cbServerProperties.getTopic(), transformData); } else { @@ -91,7 +87,8 @@ private String updateDateFormatFromTimestamp(Long completedon) { return sdf.format(date); } - public JsonNode loadEnrollment() { + public JsonNode loadCornellEnrollment() { + log.info("CornellSchedulerService :: loadEnrollment()"); RequestBodyDTO requestBodyDTO = new RequestBodyDTO(); requestBodyDTO.setServiceCode(cbServerProperties.getCornellEnrollmentServiceCode()); requestBodyDTO.setUrlMap(formUrlMapForEnrollment()); @@ -118,8 +115,8 @@ private Map formUrlMapForEnrollment() { return urlMap; } - public JsonNode performEnrollmentCall(String partnerCode, String requestBody) { - log.info("calling service locator for getting {} enrollment list", partnerCode); + private JsonNode performEnrollmentCall(String partnerCode, String requestBody) { + log.info("CornellSchedulerService :: performEnrollmentCall partnerCode {} and requestBody {}", partnerCode,requestBody); String url = cbServerProperties.getServiceLocatorHost() + cbServerProperties.getServiceLocatorFixedUrl(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); @@ -131,12 +128,17 @@ public JsonNode performEnrollmentCall(String partnerCode, String requestBody) { Object.class ); if (response.getStatusCode().is2xxSuccessful()) { - JsonNode jsonNode = objectMapper.valueToTree(response.getBody()); - JsonNode jsonData = jsonNode.path("responseData").get("enrollments"); - jsonData.forEach( - eachContentData -> { - callEnrollmentAPI(partnerCode, eachContentData); - }); + JsonNode jsonData = objectMapper.valueToTree(response.getBody()); + if(!jsonData.isMissingNode()){ + JsonNode contentPartnerResponse = dataTransformUtility.fetchPartnerInfoUsingApi(partnerCode); + String partnerId = contentPartnerResponse.get("id").asText(); + jsonData.forEach( + eachContentData -> { + callEnrollmentAPI(partnerCode, partnerId, eachContentData); + }); + }else{ + log.error("Failed to retrieve response data: for partner code {}", partnerCode); + } return jsonData; } else { throw new RuntimeException("Failed to retrieve externalId. Status code: " + response.getStatusCodeValue()); diff --git a/src/main/java/com/igot/cios/scheduler/CourseScheduler.java b/src/main/java/com/igot/cios/scheduler/CourseScheduler.java index ca6820f..2402fde 100644 --- a/src/main/java/com/igot/cios/scheduler/CourseScheduler.java +++ b/src/main/java/com/igot/cios/scheduler/CourseScheduler.java @@ -28,7 +28,7 @@ public class CourseScheduler { private void callCornellEnrollmentApi() throws JsonProcessingException{ if (schedulerEnabled) { log.info("CourseScheduler :: callCornellEnrollmentApi"); - cornellSchedulerService.loadEnrollment(); + cornellSchedulerService.loadCornellEnrollment(); } } @@ -36,7 +36,7 @@ private void callCornellEnrollmentApi() throws JsonProcessingException{ private void callCourseraEnrollmentApi() throws JsonProcessingException { if (courseraSchedulerEnabled) { log.info("CourseScheduler :: callCourseraEnrollmentApi"); - courseraSchedulerService.loadEnrollment(); + courseraSchedulerService.loadCourseraEnrollment(); } } } diff --git a/src/main/java/com/igot/cios/scheduler/CourseraSchedulerService.java b/src/main/java/com/igot/cios/scheduler/CourseraSchedulerService.java index 500caad..09891c3 100644 --- a/src/main/java/com/igot/cios/scheduler/CourseraSchedulerService.java +++ b/src/main/java/com/igot/cios/scheduler/CourseraSchedulerService.java @@ -4,6 +4,7 @@ import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ArrayNode; import com.fasterxml.jackson.databind.node.ObjectNode; import com.igot.cios.dto.RequestBodyDTO; import com.igot.cios.exception.CiosContentException; @@ -28,7 +29,7 @@ @Slf4j @Service -public class CourseraSchedulerService implements SchedulerInterface { +public class CourseraSchedulerService { @Autowired private ObjectMapper objectMapper; @Autowired @@ -44,21 +45,40 @@ public class CourseraSchedulerService implements SchedulerInterface { @Autowired private DataTransformUtility dataTransformUtility; - @Override - public JsonNode loadEnrollment() { - RequestBodyDTO requestBodyDTO = new RequestBodyDTO(); - requestBodyDTO.setServiceCode(cbServerProperties.getCourseraEnrollmentServiceCode()); - requestBodyDTO.setUrlMap(formUrlMapForEnrollment()); + public JsonNode loadCourseraEnrollment() { + log.info("Coursera Scheduler Service::loadEnrollment()"); + int start = 0; + int limit = cbServerProperties.getCourseraEnrollmentListLimit(); String payload = null; - try { - payload = objectMapper.writeValueAsString(requestBodyDTO); - } catch (JsonProcessingException e) { - throw new RuntimeException(e); + ArrayNode allEnrollmentData = objectMapper.createArrayNode(); + int total = 0; + while (start == 0 || start < total) { + RequestBodyDTO requestBodyDTO = new RequestBodyDTO(); + requestBodyDTO.setServiceCode(cbServerProperties.getCourseraEnrollmentServiceCode()); + requestBodyDTO.setUrlMap(formUrlMapForEnrollment(start, limit)); + try { + payload = objectMapper.writeValueAsString(requestBodyDTO); + } catch (JsonProcessingException e) { + throw new RuntimeException(e); + } + JsonNode response = performEnrollmentCall(cbServerProperties.courseraPartnerCode, payload); + total = response.get("count").asInt(); + JsonNode enrollmentData = response.path("data"); + if (enrollmentData != null && !enrollmentData.isMissingNode() && enrollmentData.isArray()) { + allEnrollmentData.addAll((ArrayNode) enrollmentData); + } + start += limit; } - return performEnrollmentCall(cbServerProperties.courseraPartnerCode, payload); + allEnrollmentData.forEach(eachContentData -> { + JsonNode contentPartnerInfo = dataTransformUtility.fetchPartnerInfoUsingApi(cbServerProperties.courseraPartnerCode); + String partnerId = contentPartnerInfo.get("id").asText(); + callEnrollmentAPI(cbServerProperties.courseraPartnerCode, partnerId, eachContentData); + }); + return allEnrollmentData; } - private Map formUrlMapForEnrollment() { + private Map formUrlMapForEnrollment(int start, int limit) { + log.info("Coursera Scheduler Service::formUrlMapForEnrollment"); LocalDateTime currentDateTime = LocalDateTime.now(); LocalDateTime previousDate = currentDateTime.minusDays(cbServerProperties.getCourseraDateRange()); ZonedDateTime zonedDateTime = previousDate.atZone(ZoneId.of("UTC")); @@ -66,17 +86,17 @@ private Map formUrlMapForEnrollment() { long currentMillis = System.currentTimeMillis(); long timestampWithoutMillis = (currentMillis / 1000) * 1000; Map urlMap = new HashMap<>(); - urlMap.put("limit", cbServerProperties.getCourseraEnrollmentListLimit()); - urlMap.put("start", "0"); - urlMap.put("completedAtBefore", String.valueOf(timestampWithoutMillis)); - urlMap.put("completedAtAfter", String.valueOf(timestamp)); + urlMap.put("limit", String.valueOf(cbServerProperties.getCourseraEnrollmentListLimit())); + urlMap.put("start", String.valueOf(start)); + urlMap.put(cbServerProperties.getCourseraDateBefore(), String.valueOf(timestampWithoutMillis)); + urlMap.put(cbServerProperties.getCourseraDateAfter(), String.valueOf(timestamp)); return urlMap; } - @Override - public JsonNode performEnrollmentCall(String partnerCode, String requestBody) { - log.info("calling service locator for getting {} enrollment list", partnerCode); + private JsonNode performEnrollmentCall(String partnerCode, String requestBody) { + log.info("coursera scheduler service: performEnrollmentCall for partner code {}, request body {}", partnerCode,requestBody); String url = cbServerProperties.getServiceLocatorHost() + cbServerProperties.getServiceLocatorFixedUrl(); + log.info("CourseraSchedulerService :: performEnrollmentCall url {}", url); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); HttpEntity entity = new HttpEntity<>(requestBody, headers); @@ -87,54 +107,45 @@ public JsonNode performEnrollmentCall(String partnerCode, String requestBody) { Object.class ); if (response.getStatusCode().is2xxSuccessful()) { - JsonNode jsonNode = objectMapper.valueToTree(response.getBody()); - JsonNode jsonData = jsonNode.path("responseData").get("elements"); - jsonData.forEach( - eachContentData -> { - callEnrollmentAPI(partnerCode, eachContentData); - }); - return jsonData; + log.info("CourseraSchedulerService :: performEnrollmentCall response {}"); + JsonNode jsonData = objectMapper.valueToTree(response.getBody()); + if(!jsonData.isMissingNode()&&jsonData != null){ + return jsonData; + }else{ + log.error("Failed to retrieve response data: for partner code {}", partnerCode); + } } else { throw new RuntimeException("Failed to retrieve externalId. Status code: " + response.getStatusCodeValue()); } + return null; } - @Override - public void callEnrollmentAPI(String partnerCode, JsonNode rawContentData) { + private void callEnrollmentAPI(String partnerCode, String partnerId, JsonNode transformData) { try { log.info("CourseSchedulerService::callCourseraEnrollmentAPI"); - if (rawContentData.get("contentType").asText().equalsIgnoreCase("Specialization") && rawContentData.get("isCompleted").asBoolean()) { - JsonNode entity = dataTransformUtility.fetchPartnerInfoUsingApi(partnerCode); - if (!entity.path("transformProgressViaApi").isMissingNode()) { - List contentJson = objectMapper.convertValue(entity.get("transformProgressViaApi"), new TypeReference>() { - }); - JsonNode transformData = dataTransformUtility.transformData(rawContentData, contentJson); - String extCourseId = transformData.get("courseid").asText(); - String partnerId = entity.get("id").asText(); - JsonNode result = dataTransformUtility.callCiosReadApi(extCourseId, partnerId); - String courseId = result.path("content").get("contentId").asText(); - String[] parts = transformData.get("userid").asText().split("@"); - ((ObjectNode) transformData).put("userid", parts[0]); - String userId = transformData.get("userid").asText(); - log.info("courseId and userid {} {}", courseId, userId); - Map propertyMap = new HashMap<>(); - propertyMap.put("userid", userId); - propertyMap.put("courseid", courseId); - propertyMap.put("progress", 100); - List> listOfMasterData = cassandraOperation.getRecordsByProperties(Constants.KEYSPACE_SUNBIRD_COURSES, Constants.TABLE_USER_EXTERNAL_ENROLMENTS, propertyMap, null); - if (CollectionUtils.isEmpty(listOfMasterData)) { - Long date = Long.valueOf(transformData.get("completedon").asText()); - String formatedDate = updateDateFormatFromTimestamp(date); - ((ObjectNode) transformData).put("completedon", formatedDate); - ((ObjectNode) transformData).put("partnerCode", partnerCode); - ((ObjectNode) transformData).put("partnerId", entity.get("id").asText()); - payloadValidation.validatePayload(Constants.PROGRESS_DATA_VALIDATION_FILE, transformData); - kafkaProducer.push(cbServerProperties.getTopic(), transformData); - } else { - log.info("Progress updated 100 for user {}", userId); - } + if (transformData.get("contentType").asText().equalsIgnoreCase(cbServerProperties.getCourseraEnrollmentListCourseType()) && transformData.get("isCompleted").asBoolean()) { + String extCourseId = transformData.get("courseid").asText(); + JsonNode result = dataTransformUtility.callCiosReadApi(extCourseId, partnerId); + String courseId = result.path("content").get("contentId").asText(); + String[] parts = transformData.get("userid").asText().split("@"); + ((ObjectNode) transformData).put("userid", parts[0]); + String userId = transformData.get("userid").asText(); + log.info("courseId and userid {} {}", courseId, userId); + Map propertyMap = new HashMap<>(); + propertyMap.put("userid", userId); + propertyMap.put("courseid", courseId); + propertyMap.put("progress", 100); + List> listOfMasterData = cassandraOperation.getRecordsByProperties(Constants.KEYSPACE_SUNBIRD_COURSES, Constants.TABLE_USER_EXTERNAL_ENROLMENTS, propertyMap, null); + if (CollectionUtils.isEmpty(listOfMasterData)) { + Long date = Long.valueOf(transformData.get("completedon").asText()); + String formatedDate = updateDateFormatFromTimestamp(date); + ((ObjectNode) transformData).put("completedon", formatedDate); + ((ObjectNode) transformData).put("partnerCode", partnerCode); + ((ObjectNode) transformData).put("partnerId", partnerId); + payloadValidation.validatePayload(Constants.PROGRESS_DATA_VALIDATION_FILE, transformData); + kafkaProducer.push(cbServerProperties.getTopic(), transformData); } else { - throw new CiosContentException(Constants.ERROR, "please update transformProgressJson in content partner db for partnerCode " + partnerCode, HttpStatus.INTERNAL_SERVER_ERROR); + log.info("Progress updated 100 for user {}", userId); } } } catch (Exception e) { diff --git a/src/main/java/com/igot/cios/scheduler/SchedulerInterface.java b/src/main/java/com/igot/cios/scheduler/SchedulerInterface.java deleted file mode 100644 index 02fde57..0000000 --- a/src/main/java/com/igot/cios/scheduler/SchedulerInterface.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.igot.cios.scheduler; - -import com.fasterxml.jackson.databind.JsonNode; - -public interface SchedulerInterface { - JsonNode loadEnrollment(); - JsonNode performEnrollmentCall(String partnerCode,String requestBody); - void callEnrollmentAPI(String partnerCode, JsonNode rawContentData); -} diff --git a/src/main/java/com/igot/cios/service/impl/CiosContentServiceImpl.java b/src/main/java/com/igot/cios/service/impl/CiosContentServiceImpl.java index 7d68c62..40d149e 100644 --- a/src/main/java/com/igot/cios/service/impl/CiosContentServiceImpl.java +++ b/src/main/java/com/igot/cios/service/impl/CiosContentServiceImpl.java @@ -175,7 +175,7 @@ private void callEnrollmentAPI(JsonNode rawContentData, String partnerCode) { try { log.info("CiosContentServiceImpl::saveOrUpdateContentFromProvider"); JsonNode entity = dataTransformUtility.fetchPartnerInfoUsingApi(partnerCode); - List contentJson = objectMapper.convertValue(entity.path("result").path("transformProgressJson"), new TypeReference>() { + List contentJson = objectMapper.convertValue(entity.get("transformProgressJson"), new TypeReference>() { }); JsonNode transformData = dataTransformUtility.transformData(rawContentData, contentJson); payloadValidation.validatePayload(Constants.PROGRESS_DATA_VALIDATION_FILE, transformData); @@ -247,10 +247,9 @@ public ResponseEntity deleteNotPublishContent(DeleteContentRequestDto deleteC } Long totalCourseCount = repository.countByPartnerCode(partnerCode); JsonNode contentPartnerResponse = dataTransformUtility.fetchPartnerInfoUsingApi(partnerCode); - JsonNode resultData = contentPartnerResponse.path(Constants.RESULT); - JsonNode data = resultData.path(Constants.DATA); + JsonNode data = contentPartnerResponse.path(Constants.DATA); ((ObjectNode) data).put(Constants.TOTAL_COURSES_COUNT, totalCourseCount); - dataTransformUtility.updatingPartnerInfo(resultData); + dataTransformUtility.updatingPartnerInfo(contentPartnerResponse); if (!errors.isEmpty()) { log.error("Validation errors: {}", errors); return buildErrorResponse(response, HttpStatus.BAD_REQUEST, String.join("\n", errors)); diff --git a/src/main/java/com/igot/cios/util/CbServerProperties.java b/src/main/java/com/igot/cios/util/CbServerProperties.java index 1ff6cc3..2322c44 100644 --- a/src/main/java/com/igot/cios/util/CbServerProperties.java +++ b/src/main/java/com/igot/cios/util/CbServerProperties.java @@ -84,11 +84,17 @@ public class CbServerProperties { private String courseraEnrollmentServiceCode; @Value("${coursera.enrollment.list.limit}") - private String courseraEnrollmentListLimit; + private int courseraEnrollmentListLimit; @Value("${coursera.enrollment.list.course_type}") private String courseraEnrollmentListCourseType; @Value("${coursera.date.range}") private Long courseraDateRange; + + @Value("${coursera.date.before}") + private String courseraDateBefore; + + @Value("${coursera.date.after}") + private String courseraDateAfter; } diff --git a/src/main/java/com/igot/cios/util/Constants.java b/src/main/java/com/igot/cios/util/Constants.java index cb234e9..b9f8b43 100644 --- a/src/main/java/com/igot/cios/util/Constants.java +++ b/src/main/java/com/igot/cios/util/Constants.java @@ -104,6 +104,7 @@ public class Constants { public static final String LOG_FILE = "logFile"; public static final String HAS_FAILURES = "hasFailures"; public static final long CACHE_EXPIRY_DURATION = 300000; + public static final String DURATION = "duration"; private Constants() { diff --git a/src/main/resources/PayloadValidation/ProgressFileValidation.json b/src/main/resources/PayloadValidation/ProgressFileValidation.json index 36d1fdb..0a2a4f0 100644 --- a/src/main/resources/PayloadValidation/ProgressFileValidation.json +++ b/src/main/resources/PayloadValidation/ProgressFileValidation.json @@ -27,6 +27,5 @@ "courseid", "completedon" ] - }, - "additionalProperties": false + } } diff --git a/src/main/resources/Transformation/CourseraApiProgress.json b/src/main/resources/Transformation/CourseraApiProgress.json index a6552e5..37b8660 100644 --- a/src/main/resources/Transformation/CourseraApiProgress.json +++ b/src/main/resources/Transformation/CourseraApiProgress.json @@ -1,10 +1,19 @@ [ { - "operation": "shift", "spec": { - "email": "userid", - "contentId": "courseid", - "completedAt": "completedon" - } + "paging": { + "total": "count" + }, + "elements": { + "*": { + "email": "data[&1].userid", + "contentId": "data[&1].courseid", + "enrolledAt": "data[&1].completedon", + "contentType": "data[&1].contentType", + "isCompleted": "data[&1].isCompleted" + } + } + }, + "operation": "shift" } ] \ No newline at end of file diff --git a/src/main/resources/Transformation/cornellApiProgress.json b/src/main/resources/Transformation/cornellApiProgress.json index 13e8c07..db4be7d 100644 --- a/src/main/resources/Transformation/cornellApiProgress.json +++ b/src/main/resources/Transformation/cornellApiProgress.json @@ -2,9 +2,13 @@ { "operation": "shift", "spec": { - "StudentId": "userid", - "LessonId": "courseid", - "completion_date": "completedon" + "enrollments": { + "*": { + "student": "[&1].userid", + "course": "[&1].courseid", + "completion_date": "[&1].completedon" + } + } } } ] \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 94872f8..72506b4 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -104,3 +104,6 @@ coursera.enrollment.service.code=coursera-enrollment-api coursera.scheduler.cron=0 */2 * * * * coursera.scheduler.enabled=false +coursera.date.before=enrollAtBefore +coursera.date.after=enrollAtAfter +