Skip to content
Snippets Groups Projects

Resolve "Distribution of requests per assignment over a lab"

Files

@@ -17,12 +17,12 @@
*/
package nl.tudelft.queue.controller;
import static nl.tudelft.labracore.api.dto.RolePersonDetailsDTO.TypeEnum.*;
import static nl.tudelft.labracore.api.dto.RolePersonDetailsDTO.TypeEnum.TA;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.stream.Collectors;
import javax.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
@@ -30,16 +30,19 @@ import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import nl.tudelft.labracore.api.dto.EditionSummaryDTO;
import nl.tudelft.labracore.api.dto.PersonSummaryDTO;
import nl.tudelft.labracore.api.dto.RolePersonDetailsDTO;
import nl.tudelft.librador.resolver.annotations.PathEntity;
import nl.tudelft.queue.cache.AssignmentCacheManager;
import nl.tudelft.queue.cache.EditionRolesCacheManager;
import nl.tudelft.queue.dto.view.statistics.AssistantSessionStatisticsViewDto;
import nl.tudelft.queue.model.LabRequest;
import nl.tudelft.queue.model.QueueSession;
import nl.tudelft.queue.cache.ModuleCacheManager;
import nl.tudelft.queue.dto.view.statistics.session.AssignmentSessionCountViewDto;
import nl.tudelft.queue.dto.view.statistics.session.AssistantSessionStatisticsViewDto;
import nl.tudelft.queue.dto.view.statistics.session.GeneralSessionStatisticsViewDto;
import nl.tudelft.queue.model.embeddables.AllowedRequest;
import nl.tudelft.queue.model.enums.RequestType;
import nl.tudelft.queue.model.labs.Lab;
import nl.tudelft.queue.service.EditionStatusService;
import nl.tudelft.queue.service.RequestService;
import nl.tudelft.queue.service.RoleDTOService;
import nl.tudelft.queue.service.SessionStatusService;
@RestController
@@ -57,39 +60,82 @@ public class SessionStatusController {
@Autowired
private EditionStatusService editionStatusService;
@Autowired
private RoleDTOService roleDTOService;
@Autowired
private AssignmentCacheManager aCache;
@Autowired
private ModuleCacheManager mCache;
/**
* Endpoint for general information displayed at the top of the lab statistics page.
*
* @param qSession The session to consider
* @param editions The editions to consider (useful for shared sessions)
* @return A DTO containing the aforementioned information
*/
@GetMapping("/lab/{qSession}/status/general")
@PreAuthorize("@permissionService.canManageSession(#qSession)")
public GeneralSessionStatisticsViewDto generalStatistics(@PathEntity Lab qSession,
@RequestParam(required = false, defaultValue = "") Set<Long> editions) {
var requests = requestService.getLabRequestsForEditions(qSession.getRequests(), editions);
return new GeneralSessionStatisticsViewDto(
(long) requests.size(),
requests.stream().filter(rq -> rq.getRequestType() == RequestType.QUESTION).count(),
requests.stream().filter(rq -> rq.getRequestType() == RequestType.SUBMISSION).count(),
(long) qSession.getQueue().size(),
editionStatusService.averageWaitingTime(requests),
editionStatusService.averageProcessingTime(requests));
}
/**
* Gets a DTO containing information about assistants, how many requests they have taken and the time
* since their last request interaction.
*
* @param qSession The session to consider
* @param editions The editions to consider (useful for shared labs)
* @param editions The editions to consider (useful for shared sessions)
* @return A DTO containing the relevant information
*/
@GetMapping("/lab/{qSession}/status/assistant/freq")
@PreAuthorize("@permissionService.canManageSession(#qSession)")
public AssistantSessionStatisticsViewDto getRequestFrequency(@PathEntity QueueSession<?> qSession,
public AssistantSessionStatisticsViewDto getRequestFrequency(@PathEntity Lab qSession,
@RequestParam(required = false, defaultValue = "") Set<Long> editions) {
Map<Long, String> assistantNames = eRolesCache
.getAndIgnoreMissing(
qSession.getSessionDto().getEditions().stream().map(EditionSummaryDTO::getId)
.filter(eId -> editions.isEmpty() || editions.contains(eId)))
.stream()
.flatMap(e -> e.getRoles().stream())
.filter(r -> Set.of(TEACHER, TEACHER_RO, HEAD_TA, TA).contains(r.getType()))
.map(RolePersonDetailsDTO::getPerson)
.distinct()
.collect(Collectors.toMap(PersonSummaryDTO::getId, PersonSummaryDTO::getDisplayName));
var filteredRequests = qSession.getRequests().stream()
.filter(request -> editions.isEmpty() || editions
.contains(requestService.getEditionForLabRequest((LabRequest) request).getId()))
.map(request -> ((LabRequest) request))
.toList();
return new AssistantSessionStatisticsViewDto(assistantNames,
editionStatusService.countRequestsPerAssistant(filteredRequests),
Map<Long, String> staffNames = roleDTOService.staffNames(qSession, editions);
var requests = requestService.getLabRequestsForEditions(qSession.getRequests(), editions);
return new AssistantSessionStatisticsViewDto(staffNames,
editionStatusService.countRequestsPerAssistant(requests),
sessionStatusService.getTimeSinceLastInteraction(qSession, editions));
}
@GetMapping("/lab/{qSession}/status/assignment/freq")
@PreAuthorize("@permissionService.canManageSession(#qSession)")
@Transactional
public List<AssignmentSessionCountViewDto> getAssignmentFrequency(@PathEntity Lab qSession,
@RequestParam(required = false, defaultValue = "") Set<Long> editions) {
var requests = requestService.getLabRequestsForEditions(qSession.getRequests(), editions);
var assignments = aCache
.getAndHandle(
qSession.getAllowedRequests().stream().map(AllowedRequest::getAssignment).distinct(),
id -> qSession.getAllowedRequests()
.removeIf(a -> Objects.equals(id, a.getAssignment())))
.stream()
.filter(a -> editions.isEmpty() || editions.contains(mCache
.getRequired(a.getModule().getId(), id -> qSession.getModules().remove(id))
.getEdition().getId()))
.toList();
return sessionStatusService.countAssignmentFreqs(requests, assignments);
}
}
Loading