diff --git a/SchengenVisaApi/ApplicationLayer/GeneralNeededServices/IDateTimeProvider.cs b/SchengenVisaApi/ApplicationLayer/GeneralNeededServices/IDateTimeProvider.cs index 29903d6..5395cce 100644 --- a/SchengenVisaApi/ApplicationLayer/GeneralNeededServices/IDateTimeProvider.cs +++ b/SchengenVisaApi/ApplicationLayer/GeneralNeededServices/IDateTimeProvider.cs @@ -1,7 +1,7 @@ namespace ApplicationLayer.GeneralNeededServices { public interface IDateTimeProvider - { + {//todo rename folder /// Returns current date and time DateTime Now(); } diff --git a/SchengenVisaApi/ApplicationLayer/Services/Applicants/NeededServices/IApplicantsRepository.cs b/SchengenVisaApi/ApplicationLayer/Services/Applicants/NeededServices/IApplicantsRepository.cs index 43dc538..36ed62d 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/Applicants/NeededServices/IApplicantsRepository.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/Applicants/NeededServices/IApplicantsRepository.cs @@ -8,4 +8,7 @@ public interface IApplicantsRepository : IGenericRepository { /// Find by Identifier Task FindByUserIdAsync(Guid userId, CancellationToken cancellationToken); + + /// Get identifier of applicant by user identifier + Task GetApplicantIdByUserId(Guid userId, CancellationToken cancellationToken); } diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/IVisaApplicationRequestsHandler.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/IVisaApplicationRequestsHandler.cs index 0cceb02..616591c 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/IVisaApplicationRequestsHandler.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/IVisaApplicationRequestsHandler.cs @@ -1,4 +1,5 @@ -using ApplicationLayer.Services.VisaApplications.Requests; +using ApplicationLayer.Services.VisaApplications.Models; +using ApplicationLayer.Services.VisaApplications.Requests; using Domains.VisaApplicationDomain; namespace ApplicationLayer.Services.VisaApplications.Handlers; @@ -6,6 +7,7 @@ namespace ApplicationLayer.Services.VisaApplications.Handlers; public interface IVisaApplicationRequestsHandler { Task> Get(CancellationToken cancellationToken); + Task> GetForApplicant(Guid userId, CancellationToken cancellationToken); - void HandleCreateRequest(Guid userId, VisaApplicationCreateRequest request, CancellationToken cancellationToken); + 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 c1fdb34..84efd98 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/VisaApplicationRequestsHandler.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Handlers/VisaApplicationRequestsHandler.cs @@ -17,7 +17,28 @@ public class VisaApplicationRequestsHandler( { public async Task> Get(CancellationToken cancellationToken) => await applications.GetAllAsync(cancellationToken); - public async void HandleCreateRequest(Guid userId, VisaApplicationCreateRequest request, CancellationToken cancellationToken) + public async Task> GetForApplicant(Guid userId, CancellationToken cancellationToken) + { + //todo mapper + var applicantId = await applicants.GetApplicantIdByUserId(userId, cancellationToken); + var visaApplications = await applications.GetOfApplicantAsync(applicantId, cancellationToken); + return visaApplications.Select(va => new VisaApplicationModelForApplicant + { + DestinationCountry = va.DestinationCountry.Name, + ValidDaysRequested = va.ValidDaysRequested, + ReentryPermit = va.ReentryPermit, + VisaCategory = va.VisaCategory, + RequestedNumberOfEntries = va.RequestedNumberOfEntries, + PermissionToDestCountry = va.PermissionToDestCountry, + ForGroup = va.ForGroup, + PastVisas = va.PastVisas, + RequestDate = va.RequestDate, + PastVisits = va.PastVisits.Select(pv => + new PastVisitModel { DestinationCountry = pv.DestinationCountry.Name, StartDate = pv.StartDate, EndDate = pv.EndDate }).ToList() + }).ToList(); + } + + public async Task HandleCreateRequest(Guid userId, VisaApplicationCreateRequest request, CancellationToken cancellationToken) { //TODO fix //TODO mapper @@ -45,13 +66,13 @@ public class VisaApplicationRequestsHandler( await unitOfWork.SaveAsync(cancellationToken); } - private async Task ConvertPastVisitModelToPastVisit(PastVisitModel model, CancellationToken cancellationToken) + private async Task ConvertPastVisitModelToPastVisit(PastVisitModelForRequest modelForRequest, CancellationToken cancellationToken) { return new PastVisit { - DestinationCountry = await countries.GetByIdAsync(model.DestinationCountryId, cancellationToken), - StartDate = model.StartDate, - EndDate = model.EndDate + DestinationCountry = await countries.GetByIdAsync(modelForRequest.DestinationCountryId, cancellationToken), + StartDate = modelForRequest.StartDate, + EndDate = modelForRequest.EndDate }; } } diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PastVisitModel.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PastVisitModel.cs index 9b31e45..55d7010 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PastVisitModel.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PastVisitModel.cs @@ -1,14 +1,18 @@ -namespace ApplicationLayer.Services.VisaApplications.Models +using Domains.LocationDomain; +using Domains.VisaApplicationDomain; + +namespace ApplicationLayer.Services.VisaApplications.Models { + /// Model of with only name of the destination country public class PastVisitModel { - /// First day of + /// public DateTime StartDate { get; set; } - /// Last day of + /// public DateTime EndDate { get; set; } - /// Identifier of destination country of - public Guid DestinationCountryId { get; set; } + /// + public string DestinationCountry { get; set; } = null!; } } diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PastVisitModelForRequest.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PastVisitModelForRequest.cs new file mode 100644 index 0000000..81b3c8f --- /dev/null +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/PastVisitModelForRequest.cs @@ -0,0 +1,17 @@ +using Domains.VisaApplicationDomain; + +namespace ApplicationLayer.Services.VisaApplications.Models +{ + /// Model of with only identifier of country + public class PastVisitModelForRequest + { + /// First day of + public DateTime StartDate { get; set; } + + /// Last day of + public DateTime EndDate { get; set; } + + /// Identifier of destination country of + public Guid DestinationCountryId { get; set; } + } +} diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationModelForApplicant.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationModelForApplicant.cs new file mode 100644 index 0000000..f1f85e2 --- /dev/null +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Models/VisaApplicationModelForApplicant.cs @@ -0,0 +1,40 @@ +using Domains.ApplicantDomain; +using Domains.LocationDomain; +using Domains.VisaApplicationDomain; + +namespace ApplicationLayer.Services.VisaApplications.Models +{ + /// Model of + public class VisaApplicationModelForApplicant + { + + /// + 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/ApplicationLayer/Services/VisaApplications/NeededServices/IVisaApplicationsRepository.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/NeededServices/IVisaApplicationsRepository.cs index 298c0dd..bb0b2a0 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/NeededServices/IVisaApplicationsRepository.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/NeededServices/IVisaApplicationsRepository.cs @@ -3,4 +3,8 @@ using Domains.VisaApplicationDomain; namespace ApplicationLayer.Services.VisaApplications.NeededServices; -public interface IVisaApplicationsRepository : IGenericRepository; \ No newline at end of file +public interface IVisaApplicationsRepository : IGenericRepository +{ + /// Get applications of one applicant + Task> GetOfApplicantAsync(Guid applicantId, CancellationToken cancellationToken); +} diff --git a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Requests/VisaApplicationCreateRequest.cs b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Requests/VisaApplicationCreateRequest.cs index 97982fc..d14f53e 100644 --- a/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Requests/VisaApplicationCreateRequest.cs +++ b/SchengenVisaApi/ApplicationLayer/Services/VisaApplications/Requests/VisaApplicationCreateRequest.cs @@ -13,5 +13,5 @@ public record VisaApplicationCreateRequest( int ValidDaysRequested, PastVisa[] PastVisas, PermissionToDestCountry? PermissionToDestCountry, - PastVisitModel[] PastVisits + PastVisitModelForRequest[] PastVisits ); diff --git a/SchengenVisaApi/Infrastructure/Database/Applicants/Repositories/ApplicantsRepository.cs b/SchengenVisaApi/Infrastructure/Database/Applicants/Repositories/ApplicantsRepository.cs index 63d16cb..750d13b 100644 --- a/SchengenVisaApi/Infrastructure/Database/Applicants/Repositories/ApplicantsRepository.cs +++ b/SchengenVisaApi/Infrastructure/Database/Applicants/Repositories/ApplicantsRepository.cs @@ -25,4 +25,10 @@ public sealed class ApplicantsRepository(IGenericReader reader, IGenericWriter w var result = await LoadDomain().SingleOrDefaultAsync(a => a.UserId == userId, cancellationToken); return result ?? throw new ApplicantNotFoundByUserIdException(userId); } + + async Task IApplicantsRepository.GetApplicantIdByUserId(Guid userId, CancellationToken cancellationToken) + { + var result = await base.LoadDomain().SingleOrDefaultAsync(a => a.UserId == userId, cancellationToken); + return result?.Id ?? throw new ApplicantNotFoundByUserIdException(userId); + } } diff --git a/SchengenVisaApi/Infrastructure/Database/VisaApplications/Repositories/VisaApplicationsRepository.cs b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Repositories/VisaApplicationsRepository.cs index f0c0df4..4878c99 100644 --- a/SchengenVisaApi/Infrastructure/Database/VisaApplications/Repositories/VisaApplicationsRepository.cs +++ b/SchengenVisaApi/Infrastructure/Database/VisaApplications/Repositories/VisaApplicationsRepository.cs @@ -9,10 +9,12 @@ public sealed class VisaApplicationsRepository(IGenericReader reader, IGenericWr : GenericRepository(reader, writer), IVisaApplicationsRepository { protected override IQueryable LoadDomain() - { - return base.LoadDomain() - .Include(a => a.DestinationCountry) - .Include(a => a.PastVisas) - .Include(a => a.PastVisits); - } + => base.LoadDomain() + .Include(va => va.DestinationCountry) + .Include(va => va.PastVisas) + .Include(va => va.PastVisits); + + + async Task> IVisaApplicationsRepository.GetOfApplicantAsync(Guid applicantId, CancellationToken cancellationToken) + => await LoadDomain().Where(va => va.ApplicantId == applicantId).ToListAsync(cancellationToken); } diff --git a/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs b/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs index 44214a5..1bab610 100644 --- a/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs +++ b/SchengenVisaApi/SchengenVisaApi/Controllers/VisaApplicationController.cs @@ -19,11 +19,24 @@ public class VisaApplicationController(IVisaApplicationRequestsHandler visaAppli return Ok(result); } + [HttpGet] + [Authorize(policy: PolicyConstants.ApplicantPolicy)] + [Route("OfApplicant")] + public async Task GetForApplicant(CancellationToken cancellationToken) + { + var userId = GetUserId(); + var result = await visaApplicationRequestsHandler.GetForApplicant(userId, cancellationToken); + return Ok(result); + } + [HttpPost] [Authorize(policy: PolicyConstants.ApplicantPolicy)] - public void Create(VisaApplicationCreateRequest request, CancellationToken cancellationToken) + public async Task Create(VisaApplicationCreateRequest request, CancellationToken cancellationToken) { - var userId = Guid.Parse(HttpContext.User.Claims.First(c => c.Type == ClaimTypes.NameIdentifier).Value); - visaApplicationRequestsHandler.HandleCreateRequest(userId, request, cancellationToken); + var userId = GetUserId(); + await visaApplicationRequestsHandler.HandleCreateRequest(userId, request, cancellationToken); + return Created(); } + + private Guid GetUserId() => Guid.Parse(HttpContext.User.Claims.First(c => c.Type == ClaimTypes.NameIdentifier).Value); }