Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
using Authorization.Policies.Requirements;
using Authorization.Policies.Specifications;
using Vote.Monitor.Domain.Entities.ElectionRoundAggregate;

namespace Authorization.Policies.RequirementHandlers;

Expand Down Expand Up @@ -35,8 +34,7 @@ protected override async Task HandleRequirementAsync(AuthorizationHandlerContext
return;
}

if (result.ElectionRoundStatus == ElectionRoundStatus.Archived
|| result.NgoStatus == NgoStatus.Deactivated
if (result.NgoStatus == NgoStatus.Deactivated
|| result.MonitoringNgoStatus == MonitoringNgoStatus.Suspended)
{
context.Fail();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,7 @@ protected override async Task HandleRequirementAsync(AuthorizationHandlerContext

if (result is not null)
{
if (result.ElectionRoundStatus == ElectionRoundStatus.Archived ||
result.NgoStatus == NgoStatus.Deactivated ||
if (result.NgoStatus == NgoStatus.Deactivated ||
result.MonitoringNgoStatus == MonitoringNgoStatus.Suspended ||
result.UserStatus == UserStatus.Deactivated ||
result.MonitoringObserverStatus == MonitoringObserverStatus.Suspended)
Expand Down
4 changes: 1 addition & 3 deletions api/src/Feature.Citizen.Guides/Update/Validator.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using Vote.Monitor.Core.Validators;

namespace Feature.Citizen.Guides.Update;
namespace Feature.Citizen.Guides.Update;

public class Validator : Validator<Request>
{
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Feature.CitizenReports.Models;
using Feature.CitizenReports.Requests;
using Vote.Monitor.Answer.Module.Aggregators;
using Vote.Monitor.Core.Services.FileStorage.Contracts;

Expand All @@ -8,7 +9,7 @@ public class Endpoint(
VoteMonitorContext context,
IAuthorizationService authorizationService,
IFileStorageService fileStorageService)
: Endpoint<Request, Results<Ok<Response>, NotFound>>
: Endpoint<CitizenReportsAggregateFilter, Results<Ok<Response>, NotFound>>
{
public override void Configure()
{
Expand All @@ -23,7 +24,7 @@ public override void Configure()
});
}

public override async Task<Results<Ok<Response>, NotFound>> ExecuteAsync(Request req, CancellationToken ct)
public override async Task<Results<Ok<Response>, NotFound>> ExecuteAsync(CitizenReportsAggregateFilter req, CancellationToken ct)
{
var authorizationResult =
await authorizationService.AuthorizeAsync(User, new CitizenReportingNgoAdminRequirement(req.ElectionRoundId));
Expand All @@ -49,7 +50,7 @@ public override async Task<Results<Ok<Response>, NotFound>> ExecuteAsync(Request
}

private async Task<Results<Ok<Response>, NotFound>> AggregateCitizenReportsAsync(FormAggregate form,
Request req,
CitizenReportsAggregateFilter req,
CancellationToken ct)
{
var citizenReports = await context.CitizenReports
Expand Down Expand Up @@ -118,7 +119,20 @@ private async Task<Results<Ok<Response>, NotFound>> AggregateCitizenReportsAsync
{
SubmissionsAggregate = formSubmissionsAggregate,
Notes = citizenReports.SelectMany(x => x.Notes).Select(NoteModel.FromEntity).ToArray(),
Attachments = attachments
Attachments = attachments,
SubmissionsFilter = new SubmissionsFilterModel
{
HasAttachments = req.HasAttachments,
HasNotes = req.HasNotes,
Level1Filter = req.Level1Filter,
Level2Filter = req.Level2Filter,
Level3Filter = req.Level3Filter,
Level4Filter = req.Level4Filter,
Level5Filter = req.Level5Filter,
HasFlaggedAnswers = req.HasFlaggedAnswers,
QuestionsAnswered = req.QuestionsAnswered,
FollowUpStatus = req.FollowUpStatus,
}
});
}
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Feature.CitizenReports.Models;
using Vote.Monitor.Answer.Module.Aggregators;
using Vote.Monitor.Domain.Entities.CitizenReportAggregate;

namespace Feature.CitizenReports.GetSubmissionsAggregated;

Expand All @@ -8,4 +9,27 @@ public class Response
public CitizenReportFormSubmissionsAggregate SubmissionsAggregate { get; set; }
public AttachmentModel[] Attachments { get; set; } = [];
public NoteModel[] Notes { get; set; } = [];

public SubmissionsFilterModel SubmissionsFilter { get; set; }
}

public class SubmissionsFilterModel
{
public string? Level1Filter { get; set; }

public string? Level2Filter { get; set; }

public string? Level3Filter { get; set; }

public string? Level4Filter { get; set; }

public string? Level5Filter { get; set; }

public bool? HasFlaggedAnswers { get; set; }

public CitizenReportFollowUpStatus? FollowUpStatus { get; set; }

public bool? HasNotes { get; set; }
public bool? HasAttachments { get; set; }
public QuestionsAnsweredFilter? QuestionsAnswered { get; set; }
}

This file was deleted.

8 changes: 5 additions & 3 deletions api/src/Feature.CitizenReports/ListFormsOverview/Endpoint.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
namespace Feature.CitizenReports.ListFormsOverview;
using Feature.CitizenReports.Requests;

namespace Feature.CitizenReports.ListFormsOverview;

public class Endpoint(VoteMonitorContext context, IAuthorizationService authorizationService)
: Endpoint<Request, Results<Ok<Response>, NotFound>>
: Endpoint<CitizenReportsAggregateFilter, Results<Ok<Response>, NotFound>>
{
public override void Configure()
{
Expand All @@ -13,7 +15,7 @@ public override void Configure()
Summary(x => { x.Summary = "Citizen report submissions aggregated by form"; });
}

public override async Task<Results<Ok<Response>, NotFound>> ExecuteAsync(Request req, CancellationToken ct)
public override async Task<Results<Ok<Response>, NotFound>> ExecuteAsync(CitizenReportsAggregateFilter req, CancellationToken ct)
{
var authorizationResult =
await authorizationService.AuthorizeAsync(User,
Expand Down
23 changes: 0 additions & 23 deletions api/src/Feature.CitizenReports/ListFormsOverview/Request.cs

This file was deleted.

10 changes: 0 additions & 10 deletions api/src/Feature.CitizenReports/ListFormsOverview/Validator.cs

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
using Vote.Monitor.Core.Security;
using Vote.Monitor.Domain.Entities.CitizenReportAggregate;

namespace Feature.CitizenReports.GetSubmissionsAggregated;
namespace Feature.CitizenReports.Requests;

public class Request
public class CitizenReportsAggregateFilter
{
public Guid ElectionRoundId { get; set; }

[FromClaim(ApplicationClaimTypes.NgoId)]
public Guid NgoId { get; set; }

public Guid FormId { get; set; }
public Guid? FormId { get; set; }

[QueryParam] public string? Level1Filter { get; set; }

Expand Down
4 changes: 1 addition & 3 deletions api/src/Feature.CitizenReports/SendCopy/Validator.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using Vote.Monitor.Core.Validators;

namespace Feature.CitizenReports.SendCopy;
namespace Feature.CitizenReports.SendCopy;

public class Validator : Validator<Request>
{
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
using Feature.CitizenReports.Requests;

namespace Feature.CitizenReports.Validators;

public class CitizenReportsAggregateFilterValidator : Validator<CitizenReportsAggregateFilter>
{
public CitizenReportsAggregateFilterValidator()
{
RuleFor(x => x.ElectionRoundId).NotEmpty();
RuleFor(x => x.NgoId).NotEmpty();
}
}
5 changes: 4 additions & 1 deletion api/src/Feature.DataExport/Start/FormSubmissionsFilters.cs
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@ public class FormSubmissionsFilters
public QuestionsAnsweredFilter? QuestionsAnswered { get; set; }
public DateTime? FromDateFilter { get; set; }
public DateTime? ToDateFilter { get; set; }

public bool? IsCompletedFilter { get; set; }

public ExportFormSubmissionsFilters ToFilter()
{
Expand All @@ -62,7 +64,8 @@ public ExportFormSubmissionsFilters ToFilter()
HasAttachments = HasAttachments,
QuestionsAnswered = QuestionsAnswered,
FromDateFilter = FromDateFilter,
ToDateFilter = ToDateFilter
ToDateFilter = ToDateFilter,
IsCompletedFilter = IsCompletedFilter
};
}
}
4 changes: 3 additions & 1 deletion api/src/Feature.DataExport/Start/IncidentReportsFilters.cs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ public class IncidentReportsFilters

public DateTime? FromDateFilter { get; set; }
public DateTime? ToDateFilter { get; set; }
public bool? IsCompletedFilter { get; set; }

public ExportIncidentReportsFilters ToFilter()
{
Expand All @@ -60,7 +61,8 @@ public ExportIncidentReportsFilters ToFilter()
FollowUpStatus = FollowUpStatus,
LocationType = LocationType,
FromDateFilter = FromDateFilter,
ToDateFilter = ToDateFilter
ToDateFilter = ToDateFilter,
IsCompletedFilter = IsCompletedFilter
};
}
}
35 changes: 29 additions & 6 deletions api/src/Feature.Form.Submissions/GetAggregated/Endpoint.cs
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
using Feature.Form.Submissions.Models;
using Feature.Form.Submissions.Requests;
using Microsoft.EntityFrameworkCore;
using Vote.Monitor.Answer.Module.Aggregators;
using Vote.Monitor.Core.Models;
using Vote.Monitor.Core.Services.FileStorage.Contracts;
using Vote.Monitor.Domain;
using Vote.Monitor.Domain.Entities.FormAggregate;
using Vote.Monitor.Domain.Entities.PollingStationInfoFormAggregate;

namespace Feature.Form.Submissions.GetAggregated;
Expand All @@ -12,7 +14,7 @@ public class Endpoint(
IAuthorizationService authorizationService,
VoteMonitorContext context,
INpgsqlConnectionFactory connectionFactory,
IFileStorageService fileStorageService) : Endpoint<Request, Results<Ok<Response>, NotFound>>
IFileStorageService fileStorageService) : Endpoint<FormSubmissionsAggregateFilter, Results<Ok<Response>, NotFound>>
{
public override void Configure()
{
Expand All @@ -23,20 +25,23 @@ public override void Configure()
Policies(PolicyNames.NgoAdminsOnly);
}

public override async Task<Results<Ok<Response>, NotFound>> ExecuteAsync(Request req, CancellationToken ct)
public override async Task<Results<Ok<Response>, NotFound>> ExecuteAsync(FormSubmissionsAggregateFilter req,
CancellationToken ct)
{
var authorizationResult =
await authorizationService.AuthorizeAsync(User, new MonitoringNgoAdminRequirement(req.ElectionRoundId));
if (!authorizationResult.Succeeded)
{
return TypedResults.NotFound();
}

var form = await context
.Forms
.Where(x => x.ElectionRoundId == req.ElectionRoundId
&& x.MonitoringNgo.NgoId == req.NgoId
&& x.Id == req.FormId)
.Where(x => x.Status == FormStatus.Published)
.Where(x => x.FormType != FormType.CitizenReporting && x.FormType != FormType.IncidentReporting)
.AsNoTracking()
.FirstOrDefaultAsync(ct);

Expand All @@ -59,7 +64,7 @@ public override async Task<Results<Ok<Response>, NotFound>> ExecuteAsync(Request
}

private async Task<Results<Ok<Response>, NotFound>> AggregateNgoFormSubmissionsAsync(FormAggregate form,
Request req,
FormSubmissionsAggregateFilter req,
CancellationToken ct)
{
var tags = req.TagsFilter ?? [];
Expand Down Expand Up @@ -118,6 +123,7 @@ private async Task<Results<Ok<Response>, NotFound>> AggregateNgoFormSubmissionsA
&& a.FormId == x.FormId
&& a.PollingStationId == x.PollingStationId
&& a.ElectionRoundId == x.ElectionRoundId) == 0))
.Where(x => req.IsCompletedFilter == null || x.IsCompleted == req.IsCompletedFilter)
.AsNoTracking()
.AsSplitQuery()
.ToListAsync(ct);
Expand Down Expand Up @@ -219,13 +225,30 @@ private async Task<Results<Ok<Response>, NotFound>> AggregateNgoFormSubmissionsA
{
SubmissionsAggregate = formSubmissionsAggregate,
Notes = notes,
Attachments = attachments
Attachments = attachments,
SubmissionsFilter = new SubmissionsFilterModel
{
HasAttachments = req.HasAttachments,
HasNotes = req.HasNotes,
Level1Filter = req.Level1Filter,
Level2Filter = req.Level2Filter,
Level3Filter = req.Level3Filter,
Level4Filter = req.Level4Filter,
Level5Filter = req.Level5Filter,
QuestionsAnswered = req.QuestionsAnswered,
TagsFilter = req.TagsFilter,
FollowUpStatus = req.FollowUpStatus,
HasFlaggedAnswers = req.HasFlaggedAnswers,
IsCompletedFilter = req.IsCompletedFilter,
MonitoringObserverStatus = req.MonitoringObserverStatus,
PollingStationNumberFilter = req.PollingStationNumberFilter,
}
});
}

private async Task<Results<Ok<Response>, NotFound>> AggregatePSIFormSubmissionsAsync(
PollingStationInformationForm form,
Request req,
FormSubmissionsAggregateFilter req,
CancellationToken ct)
{
var tags = req.TagsFilter ?? [];
Expand Down
Loading