Major update
This commit is contained in:
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
{
|
||||
}
|
||||
|
||||
25
teams/Handlers/GetTeamByIdQueryHandler.cs
Normal file
25
teams/Handlers/GetTeamByIdQueryHandler.cs
Normal 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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
26
teams/Handlers/GetTeamsQueryHandler.cs
Normal file
26
teams/Handlers/GetTeamsQueryHandler.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
32
teams/Helpers/PagedList.cs
Normal file
32
teams/Helpers/PagedList.cs
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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();
|
||||
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
|
||||
12
teams/Queries/GetTeamByIdQuery.cs
Normal file
12
teams/Queries/GetTeamByIdQuery.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
|
||||
14
teams/Queries/GetTeamsQuery.cs
Normal file
14
teams/Queries/GetTeamsQuery.cs
Normal 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; }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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"
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user