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