Major update
This commit is contained in:
@@ -3,12 +3,11 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using AutoMapper;
|
||||
using MediatR;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Newtonsoft.Json;
|
||||
using Venues.Entities;
|
||||
using Venues.Filter;
|
||||
using Venues.Models;
|
||||
using Venues.Services;
|
||||
using Venues.Wrappers;
|
||||
using Venues.Queries;
|
||||
|
||||
namespace Venues.Controllers
|
||||
{
|
||||
@@ -16,40 +15,39 @@ namespace Venues.Controllers
|
||||
[Route("api/venues")]
|
||||
public class VenuesController : ControllerBase
|
||||
{
|
||||
private readonly IVenuesRepository _venuesRepository;
|
||||
private readonly IMapper _mapper;
|
||||
const int maxVenuesPerPage = 50;
|
||||
private readonly ISender _sender;
|
||||
|
||||
public VenuesController(IVenuesRepository venuesRepository, IMapper mapper)
|
||||
{
|
||||
_venuesRepository = venuesRepository ?? throw new ArgumentNullException(nameof(venuesRepository));
|
||||
_mapper = mapper ?? throw new ArgumentNullException(nameof(mapper));
|
||||
}
|
||||
public VenuesController(ISender sender) => _sender = sender;
|
||||
|
||||
[HttpGet]
|
||||
public async Task<ActionResult<IEnumerable<VenueDto>>> GetVenues([FromQuery] PaginationFilter filter)
|
||||
public async Task<ActionResult> GetVenues([FromQuery] int pageNumber, [FromQuery] int pageSize)
|
||||
{
|
||||
if (filter.PageSize > maxVenuesPerPage)
|
||||
var venues = await _sender.Send(new GetVenuesQuery
|
||||
{
|
||||
filter.PageSize = maxVenuesPerPage;
|
||||
}
|
||||
PageNumber = pageNumber,
|
||||
PageSize = pageSize
|
||||
});
|
||||
|
||||
var (venueEntities, paginationMetadata) = await _venuesRepository.GetVenuesAsync(filter.PageNumber, filter.PageSize);
|
||||
Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(new
|
||||
{
|
||||
venues.CurrentPage,
|
||||
venues.PageSize,
|
||||
venues.TotalCount,
|
||||
venues.TotalPages
|
||||
}));
|
||||
|
||||
return Ok(new PagedResponse<IEnumerable<VenueDto>>(_mapper.Map<IEnumerable<VenueDto>>(venueEntities), paginationMetadata));
|
||||
return Ok(venues);
|
||||
}
|
||||
|
||||
[HttpGet("{id}")]
|
||||
public async Task<ActionResult<VenueDto>> GetVenue(int id)
|
||||
public async Task<ActionResult> GetVenueById(int id)
|
||||
{
|
||||
var venue = await _venuesRepository.GetVenueAsync(id);
|
||||
|
||||
if (venue == null)
|
||||
var venue = await _sender.Send(new GetVenueByIdQuery
|
||||
{
|
||||
return NotFound();
|
||||
}
|
||||
VenueId = id
|
||||
});
|
||||
|
||||
return Ok(new Response<VenueDto>(_mapper.Map<VenueDto>(venue)));
|
||||
return Ok(venue);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
25
venues/Handlers/GetVenueByIdQueryHandler.cs
Normal file
25
venues/Handlers/GetVenueByIdQueryHandler.cs
Normal file
@@ -0,0 +1,25 @@
|
||||
using System;
|
||||
using MediatR;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Venues.DbContexts;
|
||||
using Venues.Entities;
|
||||
using Venues.Queries;
|
||||
|
||||
namespace Venues.Handlers
|
||||
{
|
||||
public class GetVenueByIdQueryHandler : IRequestHandler<GetVenueByIdQuery, Venue>
|
||||
{
|
||||
private readonly VenuesContext _dbContext;
|
||||
|
||||
public GetVenueByIdQueryHandler(VenuesContext dbContext)
|
||||
{
|
||||
_dbContext = dbContext ?? throw new ArgumentNullException(nameof(dbContext));
|
||||
}
|
||||
|
||||
public async Task<Venue> Handle(GetVenueByIdQuery request, CancellationToken cancellationToken)
|
||||
{
|
||||
return await _dbContext.Venues.Where(x => x.Id == request.VenueId).FirstOrDefaultAsync();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
26
venues/Handlers/GetVenuesQueryHandler.cs
Normal file
26
venues/Handlers/GetVenuesQueryHandler.cs
Normal file
@@ -0,0 +1,26 @@
|
||||
using System;
|
||||
using MediatR;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Venues.DbContexts;
|
||||
using Venues.Entities;
|
||||
using Venues.Helpers;
|
||||
using Venues.Queries;
|
||||
|
||||
namespace Venues.Handlers
|
||||
{
|
||||
public class GetVenuesQueryHandler : IRequestHandler<GetVenuesQuery, PagedList<Venue>>
|
||||
{
|
||||
private readonly VenuesContext _dbContext;
|
||||
|
||||
public GetVenuesQueryHandler(VenuesContext dbContext)
|
||||
{
|
||||
_dbContext = dbContext ?? throw new ArgumentNullException(nameof(dbContext));
|
||||
}
|
||||
|
||||
public async Task<PagedList<Venue>> Handle(GetVenuesQuery request, CancellationToken cancellation)
|
||||
{
|
||||
return PagedList<Venue>.ToPagedList(await _dbContext.Venues.ToListAsync(), request.PageNumber, request.PageSize);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
32
venues/Helpers/PagedList.cs
Normal file
32
venues/Helpers/PagedList.cs
Normal file
@@ -0,0 +1,32 @@
|
||||
using System;
|
||||
namespace Venues.Helpers
|
||||
{
|
||||
public class PagedList<T> : List<T>
|
||||
{
|
||||
public int CurrentPage { get; set; }
|
||||
public int PageSize { get; private set; }
|
||||
public int TotalCount { get; private set; }
|
||||
public int TotalPages { get; private set; }
|
||||
|
||||
public PagedList(List<T> items, int count, int pageNumber, int pageSize)
|
||||
{
|
||||
CurrentPage = pageNumber;
|
||||
PageSize = pageSize;
|
||||
TotalCount = count;
|
||||
TotalPages = (int)Math.Ceiling(count / (double)pageSize);
|
||||
|
||||
AddRange(items);
|
||||
}
|
||||
|
||||
public static PagedList<T> ToPagedList(List<T> source, int pageNumber, int pageSize)
|
||||
{
|
||||
var count = source.Count();
|
||||
var items = source.Skip((pageNumber - 1) * pageSize)
|
||||
.Take(pageSize)
|
||||
.ToList();
|
||||
|
||||
return new PagedList<T>(items, count, pageNumber, pageSize);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using MediatR;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using Serilog;
|
||||
using Venues;
|
||||
using Venues.DbContexts;
|
||||
using Venues.Services;
|
||||
|
||||
Log.Logger = new LoggerConfiguration()
|
||||
.MinimumLevel.Debug()
|
||||
@@ -16,6 +16,8 @@ builder.Host.UseSerilog();
|
||||
|
||||
// Add services to the container.
|
||||
|
||||
builder.Services.AddMediatR(typeof(Program));
|
||||
|
||||
builder.Services.AddControllers(options =>
|
||||
{
|
||||
options.ReturnHttpNotAcceptable = true;
|
||||
@@ -24,14 +26,10 @@ builder.Services.AddControllers(options =>
|
||||
builder.Services.AddEndpointsApiExplorer();
|
||||
builder.Services.AddSwaggerGen();
|
||||
|
||||
builder.Services.AddDbContext<MlbGameDayContext>(dbContextOptions =>
|
||||
builder.Services.AddDbContext<VenuesContext>(dbContextOptions =>
|
||||
dbContextOptions.UseNpgsql(builder.Configuration["ConnectionStrings:DBConnectionString"])
|
||||
);
|
||||
|
||||
builder.Services.AddScoped<IVenuesRepository, VenuesRepository>();
|
||||
|
||||
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
|
||||
|
||||
var app = builder.Build();
|
||||
|
||||
// Configure the HTTP request pipeline.
|
||||
@@ -47,10 +45,7 @@ app.UseRouting();
|
||||
|
||||
app.UseAuthorization();
|
||||
|
||||
app.UseEndpoints(endpoints =>
|
||||
{
|
||||
endpoints.MapControllers();
|
||||
});
|
||||
app.MapControllers();
|
||||
|
||||
app.Run();
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
"commandName": "Project",
|
||||
"launchBrowser": true,
|
||||
"launchUrl": "swagger",
|
||||
"applicationUrl": "https://localhost:7510;http://localhost:5510",
|
||||
"applicationUrl": "https://localhost:7570;http://localhost:5570",
|
||||
"environmentVariables": {
|
||||
"ASPNETCORE_ENVIRONMENT": "Development"
|
||||
}
|
||||
|
||||
12
venues/Queries/GetVenueByIdQuery.cs
Normal file
12
venues/Queries/GetVenueByIdQuery.cs
Normal file
@@ -0,0 +1,12 @@
|
||||
using System;
|
||||
using MediatR;
|
||||
using Venues.Entities;
|
||||
|
||||
namespace Venues.Queries
|
||||
{
|
||||
public record GetVenueByIdQuery : IRequest<Venue>
|
||||
{
|
||||
public int VenueId { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
14
venues/Queries/GetVenuesQuery.cs
Normal file
14
venues/Queries/GetVenuesQuery.cs
Normal file
@@ -0,0 +1,14 @@
|
||||
using System;
|
||||
using MediatR;
|
||||
using Venues.Entities;
|
||||
using Venues.Helpers;
|
||||
|
||||
namespace Venues.Queries
|
||||
{
|
||||
public record GetVenuesQuery : IRequest<PagedList<Venue>>
|
||||
{
|
||||
public int PageNumber { get; set; }
|
||||
public int PageSize { get; set; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -19,11 +19,13 @@
|
||||
<PrivateAssets>all</PrivateAssets>
|
||||
</PackageReference>
|
||||
<PackageReference Include="AutoMapper.Extensions.Microsoft.DependencyInjection" Version="12.0.0" />
|
||||
<PackageReference Include="MediatR" Version="11.1.0" />
|
||||
<PackageReference Include="MediatR.Extensions.Microsoft.DependencyInjection" Version="11.1.0" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.2" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Remove="Controllers\" />
|
||||
<None Remove="Models\" />
|
||||
<None Remove="Serilog.AspNetCore" />
|
||||
<None Remove="Serilog.Sinks.File" />
|
||||
<None Remove="Serilog.Sinks.Console" />
|
||||
@@ -31,20 +33,19 @@
|
||||
<None Remove="Microsoft.EntityFrameworkCore.Tools" />
|
||||
<None Remove="Entities\" />
|
||||
<None Remove="DbContexts\" />
|
||||
<None Remove="Services\" />
|
||||
<None Remove="AutoMapper.Extensions.Microsoft.DependencyInjection" />
|
||||
<None Remove="Profiles\" />
|
||||
<None Remove="Wrappers\" />
|
||||
<None Remove="Filter\" />
|
||||
<None Remove="Commands\" />
|
||||
<None Remove="Handlers\" />
|
||||
<None Remove="Queries\" />
|
||||
<None Remove="Helpers\" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Folder Include="Controllers\" />
|
||||
<Folder Include="Models\" />
|
||||
<Folder Include="Entities\" />
|
||||
<Folder Include="DbContexts\" />
|
||||
<Folder Include="Services\" />
|
||||
<Folder Include="Profiles\" />
|
||||
<Folder Include="Wrappers\" />
|
||||
<Folder Include="Filter\" />
|
||||
<Folder Include="Commands\" />
|
||||
<Folder Include="Handlers\" />
|
||||
<Folder Include="Queries\" />
|
||||
<Folder Include="Helpers\" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
},
|
||||
"AllowedHosts": "*",
|
||||
"ConnectionStrings": {
|
||||
"DBConnectionString": "Host=localhost;Database=mlb-game-day;Username=postgres;Password=postgres"
|
||||
"DBConnectionString": "Host=localhost;Port=5470;Database=venues;Username=postgres;Password=postgres"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user