From 7360291242b231761655b9b02e009a1a06952318 Mon Sep 17 00:00:00 2001 From: "jozsef.b@aycode.com" <9Rj@D}fVwBaN> Date: Wed, 24 Apr 2024 06:50:45 +0200 Subject: [PATCH] refactoring, improvements... --- AyCode.Core.Tests/AyCode.Core.Tests.csproj | 2 + AyCode.Core.Tests/TestModelBase.cs | 17 ++++++- .../AcDatabaseTestModelBase.cs | 12 +---- .../AyCode.Database.Tests.csproj | 2 + .../DataLayers/Users/AcUserDalBase.cs | 25 +++++++++- .../DbContexts/Users/AcUserDbContextBase.cs | 3 ++ .../DbContexts/Users/IAcUserDbContextBase.cs | 8 ++- .../DbSets/Profiles/IAcProfileDbSetBase.cs | 10 ++++ .../AyCode.Services.Server.Tests.csproj | 2 + .../AyCode.Services.Server.csproj | 1 + .../Emails/AcEmailServiceServer.cs | 50 +++++++++++++++++++ .../Logins/AcLoginServiceServer.cs | 10 +++- 12 files changed, 125 insertions(+), 17 deletions(-) create mode 100644 AyCode.Database/DbSets/Profiles/IAcProfileDbSetBase.cs create mode 100644 AyCode.Services.Server/Emails/AcEmailServiceServer.cs diff --git a/AyCode.Core.Tests/AyCode.Core.Tests.csproj b/AyCode.Core.Tests/AyCode.Core.Tests.csproj index 2c5868e..83deb0a 100644 --- a/AyCode.Core.Tests/AyCode.Core.Tests.csproj +++ b/AyCode.Core.Tests/AyCode.Core.Tests.csproj @@ -10,6 +10,8 @@ + + diff --git a/AyCode.Core.Tests/TestModelBase.cs b/AyCode.Core.Tests/TestModelBase.cs index f863edb..ba9f421 100644 --- a/AyCode.Core.Tests/TestModelBase.cs +++ b/AyCode.Core.Tests/TestModelBase.cs @@ -1,9 +1,24 @@ -namespace AyCode.Core.Tests; +using Microsoft.Extensions.Configuration; + +namespace AyCode.Core.Tests; public abstract class TestModelBase { + protected IConfiguration AppSettingsConfiguration; + protected TestModelBase() { //if (IsProductVersion) throw new Exception("IsProductVersion!!!!!"); + + AppSettingsConfiguration = InitAppSettingsConfiguration(); + } + + protected IConfiguration InitAppSettingsConfiguration(string appSettingsFileName = "appsettings.json") + { + var config = new ConfigurationBuilder() + .AddJsonFile(appSettingsFileName) + .AddEnvironmentVariables() + .Build(); + return config; } } \ No newline at end of file diff --git a/AyCode.Database.Tests/AcDatabaseTestModelBase.cs b/AyCode.Database.Tests/AcDatabaseTestModelBase.cs index 97737d2..0ecd4d2 100644 --- a/AyCode.Database.Tests/AcDatabaseTestModelBase.cs +++ b/AyCode.Database.Tests/AcDatabaseTestModelBase.cs @@ -6,18 +6,10 @@ namespace AyCode.Database.Tests; public abstract class AcDatabaseTestModelBase : TestModelBase where TDal : IAcDalBase where TDbContext : AcDbContextBase { - protected TDal Dal; - protected AcDatabaseTestModelBase() - { - Dal = PooledDal.CreateDal(); - } + protected readonly TDal Dal = PooledDal.CreateDal(); } public abstract class AcDatabaseTestModelBase : TestModelBase where TDbContext : AcDbContextBase { - protected TDbContext Context; - protected AcDatabaseTestModelBase() - { - Context = Activator.CreateInstance(); - } + protected readonly TDbContext Context = Activator.CreateInstance(); } \ No newline at end of file diff --git a/AyCode.Database.Tests/AyCode.Database.Tests.csproj b/AyCode.Database.Tests/AyCode.Database.Tests.csproj index db41b0b..1e54d19 100644 --- a/AyCode.Database.Tests/AyCode.Database.Tests.csproj +++ b/AyCode.Database.Tests/AyCode.Database.Tests.csproj @@ -10,6 +10,8 @@ + + diff --git a/AyCode.Database/DataLayers/Users/AcUserDalBase.cs b/AyCode.Database/DataLayers/Users/AcUserDalBase.cs index 576152d..970434a 100644 --- a/AyCode.Database/DataLayers/Users/AcUserDalBase.cs +++ b/AyCode.Database/DataLayers/Users/AcUserDalBase.cs @@ -75,8 +75,29 @@ namespace AyCode.Database.DataLayers.Users return profile; } - public Task RemoveUserAsync(TUser user) => TransactionAsync(ctx => ctx.RemoveUser(user)); - public Task RemoveUserAsync(Guid userId) => TransactionAsync(ctx => ctx.RemoveUser(userId)); + public Task RemoveUserAsync(TUser? user) => TransactionAsync(ctx => RemoveUserTransactionBody(user, ctx)); + public Task RemoveUserAsync(Guid userId) => TransactionAsync(ctx => + { + var user = ctx.GetUserById(userId); + + return RemoveUserTransactionBody(user, ctx); + }); + + protected bool RemoveUserTransactionBody(TUser? user, TDbContext ctx) + { + if (user == null) return false; + + var profile = ctx.Profiles.FirstOrDefault(x => x.Id == user.ProfileId); + if (profile != null) + { + var address = ctx.Addresses.FirstOrDefault(x => x.Id == profile.AddressId); + if (address != null) ctx.Addresses.Remove(address); + + ctx.Profiles.Remove(profile); + } + + return ctx.RemoveUser(user); + } public TUser? AuthenticateUser(string? email, string? password, string refreshToken, out AcErrorCode errorCode) { diff --git a/AyCode.Database/DbContexts/Users/AcUserDbContextBase.cs b/AyCode.Database/DbContexts/Users/AcUserDbContextBase.cs index 4ed4d19..74ad693 100644 --- a/AyCode.Database/DbContexts/Users/AcUserDbContextBase.cs +++ b/AyCode.Database/DbContexts/Users/AcUserDbContextBase.cs @@ -16,6 +16,9 @@ namespace AyCode.Database.DbContexts.Users { public required DbSet Users { get; set; } public required DbSet UserTokens { get; set; } + public DbSet Addresses { get; set; } + public DbSet Profiles { get; set; } + protected AcUserDbContextBase() : this(string.Empty) { } diff --git a/AyCode.Database/DbContexts/Users/IAcUserDbContextBase.cs b/AyCode.Database/DbContexts/Users/IAcUserDbContextBase.cs index 4f63b2d..a4947f7 100644 --- a/AyCode.Database/DbContexts/Users/IAcUserDbContextBase.cs +++ b/AyCode.Database/DbContexts/Users/IAcUserDbContextBase.cs @@ -1,4 +1,6 @@ -using AyCode.Database.DbSets.Users; +using AyCode.Database.DbSets.Addresses; +using AyCode.Database.DbSets.Profiles; +using AyCode.Database.DbSets.Users; using AyCode.Interfaces.Addresses; using AyCode.Interfaces.Profiles; using AyCode.Interfaces.ServiceProviders; @@ -6,7 +8,9 @@ using AyCode.Interfaces.Users; namespace AyCode.Database.DbContexts.Users; -public interface IAcUserDbContextBase : IAcUserDbSet, IAcUserTokenDbSet +public interface IAcUserDbContextBase + : IAcUserDbSet, IAcUserTokenDbSet, IAcAddressDbSetBase, IAcProfileDbSetBase + where TUser : class, IAcUser where TProfile : class, IAcProfile where TUserToken : class, IAcUserTokenBase diff --git a/AyCode.Database/DbSets/Profiles/IAcProfileDbSetBase.cs b/AyCode.Database/DbSets/Profiles/IAcProfileDbSetBase.cs new file mode 100644 index 0000000..f61271a --- /dev/null +++ b/AyCode.Database/DbSets/Profiles/IAcProfileDbSetBase.cs @@ -0,0 +1,10 @@ +using AyCode.Interfaces.Profiles.Dtos; +using AyCode.Interfaces.Users; +using Microsoft.EntityFrameworkCore; + +namespace AyCode.Database.DbSets.Profiles; + +public interface IAcProfileDbSetBase where TProfile : class, IAcProfileDtoBase +{ + DbSet Profiles { get; set; } +} \ No newline at end of file diff --git a/AyCode.Services.Server.Tests/AyCode.Services.Server.Tests.csproj b/AyCode.Services.Server.Tests/AyCode.Services.Server.Tests.csproj index 482e437..f8962a6 100644 --- a/AyCode.Services.Server.Tests/AyCode.Services.Server.Tests.csproj +++ b/AyCode.Services.Server.Tests/AyCode.Services.Server.Tests.csproj @@ -14,6 +14,8 @@ all runtime; build; native; contentfiles; analyzers; buildtransitive + + diff --git a/AyCode.Services.Server/AyCode.Services.Server.csproj b/AyCode.Services.Server/AyCode.Services.Server.csproj index 20fdac1..4d0a62c 100644 --- a/AyCode.Services.Server/AyCode.Services.Server.csproj +++ b/AyCode.Services.Server/AyCode.Services.Server.csproj @@ -26,6 +26,7 @@ + diff --git a/AyCode.Services.Server/Emails/AcEmailServiceServer.cs b/AyCode.Services.Server/Emails/AcEmailServiceServer.cs new file mode 100644 index 0000000..e1ca784 --- /dev/null +++ b/AyCode.Services.Server/Emails/AcEmailServiceServer.cs @@ -0,0 +1,50 @@ +using AyCode.Core.Consts; +using Microsoft.Extensions.Configuration; +using SendGrid.Helpers.Mail; +using SendGrid; + +namespace AyCode.Services.Server.Emails; + +public interface IAcEmailServiceServer +{ + +} +public class AcEmailServiceServer() : IAcEmailServiceServer +{ + private IConfiguration _configuration; + private readonly SendGridClient _sendGridClient; + private readonly EmailAddress _fromEmailAddress; + + public AcEmailServiceServer(IConfiguration configuration) : this() + { + _configuration = configuration ?? throw new ArgumentNullException(nameof(configuration)); + //_sendGridClient = new SendGridClient(_configuration.ServerUserName); + //_fromEmailAddress = new EmailAddress(_configuration.FromEmail, _configuration.FromName); + + //Console.WriteLine($"{config.ServerUserName}; {config.FromEmail}; {config.FromName}"); + } + + public async Task SendLostPasswordEmailAsync(string addressEmail, string verificationToken) + { + const string subject = "Lost password"; + var toEmailAddress = new EmailAddress(addressEmail); + + var plainTextContent = $"{verificationToken}"; + var htmlContent = $"{verificationToken}"; + + var msg = MailHelper.CreateSingleEmail(_fromEmailAddress, toEmailAddress, subject, plainTextContent, htmlContent); + return await _sendGridClient.SendEmailAsync(msg).ConfigureAwait(false); + } + + public async Task SendRegistrationEmailAsync(string addressEmail, string verificationToken, string userName) + { + const string subject = "Registration"; + var toEmailAddress = new EmailAddress(addressEmail); + + var plainTextContent = $"User name: {userName}{AcEnv.NL}Confirmation token: {verificationToken}"; + var htmlContent = $"User name: {userName}
Confirmation token: {verificationToken}"; + + var msg = MailHelper.CreateSingleEmail(_fromEmailAddress, toEmailAddress, subject, plainTextContent, htmlContent); + return await _sendGridClient.SendEmailAsync(msg).ConfigureAwait(false); + } +} \ No newline at end of file diff --git a/AyCode.Services.Server/Logins/AcLoginServiceServer.cs b/AyCode.Services.Server/Logins/AcLoginServiceServer.cs index b22be45..56e68d1 100644 --- a/AyCode.Services.Server/Logins/AcLoginServiceServer.cs +++ b/AyCode.Services.Server/Logins/AcLoginServiceServer.cs @@ -108,11 +108,17 @@ public class AcLoginServiceServer RegistrationAsync(Guid.NewGuid(), email, password, phoneNumber); public virtual Task RegistrationAsync(Guid userId, string email, string password, string? phoneNumber = null) + => TaskHelper.ToThreadPoolTask(() => Registration(userId, email, password, phoneNumber)); + + public virtual bool SendConfirmationToken(string? email, string confirmationToken) { - return TaskHelper.ToThreadPoolTask(() => Registration(userId, email, password, phoneNumber)); + //var sendGrid = SendGrid.SendGridClient(); + return true; } - //public Task SendConfirmationToken(string email) + public virtual Task SendConfirmationTokenAsync(string email, string confirmationToken) + => TaskHelper.ToThreadPoolTask(() => SendConfirmationToken(email, confirmationToken)); + public string GenerateAccessToken(TUser user) { var tokenHandler = new JwtSecurityTokenHandler();