UCSBDiningMenuItemsController.java

1
package edu.ucsb.cs156.dining.controllers;
2
3
import edu.ucsb.cs156.dining.entities.MenuItem;
4
import edu.ucsb.cs156.dining.errors.EntityNotFoundException;
5
import edu.ucsb.cs156.dining.models.Entree;
6
import edu.ucsb.cs156.dining.models.MenuItemDto;
7
import edu.ucsb.cs156.dining.repositories.MenuItemRepository;
8
import edu.ucsb.cs156.dining.services.UCSBDiningMenuItemsService;
9
import io.swagger.v3.oas.annotations.Operation;
10
import io.swagger.v3.oas.annotations.Parameter;
11
import io.swagger.v3.oas.annotations.tags.Tag;
12
import jakarta.transaction.Transactional;
13
import java.util.ArrayList;
14
import java.util.List;
15
import java.util.Map;
16
import java.util.Optional;
17
import java.util.function.Function;
18
import java.util.stream.Collectors;
19
import java.util.stream.StreamSupport;
20
import lombok.extern.slf4j.Slf4j;
21
import org.springframework.beans.factory.annotation.Autowired;
22
import org.springframework.http.ResponseEntity;
23
import org.springframework.web.bind.annotation.GetMapping;
24
import org.springframework.web.bind.annotation.PathVariable;
25
import org.springframework.web.bind.annotation.RequestMapping;
26
import org.springframework.web.bind.annotation.RequestParam;
27
import org.springframework.web.bind.annotation.RestController;
28
29
@Tag(name = "UCSBDiningMenuItems")
30
@RestController
31
@RequestMapping("/api/diningcommons")
32
@Slf4j
33
public class UCSBDiningMenuItemsController extends ApiController {
34
35
  @Autowired UCSBDiningMenuItemsService ucsbDiningMenuItemsService;
36
37
  @Autowired MenuItemRepository menuItemRepository;
38
39
  @Operation(summary = "Get list of entrees being served at given meal, dining common, and day")
40
  @GetMapping(
41
      value = "/{date-time}/{dining-commons-code}/{meal-code}",
42
      produces = "application/json")
43
  @Transactional
44
  public ResponseEntity<List<MenuItemDto>> get_menu_items(
45
      @Parameter(
46
              description =
47
                  "date (in iso format, e.g. YYYY-mm-dd) or date-time (in iso format e.g. YYYY-mm-ddTHH:MM:SS)")
48
          @PathVariable("date-time")
49
          String datetime,
50
      @PathVariable("dining-commons-code") String diningcommoncode,
51
      @PathVariable("meal-code") String mealcode)
52
      throws Exception {
53
54
    List<Entree> body = ucsbDiningMenuItemsService.get(datetime, diningcommoncode, mealcode);
55
56
    List<MenuItemDto> menuitems =
57
        menuItemRepository.projectExistingEntrees(diningcommoncode, mealcode, body);
58
59
    Map<String, MenuItemDto> existingMenuItemsMap =
60
        menuitems.stream()
61 1 1. lambda$get_menu_items$0 : replaced return value with "" for edu/ucsb/cs156/dining/controllers/UCSBDiningMenuItemsController::lambda$get_menu_items$0 → KILLED
            .collect(Collectors.toMap(m -> m.name() + "/" + m.station(), Function.identity()));
62
63
    List<MenuItem> newMenuItems = new ArrayList<>(50);
64
65
    for (Entree entree : body) {
66 1 1. get_menu_items : negated conditional → KILLED
      if (existingMenuItemsMap.containsKey(entree.getName() + "/" + entree.getStation())) {
67
        continue;
68
      }
69
70
      MenuItem newMenuItem =
71
          MenuItem.builder()
72
              .diningCommonsCode(diningcommoncode)
73
              .mealCode(mealcode)
74
              .name(entree.getName())
75
              .station(entree.getStation())
76
              .build();
77
      newMenuItems.add(newMenuItem);
78
    }
79
80
    Iterable<MenuItem> savedMenuItems = menuItemRepository.saveAll(newMenuItems);
81
    StreamSupport.stream(savedMenuItems.spliterator(), false)
82
        .map(
83
            menuItem ->
84 1 1. lambda$get_menu_items$1 : replaced return value with null for edu/ucsb/cs156/dining/controllers/UCSBDiningMenuItemsController::lambda$get_menu_items$1 → KILLED
                new MenuItemDto(
85
                    menuItem.getId(),
86
                    menuItem.getDiningCommonsCode(),
87
                    menuItem.getMealCode(),
88
                    menuItem.getName(),
89
                    menuItem.getStation(),
90
                    null))
91 1 1. get_menu_items : removed call to java/util/stream/Stream::forEach → KILLED
        .forEach(menuitems::add);
92
93 1 1. get_menu_items : replaced return value with null for edu/ucsb/cs156/dining/controllers/UCSBDiningMenuItemsController::get_menu_items → KILLED
    return ResponseEntity.ok().body(menuitems);
94
  }
95
96
  @Operation(summary = "Get a single menu item by ID")
97
  @GetMapping(value = "/menuitem", produces = "application/json")
98
  public ResponseEntity<MenuItem> get_menu_item_by_id(
99
      @Parameter(description = "ID of the menu item") @RequestParam long id) throws Exception {
100
    Optional<MenuItem> menuItem = menuItemRepository.findById(id);
101 1 1. get_menu_item_by_id : negated conditional → KILLED
    if (menuItem.isEmpty()) {
102
      throw new EntityNotFoundException(MenuItem.class, id);
103
    }
104 1 1. get_menu_item_by_id : replaced return value with null for edu/ucsb/cs156/dining/controllers/UCSBDiningMenuItemsController::get_menu_item_by_id → KILLED
    return ResponseEntity.ok().body(menuItem.get());
105
  }
106
}

Mutations

61

1.1
Location : lambda$get_menu_items$0
Killed by : edu.ucsb.cs156.dining.controllers.UCSBDiningMenuItemsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.UCSBDiningMenuItemsControllerTests]/[method:get_menu_items_returns_existing_and_new_items()]
replaced return value with "" for edu/ucsb/cs156/dining/controllers/UCSBDiningMenuItemsController::lambda$get_menu_items$0 → KILLED

66

1.1
Location : get_menu_items
Killed by : edu.ucsb.cs156.dining.controllers.UCSBDiningMenuItemsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.UCSBDiningMenuItemsControllerTests]/[method:get_menu_items_returns_existing_and_new_items()]
negated conditional → KILLED

84

1.1
Location : lambda$get_menu_items$1
Killed by : edu.ucsb.cs156.dining.controllers.UCSBDiningMenuItemsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.UCSBDiningMenuItemsControllerTests]/[method:get_menu_items_returns_existing_and_new_items()]
replaced return value with null for edu/ucsb/cs156/dining/controllers/UCSBDiningMenuItemsController::lambda$get_menu_items$1 → KILLED

91

1.1
Location : get_menu_items
Killed by : edu.ucsb.cs156.dining.controllers.UCSBDiningMenuItemsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.UCSBDiningMenuItemsControllerTests]/[method:get_menu_items_returns_existing_and_new_items()]
removed call to java/util/stream/Stream::forEach → KILLED

93

1.1
Location : get_menu_items
Killed by : edu.ucsb.cs156.dining.controllers.UCSBDiningMenuItemsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.UCSBDiningMenuItemsControllerTests]/[method:get_menu_items_returns_existing_and_new_items()]
replaced return value with null for edu/ucsb/cs156/dining/controllers/UCSBDiningMenuItemsController::get_menu_items → KILLED

101

1.1
Location : get_menu_item_by_id
Killed by : edu.ucsb.cs156.dining.controllers.UCSBDiningMenuItemsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.UCSBDiningMenuItemsControllerTests]/[method:get_menu_item_by_id_returns_404_when_missing()]
negated conditional → KILLED

104

1.1
Location : get_menu_item_by_id
Killed by : edu.ucsb.cs156.dining.controllers.UCSBDiningMenuItemsControllerTests.[engine:junit-jupiter]/[class:edu.ucsb.cs156.dining.controllers.UCSBDiningMenuItemsControllerTests]/[method:get_menu_item_by_id_returns_item_when_present()]
replaced return value with null for edu/ucsb/cs156/dining/controllers/UCSBDiningMenuItemsController::get_menu_item_by_id → KILLED

Active mutators

Tests examined


Report generated by PIT 1.17.0