UCSBSubjectsService.java

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

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

  20. @Slf4j
  21. @Service("UCSBSubjects")
  22. public class UCSBSubjectsService {

  23.   @Autowired private ObjectMapper mapper;
  24.   @Autowired private UCSBSubjectRepository subjectRepository;

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

  27.   public static final String ENDPOINT =
  28.       "https://api.ucsb.edu/students/lookups/v1/subjects?includeInactive=false";

  29.   private final RestTemplate restTemplate;

  30.   public UCSBSubjectsService(RestTemplateBuilder restTemplateBuilder) {
  31.     restTemplate = restTemplateBuilder.build();
  32.   }

  33.   public List<UCSBSubject> get() throws JsonProcessingException {

  34.     HttpHeaders headers = new HttpHeaders();
  35.     headers.setAccept(List.of(MediaType.APPLICATION_JSON));
  36.     headers.setContentType(MediaType.APPLICATION_JSON);
  37.     headers.set("ucsb-api-key", this.apiKey);

  38.     HttpEntity<String> entity = new HttpEntity<>(headers);
  39.     ResponseEntity<String> re =
  40.         restTemplate.exchange(ENDPOINT, HttpMethod.GET, entity, String.class);

  41.     String retBody = re.getBody();
  42.     List<UCSBSubject> subjects =
  43.         mapper.readValue(retBody, new TypeReference<List<UCSBSubject>>() {});

  44.     return subjects;
  45.   }

  46.   public List<UCSBSubject> loadAllSubjects() throws JsonProcessingException {
  47.     List<UCSBSubject> subjects = this.get();
  48.     List<UCSBSubject> savedSubjects = new ArrayList<UCSBSubject>();

  49.     subjects.forEach(
  50.         (ucsbSubject) -> {
  51.           subjectRepository.save(ucsbSubject);
  52.           savedSubjects.add(ucsbSubject);
  53.         });
  54.     log.info("subjects={}", subjects);
  55.     return savedSubjects;
  56.   }
  57. }