feat(frontend): Add restricted area visualisation
This commit is contained in:
parent
47993d66bc
commit
83bb72faac
13 changed files with 1589 additions and 1465 deletions
|
|
@ -1,25 +0,0 @@
|
|||
package io.github.js0ny.ilp_coursework.controller;
|
||||
|
||||
import com.fasterxml.jackson.core.JsonProcessingException;
|
||||
|
||||
import io.github.js0ny.ilp_coursework.service.DroneInfoService;
|
||||
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1")
|
||||
public class GeoJsonDataController {
|
||||
|
||||
private final DroneInfoService droneInfoService;
|
||||
|
||||
public GeoJsonDataController(DroneInfoService droneInfoService) {
|
||||
this.droneInfoService = droneInfoService;
|
||||
}
|
||||
|
||||
@GetMapping("/getAllRestrictedAreaByGeoJson")
|
||||
public String getAllRestrictedAreaGeoJson() throws JsonProcessingException {
|
||||
return droneInfoService.fetchRestrictedAreasInGeoJson().stream().reduce("", String::concat);
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,32 @@
|
|||
package io.github.js0ny.ilp_coursework.controller;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import io.github.js0ny.ilp_coursework.data.external.RestrictedArea;
|
||||
import io.github.js0ny.ilp_coursework.data.external.ServicePoint;
|
||||
import io.github.js0ny.ilp_coursework.service.DroneInfoService;
|
||||
|
||||
@RestController
|
||||
@RequestMapping("/api/v1")
|
||||
public class MapMetaController {
|
||||
|
||||
private final DroneInfoService droneInfoService;
|
||||
|
||||
public MapMetaController(DroneInfoService droneInfoService) {
|
||||
this.droneInfoService = droneInfoService;
|
||||
}
|
||||
|
||||
@GetMapping("/restrictedAreas")
|
||||
public List<RestrictedArea> getRestrictedAreas() {
|
||||
return droneInfoService.fetchRestrictedAreas();
|
||||
}
|
||||
|
||||
@GetMapping("/servicePoints")
|
||||
public List<ServicePoint> getServicePoints() {
|
||||
return droneInfoService.fetchServicePoints();
|
||||
}
|
||||
}
|
||||
|
|
@ -54,13 +54,15 @@ public class DroneInfoService {
|
|||
/**
|
||||
* Return an array of ids of drones with/without cooling capability
|
||||
*
|
||||
* <p>Associated service method with {@code /dronesWithCooling/{state}}
|
||||
* <p>
|
||||
* Associated service method with {@code /dronesWithCooling/{state}}
|
||||
*
|
||||
* @param state determines the capability filtering
|
||||
* @return if {@code state} is true, return ids of drones with cooling capability, else without
|
||||
* cooling
|
||||
* @return if {@code state} is true, return ids of drones with cooling
|
||||
* capability, else without
|
||||
* cooling
|
||||
* @see
|
||||
* io.github.js0ny.ilp_coursework.controller.DroneController#getDronesWithCoolingCapability(boolean)
|
||||
* io.github.js0ny.ilp_coursework.controller.DroneController#getDronesWithCoolingCapability(boolean)
|
||||
*/
|
||||
public List<String> dronesWithCooling(boolean state) {
|
||||
// URI droneUrl = URI.create(baseUrl).resolve(dronesEndpoint);
|
||||
|
|
@ -80,13 +82,16 @@ public class DroneInfoService {
|
|||
/**
|
||||
* Return a {@link Drone}-style json data structure with the given {@code id}
|
||||
*
|
||||
* <p>Associated service method with {@code /droneDetails/{id}}
|
||||
* <p>
|
||||
* Associated service method with {@code /droneDetails/{id}}
|
||||
*
|
||||
* @param id The id of the drone
|
||||
* @return drone json body of given id
|
||||
* @throws NullPointerException when cannot fetch available drones from remote
|
||||
* @throws IllegalArgumentException when drone with given {@code id} cannot be found this should
|
||||
* lead to a 404
|
||||
* @throws NullPointerException when cannot fetch available drones from
|
||||
* remote
|
||||
* @throws IllegalArgumentException when drone with given {@code id} cannot be
|
||||
* found this should
|
||||
* lead to a 404
|
||||
* @see io.github.js0ny.ilp_coursework.controller.DroneController#getDroneDetail(String)
|
||||
*/
|
||||
public Drone droneDetail(String id) {
|
||||
|
|
@ -103,10 +108,12 @@ public class DroneInfoService {
|
|||
}
|
||||
|
||||
/**
|
||||
* Return an array of ids of drones that match all the requirements in the medical dispatch
|
||||
* Return an array of ids of drones that match all the requirements in the
|
||||
* medical dispatch
|
||||
* records
|
||||
*
|
||||
* <p>Associated service method with
|
||||
* <p>
|
||||
* Associated service method with
|
||||
*
|
||||
* @param rec array of medical dispatch records
|
||||
* @return List of drone ids that match all the requirements
|
||||
|
|
@ -128,10 +135,9 @@ public class DroneInfoService {
|
|||
return drones.stream()
|
||||
.filter(d -> d != null && d.capability() != null)
|
||||
.filter(
|
||||
d ->
|
||||
Arrays.stream(rec)
|
||||
.filter(r -> r != null && r.requirements() != null)
|
||||
.allMatch(r -> droneMatchesRequirement(d, r)))
|
||||
d -> Arrays.stream(rec)
|
||||
.filter(r -> r != null && r.requirements() != null)
|
||||
.allMatch(r -> droneMatchesRequirement(d, r)))
|
||||
.map(Drone::id)
|
||||
.collect(Collectors.toList());
|
||||
}
|
||||
|
|
@ -139,11 +145,13 @@ public class DroneInfoService {
|
|||
/**
|
||||
* Helper to check if a drone meets the requirement of a medical dispatch.
|
||||
*
|
||||
* @param drone the drone to be checked
|
||||
* @param drone the drone to be checked
|
||||
* @param record the medical dispatch record containing the requirement
|
||||
* @return true if the drone meets the requirement, false otherwise
|
||||
* @throws IllegalArgumentException when record requirements or drone capability is invalid
|
||||
* (capacity and id cannot be null in {@code MedDispathRecDto})
|
||||
* @throws IllegalArgumentException when record requirements or drone capability
|
||||
* is invalid
|
||||
* (capacity and id cannot be null in
|
||||
* {@code MedDispathRecDto})
|
||||
*/
|
||||
public boolean droneMatchesRequirement(Drone drone, MedDispatchRecRequest record) {
|
||||
var requirements = record.requirements();
|
||||
|
|
@ -183,13 +191,13 @@ public class DroneInfoService {
|
|||
* Helper to check if a drone is available at the required date and time
|
||||
*
|
||||
* @param droneId the id of the drone to be checked
|
||||
* @param record the medical dispatch record containing the required date and time
|
||||
* @param record the medical dispatch record containing the required date and
|
||||
* time
|
||||
* @return true if the drone is available, false otherwise
|
||||
*/
|
||||
private boolean checkAvailability(String droneId, MedDispatchRecRequest record) {
|
||||
URI droneUrl = URI.create(baseUrl).resolve(dronesForServicePointsEndpoint);
|
||||
ServicePointDrones[] servicePoints =
|
||||
restTemplate.getForObject(droneUrl, ServicePointDrones[].class);
|
||||
ServicePointDrones[] servicePoints = restTemplate.getForObject(droneUrl, ServicePointDrones[].class);
|
||||
|
||||
LocalDate requiredDate = record.date();
|
||||
DayOfWeek requiredDay = requiredDate.getDayOfWeek();
|
||||
|
|
@ -208,8 +216,7 @@ public class DroneInfoService {
|
|||
|
||||
private LngLat queryServicePointLocationByDroneId(String droneId) {
|
||||
URI droneUrl = URI.create(baseUrl).resolve(dronesForServicePointsEndpoint);
|
||||
ServicePointDrones[] servicePoints =
|
||||
restTemplate.getForObject(droneUrl, ServicePointDrones[].class);
|
||||
ServicePointDrones[] servicePoints = restTemplate.getForObject(droneUrl, ServicePointDrones[].class);
|
||||
|
||||
assert servicePoints != null;
|
||||
for (var sp : servicePoints) {
|
||||
|
|
@ -226,8 +233,7 @@ public class DroneInfoService {
|
|||
private LngLat queryServicePointLocation(int id) {
|
||||
URI servicePointUrl = URI.create(baseUrl).resolve(servicePointsEndpoint);
|
||||
|
||||
ServicePoint[] servicePoints =
|
||||
restTemplate.getForObject(servicePointUrl, ServicePoint[].class);
|
||||
ServicePoint[] servicePoints = restTemplate.getForObject(servicePointUrl, ServicePoint[].class);
|
||||
|
||||
assert servicePoints != null;
|
||||
for (var sp : servicePoints) {
|
||||
|
|
@ -250,31 +256,22 @@ public class DroneInfoService {
|
|||
|
||||
public List<RestrictedArea> fetchRestrictedAreas() {
|
||||
URI restrictedUrl = URI.create(baseUrl).resolve(restrictedAreasEndpoint);
|
||||
RestrictedArea[] restrictedAreas =
|
||||
restTemplate.getForObject(restrictedUrl, RestrictedArea[].class);
|
||||
RestrictedArea[] restrictedAreas = restTemplate.getForObject(restrictedUrl, RestrictedArea[].class);
|
||||
assert restrictedAreas != null;
|
||||
return Arrays.asList(restrictedAreas);
|
||||
}
|
||||
|
||||
public List<String> fetchRestrictedAreasInGeoJson() throws JsonProcessingException {
|
||||
var mapper = new ObjectMapper();
|
||||
var ras = fetchRestrictedAreas();
|
||||
var geoJson = ras.stream().map(RestrictedArea::toRegion).map(Region::toGeoJson).toList();
|
||||
return Collections.singletonList(mapper.writeValueAsString(geoJson));
|
||||
}
|
||||
|
||||
public List<ServicePoint> fetchServicePoints() {
|
||||
URI servicePointUrl = URI.create(baseUrl).resolve(servicePointsEndpoint);
|
||||
ServicePoint[] servicePoints =
|
||||
restTemplate.getForObject(servicePointUrl, ServicePoint[].class);
|
||||
ServicePoint[] servicePoints = restTemplate.getForObject(servicePointUrl, ServicePoint[].class);
|
||||
assert servicePoints != null;
|
||||
return Arrays.asList(servicePoints);
|
||||
}
|
||||
|
||||
public List<ServicePointDrones> fetchDronesForServicePoints() {
|
||||
URI servicePointDronesUrl = URI.create(baseUrl).resolve(dronesForServicePointsEndpoint);
|
||||
ServicePointDrones[] servicePointDrones =
|
||||
restTemplate.getForObject(servicePointDronesUrl, ServicePointDrones[].class);
|
||||
ServicePointDrones[] servicePointDrones = restTemplate.getForObject(servicePointDronesUrl,
|
||||
ServicePointDrones[].class);
|
||||
assert servicePointDrones != null;
|
||||
return Arrays.asList(servicePointDrones);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue