Skip to content

Commit

Permalink
Add cancellation tokens to report endpoints, fix denorm bug for new s…
Browse files Browse the repository at this point in the history
…coring teams.
  • Loading branch information
sei-bstein committed Jan 8, 2025
1 parent 5a4d568 commit 9d81b6e
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 47 deletions.
73 changes: 36 additions & 37 deletions src/Gameboard.Api/Features/Reports/ReportsController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,77 +17,76 @@ public class ReportsController(IMediator mediator, IReportsService service) : Co
private readonly IReportsService _service = service;

[HttpGet]
public async Task<IEnumerable<ReportViewModel>> List()
=> await _service.List();
public Task<IEnumerable<ReportViewModel>> List()
=> _service.List();

[HttpGet("challenges")]
public Task<ReportResults<ChallengesReportStatSummary, ChallengesReportRecord>> GetChallengesReport([FromQuery] ChallengesReportParameters parameters, [FromQuery] PagingArgs paging)
=> _mediator.Send(new GetChallengesReportQuery(parameters, paging));
public Task<ReportResults<ChallengesReportStatSummary, ChallengesReportRecord>> GetChallengesReport([FromQuery] ChallengesReportParameters parameters, [FromQuery] PagingArgs paging, CancellationToken cancellationToken)
=> _mediator.Send(new GetChallengesReportQuery(parameters, paging), cancellationToken);

[HttpGet("enrollment")]
public Task<ReportResults<EnrollmentReportRecord>> GetEnrollmentReportSummary([FromQuery] EnrollmentReportParameters parameters, [FromQuery] PagingArgs paging)
=> _mediator.Send(new EnrollmentReportSummaryQuery(parameters, paging));
public Task<ReportResults<EnrollmentReportRecord>> GetEnrollmentReportSummary([FromQuery] EnrollmentReportParameters parameters, [FromQuery] PagingArgs paging, CancellationToken cancellationToken)
=> _mediator.Send(new EnrollmentReportSummaryQuery(parameters, paging), cancellationToken);

[HttpGet("enrollment/stats")]
public Task<EnrollmentReportStatSummary> GetEnrollmentReportSummaryStats([FromQuery] EnrollmentReportParameters parameters)
=> _mediator.Send(new EnrollmentReportSummaryStatsQuery(parameters));
public Task<EnrollmentReportStatSummary> GetEnrollmentReportSummaryStats([FromQuery] EnrollmentReportParameters parameters, CancellationToken cancellationToken)
=> _mediator.Send(new EnrollmentReportSummaryStatsQuery(parameters), cancellationToken);

[HttpGet("enrollment/trend")]
public Task<EnrollmentReportLineChartResponse> GetEnrollmentReportLineChart([FromQuery] EnrollmentReportParameters parameters)
=> _mediator.Send(new EnrollmentReportLineChartQuery(parameters));
public Task<EnrollmentReportLineChartResponse> GetEnrollmentReportLineChart([FromQuery] EnrollmentReportParameters parameters, CancellationToken cancellationToken)
=> _mediator.Send(new EnrollmentReportLineChartQuery(parameters), cancellationToken);

[HttpGet("enrollment/by-game")]
public Task<ReportResults<EnrollmentReportByGameRecord>> GetEnrollmentReportByGame([FromQuery] EnrollmentReportParameters parameters, [FromQuery] PagingArgs pagingArgs)
=> _mediator.Send(new EnrollmentReportByGameQuery(parameters, pagingArgs));
public Task<ReportResults<EnrollmentReportByGameRecord>> GetEnrollmentReportByGame([FromQuery] EnrollmentReportParameters parameters, [FromQuery] PagingArgs pagingArgs, CancellationToken cancellationToken)
=> _mediator.Send(new EnrollmentReportByGameQuery(parameters, pagingArgs), cancellationToken);

[HttpGet("feedback")]
public Task<ReportResults<FeedbackReportSummaryData, FeedbackReportRecord>> GetFeedbackReport([FromQuery] FeedbackReportParameters request, [FromQuery] PagingArgs pagingArgs)
=> _mediator.Send(new FeedbackReportQuery(request, pagingArgs));
public Task<ReportResults<FeedbackReportSummaryData, FeedbackReportRecord>> GetFeedbackReport([FromQuery] FeedbackReportParameters request, [FromQuery] PagingArgs pagingArgs, CancellationToken cancellationToken)
=> _mediator.Send(new FeedbackReportQuery(request, pagingArgs), cancellationToken);

[HttpGet("feedback-legacy")]
public Task<FeedbackGameReportResults> GetFeedbackGameReport([FromQuery] GetFeedbackGameReportQuery query)
=> _mediator.Send(query);

public Task<FeedbackGameReportResults> GetFeedbackGameReport([FromQuery] GetFeedbackGameReportQuery query, CancellationToken cancellationToken)
=> _mediator.Send(query, cancellationToken);

[HttpGet("players")]
public Task<ReportResults<PlayersReportStatSummary, PlayersReportRecord>> GetPlayersReport([FromQuery] PlayersReportParameters parameters, [FromQuery] PagingArgs pagingArgs)
=> _mediator.Send(new GetPlayersReportQuery(parameters, pagingArgs));
public Task<ReportResults<PlayersReportStatSummary, PlayersReportRecord>> GetPlayersReport([FromQuery] PlayersReportParameters parameters, [FromQuery] PagingArgs pagingArgs, CancellationToken cancellationToken)
=> _mediator.Send(new GetPlayersReportQuery(parameters, pagingArgs), cancellationToken);

[HttpGet("practice-area")]
public async Task<ReportResults<PracticeModeReportOverallStats, IPracticeModeReportRecord>> GetPracticeModeReport([FromQuery] PracticeModeReportParameters parameters, [FromQuery] PagingArgs paging)
=> await _mediator.Send(new PracticeModeReportQuery(parameters, paging));
public async Task<ReportResults<PracticeModeReportOverallStats, IPracticeModeReportRecord>> GetPracticeModeReport([FromQuery] PracticeModeReportParameters parameters, [FromQuery] PagingArgs paging, CancellationToken cancellationToken)
=> await _mediator.Send(new PracticeModeReportQuery(parameters, paging), cancellationToken);

[HttpGet("practice-area/challenge-spec/{challengeSpecId}")]
public Task<PracticeModeReportChallengeDetail> GetChallengeDetail([FromQuery] PracticeModeReportParameters parameters, [FromQuery] PracticeModeReportChallengeDetailParameters challengeDetailParameters, [FromQuery] PagingArgs pagingArgs, [FromRoute] string challengeSpecId)
=> _mediator.Send(new PracticeModeReportChallengeDetailQuery(challengeSpecId, parameters, challengeDetailParameters, pagingArgs));
public Task<PracticeModeReportChallengeDetail> GetChallengeDetail([FromQuery] PracticeModeReportParameters parameters, [FromQuery] PracticeModeReportChallengeDetailParameters challengeDetailParameters, [FromQuery] PagingArgs pagingArgs, [FromRoute] string challengeSpecId, CancellationToken cancellationToken)
=> _mediator.Send(new PracticeModeReportChallengeDetailQuery(challengeSpecId, parameters, challengeDetailParameters, pagingArgs), cancellationToken);

[HttpGet("practice-area/user/{id}/summary")]
public async Task<PracticeModeReportPlayerModeSummary> GetPracticeModeReportPlayerModeSummary([FromRoute] string id, [FromQuery] bool isPractice)
=> await _mediator.Send(new PracticeModeReportPlayerModeSummaryQuery(id, isPractice));
public async Task<PracticeModeReportPlayerModeSummary> GetPracticeModeReportPlayerModeSummary([FromRoute] string id, [FromQuery] bool isPractice, CancellationToken cancellationToken)
=> await _mediator.Send(new PracticeModeReportPlayerModeSummaryQuery(id, isPractice), cancellationToken);

[HttpGet("site-usage")]
public Task<SiteUsageReportRecord> GetSiteUsageReport([FromQuery] SiteUsageReportParameters parameters)
=> _mediator.Send(new GetSiteUsageReportQuery(parameters));
public Task<SiteUsageReportRecord> GetSiteUsageReport([FromQuery] SiteUsageReportParameters parameters, CancellationToken cancellationToken)
=> _mediator.Send(new GetSiteUsageReportQuery(parameters), cancellationToken);

[HttpGet("site-usage/challenges")]
public Task<PagedEnumerable<SiteUsageReportChallenge>> GetSiteUsageREportChallenges([FromQuery] SiteUsageReportParameters reportParameters, [FromQuery] PagingArgs pagingArgs)
=> _mediator.Send(new GetSiteUsageReportChallengesQuery(reportParameters, pagingArgs));
public Task<PagedEnumerable<SiteUsageReportChallenge>> GetSiteUsageREportChallenges([FromQuery] SiteUsageReportParameters reportParameters, [FromQuery] PagingArgs pagingArgs, CancellationToken cancellationToken)
=> _mediator.Send(new GetSiteUsageReportChallengesQuery(reportParameters, pagingArgs), cancellationToken);

[HttpGet("site-usage/players")]
public Task<PagedEnumerable<SiteUsageReportPlayer>> GetSiteUsageReportPlayers([FromQuery] SiteUsageReportParameters reportParameters, [FromQuery] SiteUsageReportPlayersParameters playersParameters, [FromQuery] PagingArgs pagingArgs)
=> _mediator.Send(new GetSiteUsageReportPlayersQuery(reportParameters, playersParameters, pagingArgs));
public Task<PagedEnumerable<SiteUsageReportPlayer>> GetSiteUsageReportPlayers([FromQuery] SiteUsageReportParameters reportParameters, [FromQuery] SiteUsageReportPlayersParameters playersParameters, [FromQuery] PagingArgs pagingArgs, CancellationToken cancellationToken)
=> _mediator.Send(new GetSiteUsageReportPlayersQuery(reportParameters, playersParameters, pagingArgs), cancellationToken);

[HttpGet("site-usage/sponsors")]
public Task<IEnumerable<SiteUsageReportSponsor>> GetSiteUsageReportSponsors([FromQuery] SiteUsageReportParameters reportParameters)
=> _mediator.Send(new GetSiteUsageReportSponsorsQuery(reportParameters));
public Task<IEnumerable<SiteUsageReportSponsor>> GetSiteUsageReportSponsors([FromQuery] SiteUsageReportParameters reportParameters, CancellationToken cancellationToken)
=> _mediator.Send(new GetSiteUsageReportSponsorsQuery(reportParameters), cancellationToken);

[HttpGet("support")]
public Task<ReportResults<SupportReportStatSummary, SupportReportRecord>> GetSupportReport([FromQuery] SupportReportParameters reportParams, [FromQuery] PagingArgs pagingArgs)
=> _mediator.Send(new SupportReportQuery(reportParams, pagingArgs));
public Task<ReportResults<SupportReportStatSummary, SupportReportRecord>> GetSupportReport([FromQuery] SupportReportParameters reportParams, [FromQuery] PagingArgs pagingArgs, CancellationToken cancellationToken)
=> _mediator.Send(new SupportReportQuery(reportParams, pagingArgs), cancellationToken);

[HttpGet("metaData")]
public Task<ReportMetaData> GetReportMetaData([FromQuery] string reportKey)
=> _mediator.Send(new GetMetaDataQuery(reportKey));
public Task<ReportMetaData> GetReportMetaData([FromQuery] string reportKey, CancellationToken cancellationToken)
=> _mediator.Send(new GetMetaDataQuery(reportKey), cancellationToken);

[HttpGet("parameter/challenge-specs/{gameId?}")]
public Task<IEnumerable<SimpleEntity>> GetChallengeSpecs(string gameId = null)
Expand Down
17 changes: 11 additions & 6 deletions src/Gameboard.Api/Features/Scores/ScoreDenormalizationService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -104,13 +104,18 @@ private async Task RerankGame(string gameId)

var captains = await _teamService.ResolveCaptains(teams.Select(t => t.TeamId).ToArray(), cancellationToken: CancellationToken.None);

var rankedTeams = _scoringService.GetTeamRanks(teams.Select(t => new TeamForRanking
var rankedTeams = _scoringService.GetTeamRanks(teams.Select(t =>
{
CumulativeTimeMs = t.CumulativeTimeMs,
OverallScore = t.ScoreOverall,
SessionStart = !captains.TryGetValue(t.TeamId, out var captain) || captain?.SessionBegin == DateTimeOffset.MinValue ? null : captain.SessionBegin,
TeamId = t.TeamId
}));
captains.TryGetValue(t.TeamId, out var captain);

return new TeamForRanking
{
CumulativeTimeMs = t.CumulativeTimeMs,
OverallScore = t.ScoreOverall,
SessionStart = (captain?.SessionBegin == null || captain?.SessionBegin == DateTimeOffset.MinValue) ? null : captain.SessionBegin,
TeamId = t.TeamId
};
});

Check failure on line 118 in src/Gameboard.Api/Features/Scores/ScoreDenormalizationService.cs

View workflow job for this annotation

GitHub Actions / test

) expected

Check failure on line 118 in src/Gameboard.Api/Features/Scores/ScoreDenormalizationService.cs

View workflow job for this annotation

GitHub Actions / test

) expected

foreach (var team in teams)
team.Rank = rankedTeams.TryGetValue(team.TeamId, out var teamRank) ? (teamRank ?? 0) : 0;
Expand Down
5 changes: 3 additions & 2 deletions src/Gameboard.Api/Features/Scores/ScoringService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -297,10 +297,11 @@ public async Task<TeamScore> GetTeamScore(string teamId, CancellationToken cance
public IDictionary<string, int?> GetTeamRanks(IEnumerable<TeamForRanking> teams)
{
var scoreRank = 0;
TeamForRanking lastScore = null;
var lastScore = default(TeamForRanking);
var retVal = new Dictionary<string, int?>();
var ranked = teams
.OrderByDescending(t => t.OverallScore).ThenBy(t => t.CumulativeTimeMs);
.OrderByDescending(t => t.OverallScore)
.ThenBy(t => t.CumulativeTimeMs);

foreach (var team in ranked)
{
Expand Down
5 changes: 3 additions & 2 deletions src/Gameboard.Api/Features/Teams/Requests/EndTeamSession.cs
Original file line number Diff line number Diff line change
Expand Up @@ -13,14 +13,15 @@ namespace Gameboard.Api.Features.Teams;

public record EndTeamSessionCommand(string TeamId, User Actor) : IRequest<TeamSessionUpdate>;

internal class EndTeamSessionHandler(
internal class EndTeamSessionHandler
(
INowService nowService,
IUserRolePermissionsService permissionsService,
IStore store,
TeamExistsValidator<EndTeamSessionCommand> teamExists,
ITeamService teamService,
IValidatorService<EndTeamSessionCommand> validatorService
) : IRequestHandler<EndTeamSessionCommand, TeamSessionUpdate>
) : IRequestHandler<EndTeamSessionCommand, TeamSessionUpdate>
{
private readonly INowService _nowService = nowService;
private readonly IUserRolePermissionsService _permissionsService = permissionsService;
Expand Down
2 changes: 2 additions & 0 deletions src/Gameboard.Api/Features/Teams/TeamController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,9 @@ public Task<IEnumerable<TeamSummary>> GetTeams([FromRoute] string gameId)
public async Task<TeamSessionUpdate> UpdateSession([FromBody] SessionChangeRequest model, CancellationToken cancellationToken)
{
if (model.SessionEnd is null)
{
return await _mediator.Send(new EndTeamSessionCommand(model.TeamId, _actingUserService.Get()), cancellationToken);
}
else
{
var player = await _teamService.ExtendSession
Expand Down

0 comments on commit 9d81b6e

Please sign in to comment.