diff --git a/SchengenVisaApi/ApplicationLayer/Services/Applicants/Models/AddressModel.cs b/SchengenVisaApi/ApplicationLayer/Services/Applicants/Models/AddressModel.cs deleted file mode 100644 index e5ccb5e..0000000 --- a/SchengenVisaApi/ApplicationLayer/Services/Applicants/Models/AddressModel.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace ApplicationLayer.Services.Applicants.Models; - -public class AddressModel -{ - /// City part of address - public Guid CityId { get; set; } - - /// Street part of address - public string Street { get; set; } = null!; - - /// Building part of address - public string Building { get; set; } = null!; -} diff --git a/SchengenVisaApi/ApplicationLayer/Services/Applicants/Models/ApplicantModel.cs b/SchengenVisaApi/ApplicationLayer/Services/Applicants/Models/ApplicantModel.cs new file mode 100644 index 0000000..1898c3a --- /dev/null +++ b/SchengenVisaApi/ApplicationLayer/Services/Applicants/Models/ApplicantModel.cs @@ -0,0 +1,50 @@ +using Domains.ApplicantDomain; + +namespace ApplicationLayer.Services.Applicants.Models +{ + /// Model of + public class ApplicantModel + { + /// + public Name Name { get; set; } = null!; + + /// + public Passport Passport { get; set; } = null!; + + /// + public DateTime BirthDate { get; set; } + + /// + public string CountryOfBirth { get; set; } = null!; + + /// + public string CityOfBirth { get; set; } = null!; + + /// + public string Citizenship { get; set; } = null!; + + /// + public string CitizenshipByBirth { get; set; } = null!; + + /// + public Gender Gender { get; set; } + + /// + public MaritalStatus MaritalStatus { get; set; } + + /// + public Name FatherName { get; set; } = null!; + + /// + public Name MotherName { get; set; } = null!; + + /// + public string JobTitle { get; set; } = null!; + + /// + public PlaceOfWork PlaceOfWork { get; set; } = null!; + + /// + public bool IsNonResident { get; set; } + } +} diff --git a/SchengenVisaApi/ApplicationLayer/Services/Applicants/Models/PlaceOfWorkModel.cs b/SchengenVisaApi/ApplicationLayer/Services/Applicants/Models/PlaceOfWorkModel.cs deleted file mode 100644 index f08f220..0000000 --- a/SchengenVisaApi/ApplicationLayer/Services/Applicants/Models/PlaceOfWorkModel.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace ApplicationLayer.Services.Applicants.Models; - -public class PlaceOfWorkModel -{ - /// Name of hirer - public string Name { get; set; } = null!; - - /// of hirer - public AddressModel Address { get; set; } = null!; - - /// Phone number of hirer - public string PhoneNum { get; set; } = null!; -} diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/IVisaApplicationRequestsHandler.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/IVisaApplicationRequestsHandler.cs index 616591c..e92e7d6 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/IVisaApplicationRequestsHandler.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/IVisaApplicationRequestsHandler.cs @@ -6,8 +6,12 @@ namespace ApplicationLayer.Services.VisaApplications.Handlers; public interface IVisaApplicationRequestsHandler { - Task> Get(CancellationToken cancellationToken); - Task> GetForApplicant(Guid userId, CancellationToken cancellationToken); + /// Returns all applications for approving authorities + Task> GetAllAsync(CancellationToken cancellationToken); + /// Returns all applications of one applicant + Task> GetForApplicantAsync(Guid userId, CancellationToken cancellationToken); + + /// Creates application for applicant with specific user identifier Task HandleCreateRequest(Guid userId, VisaApplicationCreateRequest request, CancellationToken cancellationToken); } diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/VisaApplicationRequestsHandler.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/VisaApplicationRequestsHandler.cs index 5638207..6997425 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/VisaApplicationRequestsHandler.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/VisaApplicationRequestsHandler.cs @@ -1,8 +1,10 @@ using ApplicationLayer.InfrastructureServicesInterfaces; +using ApplicationLayer.Services.Applicants.Models; using ApplicationLayer.Services.Applicants.NeededServices; using ApplicationLayer.Services.VisaApplications.Models; using ApplicationLayer.Services.VisaApplications.NeededServices; using ApplicationLayer.Services.VisaApplications.Requests; +using Domains.ApplicantDomain; using Domains.VisaApplicationDomain; namespace ApplicationLayer.Services.VisaApplications.Handlers; @@ -13,9 +15,57 @@ public class VisaApplicationRequestsHandler( IApplicantsRepository applicants, IUnitOfWork unitOfWork) : IVisaApplicationRequestsHandler { - public async Task> Get(CancellationToken cancellationToken) => await applications.GetAllAsync(cancellationToken); + async Task> IVisaApplicationRequestsHandler.GetAllAsync(CancellationToken cancellationToken) + { + var applicationsList = await applications.GetAllAsync(cancellationToken); - public async Task> GetForApplicant(Guid userId, CancellationToken cancellationToken) + //todo mapper + var applicationModels = applicationsList + .Select(a => MapVisaApplicationToModelForAuthorities(a, cancellationToken).Result) + .ToList(); + return applicationModels; + } + + private async Task MapVisaApplicationToModelForAuthorities(VisaApplication visaApplication, + CancellationToken cancellationToken) + { + var applicant = await applicants.GetByIdAsync(visaApplication.ApplicantId, cancellationToken); + var applicantModel = new ApplicantModel + { + Citizenship = applicant.Citizenship, + Gender = applicant.Gender, + Name = applicant.Name, + Passport = applicant.Passport, + BirthDate = applicant.BirthDate, + FatherName = applicant.FatherName, + JobTitle = applicant.JobTitle, + MaritalStatus = applicant.MaritalStatus, + MotherName = applicant.MotherName, + CitizenshipByBirth = applicant.CitizenshipByBirth, + CityOfBirth = applicant.CityOfBirth, + CountryOfBirth = applicant.CountryOfBirth, + IsNonResident = applicant.IsNonResident, + PlaceOfWork = applicant.PlaceOfWork, + }; + return new VisaApplicationModelForAuthority + { + PastVisits = visaApplication.PastVisits, + ReentryPermit = visaApplication.ReentryPermit, + VisaCategory = visaApplication.VisaCategory, + PermissionToDestCountry = visaApplication.PermissionToDestCountry, + DestinationCountry = visaApplication.DestinationCountry, + PastVisas = visaApplication.PastVisas, + RequestDate = visaApplication.RequestDate, + ValidDaysRequested = visaApplication.ValidDaysRequested, + RequestedNumberOfEntries = visaApplication.RequestedNumberOfEntries, + ForGroup = visaApplication.ForGroup, + Applicant = applicantModel, + Id = visaApplication.Id, + Status = visaApplication.Status + }; + } + + public async Task> GetForApplicantAsync(Guid userId, CancellationToken cancellationToken) { //todo mapper var applicantId = await applicants.GetApplicantIdByUserId(userId, cancellationToken); @@ -31,8 +81,11 @@ public class VisaApplicationRequestsHandler( ForGroup = va.ForGroup, PastVisas = va.PastVisas, RequestDate = va.RequestDate, - PastVisits = va.PastVisits - }).ToList(); + PastVisits = va.PastVisits, + Id = va.Id, + Status = va.Status + }) + .ToList(); } public async Task HandleCreateRequest(Guid userId, VisaApplicationCreateRequest request, CancellationToken cancellationToken) @@ -53,7 +106,8 @@ public class VisaApplicationRequestsHandler( PastVisas = request.PastVisas.ToList(), PastVisits = request.PastVisits.ToList(), ForGroup = request.IsForGroup, - RequestDate = DateTime.Today + RequestDate = DateTime.Today, + Status = ApplicationStatus.Pending }; await applications.AddAsync(visaApplication, cancellationToken); diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationModelForApplicant.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationModelForApplicant.cs index 910b15f..c9b53b9 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationModelForApplicant.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationModelForApplicant.cs @@ -5,6 +5,11 @@ namespace ApplicationLayer.Services.VisaApplications.Models /// Model of public class VisaApplicationModelForApplicant { + /// + public Guid Id { get; set; } + + /// + public ApplicationStatus Status { get; set; } /// public ReentryPermit? ReentryPermit { get; set; } diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationModelForAuthority.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationModelForAuthority.cs new file mode 100644 index 0000000..6cfed9e --- /dev/null +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationModelForAuthority.cs @@ -0,0 +1,47 @@ +using ApplicationLayer.Services.Applicants.Models; +using Domains.VisaApplicationDomain; + +namespace ApplicationLayer.Services.VisaApplications.Models +{ + /// Model of with applicant property + public class VisaApplicationModelForAuthority + { + /// + public Guid Id { get; set; } + + /// Applicant of application + public ApplicantModel Applicant { get; set; } = null!; + + /// + public ApplicationStatus Status { get; set; } + + /// + public ReentryPermit? ReentryPermit { get; set; } + + /// + public string DestinationCountry { get; set; } = null!; + + /// + public List PastVisas { get; set; } = null!; + + /// + public PermissionToDestCountry? PermissionToDestCountry { get; set; } + + public List PastVisits { get; set; } = null!; + + /// + public VisaCategory VisaCategory { get; set; } + + /// + public bool ForGroup { get; set; } + + /// + public RequestedNumberOfEntries RequestedNumberOfEntries { get; set; } + + /// + public DateTime RequestDate { get; set; } + + /// + public int ValidDaysRequested { get; set; } + } +} diff --git a/SchengenVisaApi/Domains/VisaApplicationDomain/ApplicationStatus.cs b/SchengenVisaApi/Domains/VisaApplicationDomain/ApplicationStatus.cs new file mode 100644 index 0000000..a3978a2 --- /dev/null +++ b/SchengenVisaApi/Domains/VisaApplicationDomain/ApplicationStatus.cs @@ -0,0 +1,12 @@ +namespace Domains.VisaApplicationDomain +{ + public enum ApplicationStatus + { + /// Waits for approve + Pending, + Approved, + Rejected, + /// Closed by applicant + Closed + } +} diff --git a/SchengenVisaApi/Domains/VisaApplicationDomain/VisaApplication.cs b/SchengenVisaApi/Domains/VisaApplicationDomain/VisaApplication.cs index 3fbde18..4759c09 100644 --- a/SchengenVisaApi/Domains/VisaApplicationDomain/VisaApplication.cs +++ b/SchengenVisaApi/Domains/VisaApplicationDomain/VisaApplication.cs @@ -11,6 +11,9 @@ public class VisaApplication : IEntity /// Identifier of the public Guid ApplicantId { get; set; } + /// Status of application + public ApplicationStatus Status { get; set; } + /// /// always null if is not a non-resident public ReentryPermit? ReentryPermit { get; set; } @@ -18,9 +21,7 @@ public class VisaApplication : IEntity /// Country that wants to visit public string DestinationCountry { get; set; } = null!; - /// /// List of that applicant had before - /// public List PastVisas { get; set; } = null!; /// Permission to enter the destination country of diff --git a/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs b/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs index 9aa3837..03f2a0e 100644 --- a/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs +++ b/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs @@ -1,4 +1,3 @@ -using System.Security.Claims; using ApplicationLayer.Services.VisaApplications.Handlers; using ApplicationLayer.Services.VisaApplications.Models; using ApplicationLayer.Services.VisaApplications.Requests; @@ -14,18 +13,17 @@ namespace SchengenVisaApi.Controllers; [Route("visaApplication")] public class VisaApplicationController(IVisaApplicationRequestsHandler visaApplicationRequestsHandler) : VisaApiControllerBase { - //todo should return only pending applications //todo should return model /// Returns all applications from DB /// Accessible only for approving authorities [HttpGet] - [ProducesResponseType>(StatusCodes.Status200OK)] + [ProducesResponseType>(StatusCodes.Status200OK)] [ProducesResponseType(StatusCodes.Status403Forbidden)] [ProducesResponseType(StatusCodes.Status401Unauthorized)] [Authorize(policy: PolicyConstants.ApprovingAuthorityPolicy)] public async Task Get(CancellationToken cancellationToken) { - var result = await visaApplicationRequestsHandler.Get(cancellationToken); + var result = await visaApplicationRequestsHandler.GetAllAsync(cancellationToken); return Ok(result); } @@ -41,7 +39,7 @@ public class VisaApplicationController(IVisaApplicationRequestsHandler visaAppli public async Task GetForApplicant(CancellationToken cancellationToken) { var userId = GetUserId(); - var result = await visaApplicationRequestsHandler.GetForApplicant(userId, cancellationToken); + var result = await visaApplicationRequestsHandler.GetForApplicantAsync(userId, cancellationToken); return Ok(result); }