All checks were successful
Build, test and publish / verify (push) Successful in 4m43s
92 lines
3.2 KiB
Java
92 lines
3.2 KiB
Java
package nl.agilecc.agiledancers.rest;
|
|
|
|
import jakarta.inject.Inject;
|
|
import jakarta.validation.Valid;
|
|
import jakarta.validation.constraints.NotNull;
|
|
import jakarta.ws.rs.Consumes;
|
|
import jakarta.ws.rs.DELETE;
|
|
import jakarta.ws.rs.GET;
|
|
import jakarta.ws.rs.POST;
|
|
import jakarta.ws.rs.PUT;
|
|
import jakarta.ws.rs.Path;
|
|
import jakarta.ws.rs.PathParam;
|
|
import jakarta.ws.rs.Produces;
|
|
import jakarta.ws.rs.core.Context;
|
|
import jakarta.ws.rs.core.MediaType;
|
|
import jakarta.ws.rs.core.Response;
|
|
import jakarta.ws.rs.core.UriInfo;
|
|
import java.util.List;
|
|
import nl.agilecc.agiledancers.model.DayPart;
|
|
import nl.agilecc.agiledancers.model.Show;
|
|
import nl.agilecc.agiledancers.model.scheduling.SchedulingResult;
|
|
import nl.agilecc.agiledancers.rest.apimodel.DayPartRequest;
|
|
import nl.agilecc.agiledancers.rest.apimodel.SchedulingView;
|
|
import nl.agilecc.agiledancers.rest.apimodel.ShowRequest;
|
|
import nl.agilecc.agiledancers.rest.apimodel.ShowView;
|
|
import nl.agilecc.agiledancers.service.SchedulingService;
|
|
import nl.agilecc.agiledancers.service.SchoolManagementService;
|
|
|
|
@Path("/api/dance-schools/{schoolId}/shows")
|
|
@Produces(MediaType.APPLICATION_JSON)
|
|
@Consumes(MediaType.APPLICATION_JSON)
|
|
public class ShowResource {
|
|
private @Inject SchoolManagementService service;
|
|
|
|
private @Inject SchedulingService scheduling;
|
|
|
|
private @PathParam("schoolId") long schoolId;
|
|
|
|
@GET
|
|
public List<ShowView> list() {
|
|
return service.shows(schoolId).stream().map(ShowView::of).toList();
|
|
}
|
|
|
|
@GET
|
|
@Path("/{id}")
|
|
public ShowView get(final @PathParam("id") long id) {
|
|
return ShowView.of(service.show(schoolId, id));
|
|
}
|
|
|
|
@POST
|
|
public Response create(final @NotNull @Valid ShowRequest request, final @Context UriInfo uriInfo) {
|
|
final Show entity = service.createShow(schoolId, request.name(), parts(request), request.appearances());
|
|
return Response.created(uriInfo.getAbsolutePathBuilder()
|
|
.path(entity.getId().toString())
|
|
.build())
|
|
.entity(ShowView.of(entity))
|
|
.build();
|
|
}
|
|
|
|
@PUT
|
|
@Path("/{id}")
|
|
public ShowView update(final @PathParam("id") long id, final @NotNull @Valid ShowRequest request) {
|
|
return ShowView.of(service.updateShow(schoolId, id, request.name(), parts(request), request.appearances()));
|
|
}
|
|
|
|
private static List<DayPart> parts(final ShowRequest request) {
|
|
return request.dayParts().stream()
|
|
.map((final DayPartRequest p) -> DayPart.builder()
|
|
.date(p.date())
|
|
.type(p.type())
|
|
.danceGroups(List.of())
|
|
.build())
|
|
.toList();
|
|
}
|
|
|
|
@POST
|
|
@Path("/{id}/schedule")
|
|
@Consumes(MediaType.WILDCARD)
|
|
public SchedulingView schedule(final @PathParam("id") long id) {
|
|
final SchedulingResult result = scheduling.schedule(schoolId, id);
|
|
return new SchedulingView(
|
|
result.optimal(), result.optimal() ? "Optimal balance" : "Valid result; optimal balance not proven");
|
|
}
|
|
|
|
@DELETE
|
|
@Path("/{id}")
|
|
public Response delete(final @PathParam("id") long id) {
|
|
service.deleteShow(schoolId, id);
|
|
return Response.noContent().build();
|
|
}
|
|
}
|