mirror of
https://github.com/alex289/CleanArchitecture.git
synced 2025-08-28 06:15:30 +00:00
Update deps and rename names
This commit is contained in:
parent
1ec192c823
commit
6cb67265e3
@ -7,13 +7,13 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="7.0.4" />
|
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="7.0.5" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.4" />
|
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="7.0.5" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.4">
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="7.0.5">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="7.0.4" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="7.0.5" />
|
||||||
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
|
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
|
||||||
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="6.5.0" />
|
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="6.5.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.4" />
|
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -47,8 +47,8 @@ public sealed class UserService : IUserService
|
|||||||
await _bus.SendCommandAsync(new CreateUserCommand(
|
await _bus.SendCommandAsync(new CreateUserCommand(
|
||||||
userId,
|
userId,
|
||||||
user.Email,
|
user.Email,
|
||||||
user.Surname,
|
user.FirstName,
|
||||||
user.GivenName,
|
user.LastName,
|
||||||
user.Password));
|
user.Password));
|
||||||
|
|
||||||
return userId;
|
return userId;
|
||||||
@ -59,8 +59,8 @@ public sealed class UserService : IUserService
|
|||||||
await _bus.SendCommandAsync(new UpdateUserCommand(
|
await _bus.SendCommandAsync(new UpdateUserCommand(
|
||||||
user.Id,
|
user.Id,
|
||||||
user.Email,
|
user.Email,
|
||||||
user.Surname,
|
user.FirstName,
|
||||||
user.GivenName,
|
user.LastName,
|
||||||
user.Role));
|
user.Role));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -39,8 +39,8 @@ public sealed class UsersApiImplementation : UsersApi.UsersApiBase
|
|||||||
{
|
{
|
||||||
Id = user.Id.ToString(),
|
Id = user.Id.ToString(),
|
||||||
Email = user.Email,
|
Email = user.Email,
|
||||||
FirstName = user.GivenName,
|
FirstName = user.FirstName,
|
||||||
LastName = user.Surname,
|
LastName = user.LastName,
|
||||||
IsDeleted = user.Deleted
|
IsDeleted = user.Deleted
|
||||||
})
|
})
|
||||||
.ToListAsync();
|
.ToListAsync();
|
||||||
|
@ -2,6 +2,6 @@ namespace CleanArchitecture.Application.ViewModels.Users;
|
|||||||
|
|
||||||
public sealed record CreateUserViewModel(
|
public sealed record CreateUserViewModel(
|
||||||
string Email,
|
string Email,
|
||||||
string Surname,
|
string FirstName,
|
||||||
string GivenName,
|
string LastName,
|
||||||
string Password);
|
string Password);
|
@ -6,6 +6,6 @@ namespace CleanArchitecture.Application.ViewModels.Users;
|
|||||||
public sealed record UpdateUserViewModel(
|
public sealed record UpdateUserViewModel(
|
||||||
Guid Id,
|
Guid Id,
|
||||||
string Email,
|
string Email,
|
||||||
string Surname,
|
string FirstName,
|
||||||
string GivenName,
|
string LastName,
|
||||||
UserRole Role);
|
UserRole Role);
|
@ -8,8 +8,8 @@ public sealed class UserViewModel
|
|||||||
{
|
{
|
||||||
public Guid Id { get; set; }
|
public Guid Id { get; set; }
|
||||||
public string Email { get; set; } = string.Empty;
|
public string Email { get; set; } = string.Empty;
|
||||||
public string GivenName { get; set; } = string.Empty;
|
public string FirstName { get; set; } = string.Empty;
|
||||||
public string Surname { get; set; } = string.Empty;
|
public string LastName { get; set; } = string.Empty;
|
||||||
public UserRole Role { get; set; }
|
public UserRole Role { get; set; }
|
||||||
|
|
||||||
public static UserViewModel FromUser(User user)
|
public static UserViewModel FromUser(User user)
|
||||||
@ -18,8 +18,8 @@ public sealed class UserViewModel
|
|||||||
{
|
{
|
||||||
Id = user.Id,
|
Id = user.Id,
|
||||||
Email = user.Email,
|
Email = user.Email,
|
||||||
GivenName = user.GivenName,
|
FirstName = user.FirstName,
|
||||||
Surname = user.Surname,
|
LastName = user.LastName,
|
||||||
Role = user.Role
|
Role = user.Role
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -67,47 +67,47 @@ public sealed class CreateUserCommandValidationTests :
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Should_Be_Invalid_For_Empty_Surname()
|
public void Should_Be_Invalid_For_Empty_First_Name()
|
||||||
{
|
{
|
||||||
var command = CreateTestCommand(surName: "");
|
var command = CreateTestCommand(firstName: "");
|
||||||
|
|
||||||
ShouldHaveSingleError(
|
ShouldHaveSingleError(
|
||||||
command,
|
command,
|
||||||
DomainErrorCodes.UserEmptySurname,
|
DomainErrorCodes.UserEmptyFirstName,
|
||||||
"Surname may not be empty");
|
"FirstName may not be empty");
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Should_Be_Invalid_For_Surname_Exceeds_Max_Length()
|
public void Should_Be_Invalid_For_First_Name_Exceeds_Max_Length()
|
||||||
{
|
{
|
||||||
var command = CreateTestCommand(surName: new string('a', 101));
|
var command = CreateTestCommand(firstName: new string('a', 101));
|
||||||
|
|
||||||
ShouldHaveSingleError(
|
ShouldHaveSingleError(
|
||||||
command,
|
command,
|
||||||
DomainErrorCodes.UserSurnameExceedsMaxLength,
|
DomainErrorCodes.UserFirstNameExceedsMaxLength,
|
||||||
"Surname may not be longer than 100 characters");
|
"FirstName may not be longer than 100 characters");
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Should_Be_Invalid_For_Empty_Given_Name()
|
public void Should_Be_Invalid_For_Empty_Last_Name()
|
||||||
{
|
{
|
||||||
var command = CreateTestCommand(givenName: "");
|
var command = CreateTestCommand(lastName: "");
|
||||||
|
|
||||||
ShouldHaveSingleError(
|
ShouldHaveSingleError(
|
||||||
command,
|
command,
|
||||||
DomainErrorCodes.UserEmptyGivenName,
|
DomainErrorCodes.UserEmptyLastName,
|
||||||
"Given name may not be empty");
|
"LastName may not be empty");
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Should_Be_Invalid_For_Given_Name_Exceeds_Max_Length()
|
public void Should_Be_Invalid_For_Last_Name_Exceeds_Max_Length()
|
||||||
{
|
{
|
||||||
var command = CreateTestCommand(givenName: new string('a', 101));
|
var command = CreateTestCommand(lastName: new string('a', 101));
|
||||||
|
|
||||||
ShouldHaveSingleError(
|
ShouldHaveSingleError(
|
||||||
command,
|
command,
|
||||||
DomainErrorCodes.UserGivenNameExceedsMaxLength,
|
DomainErrorCodes.UserLastNameExceedsMaxLength,
|
||||||
"Given name may not be longer than 100 characters");
|
"LastName may not be longer than 100 characters");
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
@ -179,15 +179,15 @@ public sealed class CreateUserCommandValidationTests :
|
|||||||
private static CreateUserCommand CreateTestCommand(
|
private static CreateUserCommand CreateTestCommand(
|
||||||
Guid? userId = null,
|
Guid? userId = null,
|
||||||
string? email = null,
|
string? email = null,
|
||||||
string? surName = null,
|
string? firstName = null,
|
||||||
string? givenName = null,
|
string? lastName = null,
|
||||||
string? password = null)
|
string? password = null)
|
||||||
{
|
{
|
||||||
return new(
|
return new(
|
||||||
userId ?? Guid.NewGuid(),
|
userId ?? Guid.NewGuid(),
|
||||||
email ?? "test@email.com",
|
email ?? "test@email.com",
|
||||||
surName ?? "test",
|
firstName ?? "test",
|
||||||
givenName ?? "email",
|
lastName ?? "email",
|
||||||
password ?? "Po=PF]PC6t.?8?ks)A6W");
|
password ?? "Po=PF]PC6t.?8?ks)A6W");
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -66,61 +66,61 @@ public sealed class UpdateUserCommandValidationTests :
|
|||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Should_Be_Invalid_For_Empty_Surname()
|
public void Should_Be_Invalid_For_Empty_First_Name()
|
||||||
{
|
{
|
||||||
var command = CreateTestCommand(surName: "");
|
var command = CreateTestCommand(firstName: "");
|
||||||
|
|
||||||
ShouldHaveSingleError(
|
ShouldHaveSingleError(
|
||||||
command,
|
command,
|
||||||
DomainErrorCodes.UserEmptySurname,
|
DomainErrorCodes.UserEmptyFirstName,
|
||||||
"Surname may not be empty");
|
"FirstName may not be empty");
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Should_Be_Invalid_For_Surname_Exceeds_Max_Length()
|
public void Should_Be_Invalid_For_First_Name_Exceeds_Max_Length()
|
||||||
{
|
{
|
||||||
var command = CreateTestCommand(surName: new string('a', 101));
|
var command = CreateTestCommand(firstName: new string('a', 101));
|
||||||
|
|
||||||
ShouldHaveSingleError(
|
ShouldHaveSingleError(
|
||||||
command,
|
command,
|
||||||
DomainErrorCodes.UserSurnameExceedsMaxLength,
|
DomainErrorCodes.UserFirstNameExceedsMaxLength,
|
||||||
"Surname may not be longer than 100 characters");
|
"FirstName may not be longer than 100 characters");
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Should_Be_Invalid_For_Empty_Given_Name()
|
public void Should_Be_Invalid_For_Empty_Last_Name()
|
||||||
{
|
{
|
||||||
var command = CreateTestCommand(givenName: "");
|
var command = CreateTestCommand(lastName: "");
|
||||||
|
|
||||||
ShouldHaveSingleError(
|
ShouldHaveSingleError(
|
||||||
command,
|
command,
|
||||||
DomainErrorCodes.UserEmptyGivenName,
|
DomainErrorCodes.UserEmptyLastName,
|
||||||
"Given name may not be empty");
|
"LastName may not be empty");
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
public void Should_Be_Invalid_For_Given_Name_Exceeds_Max_Length()
|
public void Should_Be_Invalid_For_Last_Name_Exceeds_Max_Length()
|
||||||
{
|
{
|
||||||
var command = CreateTestCommand(givenName: new string('a', 101));
|
var command = CreateTestCommand(lastName: new string('a', 101));
|
||||||
|
|
||||||
ShouldHaveSingleError(
|
ShouldHaveSingleError(
|
||||||
command,
|
command,
|
||||||
DomainErrorCodes.UserGivenNameExceedsMaxLength,
|
DomainErrorCodes.UserLastNameExceedsMaxLength,
|
||||||
"Given name may not be longer than 100 characters");
|
"LastName may not be longer than 100 characters");
|
||||||
}
|
}
|
||||||
|
|
||||||
private static UpdateUserCommand CreateTestCommand(
|
private static UpdateUserCommand CreateTestCommand(
|
||||||
Guid? userId = null,
|
Guid? userId = null,
|
||||||
string? email = null,
|
string? email = null,
|
||||||
string? surName = null,
|
string? firstName = null,
|
||||||
string? givenName = null,
|
string? lastName = null,
|
||||||
UserRole? role = null)
|
UserRole? role = null)
|
||||||
{
|
{
|
||||||
return new(
|
return new(
|
||||||
userId ?? Guid.NewGuid(),
|
userId ?? Guid.NewGuid(),
|
||||||
email ?? "test@email.com",
|
email ?? "test@email.com",
|
||||||
surName ?? "test",
|
firstName ?? "test",
|
||||||
givenName ?? "email",
|
lastName ?? "email",
|
||||||
role ?? UserRole.User);
|
role ?? UserRole.User);
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -6,12 +6,12 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="BCrypt.Net-Next" Version="4.0.3"/>
|
<PackageReference Include="BCrypt.Net-Next" Version="4.0.3" />
|
||||||
<PackageReference Include="FluentValidation" Version="11.5.1"/>
|
<PackageReference Include="FluentValidation" Version="11.5.2" />
|
||||||
<PackageReference Include="MediatR" Version="12.0.1"/>
|
<PackageReference Include="MediatR" Version="12.0.1" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0"/>
|
<PackageReference Include="Microsoft.AspNetCore.Http.Abstractions" Version="2.2.0" />
|
||||||
<PackageReference Include="Microsoft.Extensions.Options" Version="7.0.1"/>
|
<PackageReference Include="Microsoft.Extensions.Options" Version="7.0.1" />
|
||||||
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.27.0"/>
|
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="6.29.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -9,21 +9,21 @@ public sealed class CreateUserCommand : CommandBase
|
|||||||
public CreateUserCommand(
|
public CreateUserCommand(
|
||||||
Guid userId,
|
Guid userId,
|
||||||
string email,
|
string email,
|
||||||
string surname,
|
string firstName,
|
||||||
string givenName,
|
string lastName,
|
||||||
string password) : base(userId)
|
string password) : base(userId)
|
||||||
{
|
{
|
||||||
UserId = userId;
|
UserId = userId;
|
||||||
Email = email;
|
Email = email;
|
||||||
Surname = surname;
|
FirstName = firstName;
|
||||||
GivenName = givenName;
|
LastName = lastName;
|
||||||
Password = password;
|
Password = password;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Guid UserId { get; }
|
public Guid UserId { get; }
|
||||||
public string Email { get; }
|
public string Email { get; }
|
||||||
public string Surname { get; }
|
public string FirstName { get; }
|
||||||
public string GivenName { get; }
|
public string LastName { get; }
|
||||||
public string Password { get; }
|
public string Password { get; }
|
||||||
|
|
||||||
public override bool IsValid()
|
public override bool IsValid()
|
||||||
|
@ -62,8 +62,8 @@ public sealed class CreateUserCommandHandler : CommandHandlerBase,
|
|||||||
var user = new User(
|
var user = new User(
|
||||||
request.UserId,
|
request.UserId,
|
||||||
request.Email,
|
request.Email,
|
||||||
request.Surname,
|
request.FirstName,
|
||||||
request.GivenName,
|
request.LastName,
|
||||||
passwordHash,
|
passwordHash,
|
||||||
UserRole.User);
|
UserRole.User);
|
||||||
|
|
||||||
|
@ -10,8 +10,8 @@ public sealed class CreateUserCommandValidation : AbstractValidator<CreateUserCo
|
|||||||
{
|
{
|
||||||
AddRuleForId();
|
AddRuleForId();
|
||||||
AddRuleForEmail();
|
AddRuleForEmail();
|
||||||
AddRuleForSurname();
|
AddRuleForFirstName();
|
||||||
AddRuleForGivenName();
|
AddRuleForLastName();
|
||||||
AddRuleForPassword();
|
AddRuleForPassword();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -34,26 +34,26 @@ public sealed class CreateUserCommandValidation : AbstractValidator<CreateUserCo
|
|||||||
.WithMessage("Email may not be longer than 320 characters");
|
.WithMessage("Email may not be longer than 320 characters");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddRuleForSurname()
|
private void AddRuleForFirstName()
|
||||||
{
|
{
|
||||||
RuleFor(cmd => cmd.Surname)
|
RuleFor(cmd => cmd.FirstName)
|
||||||
.NotEmpty()
|
.NotEmpty()
|
||||||
.WithErrorCode(DomainErrorCodes.UserEmptySurname)
|
.WithErrorCode(DomainErrorCodes.UserEmptyFirstName)
|
||||||
.WithMessage("Surname may not be empty")
|
.WithMessage("FirstName may not be empty")
|
||||||
.MaximumLength(100)
|
.MaximumLength(100)
|
||||||
.WithErrorCode(DomainErrorCodes.UserSurnameExceedsMaxLength)
|
.WithErrorCode(DomainErrorCodes.UserFirstNameExceedsMaxLength)
|
||||||
.WithMessage("Surname may not be longer than 100 characters");
|
.WithMessage("FirstName may not be longer than 100 characters");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddRuleForGivenName()
|
private void AddRuleForLastName()
|
||||||
{
|
{
|
||||||
RuleFor(cmd => cmd.GivenName)
|
RuleFor(cmd => cmd.LastName)
|
||||||
.NotEmpty()
|
.NotEmpty()
|
||||||
.WithErrorCode(DomainErrorCodes.UserEmptyGivenName)
|
.WithErrorCode(DomainErrorCodes.UserEmptyLastName)
|
||||||
.WithMessage("Given name may not be empty")
|
.WithMessage("LastName may not be empty")
|
||||||
.MaximumLength(100)
|
.MaximumLength(100)
|
||||||
.WithErrorCode(DomainErrorCodes.UserGivenNameExceedsMaxLength)
|
.WithErrorCode(DomainErrorCodes.UserLastNameExceedsMaxLength)
|
||||||
.WithMessage("Given name may not be longer than 100 characters");
|
.WithMessage("LastName may not be longer than 100 characters");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddRuleForPassword()
|
private void AddRuleForPassword()
|
||||||
|
@ -10,21 +10,21 @@ public sealed class UpdateUserCommand : CommandBase
|
|||||||
public UpdateUserCommand(
|
public UpdateUserCommand(
|
||||||
Guid userId,
|
Guid userId,
|
||||||
string email,
|
string email,
|
||||||
string surname,
|
string firstName,
|
||||||
string givenName,
|
string lastName,
|
||||||
UserRole role) : base(userId)
|
UserRole role) : base(userId)
|
||||||
{
|
{
|
||||||
UserId = userId;
|
UserId = userId;
|
||||||
Email = email;
|
Email = email;
|
||||||
Surname = surname;
|
FirstName = firstName;
|
||||||
GivenName = givenName;
|
LastName = lastName;
|
||||||
Role = role;
|
Role = role;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Guid UserId { get; }
|
public Guid UserId { get; }
|
||||||
public string Email { get; }
|
public string Email { get; }
|
||||||
public string Surname { get; }
|
public string FirstName { get; }
|
||||||
public string GivenName { get; }
|
public string LastName { get; }
|
||||||
public UserRole Role { get; }
|
public UserRole Role { get; }
|
||||||
|
|
||||||
public override bool IsValid()
|
public override bool IsValid()
|
||||||
|
@ -63,8 +63,8 @@ public sealed class UpdateUserCommandHandler : CommandHandlerBase,
|
|||||||
}
|
}
|
||||||
|
|
||||||
user.SetEmail(request.Email);
|
user.SetEmail(request.Email);
|
||||||
user.SetSurname(request.Surname);
|
user.SetFirstName(request.FirstName);
|
||||||
user.SetGivenName(request.GivenName);
|
user.SetLastName(request.LastName);
|
||||||
|
|
||||||
_userRepository.Update(user);
|
_userRepository.Update(user);
|
||||||
|
|
||||||
|
@ -9,8 +9,8 @@ public sealed class UpdateUserCommandValidation : AbstractValidator<UpdateUserCo
|
|||||||
{
|
{
|
||||||
AddRuleForId();
|
AddRuleForId();
|
||||||
AddRuleForEmail();
|
AddRuleForEmail();
|
||||||
AddRuleForSurname();
|
AddRuleForFirstName();
|
||||||
AddRuleForGivenName();
|
AddRuleForLastName();
|
||||||
AddRuleForRole();
|
AddRuleForRole();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -33,26 +33,26 @@ public sealed class UpdateUserCommandValidation : AbstractValidator<UpdateUserCo
|
|||||||
.WithMessage("Email may not be longer than 320 characters");
|
.WithMessage("Email may not be longer than 320 characters");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddRuleForSurname()
|
private void AddRuleForFirstName()
|
||||||
{
|
{
|
||||||
RuleFor(cmd => cmd.Surname)
|
RuleFor(cmd => cmd.FirstName)
|
||||||
.NotEmpty()
|
.NotEmpty()
|
||||||
.WithErrorCode(DomainErrorCodes.UserEmptySurname)
|
.WithErrorCode(DomainErrorCodes.UserEmptyFirstName)
|
||||||
.WithMessage("Surname may not be empty")
|
.WithMessage("FirstName may not be empty")
|
||||||
.MaximumLength(100)
|
.MaximumLength(100)
|
||||||
.WithErrorCode(DomainErrorCodes.UserSurnameExceedsMaxLength)
|
.WithErrorCode(DomainErrorCodes.UserFirstNameExceedsMaxLength)
|
||||||
.WithMessage("Surname may not be longer than 100 characters");
|
.WithMessage("FirstName may not be longer than 100 characters");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddRuleForGivenName()
|
private void AddRuleForLastName()
|
||||||
{
|
{
|
||||||
RuleFor(cmd => cmd.GivenName)
|
RuleFor(cmd => cmd.LastName)
|
||||||
.NotEmpty()
|
.NotEmpty()
|
||||||
.WithErrorCode(DomainErrorCodes.UserEmptyGivenName)
|
.WithErrorCode(DomainErrorCodes.UserEmptyLastName)
|
||||||
.WithMessage("Given name may not be empty")
|
.WithMessage("LastName may not be empty")
|
||||||
.MaximumLength(100)
|
.MaximumLength(100)
|
||||||
.WithErrorCode(DomainErrorCodes.UserGivenNameExceedsMaxLength)
|
.WithErrorCode(DomainErrorCodes.UserLastNameExceedsMaxLength)
|
||||||
.WithMessage("Given name may not be longer than 100 characters");
|
.WithMessage("LastName may not be longer than 100 characters");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void AddRuleForRole()
|
private void AddRuleForRole()
|
||||||
|
@ -9,25 +9,25 @@ public class User : Entity
|
|||||||
public User(
|
public User(
|
||||||
Guid id,
|
Guid id,
|
||||||
string email,
|
string email,
|
||||||
string surname,
|
string firstname,
|
||||||
string givenName,
|
string lastName,
|
||||||
string password,
|
string password,
|
||||||
UserRole role) : base(id)
|
UserRole role) : base(id)
|
||||||
{
|
{
|
||||||
Email = email;
|
Email = email;
|
||||||
GivenName = givenName;
|
FirstName = firstname;
|
||||||
Surname = surname;
|
LastName = lastName;
|
||||||
Password = password;
|
Password = password;
|
||||||
Role = role;
|
Role = role;
|
||||||
}
|
}
|
||||||
|
|
||||||
public string Email { get; private set; }
|
public string Email { get; private set; }
|
||||||
public string GivenName { get; private set; }
|
public string FirstName { get; private set; }
|
||||||
public string Surname { get; private set; }
|
public string LastName { get; private set; }
|
||||||
public string Password { get; private set; }
|
public string Password { get; private set; }
|
||||||
public UserRole Role { get; private set; }
|
public UserRole Role { get; private set; }
|
||||||
|
|
||||||
public string FullName => $"{Surname}, {GivenName}";
|
public string FullName => $"{FirstName}, {LastName}";
|
||||||
|
|
||||||
[MemberNotNull(nameof(Email))]
|
[MemberNotNull(nameof(Email))]
|
||||||
public void SetEmail(string email)
|
public void SetEmail(string email)
|
||||||
@ -46,38 +46,38 @@ public class User : Entity
|
|||||||
Email = email;
|
Email = email;
|
||||||
}
|
}
|
||||||
|
|
||||||
[MemberNotNull(nameof(GivenName))]
|
[MemberNotNull(nameof(FirstName))]
|
||||||
public void SetGivenName(string givenName)
|
public void SetFirstName(string firstName)
|
||||||
{
|
{
|
||||||
if (givenName == null)
|
if (firstName == null)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException(nameof(givenName));
|
throw new ArgumentNullException(nameof(firstName));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (givenName.Length > 100)
|
if (firstName.Length > 100)
|
||||||
{
|
{
|
||||||
throw new ArgumentException(
|
throw new ArgumentException(
|
||||||
"Given name may not be longer than 100 characters");
|
"First name may not be longer than 100 characters");
|
||||||
}
|
}
|
||||||
|
|
||||||
GivenName = givenName;
|
FirstName = firstName;
|
||||||
}
|
}
|
||||||
|
|
||||||
[MemberNotNull(nameof(Surname))]
|
[MemberNotNull(nameof(LastName))]
|
||||||
public void SetSurname(string surname)
|
public void SetLastName(string lastName)
|
||||||
{
|
{
|
||||||
if (surname == null)
|
if (lastName == null)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException(nameof(surname));
|
throw new ArgumentNullException(nameof(lastName));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (surname.Length > 100)
|
if (lastName.Length > 100)
|
||||||
{
|
{
|
||||||
throw new ArgumentException(
|
throw new ArgumentException(
|
||||||
"Surname may not be longer than 100 characters");
|
"Last name may not be longer than 100 characters");
|
||||||
}
|
}
|
||||||
|
|
||||||
Surname = surname;
|
LastName = lastName;
|
||||||
}
|
}
|
||||||
|
|
||||||
[MemberNotNull(nameof(Password))]
|
[MemberNotNull(nameof(Password))]
|
||||||
|
@ -4,11 +4,11 @@ public static class DomainErrorCodes
|
|||||||
{
|
{
|
||||||
// User Validation
|
// User Validation
|
||||||
public const string UserEmptyId = "USER_EMPTY_ID";
|
public const string UserEmptyId = "USER_EMPTY_ID";
|
||||||
public const string UserEmptySurname = "USER_EMPTY_SURNAME";
|
public const string UserEmptyFirstName = "USER_EMPTY_FIRST_NAME";
|
||||||
public const string UserEmptyGivenName = "USER_EMPTY_GIVEN_NAME";
|
public const string UserEmptyLastName = "USER_EMPTY_LAST_NAME";
|
||||||
public const string UserEmailExceedsMaxLength = "USER_EMAIL_EXCEEDS_MAX_LENGTH";
|
public const string UserEmailExceedsMaxLength = "USER_EMAIL_EXCEEDS_MAX_LENGTH";
|
||||||
public const string UserSurnameExceedsMaxLength = "USER_SURNAME_EXCEEDS_MAX_LENGTH";
|
public const string UserFirstNameExceedsMaxLength = "USER_FIRST_NAME_EXCEEDS_MAX_LENGTH";
|
||||||
public const string UserGivenNameExceedsMaxLength = "USER_GIVEN_NAME_EXCEEDS_MAX_LENGTH";
|
public const string UserLastNameExceedsMaxLength = "USER_LAST_NAME_EXCEEDS_MAX_LENGTH";
|
||||||
public const string UserInvalidEmail = "USER_INVALID_EMAIL";
|
public const string UserInvalidEmail = "USER_INVALID_EMAIL";
|
||||||
public const string UserInvalidRole = "USER_INVALID_ROLE";
|
public const string UserInvalidRole = "USER_INVALID_ROLE";
|
||||||
|
|
||||||
|
@ -6,15 +6,15 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\CleanArchitecture.Domain\CleanArchitecture.Domain.csproj"/>
|
<ProjectReference Include="..\CleanArchitecture.Domain\CleanArchitecture.Domain.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="MediatR" Version="12.0.1"/>
|
<PackageReference Include="MediatR" Version="12.0.1" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.4"/>
|
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.0.4"/>
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" Version="7.0.5" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.4"/>
|
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.5" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.4">
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="7.0.5">
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
</PackageReference>
|
</PackageReference>
|
||||||
|
@ -16,12 +16,12 @@ public sealed class UserConfiguration : IEntityTypeConfiguration<User>
|
|||||||
.HasMaxLength(320);
|
.HasMaxLength(320);
|
||||||
|
|
||||||
builder
|
builder
|
||||||
.Property(user => user.GivenName)
|
.Property(user => user.FirstName)
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasMaxLength(100);
|
.HasMaxLength(100);
|
||||||
|
|
||||||
builder
|
builder
|
||||||
.Property(user => user.Surname)
|
.Property(user => user.LastName)
|
||||||
.IsRequired()
|
.IsRequired()
|
||||||
.HasMaxLength(100);
|
.HasMaxLength(100);
|
||||||
|
|
||||||
|
@ -8,14 +8,14 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="FluentAssertions" Version="6.10.0"/>
|
<PackageReference Include="FluentAssertions" Version="6.10.0" />
|
||||||
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="7.0.4"/>
|
<PackageReference Include="Microsoft.AspNetCore.Mvc.Testing" Version="7.0.5" />
|
||||||
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="7.0.4"/>
|
<PackageReference Include="Microsoft.Data.Sqlite.Core" Version="7.0.5" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="7.0.4"/>
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Proxies" Version="7.0.5" />
|
||||||
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.4"/>
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="7.0.5" />
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0"/>
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.5.0" />
|
||||||
<PackageReference Include="xunit" Version="2.4.2"/>
|
<PackageReference Include="xunit" Version="2.4.2" />
|
||||||
<PackageReference Include="Xunit.Priority" Version="1.1.6"/>
|
<PackageReference Include="Xunit.Priority" Version="1.1.6" />
|
||||||
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
|
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
@ -27,8 +27,8 @@
|
|||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\CleanArchitecture.Api\CleanArchitecture.Api.csproj"/>
|
<ProjectReference Include="..\CleanArchitecture.Api\CleanArchitecture.Api.csproj" />
|
||||||
<ProjectReference Include="..\CleanArchitecture.Infrastructure\CleanArchitecture.Infrastructure.csproj"/>
|
<ProjectReference Include="..\CleanArchitecture.Infrastructure\CleanArchitecture.Infrastructure.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -81,8 +81,8 @@ public sealed class UserControllerTests : IClassFixture<UserTestFixture>
|
|||||||
|
|
||||||
content.Id.Should().Be(_fixture.CreatedUserId);
|
content.Id.Should().Be(_fixture.CreatedUserId);
|
||||||
content.Email.Should().Be("test@email.com");
|
content.Email.Should().Be("test@email.com");
|
||||||
content.Surname.Should().Be("Test");
|
content.FirstName.Should().Be("Test");
|
||||||
content.GivenName.Should().Be("Email");
|
content.LastName.Should().Be("Email");
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
@ -101,8 +101,8 @@ public sealed class UserControllerTests : IClassFixture<UserTestFixture>
|
|||||||
|
|
||||||
content.Id.Should().Be(_fixture.CreatedUserId);
|
content.Id.Should().Be(_fixture.CreatedUserId);
|
||||||
content.Email.Should().Be("test@email.com");
|
content.Email.Should().Be("test@email.com");
|
||||||
content.Surname.Should().Be("Test");
|
content.FirstName.Should().Be("Test");
|
||||||
content.GivenName.Should().Be("Email");
|
content.LastName.Should().Be("Email");
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
@ -145,8 +145,8 @@ public sealed class UserControllerTests : IClassFixture<UserTestFixture>
|
|||||||
|
|
||||||
content.Id.Should().Be(_fixture.CreatedUserId);
|
content.Id.Should().Be(_fixture.CreatedUserId);
|
||||||
content.Email.Should().Be("newtest@email.com");
|
content.Email.Should().Be("newtest@email.com");
|
||||||
content.Surname.Should().Be("NewTest");
|
content.FirstName.Should().Be("NewTest");
|
||||||
content.GivenName.Should().Be("NewEmail");
|
content.LastName.Should().Be("NewEmail");
|
||||||
|
|
||||||
_fixture.CreatedUserEmail = content.Email;
|
_fixture.CreatedUserEmail = content.Email;
|
||||||
}
|
}
|
||||||
@ -206,14 +206,14 @@ public sealed class UserControllerTests : IClassFixture<UserTestFixture>
|
|||||||
currentUser.Id.Should().Be(_fixture.CreatedUserId);
|
currentUser.Id.Should().Be(_fixture.CreatedUserId);
|
||||||
currentUser.Role.Should().Be(UserRole.User);
|
currentUser.Role.Should().Be(UserRole.User);
|
||||||
currentUser.Email.Should().Be("newtest@email.com");
|
currentUser.Email.Should().Be("newtest@email.com");
|
||||||
currentUser.Surname.Should().Be("NewTest");
|
currentUser.FirstName.Should().Be("NewTest");
|
||||||
currentUser.GivenName.Should().Be("NewEmail");
|
currentUser.LastName.Should().Be("NewEmail");
|
||||||
|
|
||||||
var adminUser = content.First(x => x.Role == UserRole.Admin);
|
var adminUser = content.First(x => x.Role == UserRole.Admin);
|
||||||
|
|
||||||
adminUser.Email.Should().Be("admin@email.com");
|
adminUser.Email.Should().Be("admin@email.com");
|
||||||
adminUser.Surname.Should().Be("Admin");
|
adminUser.FirstName.Should().Be("Admin");
|
||||||
adminUser.GivenName.Should().Be("User");
|
adminUser.LastName.Should().Be("User");
|
||||||
}
|
}
|
||||||
|
|
||||||
[Fact]
|
[Fact]
|
||||||
|
@ -6,19 +6,19 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Remove="Users\Models.proto"/>
|
<None Remove="Users\Models.proto" />
|
||||||
<None Remove="Users\UsersApi.proto"/>
|
<None Remove="Users\UsersApi.proto" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Protobuf Include="Users\Models.proto" GrpcServices="Both"/>
|
<Protobuf Include="Users\Models.proto" GrpcServices="Both" />
|
||||||
<Protobuf Include="Users\UsersApi.proto" GrpcServices="Both"/>
|
<Protobuf Include="Users\UsersApi.proto" GrpcServices="Both" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Google.Protobuf" Version="3.22.1"/>
|
<PackageReference Include="Google.Protobuf" Version="3.22.3" />
|
||||||
<PackageReference Include="Google.Protobuf.Tools" Version="3.22.1"/>
|
<PackageReference Include="Google.Protobuf.Tools" Version="3.22.3" />
|
||||||
<PackageReference Include="Grpc.AspNetCore" Version="2.52.0"/>
|
<PackageReference Include="Grpc.AspNetCore" Version="2.52.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -57,8 +57,8 @@ public sealed class GetUsersByIdsTests : IClassFixture<UserTestsFixture>
|
|||||||
mockUser.Should().NotBeNull();
|
mockUser.Should().NotBeNull();
|
||||||
|
|
||||||
user.Email.Should().Be(mockUser.Email);
|
user.Email.Should().Be(mockUser.Email);
|
||||||
user.FirstName.Should().Be(mockUser.GivenName);
|
user.FirstName.Should().Be(mockUser.FirstName);
|
||||||
user.LastName.Should().Be(mockUser.Surname);
|
user.LastName.Should().Be(mockUser.LastName);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user