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

@@ -1,9 +1,8 @@
using AutoMapper;
using MediatR;
using Microsoft.AspNetCore.Mvc;
using Teams.Filter;
using Teams.Models;
using Teams.Services;
using Teams.Wrappers;
using Newtonsoft.Json;
using Teams.Entities;
using Teams.Queries;
namespace Teams.Controllers;
@@ -11,40 +10,39 @@ namespace Teams.Controllers;
[Route("api/teams")]
public class TeamsController : ControllerBase
{
private readonly ITeamsRepository _teamsRepository;
private readonly IMapper _mapper;
const int maxTeamsPerPage = 50;
private readonly ISender _sender;
public TeamsController(ITeamsRepository teamsRepository, IMapper mapper)
{
_teamsRepository = teamsRepository ?? throw new ArgumentNullException(nameof(teamsRepository));
_mapper = mapper ?? throw new ArgumentNullException(nameof(mapper));
}
public TeamsController(ISender sender) => _sender = sender;
[HttpGet]
public async Task<ActionResult<IEnumerable<TeamDto>>> GetTeams([FromQuery] PaginationFilter filter)
public async Task<ActionResult> GetTeams([FromQuery] int pageNumber, [FromQuery] int pageSize)
{
if (filter.PageSize > maxTeamsPerPage)
var teams = await _sender.Send(new GetTeamsQuery
{
filter.PageSize = maxTeamsPerPage;
}
PageNumber = pageNumber,
PageSize = pageSize
});
var (teamsEntities, pageinationMetadata) = await _teamsRepository.GetTeamsAsync(filter.PageNumber, filter.PageSize);
Response.Headers.Add("X-Pagination", JsonConvert.SerializeObject(new
{
teams.CurrentPage,
teams.PageSize,
teams.TotalCount,
teams.TotalPages
}));
return Ok(new PagedResponse<IEnumerable<TeamDto>>(_mapper.Map<IEnumerable<TeamDto>>(teamsEntities), pageinationMetadata));
return Ok(teams);
}
[HttpGet("{id}")]
public async Task<ActionResult<TeamDto>> GetTeam(int id)
public async Task<ActionResult> GetTeamById(int id)
{
var team = await _teamsRepository.GetTeamAsync(id);
if (team == null)
var team = await _sender.Send(new GetTeamByIdQuery
{
return NotFound();
}
TeamId = id
});
return Ok(new Response<TeamDto>(_mapper.Map<TeamDto>(team)));
return Ok(team);
}
}

View File

@@ -6,13 +6,13 @@ using Teams.Entities;
namespace Teams.DbContexts
{
public partial class MlbGameDayContext : DbContext
public partial class TeamsContext : DbContext
{
public MlbGameDayContext()
public TeamsContext()
{
}
public MlbGameDayContext(DbContextOptions<MlbGameDayContext> options)
public TeamsContext(DbContextOptions<TeamsContext> options)
: base(options)
{
}

View File

@@ -0,0 +1,25 @@
using System;
using MediatR;
using Microsoft.EntityFrameworkCore;
using Teams.DbContexts;
using Teams.Entities;
using Teams.Queries;
namespace Teams.Handlers
{
public class GetTeamByIdQueryHandler : IRequestHandler<GetTeamByIdQuery, Team>
{
private readonly TeamsContext _dbContext;
public GetTeamByIdQueryHandler(TeamsContext dbContext)
{
_dbContext = dbContext ?? throw new ArgumentNullException(nameof(dbContext));
}
public async Task<Team> Handle(GetTeamByIdQuery request, CancellationToken cancellationToken)
{
return await _dbContext.Teams.Where(x => x.Id == request.TeamId).FirstOrDefaultAsync();
}
}
}

View File

@@ -0,0 +1,26 @@
using System;
using MediatR;
using Microsoft.EntityFrameworkCore;
using Teams.DbContexts;
using Teams.Entities;
using Teams.Helpers;
using Teams.Queries;
namespace Teams.Handlers
{
public class GetTeamsQueryHandler : IRequestHandler<GetTeamsQuery, PagedList<Team>>
{
private readonly TeamsContext _dbContext;
public GetTeamsQueryHandler(TeamsContext dbContext)
{
_dbContext = dbContext ?? throw new ArgumentNullException(nameof(dbContext));
}
public async Task<PagedList<Team>> Handle(GetTeamsQuery request, CancellationToken cancellation)
{
return PagedList<Team>.ToPagedList(await _dbContext.Teams.ToListAsync(), request.PageNumber, request.PageSize);
}
}
}

View File

@@ -0,0 +1,32 @@
using System;
namespace Teams.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,7 @@
using Microsoft.EntityFrameworkCore;
using MediatR;
using Microsoft.EntityFrameworkCore;
using Serilog;
using Teams;
using Teams.DbContexts;
using Teams.Services;
Log.Logger = new LoggerConfiguration()
.MinimumLevel.Debug()
@@ -16,22 +15,17 @@ builder.Host.UseSerilog();
// Add services to the container.
builder.Services.AddControllers(options =>
{
options.ReturnHttpNotAcceptable = true;
}).AddXmlDataContractSerializerFormatters();
builder.Services.AddMediatR(typeof(Program));
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
builder.Services.AddDbContext<MlbGameDayContext>(dbContextOptions =>
builder.Services.AddDbContext<TeamsContext>(dbContextOptions =>
dbContextOptions.UseNpgsql(builder.Configuration["ConnectionStrings:DBConnectionString"])
);
builder.Services.AddScoped<ITeamsRepository, TeamsRepository>();
builder.Services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
var app = builder.Build();
// Configure the HTTP request pipeline.
@@ -47,10 +41,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:7520;http://localhost:5520",
"applicationUrl": "https://localhost:7540;http://localhost:5540",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}

View File

@@ -0,0 +1,12 @@
using System;
using MediatR;
using Teams.Entities;
namespace Teams.Queries
{
public record GetTeamByIdQuery : IRequest<Team>
{
public int TeamId { get; set; }
}
}

View File

@@ -0,0 +1,14 @@
using System;
using MediatR;
using Teams.Entities;
using Teams.Helpers;
namespace Teams.Queries
{
public record GetTeamsQuery : IRequest<PagedList<Team>>
{
public int PageNumber { get; set; }
public int PageSize { get; set; }
}
}

View File

@@ -18,17 +18,14 @@
<PackageReference Include="Serilog.AspNetCore" Version="6.1.0" />
<PackageReference Include="Serilog.Sinks.Console" Version="4.1.0" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
<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="Entities\" />
<None Remove="Models\" />
<None Remove="DbContexts\" />
<None Remove="Filter\" />
<None Remove="Profiles\" />
<None Remove="Services\" />
<None Remove="Wrappers\" />
<None Remove="Microsoft.EntityFrameworkCore" />
<None Remove="Microsoft.EntityFrameworkCore.Tools" />
<None Remove="Npgsql.EntityFrameworkCore.PostgreSQL" />
@@ -36,15 +33,18 @@
<None Remove="Serilog.Sinks.Console" />
<None Remove="Serilog.Sinks.File" />
<None Remove="AutoMapper.Extensions.Microsoft.DependencyInjection" />
<None Remove="Commands\" />
<None Remove="Handlers\" />
<None Remove="Queries\" />
<None Remove="Helpers\" />
</ItemGroup>
<ItemGroup>
<Folder Include="Entities\" />
<Folder Include="Models\" />
<Folder Include="DbContexts\" />
<Folder Include="Entities\" />
<Folder Include="Filter\" />
<Folder Include="Profiles\" />
<Folder Include="Services\" />
<Folder Include="Wrappers\" />
<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=5450;Database=teams;Username=postgres;Password=postgres"
}
}