Application creating but without past visas and visits
This commit is contained in:
		| @@ -1,4 +1,5 @@ | |||||||
| using Domains.ApplicantDomain; | using System.ComponentModel.DataAnnotations; | ||||||
|  | using Domains.ApplicantDomain; | ||||||
|  |  | ||||||
| namespace ApplicationLayer.Services.Applicants.Models; | namespace ApplicationLayer.Services.Applicants.Models; | ||||||
|  |  | ||||||
| @@ -6,44 +7,58 @@ namespace ApplicationLayer.Services.Applicants.Models; | |||||||
| public class ApplicantModel | public class ApplicantModel | ||||||
| { | { | ||||||
|     /// <inheritdoc cref="Applicant.Name" /> |     /// <inheritdoc cref="Applicant.Name" /> | ||||||
|  |     [Required] | ||||||
|     public NameModel Name { get; set; } = null!; |     public NameModel Name { get; set; } = null!; | ||||||
|  |  | ||||||
|     /// <inheritdoc cref="Applicant.Passport" /> |     /// <inheritdoc cref="Applicant.Passport" /> | ||||||
|  |     [Required] | ||||||
|     public PassportModel Passport { get; set; } = null!; |     public PassportModel Passport { get; set; } = null!; | ||||||
|  |  | ||||||
|     /// <inheritdoc cref="Applicant.BirthDate" /> |     /// <inheritdoc cref="Applicant.BirthDate" /> | ||||||
|  |     [Required] | ||||||
|     public DateTime BirthDate { get; set; } |     public DateTime BirthDate { get; set; } | ||||||
|  |  | ||||||
|     /// <inheritdoc cref="Applicant.CountryOfBirth" /> |     /// <inheritdoc cref="Applicant.CountryOfBirth" /> | ||||||
|  |     [Required] | ||||||
|     public string CountryOfBirth { get; set; } = null!; |     public string CountryOfBirth { get; set; } = null!; | ||||||
|  |  | ||||||
|     /// <inheritdoc cref="Applicant.CityOfBirth" /> |     /// <inheritdoc cref="Applicant.CityOfBirth" /> | ||||||
|  |     [Required] | ||||||
|     public string CityOfBirth { get; set; } = null!; |     public string CityOfBirth { get; set; } = null!; | ||||||
|  |  | ||||||
|     /// <inheritdoc cref="Applicant.Citizenship" /> |     /// <inheritdoc cref="Applicant.Citizenship" /> | ||||||
|  |     [Required] | ||||||
|     public string Citizenship { get; set; } = null!; |     public string Citizenship { get; set; } = null!; | ||||||
|  |  | ||||||
|     /// <inheritdoc cref="Applicant.CitizenshipByBirth" /> |     /// <inheritdoc cref="Applicant.CitizenshipByBirth" /> | ||||||
|  |     [Required] | ||||||
|     public string CitizenshipByBirth { get; set; } = null!; |     public string CitizenshipByBirth { get; set; } = null!; | ||||||
|  |  | ||||||
|     /// <inheritdoc cref="Applicant.Gender" /> |     /// <inheritdoc cref="Applicant.Gender" /> | ||||||
|  |     [Required] | ||||||
|     public Gender Gender { get; set; } |     public Gender Gender { get; set; } | ||||||
|  |  | ||||||
|     /// <inheritdoc cref="Applicant.MaritalStatus" /> |     /// <inheritdoc cref="Applicant.MaritalStatus" /> | ||||||
|  |     [Required] | ||||||
|     public MaritalStatus MaritalStatus { get; set; } |     public MaritalStatus MaritalStatus { get; set; } | ||||||
|  |  | ||||||
|     /// <inheritdoc cref="Applicant.FatherName" /> |     /// <inheritdoc cref="Applicant.FatherName" /> | ||||||
|  |     [Required] | ||||||
|     public NameModel FatherName { get; set; } = null!; |     public NameModel FatherName { get; set; } = null!; | ||||||
|  |  | ||||||
|     /// <inheritdoc cref="Applicant.MotherName" /> |     /// <inheritdoc cref="Applicant.MotherName" /> | ||||||
|  |     [Required] | ||||||
|     public NameModel MotherName { get; set; } = null!; |     public NameModel MotherName { get; set; } = null!; | ||||||
|  |  | ||||||
|     /// <inheritdoc cref="Applicant.JobTitle" /> |     /// <inheritdoc cref="Applicant.JobTitle" /> | ||||||
|  |     [Required] | ||||||
|     public string JobTitle { get; set; } = null!; |     public string JobTitle { get; set; } = null!; | ||||||
|  |  | ||||||
|     /// <inheritdoc cref="Applicant.PlaceOfWork" /> |     /// <inheritdoc cref="Applicant.PlaceOfWork" /> | ||||||
|  |     [Required] | ||||||
|     public PlaceOfWorkModel PlaceOfWork { get; set; } = null!; |     public PlaceOfWorkModel PlaceOfWork { get; set; } = null!; | ||||||
|  |  | ||||||
|     /// <inheritdoc cref="Applicant.IsNonResident" /> |     /// <inheritdoc cref="Applicant.IsNonResident" /> | ||||||
|  |     [Required] | ||||||
|     public bool IsNonResident { get; set; } |     public bool IsNonResident { get; set; } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,4 +1,5 @@ | |||||||
| using ApplicationLayer.Services.Users.Models; | using ApplicationLayer.Services.Applicants.Models; | ||||||
|  | using ApplicationLayer.Services.Users.Models; | ||||||
| using ApplicationLayer.Services.Users.Requests; | using ApplicationLayer.Services.Users.Requests; | ||||||
|  |  | ||||||
| namespace ApplicationLayer.Services.Users; | namespace ApplicationLayer.Services.Users; | ||||||
| @@ -19,4 +20,8 @@ public interface IUsersService | |||||||
|     /// <param name="userId">Identifier of account</param> |     /// <param name="userId">Identifier of account</param> | ||||||
|     /// <param name="cancellationToken">Cancellation token</param> |     /// <param name="cancellationToken">Cancellation token</param> | ||||||
|     Task RemoveAuthorityAccount(Guid userId, CancellationToken cancellationToken); |     Task RemoveAuthorityAccount(Guid userId, CancellationToken cancellationToken); | ||||||
|  |  | ||||||
|  |     /// Get applicant that made request | ||||||
|  |     /// <param name="cancellationToken">cancellation token</param> | ||||||
|  |     Task<ApplicantModel> GetAuthenticatedApplicant(CancellationToken cancellationToken); | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,4 +1,6 @@ | |||||||
| using ApplicationLayer.InfrastructureServicesInterfaces; | using ApplicationLayer.InfrastructureServicesInterfaces; | ||||||
|  | using ApplicationLayer.Services.Applicants.Models; | ||||||
|  | using ApplicationLayer.Services.Applicants.NeededServices; | ||||||
| using ApplicationLayer.Services.AuthServices.Common; | using ApplicationLayer.Services.AuthServices.Common; | ||||||
| using ApplicationLayer.Services.AuthServices.NeededServices; | using ApplicationLayer.Services.AuthServices.NeededServices; | ||||||
| using ApplicationLayer.Services.Users.Exceptions; | using ApplicationLayer.Services.Users.Exceptions; | ||||||
| @@ -9,7 +11,12 @@ using Domains.Users; | |||||||
|  |  | ||||||
| namespace ApplicationLayer.Services.Users; | namespace ApplicationLayer.Services.Users; | ||||||
|  |  | ||||||
| public class UsersService(IMapper mapper, IUsersRepository users, IUnitOfWork unitOfWork) : IUsersService | public class UsersService( | ||||||
|  |     IMapper mapper, | ||||||
|  |     IUserIdProvider userIdProvider, | ||||||
|  |     IUsersRepository users, | ||||||
|  |     IApplicantsRepository applicants, | ||||||
|  |     IUnitOfWork unitOfWork) : IUsersService | ||||||
| { | { | ||||||
|     async Task<List<UserModel>> IUsersService.GetAuthoritiesAccountsAsync(CancellationToken cancellationToken) |     async Task<List<UserModel>> IUsersService.GetAuthoritiesAccountsAsync(CancellationToken cancellationToken) | ||||||
|     { |     { | ||||||
| @@ -35,6 +42,13 @@ public class UsersService(IMapper mapper, IUsersRepository users, IUnitOfWork un | |||||||
|         await RemoveUserAccount(user, cancellationToken); |         await RemoveUserAccount(user, cancellationToken); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     async Task<ApplicantModel> IUsersService.GetAuthenticatedApplicant(CancellationToken cancellationToken) | ||||||
|  |     { | ||||||
|  |         var applicant = await applicants.FindByUserIdAsync(userIdProvider.GetUserId(), cancellationToken); | ||||||
|  |  | ||||||
|  |         return mapper.Map<ApplicantModel>(applicant); | ||||||
|  |     } | ||||||
|  |  | ||||||
|     /// Updates user account auth data |     /// Updates user account auth data | ||||||
|     /// <param name="user">User to remove</param> |     /// <param name="user">User to remove</param> | ||||||
|     /// <param name="authData">New auth data</param> |     /// <param name="authData">New auth data</param> | ||||||
|   | |||||||
| @@ -7,9 +7,11 @@ namespace ApplicationLayer.Services.VisaApplications.Models; | |||||||
| public class PermissionToDestCountryModel | public class PermissionToDestCountryModel | ||||||
| { | { | ||||||
|     /// Date when permission to destination country expires |     /// Date when permission to destination country expires | ||||||
|  |     [Required] | ||||||
|     public DateTime ExpirationDate { get; set; } |     public DateTime ExpirationDate { get; set; } | ||||||
|  |  | ||||||
|     /// Issuing authority |     /// Issuing authority | ||||||
|     [MaxLength(ConfigurationConstraints.IssuerNameLength)] |     [MaxLength(ConfigurationConstraints.IssuerNameLength)] | ||||||
|  |     [Required] | ||||||
|     public string Issuer { get; set; } = null!; |     public string Issuer { get; set; } = null!; | ||||||
| } | } | ||||||
|   | |||||||
| @@ -8,8 +8,10 @@ public class ReentryPermitModel | |||||||
| { | { | ||||||
|     /// Number of re-entry permit |     /// Number of re-entry permit | ||||||
|     [MaxLength(ConfigurationConstraints.ReentryPermitNumberLength)] |     [MaxLength(ConfigurationConstraints.ReentryPermitNumberLength)] | ||||||
|  |     [Required] | ||||||
|     public string Number { get; set; } = null!; |     public string Number { get; set; } = null!; | ||||||
|  |  | ||||||
|     /// Date when re-entry permit expires |     /// Date when re-entry permit expires | ||||||
|  |     [Required] | ||||||
|     public DateTime ExpirationDate { get; set; } |     public DateTime ExpirationDate { get; set; } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -13,7 +13,7 @@ | |||||||
|         Expiration date:<br/> |         Expiration date:<br/> | ||||||
|         <InputDate DisplayName="Expiration date of permission to destination Country" class="rounded" |         <InputDate DisplayName="Expiration date of permission to destination Country" class="rounded" | ||||||
|                    @bind-Value="PermissionToDestCountry.ExpirationDate" |                    @bind-Value="PermissionToDestCountry.ExpirationDate" | ||||||
|                    max="@formattedDate"/> |                    min="@formattedDate"/> | ||||||
|     </label><br/> |     </label><br/> | ||||||
|     <ValidationMessage For="() => PermissionToDestCountry.ExpirationDate"></ValidationMessage> |     <ValidationMessage For="() => PermissionToDestCountry.ExpirationDate"></ValidationMessage> | ||||||
| </div> | </div> | ||||||
|   | |||||||
| @@ -0,0 +1,34 @@ | |||||||
|  | @using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider | ||||||
|  | @using VisaApiClient | ||||||
|  |  | ||||||
|  | <div> | ||||||
|  |     <label> | ||||||
|  |         Number:<br/> | ||||||
|  |         <InputText DisplayName="Number of re-entry permit" class="rounded" | ||||||
|  |                    @bind-Value="ReentryPermit.Number"/> | ||||||
|  |     </label><br/> | ||||||
|  |     <ValidationMessage For="() => ReentryPermit.Number"></ValidationMessage><br/> | ||||||
|  |  | ||||||
|  |     <label> | ||||||
|  |         Expiration date:<br/> | ||||||
|  |         <InputDate DisplayName="Expiration date of re-entry permit" class="rounded" | ||||||
|  |                    @bind-Value="ReentryPermit.ExpirationDate" | ||||||
|  |                    min="@formattedDate"/> | ||||||
|  |     </label><br/> | ||||||
|  |     <ValidationMessage For="() => ReentryPermit.ExpirationDate"></ValidationMessage> | ||||||
|  | </div> | ||||||
|  |  | ||||||
|  | @code { | ||||||
|  |     private string formattedDate = null!; | ||||||
|  |  | ||||||
|  |     [Parameter, EditorRequired] public ReentryPermitModel ReentryPermit { get; set; } = null!; | ||||||
|  |  | ||||||
|  |     [Inject] IDateTimeProvider DateTimeProvider { get; set; } = null!; | ||||||
|  |  | ||||||
|  |     protected override void OnInitialized() | ||||||
|  |     { | ||||||
|  |         formattedDate = DateTimeProvider.FormattedNow(); | ||||||
|  |         ReentryPermit.ExpirationDate = DateTimeProvider.Now(); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  | } | ||||||
| @@ -1,4 +1,6 @@ | |||||||
| <CascadingValue Value="this"> | @using System.Net | ||||||
|  | @using VisaApiClient | ||||||
|  | <CascadingValue Value="this"> | ||||||
|     @ChildContent |     @ChildContent | ||||||
| </CascadingValue> | </CascadingValue> | ||||||
|  |  | ||||||
| @@ -7,8 +9,13 @@ | |||||||
|     [Parameter] |     [Parameter] | ||||||
|     public RenderFragment? ChildContent { get; set; } |     public RenderFragment? ChildContent { get; set; } | ||||||
|  |  | ||||||
|  |     [Inject] private NavigationManager Nav { get; set; } = null!; | ||||||
|  |  | ||||||
|     public void Handle(Exception ex) |     public void Handle(Exception ex) | ||||||
|     { |     { | ||||||
|  |         if (ex is ApiException<ProblemDetails> { StatusCode: (int)HttpStatusCode.Unauthorized or (int)HttpStatusCode.Forbidden }) | ||||||
|  |         { | ||||||
|  |             Nav.NavigateTo("/"); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -0,0 +1,14 @@ | |||||||
|  | using AutoMapper; | ||||||
|  | using BlazorWebAssemblyVisaApiClient.Validation.VisaApplications.Models; | ||||||
|  | using VisaApiClient; | ||||||
|  |  | ||||||
|  | namespace BlazorWebAssemblyVisaApiClient.Infrastructure.AutoMapper.Profiles | ||||||
|  | { | ||||||
|  |     public class VisaApplicationCreateRequestProfile : Profile | ||||||
|  |     { | ||||||
|  |         public VisaApplicationCreateRequestProfile() | ||||||
|  |         { | ||||||
|  |             CreateMap<VisaApplicationCreateRequestModel, VisaApplicationCreateRequest>(MemberList.Destination); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,22 @@ | |||||||
|  | using System.Text; | ||||||
|  | using FluentValidation.Results; | ||||||
|  |  | ||||||
|  | namespace BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers | ||||||
|  | { | ||||||
|  |     public static class ValidationResultExtensions | ||||||
|  |     { | ||||||
|  |         public static string ToErrorsString(this ValidationResult validationResult) | ||||||
|  |             => ErrorsToString(validationResult.Errors.Select(e => e.ErrorMessage)); | ||||||
|  |  | ||||||
|  |         private static string ErrorsToString(IEnumerable<string> errors) | ||||||
|  |         { | ||||||
|  |             var stringBuilder = new StringBuilder(); | ||||||
|  |             foreach (var error in errors) | ||||||
|  |             { | ||||||
|  |                 stringBuilder.Append($"{error}<br/>"); | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             return stringBuilder.ToString(); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -5,7 +5,7 @@ namespace BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvide | |||||||
|     public interface IUserDataProvider |     public interface IUserDataProvider | ||||||
|     { |     { | ||||||
|  |  | ||||||
|         public ApplicantModel? GetApplicant(); |         public Task<ApplicantModel> GetApplicant(); | ||||||
|  |  | ||||||
|         public string? GetCurrentRole(); |         public string? GetCurrentRole(); | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -8,10 +8,9 @@ namespace BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvide | |||||||
|     { |     { | ||||||
|         private static readonly JwtSecurityTokenHandler tokenHandler = new (); |         private static readonly JwtSecurityTokenHandler tokenHandler = new (); | ||||||
|  |  | ||||||
|         public ApplicantModel? GetApplicant() |         public async Task<ApplicantModel> GetApplicant() | ||||||
|         { |         { | ||||||
|             //todo api action |             return await client.GetApplicantAsync(); | ||||||
|             return null; |  | ||||||
|         } |         } | ||||||
|  |  | ||||||
|         public string? GetCurrentRole() |         public string? GetCurrentRole() | ||||||
|   | |||||||
| @@ -22,6 +22,13 @@ | |||||||
|             </NavLink> |             </NavLink> | ||||||
|         </div> |         </div> | ||||||
|     </nav> |     </nav> | ||||||
|  |     <nav class="flex-column"> | ||||||
|  |         <div class="nav-item px-3"> | ||||||
|  |             <NavLink class="nav-link" href="applications/new" Match="NavLinkMatch.All"> | ||||||
|  |                 <span class="bi bi-plus-square-fill-nav-menu" aria-hidden="true"></span> New application | ||||||
|  |             </NavLink> | ||||||
|  |         </div> | ||||||
|  |     </nav> | ||||||
| </div> | </div> | ||||||
|  |  | ||||||
| @code { | @code { | ||||||
|   | |||||||
| @@ -1,5 +1,4 @@ | |||||||
| @page "/applications" | @page "/applications" | ||||||
| @using System.Net |  | ||||||
| @using System.Text | @using System.Text | ||||||
| @using BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers | @using BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers | ||||||
| @using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider | @using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider | ||||||
| @@ -61,14 +60,7 @@ | |||||||
|         } |         } | ||||||
|         catch (Exception e) |         catch (Exception e) | ||||||
|         { |         { | ||||||
|             if (e is ApiException<ProblemDetails> { Result.Status: (int)HttpStatusCode.Unauthorized } problemDetailsException) |  | ||||||
|             { |  | ||||||
|                 htmlBody =  $"<p>{problemDetailsException.Result.Detail!}</p>"; |  | ||||||
|             } |  | ||||||
|             else |  | ||||||
|             { |  | ||||||
|                 ErrorHandler.Handle(e); |                 ErrorHandler.Handle(e); | ||||||
|             } |  | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,10 +1,17 @@ | |||||||
| @page "/visaApplications/new" | @page "/applications/new" | ||||||
|  | @using System.Net | ||||||
|  | @using AutoMapper | ||||||
| @using BlazorWebAssemblyVisaApiClient.Validation.VisaApplications.Models | @using BlazorWebAssemblyVisaApiClient.Validation.VisaApplications.Models | ||||||
| @using BlazorWebAssemblyVisaApiClient.Components.FormComponents.Applicants | @using BlazorWebAssemblyVisaApiClient.Components.FormComponents.Applicants | ||||||
| @using VisaApiClient | @using VisaApiClient | ||||||
| @using BlazorWebAssemblyVisaApiClient.Components | @using BlazorWebAssemblyVisaApiClient.Components | ||||||
| @using BlazorWebAssemblyVisaApiClient.Components.FormComponents.VisaApplications | @using BlazorWebAssemblyVisaApiClient.Components.FormComponents.VisaApplications | ||||||
|  | @using BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers | ||||||
| @using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider | @using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider | ||||||
|  | @using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.UserDataProvider | ||||||
|  | @using FluentValidation | ||||||
|  | @using Newtonsoft.Json | ||||||
|  | @using Newtonsoft.Json.Linq | ||||||
| @inherits BlazorWebAssemblyVisaApiClient.Components.Base.VisaClientComponentBase | @inherits BlazorWebAssemblyVisaApiClient.Components.Base.VisaClientComponentBase | ||||||
|  |  | ||||||
| <PageTitle>New Application</PageTitle> | <PageTitle>New Application</PageTitle> | ||||||
| @@ -23,9 +30,10 @@ | |||||||
|             <ValidationMessage For="() => requestModel.DestinationCountry"></ValidationMessage><br/> |             <ValidationMessage For="() => requestModel.DestinationCountry"></ValidationMessage><br/> | ||||||
|  |  | ||||||
|             <label> |             <label> | ||||||
|                 Category: <EnumInputList Model="requestModel" |                 Category: | ||||||
|                                          EnumProperty="r => r.VisaCategory" |                 <EnumInputList Model="requestModel" | ||||||
|                                          OnChanged="StateHasChanged"/> |                                EnumProperty="r => r.VisaCategory" | ||||||
|  |                                OnChanged="StateHasChanged"/> | ||||||
|             </label><br/> |             </label><br/> | ||||||
|             <ValidationMessage For="() => requestModel.VisaCategory"></ValidationMessage><br/> |             <ValidationMessage For="() => requestModel.VisaCategory"></ValidationMessage><br/> | ||||||
|  |  | ||||||
| @@ -46,33 +54,98 @@ | |||||||
|             <ValidationMessage For="() => requestModel.ValidDaysRequested"></ValidationMessage><br/> |             <ValidationMessage For="() => requestModel.ValidDaysRequested"></ValidationMessage><br/> | ||||||
|         </div> |         </div> | ||||||
|  |  | ||||||
|         <div class="form-block"> |         @if (requestModel.VisaCategory is VisaCategory.Transit) | ||||||
|             <fieldset disabled="@(requestModel.VisaCategory is not VisaCategory.Transit)"> |         { | ||||||
|  |             <div class="form-block"> | ||||||
|                 <h5>Permission to destination Country</h5> |                 <h5>Permission to destination Country</h5> | ||||||
|                 <PermissionToDestCountryInput PermissionToDestCountry="requestModel.PermissionToDestCountry" /> |                 <PermissionToDestCountryInput PermissionToDestCountry="requestModel.PermissionToDestCountry"/> | ||||||
|             </fieldset> |             </div> | ||||||
|         </div><br/> |         } | ||||||
|  |  | ||||||
|  |         @if (isNonResident) | ||||||
|  |         { | ||||||
|  |             <div class="form-block"> | ||||||
|  |                 <h5>Re-entry permission</h5> | ||||||
|  |                 <ReentryPermitInput ReentryPermit="requestModel.ReentryPermit" /> | ||||||
|  |             </div> | ||||||
|  |             <br/> | ||||||
|  |         } | ||||||
|  |  | ||||||
|         <input type="submit" class="btn-outline-primary" value="Register"/> |         <input type="submit" class="btn-outline-primary" value="Register"/> | ||||||
|  |         <ValidationSummary/> | ||||||
|         <Status @ref="status"/> |         <Status @ref="status"/> | ||||||
|     </EditForm> |     </EditForm> | ||||||
| </div> | </div> | ||||||
|  | //todo past visas and visits | ||||||
|  |  | ||||||
| @code { | @code { | ||||||
|     private VisaApplicationCreateRequestModel requestModel = new(); |     private VisaApplicationCreateRequestModel requestModel = new(); | ||||||
|     private Status status = null!; |     private Status status = null!; | ||||||
|  |     private bool isNonResident; | ||||||
|  |  | ||||||
|     [Inject] IDateTimeProvider DateTimeProvider { get; set; } = null!; |     [Inject] IDateTimeProvider DateTimeProvider { get; set; } = null!; | ||||||
|  |  | ||||||
|     protected override void OnInitialized() |     [Inject] IUserDataProvider UserDataProvider { get; set; } = null!; | ||||||
|  |  | ||||||
|  |     [Inject] IValidator<VisaApplicationCreateRequestModel> VisaApplicationCreateRequestValidator { get; set; } = null!; | ||||||
|  |  | ||||||
|  |     [Inject] IMapper Mapper { get; set; } = null!; | ||||||
|  |  | ||||||
|  |     protected override async Task OnInitializedAsync() | ||||||
|     { |     { | ||||||
|  |         try | ||||||
|  |         { | ||||||
|  |             isNonResident = (await UserDataProvider.GetApplicant()).IsNonResident; | ||||||
|  |         } | ||||||
|  |         catch (Exception e) | ||||||
|  |         { | ||||||
|  |             ErrorHandler.Handle(e); | ||||||
|  |         } | ||||||
|  |  | ||||||
|         requestModel.PermissionToDestCountry!.ExpirationDate = DateTimeProvider.Now(); |         requestModel.PermissionToDestCountry!.ExpirationDate = DateTimeProvider.Now(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private static void TryCreate() |     private async Task TryCreate() | ||||||
|     { |     { | ||||||
|  |         var validationResult = await VisaApplicationCreateRequestValidator.ValidateAsync(requestModel); | ||||||
|  |         if (!validationResult.IsValid) | ||||||
|  |         { | ||||||
|  |             var errorsString = validationResult.ToErrorsString(); | ||||||
|  |             status.SetError(errorsString); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         status.SetMessage("Wait..."); | ||||||
|  |  | ||||||
|  |         var request = Mapper.Map<VisaApplicationCreateRequest>(requestModel); | ||||||
|  |         try | ||||||
|  |         { | ||||||
|  |             await Client.CreateApplicationAsync(request); | ||||||
|  |             status.SetSucces("Application created successfully."); | ||||||
|  |         } | ||||||
|  |         catch (ApiException<ProblemDetails> e) | ||||||
|  |         { | ||||||
|  |             if (e.StatusCode == (int)HttpStatusCode.BadRequest | ||||||
|  |                 && e.Result.AdditionalProperties.TryGetValue("errors", out var errors)) | ||||||
|  |             { | ||||||
|  |                 var errorsList = ((JArray)errors).ToObject<List<string>>(); | ||||||
|  |                 if (errorsList is null) | ||||||
|  |                 { | ||||||
|  |                     ErrorHandler.Handle(new JsonException("Can't convert validation errors to list")); | ||||||
|  |  | ||||||
|  |                     return; | ||||||
|  |                 } | ||||||
|  |  | ||||||
|  |                 status.SetError(string.Join("<br/>", errorsList)); | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                 ErrorHandler.Handle(e); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |         catch (Exception e) | ||||||
|  |         { | ||||||
|  |             ErrorHandler.Handle(e); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } | } | ||||||
|   | |||||||
| @@ -1,6 +1,5 @@ | |||||||
| @page "/register" | @page "/register" | ||||||
| @using System.Net | @using System.Net | ||||||
| @using System.Text |  | ||||||
| @using AutoMapper | @using AutoMapper | ||||||
| @using VisaApiClient | @using VisaApiClient | ||||||
| @using BlazorWebAssemblyVisaApiClient.Components.FormComponents.Applicants | @using BlazorWebAssemblyVisaApiClient.Components.FormComponents.Applicants | ||||||
| @@ -8,6 +7,7 @@ | |||||||
| @using Newtonsoft.Json | @using Newtonsoft.Json | ||||||
| @using Newtonsoft.Json.Linq | @using Newtonsoft.Json.Linq | ||||||
| @using BlazorWebAssemblyVisaApiClient.Components | @using BlazorWebAssemblyVisaApiClient.Components | ||||||
|  | @using BlazorWebAssemblyVisaApiClient.Infrastructure.Helpers | ||||||
| @using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider | @using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider | ||||||
| @using BlazorWebAssemblyVisaApiClient.Validation.Applicants.Models | @using BlazorWebAssemblyVisaApiClient.Validation.Applicants.Models | ||||||
| @inherits BlazorWebAssemblyVisaApiClient.Components.Base.VisaClientComponentBase | @inherits BlazorWebAssemblyVisaApiClient.Components.Base.VisaClientComponentBase | ||||||
| @@ -144,23 +144,12 @@ | |||||||
|         requestModel.BirthDate = DateTime.Now; |         requestModel.BirthDate = DateTime.Now; | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     private string ErrorsToString(IEnumerable<string> errors) |  | ||||||
|     { |  | ||||||
|         var stringBuilder = new StringBuilder(); |  | ||||||
|         foreach (var error in errors) |  | ||||||
|         { |  | ||||||
|             stringBuilder.Append($"{error}<br/>"); |  | ||||||
|         } |  | ||||||
|  |  | ||||||
|         return stringBuilder.ToString(); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     private async void TryRegisterApplicant() |     private async void TryRegisterApplicant() | ||||||
|     { |     { | ||||||
|         var validationResult = await RegisterApplicantRequestValidator.ValidateAsync(requestModel); |         var validationResult = await RegisterApplicantRequestValidator.ValidateAsync(requestModel); | ||||||
|         if (!validationResult.IsValid) |         if (!validationResult.IsValid) | ||||||
|         { |         { | ||||||
|             var errorsString = ErrorsToString(validationResult.Errors.Select(e => e.ErrorMessage)); |             var errorsString = validationResult.ToErrorsString(); | ||||||
|             status.SetError(errorsString); |             status.SetError(errorsString); | ||||||
|  |  | ||||||
|             return; |             return; | ||||||
| @@ -187,7 +176,7 @@ | |||||||
|                     return; |                     return; | ||||||
|                 } |                 } | ||||||
|  |  | ||||||
|                 status.SetError(ErrorsToString(errorsList)); |                 status.SetError(string.Join("<br/>", errorsList)); | ||||||
|             } |             } | ||||||
|             else |             else | ||||||
|             { |             { | ||||||
| @@ -196,6 +185,7 @@ | |||||||
|         } |         } | ||||||
|         catch (Exception e) |         catch (Exception e) | ||||||
|         { |         { | ||||||
|  |             status.SetError("Error occured"); | ||||||
|             ErrorHandler.Handle(e); |             ErrorHandler.Handle(e); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -26,14 +26,12 @@ namespace BlazorWebAssemblyVisaApiClient.Validation.VisaApplications.Models | |||||||
|         [Range(0, ConfigurationConstraints.MaxValidDays)] |         [Range(0, ConfigurationConstraints.MaxValidDays)] | ||||||
|         public int ValidDaysRequested { get; set; } |         public int ValidDaysRequested { get; set; } | ||||||
|  |  | ||||||
|         [Required] |  | ||||||
|         [ValidateComplexType] |         [ValidateComplexType] | ||||||
|         public PastVisaModel[] PastVisas { get; set; } = default!; |         public PastVisaModel[] PastVisas { get; set; } = default!; | ||||||
|  |  | ||||||
|         [ValidateComplexType] |         [ValidateComplexType] | ||||||
|         public PermissionToDestCountryModel? PermissionToDestCountry { get; set; } = new(); |         public PermissionToDestCountryModel? PermissionToDestCountry { get; set; } = new(); | ||||||
|  |  | ||||||
|         [Required] |  | ||||||
|         [ValidateComplexType] |         [ValidateComplexType] | ||||||
|         public PastVisitModel[] PastVisits { get; set; } = default!; |         public PastVisitModel[] PastVisits { get; set; } = default!; | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -0,0 +1,27 @@ | |||||||
|  | using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider; | ||||||
|  | using FluentValidation; | ||||||
|  | using VisaApiClient; | ||||||
|  |  | ||||||
|  | namespace BlazorWebAssemblyVisaApiClient.Validation.VisaApplications.Validators; | ||||||
|  |  | ||||||
|  | public class PastVisaModelValidator : AbstractValidator<PastVisaModel> | ||||||
|  | { | ||||||
|  |     public PastVisaModelValidator(IDateTimeProvider dateTimeProvider) | ||||||
|  |     { | ||||||
|  |         RuleFor(v => v.ExpirationDate) | ||||||
|  |             .NotEmpty() | ||||||
|  |             .WithMessage("Expiration date of past visa can not be empty") | ||||||
|  |             .GreaterThan(v => v.IssueDate) | ||||||
|  |             .WithMessage("Past visa expiration date can not be earlier than issue date"); | ||||||
|  |  | ||||||
|  |         RuleFor(v => v.IssueDate) | ||||||
|  |             .NotEmpty() | ||||||
|  |             .WithMessage("Issue date of past visa can not be empty") | ||||||
|  |             .LessThan(dateTimeProvider.Now()) | ||||||
|  |             .WithMessage("Issue date of past visa must be in past"); | ||||||
|  |  | ||||||
|  |         RuleFor(v => v.Name) | ||||||
|  |             .NotEmpty() | ||||||
|  |             .WithMessage("Name of past visa can not be empty"); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,29 @@ | |||||||
|  | using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider; | ||||||
|  | using FluentValidation; | ||||||
|  | using VisaApiClient; | ||||||
|  |  | ||||||
|  | namespace BlazorWebAssemblyVisaApiClient.Validation.VisaApplications.Validators; | ||||||
|  |  | ||||||
|  | public class PastVisitModelValidator : AbstractValidator<PastVisitModel> | ||||||
|  | { | ||||||
|  |     public PastVisitModelValidator(IDateTimeProvider dateTimeProvider) | ||||||
|  |     { | ||||||
|  |         RuleFor(v => v.StartDate) | ||||||
|  |             .NotEmpty() | ||||||
|  |             .WithMessage("Start date of past visit can not be empty") | ||||||
|  |             .LessThan(v => v.EndDate) | ||||||
|  |             .WithMessage("Start date of past visit must be earlier than end date") | ||||||
|  |             .LessThan(dateTimeProvider.Now()) | ||||||
|  |             .WithMessage("Start date of past visit must be in past"); | ||||||
|  |  | ||||||
|  |         RuleFor(v => v.EndDate) | ||||||
|  |             .NotEmpty() | ||||||
|  |             .WithMessage("End date of past visit can not be empty"); | ||||||
|  |  | ||||||
|  |         RuleFor(v => v.DestinationCountry) | ||||||
|  |             .NotEmpty() | ||||||
|  |             .WithMessage("Destination Country of past visit can not be null") | ||||||
|  |             .MaximumLength(ConfigurationConstraints.CountryNameLength) | ||||||
|  |             .WithMessage($"Destination Country of past visit length must be less than {ConfigurationConstraints.CountryNameLength}"); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,23 @@ | |||||||
|  | using BlazorWebAssemblyVisaApiClient.Infrastructure.Services.DateTimeProvider; | ||||||
|  | using FluentValidation; | ||||||
|  | using VisaApiClient; | ||||||
|  |  | ||||||
|  | namespace BlazorWebAssemblyVisaApiClient.Validation.VisaApplications.Validators; | ||||||
|  |  | ||||||
|  | public class PermissionToDestCountryModelValidator : AbstractValidator<PermissionToDestCountryModel?> | ||||||
|  | { | ||||||
|  |     public PermissionToDestCountryModelValidator(IDateTimeProvider dateTimeProvider) | ||||||
|  |     { | ||||||
|  |         RuleFor(p => p!.ExpirationDate) | ||||||
|  |             .NotEmpty() | ||||||
|  |             .WithMessage("Expiration date of permission to destination Country can not be empty") | ||||||
|  |             .GreaterThan(dateTimeProvider.Now()) | ||||||
|  |             .WithMessage("Permission to destination Country must not be expired"); | ||||||
|  |  | ||||||
|  |         RuleFor(p => p!.Issuer) | ||||||
|  |             .NotEmpty() | ||||||
|  |             .WithMessage("Issuer of permission for destination Country can not be empty") | ||||||
|  |             .MaximumLength(ConfigurationConstraints.IssuerNameLength) | ||||||
|  |             .WithMessage($"Issuer of permission to destination Country length must be less than {ConfigurationConstraints.IssuerNameLength}"); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -0,0 +1,42 @@ | |||||||
|  | using BlazorWebAssemblyVisaApiClient.Validation.VisaApplications.Models; | ||||||
|  | using FluentValidation; | ||||||
|  | using VisaApiClient; | ||||||
|  |  | ||||||
|  | namespace BlazorWebAssemblyVisaApiClient.Validation.VisaApplications.Validators; | ||||||
|  |  | ||||||
|  | public class VisaApplicationCreateRequestModelValidator : AbstractValidator<VisaApplicationCreateRequestModel> | ||||||
|  | { | ||||||
|  |     public VisaApplicationCreateRequestModelValidator( | ||||||
|  |         IValidator<PastVisaModel> pastVisaModelValidator, | ||||||
|  |         IValidator<PermissionToDestCountryModel?> permissionToDestCountryModelValidator, | ||||||
|  |         IValidator<PastVisitModel> pastVisitModelValidator) | ||||||
|  |     { | ||||||
|  |         RuleFor(r => r.PermissionToDestCountry) | ||||||
|  |             .NotEmpty() | ||||||
|  |             .WithMessage("For transit you must provide permission to destination country") | ||||||
|  |             .SetValidator(permissionToDestCountryModelValidator) | ||||||
|  |             .When(r => r.VisaCategory is VisaCategory.Transit); | ||||||
|  |  | ||||||
|  |         RuleFor(r => r.DestinationCountry) | ||||||
|  |             .NotEmpty() | ||||||
|  |             .WithMessage("Destination country can not be empty"); | ||||||
|  |  | ||||||
|  |         RuleFor(r => r.VisaCategory) | ||||||
|  |             .IsInEnum(); | ||||||
|  |  | ||||||
|  |         RuleFor(r => r.RequestedNumberOfEntries) | ||||||
|  |             .IsInEnum(); | ||||||
|  |  | ||||||
|  |         RuleFor(r => r.ValidDaysRequested) | ||||||
|  |             .GreaterThan(0) | ||||||
|  |             .WithMessage($"Valid days requested should be positive number and less than {ConfigurationConstraints.MaxValidDays}") | ||||||
|  |             .LessThanOrEqualTo(ConfigurationConstraints.MaxValidDays) | ||||||
|  |             .WithMessage($"Valid days requested must be less than or equal to {ConfigurationConstraints.MaxValidDays}"); | ||||||
|  |  | ||||||
|  |         RuleForEach(r => r.PastVisas) | ||||||
|  |             .SetValidator(pastVisaModelValidator); | ||||||
|  |  | ||||||
|  |         RuleForEach(r => r.PastVisits) | ||||||
|  |             .SetValidator(pastVisitModelValidator); | ||||||
|  |     } | ||||||
|  | } | ||||||
| @@ -1,4 +1,5 @@ | |||||||
| using ApplicationLayer.Services.AuthServices.Common; | using ApplicationLayer.Services.Applicants.Models; | ||||||
|  | using ApplicationLayer.Services.AuthServices.Common; | ||||||
| using ApplicationLayer.Services.AuthServices.LoginService; | using ApplicationLayer.Services.AuthServices.LoginService; | ||||||
| using ApplicationLayer.Services.AuthServices.RegisterService; | using ApplicationLayer.Services.AuthServices.RegisterService; | ||||||
| using ApplicationLayer.Services.AuthServices.Requests; | using ApplicationLayer.Services.AuthServices.Requests; | ||||||
| @@ -109,4 +110,17 @@ public class UsersController( | |||||||
|         await usersService.RemoveAuthorityAccount(authorityAccountId, cancellationToken); |         await usersService.RemoveAuthorityAccount(authorityAccountId, cancellationToken); | ||||||
|         return Ok(); |         return Ok(); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     /// <summary> Returns applicant info </summary> | ||||||
|  |     [HttpGet("applicant")] | ||||||
|  |     [ProducesResponseType<ApplicantModel>(StatusCodes.Status200OK)] | ||||||
|  |     [ProducesResponseType(StatusCodes.Status401Unauthorized)] | ||||||
|  |     [ProducesResponseType(StatusCodes.Status403Forbidden)] | ||||||
|  |     [Authorize(policy: PolicyConstants.ApplicantPolicy)] | ||||||
|  |     public async Task<IActionResult> GetApplicant(CancellationToken cancellationToken) | ||||||
|  |     { | ||||||
|  |  | ||||||
|  |         var result = await usersService.GetAuthenticatedApplicant(cancellationToken); | ||||||
|  |         return Ok(result); | ||||||
|  |     } | ||||||
| } | } | ||||||
|   | |||||||
| @@ -742,6 +742,110 @@ namespace VisaApiClient | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  |  | ||||||
|  |         /// <summary> | ||||||
|  |         /// Returns applicant info | ||||||
|  |         /// </summary> | ||||||
|  |         /// <returns>Success</returns> | ||||||
|  |         /// <exception cref="ApiException">A server side error occurred.</exception> | ||||||
|  |         public virtual System.Threading.Tasks.Task<ApplicantModel> GetApplicantAsync() | ||||||
|  |         { | ||||||
|  |             return GetApplicantAsync(System.Threading.CancellationToken.None); | ||||||
|  |         } | ||||||
|  |  | ||||||
|  |         /// <param name="cancellationToken">A cancellation token that can be used by other objects or threads to receive notice of cancellation.</param> | ||||||
|  |         /// <summary> | ||||||
|  |         /// Returns applicant info | ||||||
|  |         /// </summary> | ||||||
|  |         /// <returns>Success</returns> | ||||||
|  |         /// <exception cref="ApiException">A server side error occurred.</exception> | ||||||
|  |         public virtual async System.Threading.Tasks.Task<ApplicantModel> GetApplicantAsync(System.Threading.CancellationToken cancellationToken) | ||||||
|  |         { | ||||||
|  |             var client_ = _httpClient; | ||||||
|  |             var disposeClient_ = false; | ||||||
|  |             try | ||||||
|  |             { | ||||||
|  |                 using (var request_ = await CreateHttpRequestMessageAsync(cancellationToken).ConfigureAwait(false)) | ||||||
|  |                 { | ||||||
|  |                     request_.Method = new System.Net.Http.HttpMethod("GET"); | ||||||
|  |                     request_.Headers.Accept.Add(System.Net.Http.Headers.MediaTypeWithQualityHeaderValue.Parse("text/plain")); | ||||||
|  |  | ||||||
|  |                     var urlBuilder_ = new System.Text.StringBuilder(); | ||||||
|  |                     if (!string.IsNullOrEmpty(_baseUrl)) urlBuilder_.Append(_baseUrl); | ||||||
|  |                     // Operation Path: "users/applicant" | ||||||
|  |                     urlBuilder_.Append("users/applicant"); | ||||||
|  |  | ||||||
|  |                     await PrepareRequestAsync(client_, request_, urlBuilder_, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |                     var url_ = urlBuilder_.ToString(); | ||||||
|  |                     request_.RequestUri = new System.Uri(url_, System.UriKind.RelativeOrAbsolute); | ||||||
|  |  | ||||||
|  |                     await PrepareRequestAsync(client_, request_, url_, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |                     var response_ = await client_.SendAsync(request_, System.Net.Http.HttpCompletionOption.ResponseHeadersRead, cancellationToken).ConfigureAwait(false); | ||||||
|  |                     var disposeResponse_ = true; | ||||||
|  |                     try | ||||||
|  |                     { | ||||||
|  |                         var headers_ = new System.Collections.Generic.Dictionary<string, System.Collections.Generic.IEnumerable<string>>(); | ||||||
|  |                         foreach (var item_ in response_.Headers) | ||||||
|  |                             headers_[item_.Key] = item_.Value; | ||||||
|  |                         if (response_.Content != null && response_.Content.Headers != null) | ||||||
|  |                         { | ||||||
|  |                             foreach (var item_ in response_.Content.Headers) | ||||||
|  |                                 headers_[item_.Key] = item_.Value; | ||||||
|  |                         } | ||||||
|  |  | ||||||
|  |                         await ProcessResponseAsync(client_, response_, cancellationToken).ConfigureAwait(false); | ||||||
|  |  | ||||||
|  |                         var status_ = (int)response_.StatusCode; | ||||||
|  |                         if (status_ == 200) | ||||||
|  |                         { | ||||||
|  |                             var objectResponse_ = await ReadObjectResponseAsync<ApplicantModel>(response_, headers_, cancellationToken).ConfigureAwait(false); | ||||||
|  |                             if (objectResponse_.Object == null) | ||||||
|  |                             { | ||||||
|  |                                 throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); | ||||||
|  |                             } | ||||||
|  |                             return objectResponse_.Object; | ||||||
|  |                         } | ||||||
|  |                         else | ||||||
|  |                         if (status_ == 401) | ||||||
|  |                         { | ||||||
|  |                             var objectResponse_ = await ReadObjectResponseAsync<ProblemDetails>(response_, headers_, cancellationToken).ConfigureAwait(false); | ||||||
|  |                             if (objectResponse_.Object == null) | ||||||
|  |                             { | ||||||
|  |                                 throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); | ||||||
|  |                             } | ||||||
|  |                             throw new ApiException<ProblemDetails>("Unauthorized", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); | ||||||
|  |                         } | ||||||
|  |                         else | ||||||
|  |                         if (status_ == 403) | ||||||
|  |                         { | ||||||
|  |                             var objectResponse_ = await ReadObjectResponseAsync<ProblemDetails>(response_, headers_, cancellationToken).ConfigureAwait(false); | ||||||
|  |                             if (objectResponse_.Object == null) | ||||||
|  |                             { | ||||||
|  |                                 throw new ApiException("Response was null which was not expected.", status_, objectResponse_.Text, headers_, null); | ||||||
|  |                             } | ||||||
|  |                             throw new ApiException<ProblemDetails>("Forbidden", status_, objectResponse_.Text, headers_, objectResponse_.Object, null); | ||||||
|  |                         } | ||||||
|  |                         else | ||||||
|  |                         { | ||||||
|  |                             var responseData_ = response_.Content == null ? null : await response_.Content.ReadAsStringAsync().ConfigureAwait(false); | ||||||
|  |                             throw new ApiException("The HTTP status code of the response was not expected (" + status_ + ").", status_, responseData_, headers_, null); | ||||||
|  |                         } | ||||||
|  |                     } | ||||||
|  |                     finally | ||||||
|  |                     { | ||||||
|  |                         if (disposeResponse_) | ||||||
|  |                             response_.Dispose(); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |             finally | ||||||
|  |             { | ||||||
|  |                 if (disposeClient_) | ||||||
|  |                     client_.Dispose(); | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |  | ||||||
|         /// <summary> |         /// <summary> | ||||||
|         /// Returns pending applications |         /// Returns pending applications | ||||||
|         /// </summary> |         /// </summary> | ||||||
| @@ -1494,49 +1598,62 @@ namespace VisaApiClient | |||||||
|     [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] |     [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] | ||||||
|     public partial class ApplicantModel |     public partial class ApplicantModel | ||||||
|     { |     { | ||||||
|         [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] |         [Newtonsoft.Json.JsonProperty("name", Required = Newtonsoft.Json.Required.Always)] | ||||||
|         public NameModel? Name { get; set; } = default!; |         [System.ComponentModel.DataAnnotations.Required] | ||||||
|  |         public NameModel Name { get; set; } = new NameModel(); | ||||||
|  |  | ||||||
|         [Newtonsoft.Json.JsonProperty("passport", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] |         [Newtonsoft.Json.JsonProperty("passport", Required = Newtonsoft.Json.Required.Always)] | ||||||
|         public PassportModel? Passport { get; set; } = default!; |         [System.ComponentModel.DataAnnotations.Required] | ||||||
|  |         public PassportModel Passport { get; set; } = new PassportModel(); | ||||||
|  |  | ||||||
|         [Newtonsoft.Json.JsonProperty("birthDate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] |         [Newtonsoft.Json.JsonProperty("birthDate", Required = Newtonsoft.Json.Required.Always)] | ||||||
|         public System.DateTimeOffset? BirthDate { get; set; } = default!; |         [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] | ||||||
|  |         public System.DateTimeOffset BirthDate { get; set; } = default!; | ||||||
|  |  | ||||||
|         [Newtonsoft.Json.JsonProperty("countryOfBirth", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] |         [Newtonsoft.Json.JsonProperty("countryOfBirth", Required = Newtonsoft.Json.Required.Always)] | ||||||
|         public string? CountryOfBirth { get; set; } = default!; |         [System.ComponentModel.DataAnnotations.Required] | ||||||
|  |         public string CountryOfBirth { get; set; } = default!; | ||||||
|  |  | ||||||
|         [Newtonsoft.Json.JsonProperty("cityOfBirth", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] |         [Newtonsoft.Json.JsonProperty("cityOfBirth", Required = Newtonsoft.Json.Required.Always)] | ||||||
|         public string? CityOfBirth { get; set; } = default!; |         [System.ComponentModel.DataAnnotations.Required] | ||||||
|  |         public string CityOfBirth { get; set; } = default!; | ||||||
|  |  | ||||||
|         [Newtonsoft.Json.JsonProperty("citizenship", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] |         [Newtonsoft.Json.JsonProperty("citizenship", Required = Newtonsoft.Json.Required.Always)] | ||||||
|         public string? Citizenship { get; set; } = default!; |         [System.ComponentModel.DataAnnotations.Required] | ||||||
|  |         public string Citizenship { get; set; } = default!; | ||||||
|  |  | ||||||
|         [Newtonsoft.Json.JsonProperty("citizenshipByBirth", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] |         [Newtonsoft.Json.JsonProperty("citizenshipByBirth", Required = Newtonsoft.Json.Required.Always)] | ||||||
|         public string? CitizenshipByBirth { get; set; } = default!; |         [System.ComponentModel.DataAnnotations.Required] | ||||||
|  |         public string CitizenshipByBirth { get; set; } = default!; | ||||||
|  |  | ||||||
|         [Newtonsoft.Json.JsonProperty("gender", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] |         [Newtonsoft.Json.JsonProperty("gender", Required = Newtonsoft.Json.Required.Always)] | ||||||
|  |         [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] | ||||||
|         [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] |         [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] | ||||||
|         public Gender? Gender { get; set; } = default!; |         public Gender Gender { get; set; } = default!; | ||||||
|  |  | ||||||
|         [Newtonsoft.Json.JsonProperty("maritalStatus", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] |         [Newtonsoft.Json.JsonProperty("maritalStatus", Required = Newtonsoft.Json.Required.Always)] | ||||||
|  |         [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] | ||||||
|         [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] |         [Newtonsoft.Json.JsonConverter(typeof(Newtonsoft.Json.Converters.StringEnumConverter))] | ||||||
|         public MaritalStatus? MaritalStatus { get; set; } = default!; |         public MaritalStatus MaritalStatus { get; set; } = default!; | ||||||
|  |  | ||||||
|         [Newtonsoft.Json.JsonProperty("fatherName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] |         [Newtonsoft.Json.JsonProperty("fatherName", Required = Newtonsoft.Json.Required.Always)] | ||||||
|         public NameModel? FatherName { get; set; } = default!; |         [System.ComponentModel.DataAnnotations.Required] | ||||||
|  |         public NameModel FatherName { get; set; } = new NameModel(); | ||||||
|  |  | ||||||
|         [Newtonsoft.Json.JsonProperty("motherName", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] |         [Newtonsoft.Json.JsonProperty("motherName", Required = Newtonsoft.Json.Required.Always)] | ||||||
|         public NameModel? MotherName { get; set; } = default!; |         [System.ComponentModel.DataAnnotations.Required] | ||||||
|  |         public NameModel MotherName { get; set; } = new NameModel(); | ||||||
|  |  | ||||||
|         [Newtonsoft.Json.JsonProperty("jobTitle", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] |         [Newtonsoft.Json.JsonProperty("jobTitle", Required = Newtonsoft.Json.Required.Always)] | ||||||
|         public string? JobTitle { get; set; } = default!; |         [System.ComponentModel.DataAnnotations.Required] | ||||||
|  |         public string JobTitle { get; set; } = default!; | ||||||
|  |  | ||||||
|         [Newtonsoft.Json.JsonProperty("placeOfWork", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] |         [Newtonsoft.Json.JsonProperty("placeOfWork", Required = Newtonsoft.Json.Required.Always)] | ||||||
|         public PlaceOfWorkModel? PlaceOfWork { get; set; } = default!; |         [System.ComponentModel.DataAnnotations.Required] | ||||||
|  |         public PlaceOfWorkModel PlaceOfWork { get; set; } = new PlaceOfWorkModel(); | ||||||
|  |  | ||||||
|         [Newtonsoft.Json.JsonProperty("isNonResident", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] |         [Newtonsoft.Json.JsonProperty("isNonResident", Required = Newtonsoft.Json.Required.Always)] | ||||||
|         public bool? IsNonResident { get; set; } = default!; |         public bool IsNonResident { get; set; } = default!; | ||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -1714,12 +1831,14 @@ namespace VisaApiClient | |||||||
|     [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] |     [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] | ||||||
|     public partial class PermissionToDestCountryModel |     public partial class PermissionToDestCountryModel | ||||||
|     { |     { | ||||||
|         [Newtonsoft.Json.JsonProperty("expirationDate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] |         [Newtonsoft.Json.JsonProperty("expirationDate", Required = Newtonsoft.Json.Required.Always)] | ||||||
|         public System.DateTimeOffset? ExpirationDate { get; set; } = default!; |         [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] | ||||||
|  |         public System.DateTimeOffset ExpirationDate { get; set; } = default!; | ||||||
|  |  | ||||||
|         [Newtonsoft.Json.JsonProperty("issuer", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] |         [Newtonsoft.Json.JsonProperty("issuer", Required = Newtonsoft.Json.Required.Always)] | ||||||
|         [System.ComponentModel.DataAnnotations.StringLength(200)] |         [System.ComponentModel.DataAnnotations.Required] | ||||||
|         public string? Issuer { get; set; } = default!; |         [System.ComponentModel.DataAnnotations.StringLength(200, MinimumLength = 1)] | ||||||
|  |         public string Issuer { get; set; } = default!; | ||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
| @@ -1774,12 +1893,14 @@ namespace VisaApiClient | |||||||
|     [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] |     [System.CodeDom.Compiler.GeneratedCode("NJsonSchema", "14.1.0.0 (NJsonSchema v11.0.2.0 (Newtonsoft.Json v13.0.0.0))")] | ||||||
|     public partial class ReentryPermitModel |     public partial class ReentryPermitModel | ||||||
|     { |     { | ||||||
|         [Newtonsoft.Json.JsonProperty("number", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] |         [Newtonsoft.Json.JsonProperty("number", Required = Newtonsoft.Json.Required.Always)] | ||||||
|         [System.ComponentModel.DataAnnotations.StringLength(25)] |         [System.ComponentModel.DataAnnotations.Required] | ||||||
|         public string? Number { get; set; } = default!; |         [System.ComponentModel.DataAnnotations.StringLength(25, MinimumLength = 1)] | ||||||
|  |         public string Number { get; set; } = default!; | ||||||
|  |  | ||||||
|         [Newtonsoft.Json.JsonProperty("expirationDate", Required = Newtonsoft.Json.Required.Default, NullValueHandling = Newtonsoft.Json.NullValueHandling.Ignore)] |         [Newtonsoft.Json.JsonProperty("expirationDate", Required = Newtonsoft.Json.Required.Always)] | ||||||
|         public System.DateTimeOffset? ExpirationDate { get; set; } = default!; |         [System.ComponentModel.DataAnnotations.Required(AllowEmptyStrings = true)] | ||||||
|  |         public System.DateTimeOffset ExpirationDate { get; set; } = default!; | ||||||
|  |  | ||||||
|     } |     } | ||||||
|  |  | ||||||
|   | |||||||
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
		Reference in New Issue
	
	Block a user