From 60d1713a94170a6f5a4d3f9e80c99369eae3351e Mon Sep 17 00:00:00 2001 From: "Collin M. Barrett" Date: Tue, 25 Aug 2020 08:04:13 -0500 Subject: [PATCH] =?UTF-8?q?feat(directory):=20=E2=9C=A8=20add=20GET=20main?= =?UTF-8?q?tainers=20endpoint?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/MaintainersController.cs | 26 ++++++++ .../Queries/GetMaintainers.cs | 62 +++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 services/directory/src/FilterLists.Directory.Api/Controllers/MaintainersController.cs create mode 100644 services/directory/src/FilterLists.Directory.Application/Queries/GetMaintainers.cs diff --git a/services/directory/src/FilterLists.Directory.Api/Controllers/MaintainersController.cs b/services/directory/src/FilterLists.Directory.Api/Controllers/MaintainersController.cs new file mode 100644 index 000000000..95d969c1a --- /dev/null +++ b/services/directory/src/FilterLists.Directory.Api/Controllers/MaintainersController.cs @@ -0,0 +1,26 @@ +using System.Threading; +using System.Threading.Tasks; +using FilterLists.Directory.Application.Queries; +using MediatR; +using Microsoft.AspNetCore.Mvc; + +namespace FilterLists.Directory.Api.Controllers +{ + [ApiController] + [Route("v1/[controller]")] + public class MaintainersController : ControllerBase + { + private readonly IMediator _mediator; + + public MaintainersController(IMediator mediator) + { + _mediator = mediator; + } + + [HttpGet] + public async Task Get(CancellationToken cancellationToken) + { + return Ok(await _mediator.Send(new GetMaintainers.Query(), cancellationToken)); + } + } +} \ No newline at end of file diff --git a/services/directory/src/FilterLists.Directory.Application/Queries/GetMaintainers.cs b/services/directory/src/FilterLists.Directory.Application/Queries/GetMaintainers.cs new file mode 100644 index 000000000..8723fdca7 --- /dev/null +++ b/services/directory/src/FilterLists.Directory.Application/Queries/GetMaintainers.cs @@ -0,0 +1,62 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using AutoMapper; +using AutoMapper.QueryableExtensions; +using FilterLists.Directory.Infrastructure.Persistence.Queries.Context; +using FilterLists.Directory.Infrastructure.Persistence.Queries.Entities; +using MediatR; +using Microsoft.EntityFrameworkCore; + +namespace FilterLists.Directory.Application.Queries +{ + public static class GetMaintainers + { + public class Query : IRequest> + { + } + + public class Handler : IRequestHandler> + { + private readonly IQueryContext _context; + private readonly IMapper _mapper; + + public Handler(IQueryContext context, IMapper mapper) + { + _context = context; + _mapper = mapper; + } + + public async Task> Handle( + Query request, + CancellationToken cancellationToken) + { + return await _context.Maintainers + .ProjectTo(_mapper.ConfigurationProvider) + .ToListAsync(cancellationToken); + } + } + + public class MaintainerViewModelProfile : Profile + { + public MaintainerViewModelProfile() + { + CreateMap() + .ForMember(m => m.FilterListIds, + o => o.MapFrom(m => m.FilterListMaintainers.Select(fl => fl.FilterList.Id))); + } + } + + public class MaintainerViewModel + { + public int Id { get; set; } + public string Name { get; set; } = null!; + public Uri? Url { get; set; } + public string? EmailAddress { get; set; } + public string? TwitterHandle { get; set; } + public IEnumerable? FilterListIds { get; set; } + } + } +} \ No newline at end of file