| @@ -0,0 +1,37 @@ | |||
| namespace Diligent.WebAPI.Business.Extensions | |||
| { | |||
| public static class SelectionProcessExtensions | |||
| { | |||
| public static List<SelectionLevel> FilterLevels(this List<SelectionLevel> query, SelectionProcessFilterDto filter) | |||
| { | |||
| var filteredLevels = new List<SelectionLevel>(); | |||
| // If filters are empty | |||
| if ((filter == null) || (!filter.DateStart.HasValue && !filter.DateEnd.HasValue && filter.Statuses != null && filter.Statuses.Length == 0)) | |||
| return query; | |||
| foreach (var level in query) | |||
| { | |||
| List<SelectionProcess> selectionProcesses = level.SelectionProcesses; | |||
| if (filter.DateStart.HasValue) | |||
| { | |||
| selectionProcesses = level.SelectionProcesses.Where(sp => sp.Date >= filter.DateStart.Value).ToList(); | |||
| } | |||
| if (filter.DateEnd.HasValue) | |||
| { | |||
| selectionProcesses = selectionProcesses.Where(sp => sp.Date <= filter.DateEnd.Value).ToList(); | |||
| } | |||
| var filteredLevel = new SelectionLevel { Id = level.Id, Name = level.Name, SelectionProcesses = level.SelectionProcesses}; | |||
| if(filter.Statuses != null && filter.Statuses.Length > 0) { | |||
| filteredLevel.SelectionProcesses = selectionProcesses.Where(f => filter.Statuses.Contains(f.Status)).ToList(); | |||
| } | |||
| filteredLevels.Add(filteredLevel); | |||
| } | |||
| return filteredLevels; | |||
| } | |||
| } | |||
| } | |||
| @@ -8,5 +8,6 @@ namespace Diligent.WebAPI.Business.Services.Interfaces | |||
| { | |||
| Task<List<SelectionLevelResponseWithDataDto>> GetAllAsync(); | |||
| Task<SelectionLevelResposneDto> GetByIdAsync(int id); | |||
| List<SelectionLevelResponseWithDataDto> GetFilteredLevelsAsync(SelectionProcessFilterDto filters); | |||
| } | |||
| } | |||
| @@ -1,5 +1,5 @@ | |||
| using Diligent.WebAPI.Contracts.DTOs.SelectionLevel; | |||
| using Diligent.WebAPI.Contracts.DTOs.SelectionProcess; | |||
| using Diligent.WebAPI.Business.Extensions; | |||
| using Diligent.WebAPI.Contracts.DTOs.SelectionLevel; | |||
| namespace Diligent.WebAPI.Business.Services | |||
| { | |||
| @@ -27,5 +27,12 @@ namespace Diligent.WebAPI.Business.Services | |||
| return _mapper.Map<SelectionLevelResposneDto>(sl); | |||
| } | |||
| public List<SelectionLevelResponseWithDataDto> GetFilteredLevelsAsync(SelectionProcessFilterDto filters) | |||
| { | |||
| var filteredLevels = _context.SelectionLevels.Include(x => x.SelectionProcesses).ThenInclude(sp => sp.Applicant).ToList().FilterLevels(filters); | |||
| return _mapper.Map<List<SelectionLevelResponseWithDataDto>>(filteredLevels); | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,9 @@ | |||
| namespace Diligent.WebAPI.Contracts.DTOs.Ad | |||
| { | |||
| public class SelectionProcessFilterDto | |||
| { | |||
| public string[]? Statuses { get; set; } | |||
| public DateTime? DateStart { get; set; } | |||
| public DateTime? DateEnd { get; set; } | |||
| } | |||
| } | |||
| @@ -16,6 +16,10 @@ | |||
| public async Task<IActionResult> GetAll() => | |||
| Ok(await _selectionLevelService.GetAllAsync()); | |||
| [HttpGet("filtered")] | |||
| public async Task<IActionResult> GetFilteredLevels([FromQuery] SelectionProcessFilterDto request) => | |||
| Ok(_selectionLevelService.GetFilteredLevelsAsync(request)); | |||
| [Authorize] | |||
| [HttpGet("{id}")] | |||
| public async Task<IActionResult> GetById([FromRoute] int id) => | |||
| @@ -1,6 +1,7 @@ | |||
| using AutoMapper; | |||
| using Diligent.WebAPI.Business.MappingProfiles; | |||
| using Diligent.WebAPI.Business.Services; | |||
| using Diligent.WebAPI.Contracts.DTOs.Ad; | |||
| using Diligent.WebAPI.Contracts.DTOs.Applicant; | |||
| using Diligent.WebAPI.Contracts.DTOs.SelectionLevel; | |||
| using Diligent.WebAPI.Contracts.Exceptions; | |||
| @@ -27,6 +28,7 @@ namespace Diligent.WebAPI.Tests.Services | |||
| new List<Profile> | |||
| { | |||
| new SelectionLevelMappingProfile(), | |||
| new SelectionProcessMappingProfile(), | |||
| })); | |||
| _mapper = new Mapper(configuration); | |||
| } | |||
| @@ -42,6 +44,32 @@ namespace Diligent.WebAPI.Tests.Services | |||
| result.Should().HaveCount(4); | |||
| } | |||
| [Fact] | |||
| public async Task GetFilteredData_ShouldReturnListOfLevels_Always() | |||
| { | |||
| var databaseContext = await Helpers<SelectionLevel>.GetDatabaseContext(_levels); | |||
| databaseContext.SelectionLevels.First().SelectionProcesses = new List<SelectionProcess> | |||
| { | |||
| new SelectionProcess{ Id = 1, Status = "Obrađen", Date = DateTime.Now}, | |||
| new SelectionProcess{ Id = 2, Status = "Obrađen", Date = DateTime.Now.AddMonths(-1)}, | |||
| new SelectionProcess{ Id = 3, Status = "Čeka na zakazivanje", Date = DateTime.Now}, | |||
| new SelectionProcess{ Id = 4, Status = "Čeka na zakazivanje", Date = DateTime.Now.AddMonths(-1)}, | |||
| }; | |||
| SelectionLevelService service = new(databaseContext, _mapper); | |||
| var filter = new SelectionProcessFilterDto | |||
| { | |||
| DateStart = DateTime.Now.AddDays(-1), | |||
| DateEnd = DateTime.Now.AddDays(1), | |||
| Statuses = new string[]{ "Obrađen", "Zakazan" } | |||
| }; | |||
| var result = service.GetFilteredLevelsAsync(filter); | |||
| result.Should().HaveCount(4); | |||
| result.First().SelectionProcesses.Should().HaveCount(1); | |||
| } | |||
| [Fact] | |||
| public async Task GetById_ShouldReturnLevel_WhenLevelExist() | |||
| { | |||