UCSBAPIQuarterService.java

  1. package edu.ucsb.cs156.courses.services;

  2. import com.fasterxml.jackson.core.type.TypeReference;
  3. import com.fasterxml.jackson.databind.ObjectMapper;
  4. import edu.ucsb.cs156.courses.entities.UCSBAPIQuarter;
  5. import edu.ucsb.cs156.courses.models.Quarter;
  6. import edu.ucsb.cs156.courses.repositories.UCSBAPIQuarterRepository;
  7. import java.util.ArrayList;
  8. import java.util.Arrays;
  9. import java.util.List;
  10. import lombok.extern.slf4j.Slf4j;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.beans.factory.annotation.Value;
  13. import org.springframework.boot.web.client.RestTemplateBuilder;
  14. import org.springframework.http.HttpEntity;
  15. import org.springframework.http.HttpHeaders;
  16. import org.springframework.http.HttpMethod;
  17. import org.springframework.http.HttpStatus;
  18. import org.springframework.http.MediaType;
  19. import org.springframework.http.ResponseEntity;
  20. import org.springframework.stereotype.Service;
  21. import org.springframework.web.client.RestTemplate;

  22. /** Service object that wraps the UCSB Academic Curriculum API */
  23. @Service
  24. @Slf4j
  25. public class UCSBAPIQuarterService {

  26.   @Value("${app.startQtrYYYYQ:20221}")
  27.   private String startQtrYYYYQ;

  28.   @Value("${app.endQtrYYYYQ:20222}")
  29.   private String endQtrYYYYQ;

  30.   @Autowired private ObjectMapper objectMapper;

  31.   @Autowired UCSBAPIQuarterRepository ucsbApiQuarterRepository;

  32.   @Value("${app.ucsb.api.consumer_key}")
  33.   private String apiKey;

  34.   private RestTemplate restTemplate = new RestTemplate();

  35.   public UCSBAPIQuarterService(RestTemplateBuilder restTemplateBuilder) throws Exception {
  36.     restTemplate = restTemplateBuilder.build();
  37.   }

  38.   public static final String CURRENT_QUARTER_ENDPOINT =
  39.       "https://api.ucsb.edu/academics/quartercalendar/v1/quarters/current";

  40.   public static final String ALL_QUARTERS_ENDPOINT =
  41.       "https://api.ucsb.edu/academics/quartercalendar/v1/quarters";

  42.   public static final String END_QUARTER_ENDPOINT =
  43.       "https://api.ucsb.edu/academics/quartercalendar/v1/quarters/end";

  44.   public String getStartQtrYYYYQ() {
  45.     return startQtrYYYYQ;
  46.   }

  47.   public String getEndQtrYYYYQ() {
  48.     return endQtrYYYYQ;
  49.   }

  50.   public String getCurrentQuarterYYYYQ() throws Exception {
  51.     UCSBAPIQuarter quarter = getCurrentQuarter();
  52.     return quarter.getQuarter();
  53.   }

  54.   public UCSBAPIQuarter getCurrentQuarter() throws Exception {
  55.     HttpHeaders headers = new HttpHeaders();
  56.     headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
  57.     headers.setContentType(MediaType.APPLICATION_JSON);
  58.     headers.set("ucsb-api-version", "1.0");
  59.     headers.set("ucsb-api-key", this.apiKey);

  60.     HttpEntity<String> entity = new HttpEntity<>("body", headers);

  61.     String url = CURRENT_QUARTER_ENDPOINT;

  62.     log.info("url=" + url);

  63.     String retVal = "";
  64.     MediaType contentType = null;
  65.     HttpStatus statusCode = null;

  66.     ResponseEntity<String> re = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
  67.     contentType = re.getHeaders().getContentType();
  68.     statusCode = (HttpStatus) re.getStatusCode();
  69.     retVal = re.getBody();

  70.     log.info(
  71.         "json: {} contentType: {} statusCode: {} entity: {}",
  72.         retVal,
  73.         contentType,
  74.         statusCode,
  75.         entity);
  76.     UCSBAPIQuarter quarter = null;
  77.     quarter = objectMapper.readValue(retVal, UCSBAPIQuarter.class);
  78.     return quarter;
  79.   }

  80.   public List<UCSBAPIQuarter> getAllQuarters() throws Exception {
  81.     List<UCSBAPIQuarter> quarters = ucsbApiQuarterRepository.findAll();
  82.     if (quarters.isEmpty()) {
  83.       quarters = this.loadAllQuarters();
  84.     }
  85.     return quarters;
  86.   }

  87.   public List<UCSBAPIQuarter> getAllQuartersFromAPI() throws Exception {
  88.     HttpHeaders headers = new HttpHeaders();
  89.     headers.setAccept(Arrays.asList(MediaType.APPLICATION_JSON));
  90.     headers.setContentType(MediaType.APPLICATION_JSON);
  91.     headers.set("ucsb-api-version", "1.0");
  92.     headers.set("ucsb-api-key", this.apiKey);

  93.     HttpEntity<String> entity = new HttpEntity<>("body", headers);

  94.     String url = ALL_QUARTERS_ENDPOINT;

  95.     log.info("url=" + url);

  96.     String retVal = "";
  97.     MediaType contentType = null;
  98.     HttpStatus statusCode = null;

  99.     ResponseEntity<String> re = restTemplate.exchange(url, HttpMethod.GET, entity, String.class);
  100.     contentType = re.getHeaders().getContentType();
  101.     statusCode = (HttpStatus) re.getStatusCode();
  102.     retVal = re.getBody();

  103.     log.info(
  104.         "json: {} contentType: {} statusCode: {} entity: {}",
  105.         retVal,
  106.         contentType,
  107.         statusCode,
  108.         entity);
  109.     List<UCSBAPIQuarter> quarters = null;
  110.     quarters = objectMapper.readValue(retVal, new TypeReference<List<UCSBAPIQuarter>>() {});
  111.     return quarters;
  112.   }

  113.   public boolean quarterYYYYQInRange(String quarterYYYYQ) {
  114.     boolean dateGEStart = quarterYYYYQ.compareTo(startQtrYYYYQ) >= 0;
  115.     boolean dateLEEnd = quarterYYYYQ.compareTo(endQtrYYYYQ) <= 0;
  116.     return (dateGEStart && dateLEEnd);
  117.   }

  118.   public List<UCSBAPIQuarter> loadAllQuarters() throws Exception {
  119.     List<UCSBAPIQuarter> quarters = this.getAllQuartersFromAPI();
  120.     List<UCSBAPIQuarter> savedQuarters = new ArrayList<UCSBAPIQuarter>();
  121.     quarters.forEach(
  122.         (quarter) -> {
  123.           if (quarterYYYYQInRange(quarter.getQuarter())) {
  124.             ucsbApiQuarterRepository.save(quarter);
  125.             savedQuarters.add(quarter);
  126.           }
  127.         });
  128.     log.info("savedQuarters.size={}", savedQuarters.size());
  129.     return savedQuarters;
  130.   }

  131.   public List<String> getActiveQuarterList() throws Exception {
  132.     List<String> activeQuarters = new ArrayList<>();
  133.     String startQuarter = getCurrentQuarterYYYYQ();
  134.     String endQuarter = getEndQtrYYYYQ();

  135.     List<Quarter> quarterObjects = Quarter.quarterList(startQuarter, endQuarter);

  136.     for (Quarter quarter : quarterObjects) {
  137.       activeQuarters.add(quarter.getYYYYQ());
  138.     }

  139.     return activeQuarters;
  140.   }
  141. }