| 1 | package edu.ucsb.cs156.dining.services; | |
| 2 | ||
| 3 | import edu.ucsb.cs156.dining.dto.MenuItemDTO; | |
| 4 | import edu.ucsb.cs156.dining.entities.MenuItem; | |
| 5 | import edu.ucsb.cs156.dining.repositories.MenuItemRepository; | |
| 6 | import org.springframework.beans.factory.annotation.Value; | |
| 7 | import org.springframework.boot.web.client.RestTemplateBuilder; | |
| 8 | import org.springframework.http.HttpEntity; | |
| 9 | import org.springframework.http.HttpHeaders; | |
| 10 | import org.springframework.http.HttpMethod; | |
| 11 | import org.springframework.http.ResponseEntity; | |
| 12 | import org.springframework.stereotype.Service; | |
| 13 | import org.springframework.web.client.RestTemplate; | |
| 14 | import org.springframework.web.server.ResponseStatusException; | |
| 15 | import org.springframework.web.client.HttpClientErrorException; | |
| 16 | ||
| 17 | import java.time.LocalDateTime; | |
| 18 | import java.time.format.DateTimeFormatter; | |
| 19 | import java.util.Arrays; | |
| 20 | import java.util.List; | |
| 21 | import java.util.stream.Collectors; | |
| 22 | ||
| 23 | /** | |
| 24 | * Service for interacting with the Dining Menu API and saving menu items. | |
| 25 | */ | |
| 26 | @Service | |
| 27 | public class MenuItemService { | |
| 28 | ||
| 29 | @Value("${app.ucsb.api.consumer_key}") | |
| 30 | private String apiKey; | |
| 31 | ||
| 32 | private final RestTemplate restTemplate; | |
| 33 | private final MenuItemRepository menuItemRepository; | |
| 34 | ||
| 35 | private static final String MENU_ITEM_ENDPOINT = "https://api.ucsb.edu/dining/menu/v1/"; | |
| 36 | private static final DateTimeFormatter DATE_FORMATTER = DateTimeFormatter.ofPattern("yyyy-MM-dd"); | |
| 37 | ||
| 38 | public MenuItemService(RestTemplateBuilder restTemplateBuilder, MenuItemRepository menuItemRepository) { | |
| 39 | this.restTemplate = restTemplateBuilder.build(); | |
| 40 | this.menuItemRepository = menuItemRepository; | |
| 41 | } | |
| 42 | ||
| 43 | /** | |
| 44 | * Fetches all menu items for a specific dining commons, meal, and date. | |
| 45 | * Saves each unique menu item to the database. | |
| 46 | * | |
| 47 | * @param dateTime the date as LocalDateTime | |
| 48 | * @param diningCommonsCode the code for the dining commons | |
| 49 | * @param mealCode the meal code (e.g., "breakfast", "lunch", "dinner") | |
| 50 | * @return a list of MenuItemDTO containing name, station, and id | |
| 51 | */ | |
| 52 | public List<MenuItemDTO> getMenuItems(LocalDateTime dateTime, String diningCommonsCode, String mealCode) { | |
| 53 | String formattedDate = dateTime.format(DATE_FORMATTER); | |
| 54 | String url = String.format("%s%s/%s/%s", MENU_ITEM_ENDPOINT, formattedDate, diningCommonsCode, mealCode); | |
| 55 | ||
| 56 | HttpHeaders headers = new HttpHeaders(); | |
| 57 |
1
1. getMenuItems : removed call to org/springframework/http/HttpHeaders::set → KILLED |
headers.set("ucsb-api-key", this.apiKey); |
| 58 |
1
1. getMenuItems : removed call to org/springframework/http/HttpHeaders::set → KILLED |
headers.set("accept", "application/json"); |
| 59 | ||
| 60 | HttpEntity<String> entity = new HttpEntity<>("body", headers); | |
| 61 | ||
| 62 | try { | |
| 63 | ResponseEntity<MenuItem[]> response = restTemplate.exchange( | |
| 64 | url, HttpMethod.GET, entity, MenuItem[].class); | |
| 65 | ||
| 66 | MenuItem[] menuItemsArray = response.getBody(); | |
| 67 | ||
| 68 | // Save unique menu items to the database and return DTOs | |
| 69 | List<MenuItemDTO> result = Arrays.stream(menuItemsArray) | |
| 70 |
1
1. lambda$getMenuItems$0 : replaced return value with null for edu/ucsb/cs156/dining/services/MenuItemService::lambda$getMenuItems$0 → KILLED |
.map(menuItem -> saveOrUpdateMenuItem(menuItem, diningCommonsCode, mealCode)) |
| 71 |
1
1. lambda$getMenuItems$1 : replaced return value with null for edu/ucsb/cs156/dining/services/MenuItemService::lambda$getMenuItems$1 → KILLED |
.map(menuItem -> new MenuItemDTO(menuItem.getId(), menuItem.getName(), menuItem.getStation())) |
| 72 | .collect(Collectors.toList()); | |
| 73 |
1
1. getMenuItems : replaced return value with Collections.emptyList for edu/ucsb/cs156/dining/services/MenuItemService::getMenuItems → KILLED |
return result; |
| 74 | } catch (HttpClientErrorException.NotFound e) { | |
| 75 | // Handle 404 error from external API | |
| 76 | throw new ResponseStatusException( | |
| 77 | org.springframework.http.HttpStatus.NOT_FOUND, | |
| 78 | String.format("No menu items found for dining commons: %s, meal: %s, date: %s", | |
| 79 | diningCommonsCode, mealCode, formattedDate)); | |
| 80 | } catch (Exception e) { | |
| 81 | throw new ResponseStatusException( | |
| 82 | org.springframework.http.HttpStatus.INTERNAL_SERVER_ERROR, | |
| 83 | "Error fetching menu items from the API", e); | |
| 84 | } | |
| 85 | } | |
| 86 | ||
| 87 | /** | |
| 88 | * Saves the menu item to the database if it does not already exist. | |
| 89 | * | |
| 90 | * @param menuItem the menu item retrieved from the API | |
| 91 | * @param diningCommonsCode the dining commons code | |
| 92 | * @param mealCode the meal code | |
| 93 | * @return the saved or existing MenuItem | |
| 94 | */ | |
| 95 | public MenuItem saveOrUpdateMenuItem(MenuItem menuItem, String diningCommonsCode, String mealCode) { | |
| 96 | // Check if the menu item already exists | |
| 97 |
1
1. saveOrUpdateMenuItem : replaced return value with null for edu/ucsb/cs156/dining/services/MenuItemService::saveOrUpdateMenuItem → KILLED |
return menuItemRepository.findByUniqueFields(diningCommonsCode, mealCode, menuItem.getName(), menuItem.getStation()) |
| 98 | .orElseGet(() -> { | |
| 99 | // Log the new menu item to be saved | |
| 100 |
1
1. lambda$saveOrUpdateMenuItem$2 : removed call to edu/ucsb/cs156/dining/entities/MenuItem::setDiningCommonsCode → KILLED |
menuItem.setDiningCommonsCode(diningCommonsCode); |
| 101 |
1
1. lambda$saveOrUpdateMenuItem$2 : removed call to edu/ucsb/cs156/dining/entities/MenuItem::setMealCode → KILLED |
menuItem.setMealCode(mealCode); |
| 102 | MenuItem savedItem = menuItemRepository.save(menuItem); | |
| 103 |
1
1. lambda$saveOrUpdateMenuItem$2 : replaced return value with null for edu/ucsb/cs156/dining/services/MenuItemService::lambda$saveOrUpdateMenuItem$2 → KILLED |
return savedItem; |
| 104 | }); | |
| 105 | } | |
| 106 | } | |
Mutations | ||
| 57 |
1.1 |
|
| 58 |
1.1 |
|
| 70 |
1.1 |
|
| 71 |
1.1 |
|
| 73 |
1.1 |
|
| 97 |
1.1 |
|
| 100 |
1.1 |
|
| 101 |
1.1 |
|
| 103 |
1.1 |