Skip to content

Commit

Permalink
feat(ranks): implement ranks update
Browse files Browse the repository at this point in the history
  • Loading branch information
CarlosPavajeau committed Nov 5, 2021
1 parent 83dad59 commit aee511b
Show file tree
Hide file tree
Showing 10 changed files with 162 additions and 0 deletions.
18 changes: 18 additions & 0 deletions src/Armory.Api/Controllers/Ranks/RanksController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
using Armory.Ranks.Application.Create;
using Armory.Ranks.Application.Find;
using Armory.Ranks.Application.SearchAll;
using Armory.Ranks.Application.Update;
using Armory.Ranks.Domain;
using AutoMapper;
using MediatR;
using Microsoft.AspNetCore.Authorization;
Expand Down Expand Up @@ -68,5 +70,21 @@ public async Task<ActionResult<RankResponse>> GetRank(int id)

return RankNotFound(id);
}

[HttpGet("{id:int}")]
public async Task<ActionResult> UpdateRank(int id, [FromBody] UpdateRankRequest request)
{
try
{
var command = _mapper.Map<UpdateRankCommand>(request);
await _mediator.Send(command);
}
catch (RankNotFoundException)
{
return RankNotFound(id);
}

return Ok();
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
namespace Armory.Api.Controllers.Ranks.Requests
{
public class UpdateRankRequest
{
public int Id { get; set; }
public string Name { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
using Armory.Api.Controllers.Ranks.Requests;
using FluentValidation;

namespace Armory.Api.Controllers.Ranks.Validators
{
public class UpdateRankRequestValidator : AbstractValidator<UpdateRankRequest>
{
public UpdateRankRequestValidator()
{
RuleFor(m => m.Id)
.NotNull();

RuleFor(m => m.Name)
.NotNull()
.NotEmpty()
.MaximumLength(256)
.WithName("Nombre");
}
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
using Armory.Ranks.Application.Create;
using Armory.Ranks.Application.Find;
using Armory.Ranks.Application.SearchAll;
using Armory.Ranks.Application.Update;
using Microsoft.Extensions.DependencyInjection;

namespace Armory.Api.Extensions.DependencyInjection.Ranks
Expand All @@ -12,6 +13,7 @@ public static IServiceCollection AddRanksApplication(this IServiceCollection ser
services.AddScoped<RankCreator, RankCreator>();
services.AddScoped<RankFinder, RankFinder>();
services.AddScoped<AllRanksSearcher, AllRanksSearcher>();
services.AddScoped<RankUpdater, RankUpdater>();

return services;
}
Expand Down
2 changes: 2 additions & 0 deletions src/Armory.Api/Profiles/RanksProfile.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Armory.Api.Controllers.Ranks.Requests;
using Armory.Ranks.Application.Create;
using Armory.Ranks.Application.Update;
using AutoMapper;

namespace Armory.Api.Profiles
Expand All @@ -9,6 +10,7 @@ public class RanksProfile : Profile
public RanksProfile()
{
CreateMap<CreateRankRequest, CreateRankCommand>();
CreateMap<UpdateRankRequest, UpdateRankCommand>();
}
}
}
22 changes: 22 additions & 0 deletions src/Armory/Ranks/Application/Update/RankUpdater.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
using System.Threading.Tasks;
using Armory.Ranks.Domain;
using Armory.Shared.Domain.Persistence.EntityFramework;

namespace Armory.Ranks.Application.Update
{
public class RankUpdater
{
private readonly IUnitWork _unitWork;

public RankUpdater(IUnitWork unitWork)
{
_unitWork = unitWork;
}

public async Task Update(Rank rank, string newName)
{
rank.Name = newName;
await _unitWork.SaveChanges();
}
}
}
10 changes: 10 additions & 0 deletions src/Armory/Ranks/Application/Update/UpdateRankCommand.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using Armory.Shared.Domain.Bus.Command;

namespace Armory.Ranks.Application.Update
{
public class UpdateRankCommand : Command
{
public int Id { get; init; }
public string Name { get; init; }
}
}
31 changes: 31 additions & 0 deletions src/Armory/Ranks/Application/Update/UpdateRankCommandHandler.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using System.Threading;
using System.Threading.Tasks;
using Armory.Ranks.Application.Find;
using Armory.Ranks.Domain;
using Armory.Shared.Domain.Bus.Command;

namespace Armory.Ranks.Application.Update
{
public class UpdateRankCommandHandler : CommandHandler<UpdateRankCommand>
{
private readonly RankFinder _finder;
private readonly RankUpdater _updater;

public UpdateRankCommandHandler(RankFinder finder, RankUpdater updater)
{
_finder = finder;
_updater = updater;
}

protected override async Task Handle(UpdateRankCommand request, CancellationToken cancellationToken)
{
var rank = await _finder.Find(request.Id);
if (rank is null)
{
throw new RankNotFoundException();
}

await _updater.Update(rank, request.Name);
}
}
}
11 changes: 11 additions & 0 deletions src/Armory/Ranks/Domain/RankNotFoundException.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using Armory.Shared.Domain;

namespace Armory.Ranks.Domain
{
/// <summary>
/// Represents errors that occur when rank is not found
/// </summary>
public class RankNotFoundException : ArmoryException
{
}
}
38 changes: 38 additions & 0 deletions test/Armory.Api.Test/Controllers/Ranks/RanksControllerTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,11 @@
using Armory.Ranks.Application.Create;
using Armory.Ranks.Application.Find;
using Armory.Ranks.Application.SearchAll;
using Armory.Ranks.Application.Update;
using Armory.Ranks.Domain;
using AutoMapper;
using FluentAssertions;
using MediatR;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
Expand Down Expand Up @@ -117,5 +121,39 @@ public async Task Get_A_Non_Existent_Rank()
Assert.IsTrue(errors.Any());
Assert.AreEqual("No se encontró ningun rango con el código '2'.", errors[0]);
}

[Test]
[Order(6)]
public async Task UpdateRank_ShouldUpdateRank()
{
Mediator.Setup(x => x.Send(It.IsAny<UpdateRankCommand>(), CancellationToken.None))
.ReturnsAsync((UpdateRankCommand command, CancellationToken _) =>
command.Id == 1 ? Unit.Value : throw new RankNotFoundException());

var request = new UpdateRankRequest
{
Id = 1,
Name = "Estudiante"
};

var result = await _controller.UpdateRank(request.Id, request);

result.Should().NotBeNull().And.BeAssignableTo<OkResult>();
}

[Test]
[Order(7)]
public async Task UpdateRank_ShouldReturnNotFound()
{
var request = new UpdateRankRequest
{
Id = 2,
Name = "Estudiante"
};

var result = await _controller.UpdateRank(request.Id, request);

result.Should().NotBeNull().And.BeAssignableTo<NotFoundObjectResult>();
}
}
}

0 comments on commit aee511b

Please sign in to comment.