Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
d6f12ac
Add crud for election rounds
idormenco Jan 22, 2025
58f4928
Merge branch 'main' into feature/election-round-crud
idormenco Jan 27, 2025
db84673
Update Validator.cs
idormenco Jan 27, 2025
8425332
Improve endpoints for election rounds
idormenco Jan 28, 2025
c2db313
make phone number not mandatory
idormenco Jan 29, 2025
8467797
Merge branch 'main' into feature/election-round-crud
idormenco Jan 29, 2025
90580a5
rework validation of phone number
idormenco Jan 29, 2025
e86357e
Implement edit ps /location
idormenco Feb 4, 2025
d3d5c41
undo delete
idormenco Feb 4, 2025
02608db
fix dashboard search
idormenco Feb 4, 2025
f877fee
fix filtering
idormenco Feb 5, 2025
104dc8d
Refactor form builders
idormenco Feb 8, 2025
14c6ba2
Rework form templates fix form builder
idormenco Feb 13, 2025
64a080e
Merge branch 'main' into feature/election-round-crud
idormenco Feb 13, 2025
bac320d
Refactor forms
idormenco Feb 14, 2025
4ea7b51
Rebuild migrations
idormenco Feb 14, 2025
be51064
fix observers tab queries
idormenco Feb 14, 2025
0f6d42b
more fixez and improvements
idormenco Feb 14, 2025
28b93d3
Update packages
idormenco Feb 14, 2025
7d6bfe1
Fix monitoring observers view/edit
idormenco Feb 14, 2025
2d70a49
Merge branch 'main' into feature/election-round-crud
idormenco Feb 14, 2025
afea1d0
Fix .net build, fix navigations
idormenco Feb 14, 2025
dfd25eb
Fix new form
idormenco Feb 14, 2025
428821f
use navigate without void
idormenco Feb 14, 2025
da0181f
fix file name casing
idormenco Feb 14, 2025
69b26b1
fix linting issues
idormenco Feb 14, 2025
85727c3
Cleanup and fix add translations
idormenco Feb 17, 2025
ea89aa0
Add election rounds filtering
idormenco Feb 17, 2025
3a46f9e
Update form-submissions-queries.ts
idormenco Feb 17, 2025
3e09412
Update ElectionRoundForm.tsx
idormenco Feb 17, 2025
9c40692
Delete hooks.ts
idormenco Feb 17, 2025
750640d
Update queries.ts
idormenco Feb 17, 2025
a4455d2
Update PreviewDialogs.tsx
idormenco Feb 17, 2025
04f72bc
better errors
idormenco Feb 17, 2025
780f1a8
Update observer.ts
idormenco Feb 17, 2025
c94055d
Cleanup
idormenco Feb 17, 2025
d3ac189
Potential fix for code scanning alert no. 1118: Unused variable, impo…
idormenco Feb 17, 2025
2aeee7c
Potential fix for code scanning alert no. 1098: Unused variable, impo…
idormenco Feb 17, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
using Vote.Monitor.Domain.Entities.FormAggregate;
using Vote.Monitor.Domain.Entities.FormBase;

namespace Feature.CitizenReports.Specifications;

Expand Down
1 change: 1 addition & 0 deletions api/src/Feature.DataExport/Start/FormSubmissionsFilters.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Vote.Monitor.Core.Models;
using Vote.Monitor.Domain.Entities.ExportedDataAggregate.Filters;
using Vote.Monitor.Domain.Entities.FormAggregate;
using Vote.Monitor.Domain.Entities.FormBase;
using Vote.Monitor.Domain.Entities.FormSubmissionAggregate;
using Vote.Monitor.Domain.Entities.MonitoringObserverAggregate;

Expand Down
1 change: 1 addition & 0 deletions api/src/Feature.Form.Submissions/GetAggregated/Endpoint.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
using Vote.Monitor.Core.Services.FileStorage.Contracts;
using Vote.Monitor.Domain;
using Vote.Monitor.Domain.Entities.FormAggregate;
using Vote.Monitor.Domain.Entities.FormBase;
using Vote.Monitor.Domain.Entities.PollingStationInfoFormAggregate;

namespace Feature.Form.Submissions.GetAggregated;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ public record ObserverSubmissionOverview
public Guid MonitoringObserverId { get; init; }
public string ObserverName { get; init; } = default!;
public string Email { get; init; } = default!;
public string PhoneNumber { get; init; } = default!;
public string? PhoneNumber { get; init; } = default!;
public string NgoName { get; init; } = default!;
public string[] Tags { get; init; } = [];
public int NumberOfFlaggedAnswers { get; init; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using Ardalis.SmartEnum.SystemTextJson;
using Vote.Monitor.Core.Models;
using Vote.Monitor.Domain.Entities.FormAggregate;
using Vote.Monitor.Domain.Entities.FormBase;
using Vote.Monitor.Domain.Entities.MonitoringObserverAggregate;

namespace Feature.Form.Submissions.ListEntries;
Expand All @@ -28,7 +29,7 @@ public record FormSubmissionEntry
public Guid MonitoringObserverId { get; init; }
public string ObserverName { get; init; } = default!;
public string Email { get; init; } = default!;
public string PhoneNumber { get; init; } = default!;
public string? PhoneNumber { get; init; } = default!;
public string NgoName { get; init; } = default!;
public string[] Tags { get; init; } = [];
public int NumberOfQuestionsAnswered { get; init; }
Expand Down
1 change: 1 addition & 0 deletions api/src/Feature.Form.Submissions/ListEntries/Request.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Vote.Monitor.Core.Models;
using Vote.Monitor.Core.Security;
using Vote.Monitor.Domain.Entities.FormAggregate;
using Vote.Monitor.Domain.Entities.FormBase;
using Vote.Monitor.Domain.Entities.MonitoringObserverAggregate;

namespace Feature.Form.Submissions.ListEntries;
Expand Down
32 changes: 6 additions & 26 deletions api/src/Feature.FormTemplates/Create/Endpoint.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,45 +4,25 @@
namespace Feature.FormTemplates.Create;

public class Endpoint(IRepository<FormTemplate> repository) :
Endpoint<Request, Results<Ok<FormTemplateSlimModel>, Conflict<ProblemDetails>>>
Endpoint<Request, Ok<FormTemplateFullModel>>
{
public override void Configure()
{
Post("/api/form-templates");
Policies(PolicyNames.PlatformAdminsOnly);
}

public override async Task<Results<Ok<FormTemplateSlimModel>, Conflict<ProblemDetails>>> ExecuteAsync(Request req, CancellationToken ct)
public override async Task<Ok<FormTemplateFullModel>> ExecuteAsync(Request req, CancellationToken ct)
{
var specification = new GetFormTemplateSpecification(req.Code, req.FormType);
var duplicatedFormTemplate = await repository.AnyAsync(specification, ct);

if (duplicatedFormTemplate)
{
AddError(r => r.Code, "A form template with same parameters already exists");
return TypedResults.Conflict(new ProblemDetails(ValidationFailures));
}

var questions = req.Questions.Select(QuestionsMapper.ToEntity)
.ToList()
.AsReadOnly();

var formTemplate = Vote.Monitor.Domain.Entities.FormTemplateAggregate.FormTemplate.Create(req.FormType, req.Code, req.DefaultLanguage, req.Name, req.Description, req.Languages, questions);

var formTemplate = FormTemplate.Create(req.FormType, req.Code, req.DefaultLanguage, req.Name, req.Description,
req.Languages, req.Icon, questions);

await repository.AddAsync(formTemplate, ct);

return TypedResults.Ok(new FormTemplateSlimModel
{
Id = formTemplate.Id,
FormType = formTemplate.FormType,
Code = formTemplate.Code,
Languages = formTemplate.Languages,
DefaultLanguage = formTemplate.DefaultLanguage,
Name = formTemplate.Name,
Description = formTemplate.Description,
Status = formTemplate.Status,
CreatedOn = formTemplate.CreatedOn,
LastModifiedOn = formTemplate.LastModifiedOn
});
return TypedResults.Ok(FormTemplateFullModel.FromEntity(formTemplate));
}
}
2 changes: 2 additions & 0 deletions api/src/Feature.FormTemplates/Create/Request.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Vote.Monitor.Core.Models;
using Vote.Monitor.Domain.Entities.FormAggregate;
using Vote.Monitor.Domain.Entities.FormBase;
using Vote.Monitor.Form.Module.Requests;

namespace Feature.FormTemplates.Create;
Expand All @@ -12,6 +13,7 @@ public class Request
public TranslatedString Description { get; set; } = new();
public FormType FormType { get; set; }
public List<string> Languages { get; set; } = [];
public string? Icon { get; set; }
public List<BaseQuestionRequest> Questions { get; set; } = [];

}
44 changes: 41 additions & 3 deletions api/src/Feature.FormTemplates/FormTemplateFullModel.cs
Original file line number Diff line number Diff line change
@@ -1,8 +1,46 @@
using Vote.Monitor.Form.Module.Models;
using Vote.Monitor.Core.Models;
using Vote.Monitor.Domain.Entities.FormAggregate;
using Vote.Monitor.Domain.Entities.FormBase;
using Vote.Monitor.Form.Module.Models;

namespace Feature.FormTemplates;

public record FormTemplateFullModel : FormTemplateSlimModel
public record FormTemplateFullModel
{
public List<BaseQuestionModel> Questions { get; init; } = [];
public TranslatedString Description { get; init; }

public required Guid Id { get; init; }

public required FormType FormType { get; init; }

public required string Code { get; init; }
public TranslatedString Name { get; init; }

public required FormStatus Status { get; init; }

public required string DefaultLanguage { get; init; }
public required string[] Languages { get; init; } = [];
public int NumberOfQuestions { get; init; }
public string? Icon { get; init; }

public LanguagesTranslationStatus LanguagesTranslationStatus { get; init; }
public IReadOnlyList<BaseQuestionModel> Questions { get; init; } = [];

public static FormTemplateFullModel FromEntity(FormTemplateAggregate formTemplate) => formTemplate == null
? null
: new FormTemplateFullModel
{
Id = formTemplate.Id,
Code = formTemplate.Code,
FormType = formTemplate.FormType,
Status = formTemplate.Status,
DefaultLanguage = formTemplate.DefaultLanguage,
Languages = formTemplate.Languages,
Name = formTemplate.Name,
Questions = formTemplate.Questions.Select(QuestionsMapper.ToModel).ToList(),
NumberOfQuestions = formTemplate.NumberOfQuestions,
Description = formTemplate.Description,
LanguagesTranslationStatus = formTemplate.LanguagesTranslationStatus,
Icon = formTemplate.Icon,
};
}
33 changes: 18 additions & 15 deletions api/src/Feature.FormTemplates/FormTemplateSlimModel.cs
Original file line number Diff line number Diff line change
@@ -1,27 +1,30 @@
using System.Text.Json.Serialization;
using Ardalis.SmartEnum.SystemTextJson;
using Vote.Monitor.Core.Models;
using Vote.Monitor.Core.Models;
using Vote.Monitor.Domain.Entities.FormAggregate;
using Vote.Monitor.Domain.Entities.FormTemplateAggregate;
using Vote.Monitor.Domain.Entities.FormBase;

namespace Feature.FormTemplates;

public record FormTemplateSlimModel
{
public Guid Id { get; init; }
public TranslatedString Description { get; set; }

public required Guid Id { get; init; }

public required FormType FormType { get; init; }

public required string Code { get; init; }
public TranslatedString Name { get; init; }
public string? Icon { get; init; }

public required FormStatus Status { get; init; }

public required string DefaultLanguage { get; init; }
public string[] Languages { get; init; } = [];
public required string[] Languages { get; init; } = [];
public int NumberOfQuestions { get; init; }
public required DateTime LastModifiedOn { get; init; }

public required TranslatedString Name { get; init; }
public required TranslatedString Description { get; init; }
public string LastModifiedBy { get; init; }

[JsonConverter(typeof(SmartEnumNameConverter<FormType, string>))]
public required FormType FormType { get; init; }

[JsonConverter(typeof(SmartEnumNameConverter<FormTemplateStatus, string>))]
public required FormTemplateStatus Status { get; init; }
public int NumberOfQuestions { get; set; }
public required DateTime CreatedOn { get; init; }
public required DateTime? LastModifiedOn { get; init; }
public LanguagesTranslationStatus LanguagesTranslationStatus { get; init; }
}
19 changes: 3 additions & 16 deletions api/src/Feature.FormTemplates/Get/Endpoint.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,27 +31,14 @@ public override async Task<Results<Ok<FormTemplateFullModel>, NotFound>> Execute
}
}

var formTemplate = await repository.SingleOrDefaultAsync(new GetFormTemplateSpecification(req.Id, isNgoAdmin), ct);
var formTemplate =
await repository.SingleOrDefaultAsync(new GetFormTemplateSpecification(req.Id, isNgoAdmin), ct);

if (formTemplate is null)
{
return TypedResults.NotFound();
}

return TypedResults.Ok(new FormTemplateFullModel
{
Id = formTemplate.Id,
FormType = formTemplate.FormType,
Code = formTemplate.Code,
DefaultLanguage = formTemplate.DefaultLanguage,
Name = formTemplate.Name,
Description = formTemplate.Description,
Status = formTemplate.Status,
CreatedOn = formTemplate.CreatedOn,
LastModifiedOn = formTemplate.LastModifiedOn,
Languages = formTemplate.Languages,
NumberOfQuestions = formTemplate.NumberOfQuestions,
Questions = formTemplate.Questions.Select(QuestionsMapper.ToModel).ToList()
});
return TypedResults.Ok(FormTemplateFullModel.FromEntity(formTemplate));
}
}
Loading
Loading