diff --git a/src/Nocr.Users.Api.Contracts/Users/UserData.cs b/src/Nocr.Users.Api.Contracts/Users/Dto/UserData.cs similarity index 70% rename from src/Nocr.Users.Api.Contracts/Users/UserData.cs rename to src/Nocr.Users.Api.Contracts/Users/Dto/UserData.cs index bb2de16..d793aa5 100644 --- a/src/Nocr.Users.Api.Contracts/Users/UserData.cs +++ b/src/Nocr.Users.Api.Contracts/Users/Dto/UserData.cs @@ -1,4 +1,4 @@ -namespace Nocr.Users.Api.Contracts.Users; +namespace Nocr.Users.Api.Contracts.Users.Dto; public sealed class UserData { diff --git a/src/Nocr.Users.AppServices/ServiceCollectionExtensions.cs b/src/Nocr.Users.AppServices/ServiceCollectionExtensions.cs index 87ea7f6..8a73ad2 100644 --- a/src/Nocr.Users.AppServices/ServiceCollectionExtensions.cs +++ b/src/Nocr.Users.AppServices/ServiceCollectionExtensions.cs @@ -1,5 +1,6 @@ using Microsoft.Extensions.DependencyInjection; -using Nocr.Users.AppServices.Users; +using Nocr.Users.AppServices.Users.Repositories; +using Nocr.Users.AppServices.Users.Services; namespace Nocr.Users.AppServices; @@ -11,7 +12,7 @@ public static class ServiceCollectionExtensions throw new ArgumentNullException(nameof(services)); // Add registrations here - services.AddScoped(); + services.AddSingleton(); services.AddScoped(); return services; diff --git a/src/Nocr.Users.AppServices/Users/IUsersRepository.cs b/src/Nocr.Users.AppServices/Users/Repositories/IUsersRepository.cs similarity index 79% rename from src/Nocr.Users.AppServices/Users/IUsersRepository.cs rename to src/Nocr.Users.AppServices/Users/Repositories/IUsersRepository.cs index b898ca2..3ecc5d5 100644 --- a/src/Nocr.Users.AppServices/Users/IUsersRepository.cs +++ b/src/Nocr.Users.AppServices/Users/Repositories/IUsersRepository.cs @@ -1,4 +1,4 @@ -namespace Nocr.Users.AppServices.Users; +namespace Nocr.Users.AppServices.Users.Repositories; public interface IUsersRepository { diff --git a/src/Nocr.Users.AppServices/Users/InMemoryUsersRepository.cs b/src/Nocr.Users.AppServices/Users/Repositories/InMemoryUsersRepository.cs similarity index 93% rename from src/Nocr.Users.AppServices/Users/InMemoryUsersRepository.cs rename to src/Nocr.Users.AppServices/Users/Repositories/InMemoryUsersRepository.cs index 808e54c..4f31b5a 100644 --- a/src/Nocr.Users.AppServices/Users/InMemoryUsersRepository.cs +++ b/src/Nocr.Users.AppServices/Users/Repositories/InMemoryUsersRepository.cs @@ -1,4 +1,4 @@ -namespace Nocr.Users.AppServices.Users; +namespace Nocr.Users.AppServices.Users.Repositories; public sealed class InMemoryUsersRepository : IUsersRepository { diff --git a/src/Nocr.Users.AppServices/Users/IUsersService.cs b/src/Nocr.Users.AppServices/Users/Services/IUsersService.cs similarity index 52% rename from src/Nocr.Users.AppServices/Users/IUsersService.cs rename to src/Nocr.Users.AppServices/Users/Services/IUsersService.cs index f63c715..2ce5f27 100644 --- a/src/Nocr.Users.AppServices/Users/IUsersService.cs +++ b/src/Nocr.Users.AppServices/Users/Services/IUsersService.cs @@ -1,11 +1,11 @@ -using Nocr.Users.Api.Contracts.Users; +using Nocr.Users.Api.Contracts.Users.Dto; -namespace Nocr.Users.AppServices.Users; +namespace Nocr.Users.AppServices.Users.Services; public interface IUsersService { Task Create(string username, string? telegramUsername, string? email, long? telegramId, CancellationToken cancellationToken = default); - Task GetUserById(long id, CancellationToken cancellationToken = default); + Task GetById(long id, CancellationToken cancellationToken = default); } \ No newline at end of file diff --git a/src/Nocr.Users.AppServices/Users/UsersService.cs b/src/Nocr.Users.AppServices/Users/Services/UsersService.cs similarity index 84% rename from src/Nocr.Users.AppServices/Users/UsersService.cs rename to src/Nocr.Users.AppServices/Users/Services/UsersService.cs index 4226286..a88a7c5 100644 --- a/src/Nocr.Users.AppServices/Users/UsersService.cs +++ b/src/Nocr.Users.AppServices/Users/Services/UsersService.cs @@ -1,6 +1,7 @@ -using Nocr.Users.Api.Contracts.Users; +using Nocr.Users.Api.Contracts.Users.Dto; +using Nocr.Users.AppServices.Users.Repositories; -namespace Nocr.Users.AppServices.Users; +namespace Nocr.Users.AppServices.Users.Services; public sealed class UsersService : IUsersService { @@ -31,7 +32,7 @@ public sealed class UsersService : IUsersService return await _repository.Create(user, cancellationToken); } - public async Task GetUserById(long id, CancellationToken cancellationToken = default) + public async Task GetById(long id, CancellationToken cancellationToken = default) { var user = await _repository.GetUserById(id, cancellationToken); if (user == null) diff --git a/src/Nocr.Users.AppServices/Users/User.cs b/src/Nocr.Users.AppServices/Users/User.cs index c8501e7..7946f43 100644 --- a/src/Nocr.Users.AppServices/Users/User.cs +++ b/src/Nocr.Users.AppServices/Users/User.cs @@ -6,15 +6,20 @@ public sealed class User public string Username { get; private set; } - private List _identities = new List(); + private readonly List _identities = new(); public IReadOnlyCollection Identities => _identities; private User(string username, params UserIdentity[] identities) { Username = username; - + // TODO: Check that there is no repeating identity types + if (identities.GroupBy(x => x.Type).SelectMany(g => g.Skip(1)).Any()) + { + throw new InvalidOperationException($"All identities should be unique by {nameof(UserIdentity.Type)}"); + } + _identities.AddRange(identities); } diff --git a/src/Nocr.Users.AppServices/Users/UserIdentity.cs b/src/Nocr.Users.AppServices/Users/UserIdentity.cs index f51b46a..db281ee 100644 --- a/src/Nocr.Users.AppServices/Users/UserIdentity.cs +++ b/src/Nocr.Users.AppServices/Users/UserIdentity.cs @@ -6,15 +6,15 @@ public sealed class UserIdentity public string Identity { get; private set; } - public UserIdentityType IdentityType { get; private set; } + public UserIdentityType Type { get; private set; } - private UserIdentity(string identity, UserIdentityType identityType) + private UserIdentity(string identity, UserIdentityType type) { if (string.IsNullOrWhiteSpace(identity)) throw new ArgumentNullException(nameof(identity)); Identity = identity; - IdentityType = identityType; + Type = type; } public static UserIdentity TelegramId(string identity) diff --git a/src/Nocr.Users.Host/Controllers/UsersController.cs b/src/Nocr.Users.Host/Controllers/UsersController.cs index d36b63a..d6e8cc2 100644 --- a/src/Nocr.Users.Host/Controllers/UsersController.cs +++ b/src/Nocr.Users.Host/Controllers/UsersController.cs @@ -1,10 +1,9 @@ using Microsoft.AspNetCore.Mvc; using Nocr.Users.Api.Contracts; -using Nocr.Users.Api.Contracts.Users; using Nocr.Users.Api.Contracts.Users.Dto; -using Nocr.Users.AppServices.Users; +using Nocr.Users.AppServices.Users.Services; -namespace Nocr.Users.Host; +namespace Nocr.Users.Host.Controllers; [ApiController] [Route(WebRoutes.Users.Path)] @@ -20,11 +19,13 @@ public class UsersController : ControllerBase [HttpPost] public Task Create([FromBody] CreateUserRequest request, CancellationToken cancellationToken = default) { - return _usersService.Create(request.Username, request.TelegramUsername, request.Email, request.TelegramId, cancellationToken); + return _usersService.Create(request.Username, request.TelegramUsername, request.Email, request.TelegramId, + cancellationToken); } + [HttpGet("{id}")] public Task GetById([FromRoute] long id, CancellationToken cancellationToken = default) { - return _usersService.GetUserById(id, cancellationToken); + return _usersService.GetById(id, cancellationToken); } } \ No newline at end of file diff --git a/src/Nocr.Users.Host/Infrastructure/HostBuilderFactory.cs b/src/Nocr.Users.Host/Infrastructure/HostBuilderFactory.cs index ffe123e..251a45b 100644 --- a/src/Nocr.Users.Host/Infrastructure/HostBuilderFactory.cs +++ b/src/Nocr.Users.Host/Infrastructure/HostBuilderFactory.cs @@ -12,7 +12,7 @@ public class HostBuilderFactory where TStartup : class if (!string.IsNullOrWhiteSpace(baseDirectory)) configurationBuilder.SetBasePath(baseDirectory); - configurationBuilder.AddJsonFile("appsettings.protected.json", false); + configurationBuilder.AddJsonFile("appsettings.protected.json", true); }) .ConfigureWebHostDefaults(host => { host.UseStartup(); }) .UseSerilog((ctx, logBuilder) =>