Skip to content

Commit

Permalink
feat(people): unassign a user role when registering a person
Browse files Browse the repository at this point in the history
  • Loading branch information
CarlosPavajeau committed Sep 15, 2021
1 parent a9822c2 commit 3cfae48
Show file tree
Hide file tree
Showing 5 changed files with 16 additions and 122 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,9 @@ public class CreatePersonRequest
public string Email { get; set; }

[Required(ErrorMessage = "El número de teléfono de la persona es requerido.")]
[MaxLength(127, ErrorMessage = "El número de teléfono de la persona no debe tener más de 10 caracteres.")]
[MaxLength(10, ErrorMessage = "El número de teléfono de la persona no debe tener más de 10 caracteres.")]
public string PhoneNumber { get; set; }

[Required(ErrorMessage = "El rol de la persona es requerido.")]
public string RoleName { get; set; }

[Required(ErrorMessage = "El grado de la persona es requerido.")]
public int DegreeId { get; set; }
}
Expand Down
32 changes: 8 additions & 24 deletions src/Armory/People/Application/Create/CreatePersonCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,30 +4,14 @@ namespace Armory.People.Application.Create
{
public class CreatePersonCommand : Command
{
public CreatePersonCommand(string id, string firstName, string secondName, string lastName,
string secondLastName, string email, string phoneNumber, string roleName, int degreeId)
{
Id = id;
FirstName = firstName;
SecondName = secondName;
LastName = lastName;
SecondLastName = secondLastName;
Email = email;
PhoneNumber = phoneNumber;
RoleName = roleName;
DegreeId = degreeId;
}
public string Id { get; init; }

public string Id { get; }

public string FirstName { get; }
public string SecondName { get; }
public string LastName { get; }
public string SecondLastName { get; }
public string Email { get; }
public string PhoneNumber { get; }

public string RoleName { get; }
public int DegreeId { get; }
public string FirstName { get; init; }
public string SecondName { get; init; }
public string LastName { get; init; }
public string SecondLastName { get; init; }
public string Email { get; init; }
public string PhoneNumber { get; init; }
public int DegreeId { get; init; }
}
}
2 changes: 1 addition & 1 deletion src/Armory/People/Application/Create/PersonCreator.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public async Task Create(CreatePersonCommand command)
{
var transaction = await _initializer.Begin();
var user = await _userCreator.Create(command.Id, command.Email, command.PhoneNumber,
$"{command.Id.Trim()}{command.FirstName.Trim()}", command.RoleName);
$"{command.Id.Trim()}{command.FirstName.Trim()}");

var person = _mapper.Map<Person>(command);
person.ArmoryUserId = user.Id;
Expand Down
35 changes: 3 additions & 32 deletions src/Armory/Users/Application/Create/ArmoryUserCreator.cs
Original file line number Diff line number Diff line change
@@ -1,52 +1,23 @@
using System;
using System.Threading.Tasks;
using Armory.Users.Application.AddToRole;
using Armory.Users.Domain;
using Microsoft.AspNetCore.Identity;

namespace Armory.Users.Application.Create
{
public class ArmoryUserCreator
{
private readonly IArmoryUsersRepository _repository;
private readonly RoleAggregator _roleAggregator;

public ArmoryUserCreator(IArmoryUsersRepository repository, RoleAggregator roleAggregator)
public ArmoryUserCreator(IArmoryUsersRepository repository)
{
_repository = repository;
_roleAggregator = roleAggregator;
}

public async Task<ArmoryUser> Create(string username, string email, string phoneNumber, string password,
string roleName)
public async Task<ArmoryUser> Create(string username, string email, string phoneNumber, string password)
{
var user = ArmoryUser.Create(username, email, phoneNumber);

var result = await _repository.Save(user, password);
if (!result.Succeeded)
{
throw new ArmoryUserNotCreated(result.Errors);
}

try
{
var roleResult = await _roleAggregator.AddToRole(user, roleName);
if (!roleResult.Succeeded)
{
throw new ArmoryUserNotCreated(roleResult.Errors);
}
}
catch (InvalidOperationException)
{
throw new ArmoryUserNotCreated(new[]
{
new IdentityError
{
Code = "RoleDoesNotExists",
Description = $"El rol '{roleName}' no existe."
}
});
}
if (!result.Succeeded) throw new ArmoryUserNotCreated(result.Errors);

return user;
}
Expand Down
64 changes: 3 additions & 61 deletions test/Armory.Test/Users/Application/Create/ArmoryUserCreatorTest.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,4 @@
using System;
using System.Linq;
using System.Threading.Tasks;
using Armory.Users.Application.AddToRole;
using Armory.Users.Application.Create;
using Armory.Users.Domain;
using Armory.Users.Infrastructure.Identity;
Expand All @@ -18,7 +15,7 @@ public class ArmoryUserCreatorTest : UsersUnitTestCase

public ArmoryUserCreatorTest()
{
_creator = new ArmoryUserCreator(Repository.Object, new RoleAggregator(Repository.Object));
_creator = new ArmoryUserCreator(Repository.Object);
_describer = new SpanishIdentityErrorDescriber();

SetUpRepository();
Expand All @@ -30,19 +27,6 @@ private void SetUpRepository()
.ReturnsAsync((ArmoryUser user, string _) => string.IsNullOrEmpty(user.UserName)
? IdentityResult.Failed(_describer.InvalidUserName(user.UserName))
: IdentityResult.Success);

Repository.Setup(x => x.AddToRole(It.IsAny<ArmoryUser>(), It.IsAny<string>()))
.ReturnsAsync((ArmoryUser _, string roleName) =>
{
if (string.IsNullOrEmpty(roleName))
{
throw new InvalidOperationException();
}
return roleName == "nadmin"
? IdentityResult.Failed(_describer.InvalidRoleName(roleName))
: IdentityResult.Success;
});
}

private void ShouldHaveSave()
Expand All @@ -54,7 +38,7 @@ private void ShouldHaveSave()
[Order(1)]
public async Task Create_A_Valid_ArmoryUser()
{
var user = await _creator.Create("admin", "admin@admin.com", "3000000000", "admin", "admin");
var user = await _creator.Create("admin", "admin@admin.com", "3000000000", "admin");

ShouldHaveSave();
Assert.IsNotNull(user);
Expand All @@ -66,7 +50,7 @@ public async Task Create_An_Invalid_ArmoryUser()
{
try
{
_ = await _creator.Create("", "admin@admin.com", "3000000000", "admin", "admin");
_ = await _creator.Create("", "admin@admin.com", "3000000000", "admin");

Assert.Fail();
}
Expand All @@ -76,47 +60,5 @@ public async Task Create_An_Invalid_ArmoryUser()
Assert.Pass();
}
}

[Test]
[Order(3)]
public async Task Create_A_Valid_ArmoryUser_With_Invalid_RoleName()
{
try
{
_ = await _creator.Create("admin", "admin@admin.com", "3000000000", "admin", "nadmin");

Assert.Fail();
}
catch (ArmoryUserNotCreated e)
{
ShouldHaveSave();

Assert.IsNotNull(e.Errors);
Assert.AreEqual(1, e.Errors.Count());
Assert.AreEqual("InvalidRoleName", e.Errors.ElementAt(0).Code);
Assert.Pass();
}
}

[Test]
[Order(4)]
public async Task Create_A_Valid_ArmoryUser_With_Non_Existing_RoleName()
{
try
{
_ = await _creator.Create("admin", "admin@admin.com", "3000000000", "admin", "");

Assert.Fail();
}
catch (ArmoryUserNotCreated e)
{
ShouldHaveSave();

Assert.IsNotNull(e.Errors);
Assert.AreEqual(1, e.Errors.Count());
Assert.AreEqual("RoleDoesNotExists", e.Errors.ElementAt(0).Code);
Assert.Pass();
}
}
}
}

0 comments on commit 3cfae48

Please sign in to comment.