Major update

This commit is contained in:
2023-06-01 08:52:05 -05:00
parent d7c0f373f4
commit df84287eb2
264 changed files with 8614 additions and 964 deletions

View File

@@ -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);
}
}
}

View 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();
}
}
}

View 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);
}
}
}

View 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);
}
}
}

View File

@@ -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();

View File

@@ -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"
}

View 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; }
}
}

View 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; }
}
}

View File

@@ -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>

View File

@@ -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"
}
}