diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/Exceptions/NotLoggedInException.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/Exceptions/NotLoggedInException.cs deleted file mode 100644 index ef88958..0000000 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Components/Auth/Exceptions/NotLoggedInException.cs +++ /dev/null @@ -1,6 +0,0 @@ -using BlazorWebAssemblyVisaApiClient.Common; - -namespace BlazorWebAssemblyVisaApiClient.Components.Auth.Exceptions -{ - public class NotLoggedInException() : BlazorClientException("User is not logged in"); -} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/Exceptions/UnknownRoleException.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/Exceptions/UnknownRoleException.cs new file mode 100644 index 0000000..57e46a8 --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/Exceptions/UnknownRoleException.cs @@ -0,0 +1,6 @@ +using BlazorWebAssemblyVisaApiClient.Common; + +namespace BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider.Exceptions +{ + public class UnknownRoleException() : BlazorClientException("Unknown user role"); +} diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/UserDataProvider.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/UserDataProvider.cs index 1c32a4b..cb1d763 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/UserDataProvider.cs +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Infrastructure/Services/UserDataProvider/UserDataProvider.cs @@ -1,12 +1,14 @@ using System.IdentityModel.Tokens.Jwt; using System.Security.Claims; +using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider.Exceptions; using VisaApiClient; namespace BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider { public class UserDataProvider(Client client) : IUserDataProvider { - private static readonly JwtSecurityTokenHandler tokenHandler = new (); + private readonly static JwtSecurityTokenHandler tokenHandler = new (); + private readonly static string[] knownRoles = ["Applicant", "ApprovingAuthority", "Admin"]; public async Task GetApplicant() { @@ -23,6 +25,11 @@ namespace BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvide var token = tokenHandler.ReadJwtToken(client.AuthToken.Token); var role = token.Claims.FirstOrDefault(claim => claim.Type == ClaimTypes.Role)?.Value; + if (!knownRoles.Contains(role)) + { + throw new UnknownRoleException(); + } + return role; } } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor index d205367..63a5509 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Applications.razor @@ -1,25 +1,63 @@ @page "/applications" -@using System.Text +@using System.Reflection @using BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers @using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider +@using BlazorWebAssemblyVisaApiClient.PagesExceptions.Applications @using VisaApiClient @inherits BlazorWebAssemblyVisaApiClient.Components.Base.VisaClientComponentBase Applications - - @((MarkupString)htmlHead) - - - @((MarkupString)htmlBody) - + @switch (currentRole) + { + case "Applicant": + + + + + + + + + + + + + @foreach (var application in applications.Cast()) + { + var rowClass = application.Status switch + { + ApplicationStatus.Pending => "", + ApplicationStatus.Approved => "table-success", + ApplicationStatus.Rejected => "table-danger", + ApplicationStatus.Closed => "table-danger", + _ => throw new ArgumentOutOfRangeException() + }; + + + + + + + + + + } + + + break; + default: + Nav.NavigateTo("/"); //todo feedback + break; + }
Destination CountryVisa CategoryRequest dateDays requestedStatus
@application.DestinationCountry@application.VisaCategory.GetDisplayName()@application.RequestDate.ToString("d")@application.ValidDaysRequested@application.Status.GetDisplayName() + +
@code { - private string htmlBody = null!; - - private string htmlHead = null!; + private string currentRole = null!; + private IEnumerable applications = []; [Inject] private IUserDataProvider UserDataProvider { get; set; } = null!; @@ -27,41 +65,59 @@ protected override async Task OnInitializedAsync() { - var stringBuilder = new StringBuilder(); + currentRole = UserDataProvider.GetCurrentRole()!; + await Fetch(); + } + private async Task Fetch() + { try { - switch (UserDataProvider.GetCurrentRole()) + applications = currentRole switch { - case "Applicant": - htmlHead = "Destination CountryVisa CategoryRequest dateDays requestedStatus"; - var applications = await Client.GetForApplicantAsync(); - - foreach (var application in applications) - { - var rowClass = application.Status switch - { - ApplicationStatus.Pending => "", - ApplicationStatus.Approved => "table-success", - ApplicationStatus.Rejected => "table-danger", - ApplicationStatus.Closed => "table-danger", - _ => throw new ArgumentOutOfRangeException() - }; - - stringBuilder.AppendLine($"{application.DestinationCountry}{application.VisaCategory.GetDisplayName()}{application.RequestDate.ToString("d")}{application.ValidDaysRequested}{application.Status.GetDisplayName()}"); - } - - htmlBody = stringBuilder.ToString(); - break; - default: - Nav.NavigateTo("/"); //todo feedback - break; - } + "Applicant" => (await Client.GetForApplicantAsync()).OrderByDescending(a => a.RequestDate), + _ => throw new ArgumentOutOfRangeException() + }; } catch (Exception e) { - ErrorHandler.Handle(e); + ErrorHandler.Handle(e); } } + private async Task CloseApplication(object application) + { + try + { + PropertyInfo idProp; + PropertyInfo statusProp; + try + { + var type = applications.First().GetType(); + idProp = type.GetProperty("Id")!; + statusProp = type.GetProperty("Status")!; + if (idProp.PropertyType != typeof(Guid) + || statusProp.PropertyType != typeof(ApplicationStatus)) + { + throw new(); + } + } + catch (Exception) + { + throw new UnknownApplicationTypeException(); + } + + var id = (Guid)idProp.GetValue(application)!; + await Client.CloseApplicationAsync(id); + + statusProp.SetValue(application, ApplicationStatus.Closed); + StateHasChanged(); + } + catch (Exception e) + { + ErrorHandler.Handle(e); + } + + } + } diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor index c286833..5052650 100644 --- a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/Pages/Register.razor @@ -8,7 +8,6 @@ @using Newtonsoft.Json.Linq @using BlazorWebAssemblyVisaApiClient.Components @using BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers -@using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider @using BlazorWebAssemblyVisaApiClient.Validation @using BlazorWebAssemblyVisaApiClient.Validation.Applicants.Models @inherits BlazorWebAssemblyVisaApiClient.Components.Base.VisaClientComponentBase @@ -139,8 +138,6 @@ [Inject] IMapper Mapper { get; set; } = null!; - [Inject] IDateTimeProvider DateTimeProvider { get; set; } = null!; - protected override void OnInitialized() { requestModel.BirthDate = DateTime.Now.AddYears(-ConfigurationConstraints.ApplicantMinAge); diff --git a/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/PagesExceptions/Applications/UnknownApplicationTypeException.cs b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/PagesExceptions/Applications/UnknownApplicationTypeException.cs new file mode 100644 index 0000000..2fc4c3e --- /dev/null +++ b/SchengenVisaApi/BlazorWebAssemblyVisaApiClient/PagesExceptions/Applications/UnknownApplicationTypeException.cs @@ -0,0 +1,6 @@ +using BlazorWebAssemblyVisaApiClient.Common; + +namespace BlazorWebAssemblyVisaApiClient.PagesExceptions.Applications +{ + public class UnknownApplicationTypeException() : BlazorClientException("Application type is unknown"); +}