refactoring, improvements, fixes, etc...

This commit is contained in:
jozsef.b@aycode.com 2023-12-20 02:51:05 +01:00
parent ede481f858
commit 02a4c197b4
33 changed files with 198 additions and 118 deletions

View File

@ -2,16 +2,18 @@
using AyCode.Database.DbContexts; using AyCode.Database.DbContexts;
using AyCode.Database.DbContexts.Users; using AyCode.Database.DbContexts.Users;
using AyCode.Interfaces.Profiles; using AyCode.Interfaces.Profiles;
using AyCode.Interfaces.ServiceProviders;
using AyCode.Interfaces.Users; using AyCode.Interfaces.Users;
namespace AyCode.Database.Tests.Users namespace AyCode.Database.Tests.Users
{ {
public abstract class AcUserDalTestBase<TDal, TDbContext, TUser, TProfile, TUserToken> : AcDatabaseTestModelBase<TDal, TDbContext> public abstract class AcUserDalTestBase<TDal, TDbContext, TUser, TProfile, TUserToken, TServiceProvider> : AcDatabaseTestModelBase<TDal, TDbContext>
where TDal : AcUserDalBase<TDbContext, TUser, TProfile, TUserToken> where TDal : AcUserDalBase<TDbContext, TUser, TProfile, TUserToken, TServiceProvider>
where TDbContext : AcDbContextBase, IAcUserDbContextBase<TUser, TProfile, TUserToken> where TDbContext : AcDbContextBase, IAcUserDbContextBase<TUser, TProfile, TUserToken,TServiceProvider>
where TUser : class, IUserBase<TProfile> where TUser : class, IAcUser<TProfile, TServiceProvider>
where TProfile : class, IAcProfileBase where TProfile : class, IAcProfile
where TUserToken : class, IUserTokenBase where TUserToken : class, IAcUserTokenBase
where TServiceProvider : class, IAcServiceProvider
{ {
[TestMethod] [TestMethod]
public virtual void GetUserById_ReturnsUser_WhenUserExists(string userIdString) public virtual void GetUserById_ReturnsUser_WhenUserExists(string userIdString)

View File

@ -12,14 +12,16 @@ using AyCode.Database.Extensions;
using AyCode.Core.Consts; using AyCode.Core.Consts;
using AyCode.Database.DbSets.Users; using AyCode.Database.DbSets.Users;
using AyCode.Interfaces.Profiles; using AyCode.Interfaces.Profiles;
using AyCode.Interfaces.ServiceProviders;
namespace AyCode.Database.DataLayers.Users namespace AyCode.Database.DataLayers.Users
{ {
public abstract class AcUserDalBase<TDbContext, TUser, TProfile, TUserToken> : AcDalBase<TDbContext> public abstract class AcUserDalBase<TDbContext, TUser, TProfile, TUserToken, TServiceProvider> : AcDalBase<TDbContext>
where TDbContext : AcDbContextBase, IAcUserDbContextBase<TUser, TProfile, TUserToken> where TDbContext : AcDbContextBase, IAcUserDbContextBase<TUser, TProfile, TUserToken, TServiceProvider>
where TUser : class, IUserBase<TProfile> where TUser : class, IAcUser<TProfile, TServiceProvider>
where TProfile : class, IAcProfileBase where TProfile : class, IAcProfile
where TUserToken : class, IUserTokenBase where TUserToken : class, IAcUserTokenBase
where TServiceProvider : class, IAcServiceProvider
{ {
public TUser? GetUserById(Guid userId) => Session(x => x.GetUserById(userId)); public TUser? GetUserById(Guid userId) => Session(x => x.GetUserById(userId));
public Task<TUser?> GetUserByIdAsync(Guid userId) => SessionAsync(x => x.GetUserById(userId)); public Task<TUser?> GetUserByIdAsync(Guid userId) => SessionAsync(x => x.GetUserById(userId));

View File

@ -11,7 +11,7 @@ namespace AyCode.Database.DataLayers.Users
{ {
public static class AcUserDalExtension public static class AcUserDalExtension
{ {
//public static bool DeleteUser(this IAcUserDbContextBase ctx, IUserBase user) //public static bool DeleteUser(this IAcUserDbContextBase ctx, IAcUser user)
//{ //{
// if (user == null) return false; // if (user == null) return false;
@ -48,7 +48,7 @@ namespace AyCode.Database.DataLayers.Users
// return ctx.SetUserConsentsToAccepted(user); // return ctx.SetUserConsentsToAccepted(user);
//} //}
//public static bool SetUserConsentsToAccepted(this AcUserDbContextBase ctx, IUserBase? user) //public static bool SetUserConsentsToAccepted(this AcUserDbContextBase ctx, IAcUser? user)
//{ //{
// if (!user.EmailConfirmed) return false; //Ez nem kéne ide... - J. // if (!user.EmailConfirmed) return false; //Ez nem kéne ide... - J.
@ -76,7 +76,7 @@ namespace AyCode.Database.DataLayers.Users
//public static void UsernameAndEmailAvailable(this IUserDal userDal, string username, string email, Action<bool, AcErrorCode, AspNetUser> callback) //public static void UsernameAndEmailAvailable(this IUserDal userDal, string username, string email, Action<bool, AcErrorCode, AspNetUser> callback)
//{ //{
// IUserBase notConfirmedUser = null; // IAcUser notConfirmedUser = null;
// var lowerEmail = email.ToLower(); // var lowerEmail = email.ToLower();
// var lowerUserName = username.ToLower(); // var lowerUserName = username.ToLower();
@ -106,7 +106,7 @@ namespace AyCode.Database.DataLayers.Users
//} //}
//public static void AddNewUser(this IUserDal userDal, IUserBase newUser, Action<AspNetUser> callback) //public static void AddNewUser(this IUserDal userDal, IAcUser newUser, Action<AspNetUser> callback)
//{ //{
// userDal.Add(newUser); // userDal.Add(newUser);
// callback(newUser); // callback(newUser);

View File

@ -4,15 +4,17 @@ using System.Linq;
using System.Text; using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using AyCode.Interfaces.Profiles; using AyCode.Interfaces.Profiles;
using AyCode.Interfaces.ServiceProviders;
using AyCode.Interfaces.Users; using AyCode.Interfaces.Users;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
namespace AyCode.Database.DbContexts.Users namespace AyCode.Database.DbContexts.Users
{ {
public abstract class AcUserDbContextBase<TUser, TProfile, TUserToken> : AcDbContextBase, IAcUserDbContextBase<TUser, TProfile, TUserToken> public abstract class AcUserDbContextBase<TUser, TProfile, TUserToken, TServiceProvider> : AcDbContextBase, IAcUserDbContextBase<TUser, TProfile, TUserToken, TServiceProvider>
where TUser : class, IUserBase<TProfile> where TUser : class, IAcUser<TProfile, TServiceProvider>
where TProfile : class, IAcProfileBase where TProfile : class, IAcProfile
where TUserToken : class, IUserTokenBase where TUserToken : class, IAcUserTokenBase
where TServiceProvider : class, IAcServiceProvider
{ {
public required DbSet<TUser> Users { get; set; } public required DbSet<TUser> Users { get; set; }
public required DbSet<TUserToken> UserTokens { get; set; } public required DbSet<TUserToken> UserTokens { get; set; }

View File

@ -1,13 +1,15 @@
using AyCode.Database.DbSets.Users; using AyCode.Database.DbSets.Users;
using AyCode.Interfaces.Profiles; using AyCode.Interfaces.Profiles;
using AyCode.Interfaces.ServiceProviders;
using AyCode.Interfaces.Users; using AyCode.Interfaces.Users;
using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore;
namespace AyCode.Database.DbContexts.Users; namespace AyCode.Database.DbContexts.Users;
public interface IAcUserDbContextBase<TUser, TProfile, TUserToken> : IAcUserDbSet<TUser, TProfile>, IAcUserTokenDbSet<TUserToken> public interface IAcUserDbContextBase<TUser, TProfile, TUserToken, TServiceProvider> : IAcUserDbSet<TUser, TProfile, TServiceProvider>, IAcUserTokenDbSet<TUserToken>
where TUser : class, IUserBase<TProfile> where TUser : class, IAcUser<TProfile, TServiceProvider>
where TProfile : class, IAcProfileBase where TProfile : class, IAcProfile
where TUserToken : class, IUserTokenBase where TUserToken : class, IAcUserTokenBase
where TServiceProvider : class, IAcServiceProvider
{ {
} }

View File

@ -3,7 +3,7 @@ using Microsoft.EntityFrameworkCore;
namespace AyCode.Database.DbContexts.Users; namespace AyCode.Database.DbContexts.Users;
public interface IAcUserTokenDbContextBase<TUserToken> where TUserToken : class, IUserTokenBase public interface IAcUserTokenDbContextBase<TUserToken> where TUserToken : class, IAcUserTokenBase
{ {
DbSet<TUserToken> UserToken { get; set; } DbSet<TUserToken> UserToken { get; set; }
} }

View File

@ -7,16 +7,16 @@ namespace AyCode.Database.DbSets.Users;
public static class AcUserDbSetExtensions public static class AcUserDbSetExtensions
{ {
public static TUser? GetUserById<TUser, TProfile>(this IAcUserDbSet<TUser, TProfile> ctx, Guid userId) where TUser : class, IUserBase<TProfile> where TProfile : class, IAcProfileBase public static TUser? GetUserById<TUser>(this IAcUserDbSetBase<TUser> ctx, Guid userId) where TUser : class, IAcUserBase
=> ctx.GetUsersById(userId).FirstOrDefault(); => ctx.GetUsersById(userId).FirstOrDefault();
public static TUser? GetUserByEmail<TUser, TProfile>(this IAcUserDbSet<TUser, TProfile> ctx, string email) where TUser : class, IUserBase<TProfile> where TProfile : class, IAcProfileBase public static TUser? GetUserByEmail<TUser>(this IAcUserDbSetBase<TUser> ctx, string email) where TUser : class, IAcUserBase
=> ctx.GetUsersByEmail(email).FirstOrDefault(); => ctx.GetUsersByEmail(email).FirstOrDefault();
public static IQueryable<TUser> GetUsersById<TUser, TProfile>(this IAcUserDbSet<TUser, TProfile> ctx, Guid userId) where TUser : class, IUserBase<TProfile> where TProfile : class, IAcProfileBase public static IQueryable<TUser> GetUsersById<TUser>(this IAcUserDbSetBase<TUser> ctx, Guid userId) where TUser : class, IAcUserBase
=> ctx.Users.Where(u => u.Id == userId); => ctx.Users.Where(u => u.Id == userId);
public static IQueryable<TUser> GetUsersByEmail<TUser, TProfile>(this IAcUserDbSet<TUser, TProfile> ctx, string email) where TUser : class, IUserBase<TProfile> where TProfile : class, IAcProfileBase public static IQueryable<TUser> GetUsersByEmail<TUser>(this IAcUserDbSetBase<TUser> ctx, string email) where TUser : class, IAcUserBase
{ {
Logger.Info($"GetUserByEmail: {email}"); Logger.Info($"GetUserByEmail: {email}");

View File

@ -6,10 +6,9 @@ namespace AyCode.Database.DbSets.Users;
public static class AcUserTokenDbSetExtensions public static class AcUserTokenDbSetExtensions
{ {
public static bool ChangePassword<TUser, TProfile, TUserToken>(this IAcUserDbContextBase<TUser, TProfile, TUserToken> ctx, TUser? user, string passwordHash, string verificationToken) public static bool ChangePassword<TUser, TUserToken>(this IAcUserChangePasswordDbSet<TUser, TUserToken> ctx, TUser? user, string passwordHash, string verificationToken)
where TUser : class, IUserBase<TProfile> where TUser : class, IAcUserBase
where TProfile : class, IAcProfileBase where TUserToken : class, IAcUserTokenBase
where TUserToken : class, IUserTokenBase
{ {
if (user == null || !ctx.IsValidToken(user.Id, verificationToken)) return false; if (user == null || !ctx.IsValidToken(user.Id, verificationToken)) return false;
@ -21,7 +20,7 @@ public static class AcUserTokenDbSetExtensions
return true; return true;
} }
public static TUserToken? UpdateUserTokenSent<TUserToken>(this IAcUserTokenDbSet<TUserToken> ctx, Guid userId, string verificationToken, DateTime tokenSentUtc) where TUserToken : class, IUserTokenBase public static TUserToken? UpdateUserTokenSent<TUserToken>(this IAcUserTokenDbSet<TUserToken> ctx, Guid userId, string verificationToken, DateTime tokenSentUtc) where TUserToken : class, IAcUserTokenBase
{ {
var userToken = ctx.GetUserToken(userId, verificationToken); var userToken = ctx.GetUserToken(userId, verificationToken);
@ -37,7 +36,7 @@ public static class AcUserTokenDbSetExtensions
return userToken; return userToken;
} }
public static TUserToken CreateUserToken<TUserToken>(this IAcUserTokenDbSet<TUserToken> ctx, Guid userId, string verificationToken) where TUserToken : class, IUserTokenBase public static TUserToken CreateUserToken<TUserToken>(this IAcUserTokenDbSet<TUserToken> ctx, Guid userId, string verificationToken) where TUserToken : class, IAcUserTokenBase
{ {
var userToken = Activator.CreateInstance<TUserToken>(); var userToken = Activator.CreateInstance<TUserToken>();
userToken.UserId = userId; userToken.UserId = userId;
@ -46,7 +45,7 @@ public static class AcUserTokenDbSetExtensions
return ctx.CreateUserToken(userToken); return ctx.CreateUserToken(userToken);
} }
public static TUserToken CreateUserToken<TUserToken>(this IAcUserTokenDbSet<TUserToken> ctx, TUserToken userToken) where TUserToken : class, IUserTokenBase public static TUserToken CreateUserToken<TUserToken>(this IAcUserTokenDbSet<TUserToken> ctx, TUserToken userToken) where TUserToken : class, IAcUserTokenBase
{ {
ctx.DeactivateTokens(userToken.UserId); ctx.DeactivateTokens(userToken.UserId);
@ -56,16 +55,16 @@ public static class AcUserTokenDbSetExtensions
return userToken; return userToken;
} }
public static TUserToken? GetActiveUserToken<TUserToken>(this IAcUserTokenDbSet<TUserToken> ctx, Guid userId) where TUserToken : class, IUserTokenBase public static TUserToken? GetActiveUserToken<TUserToken>(this IAcUserTokenDbSet<TUserToken> ctx, Guid userId) where TUserToken : class, IAcUserTokenBase
=> ctx.UserTokens.SingleOrDefault(x => x.UserId == userId && x.IsActive && (x.TokenExpiration == null || x.TokenExpiration > DateTime.UtcNow)); => ctx.UserTokens.SingleOrDefault(x => x.UserId == userId && x.IsActive && (x.TokenExpiration == null || x.TokenExpiration > DateTime.UtcNow));
public static TUserToken? GetUserToken<TUserToken>(this IAcUserTokenDbSet<TUserToken> ctx, Guid userId, string verificationToken) where TUserToken : class, IUserTokenBase public static TUserToken? GetUserToken<TUserToken>(this IAcUserTokenDbSet<TUserToken> ctx, Guid userId, string verificationToken) where TUserToken : class, IAcUserTokenBase
=> ctx.UserTokens.SingleOrDefault(x => x.UserId == userId && x.Token == verificationToken); => ctx.UserTokens.SingleOrDefault(x => x.UserId == userId && x.Token == verificationToken);
public static bool IsValidToken<TUserToken>(this IAcUserTokenDbSet<TUserToken> ctx, Guid userId, string verificationToken) where TUserToken : class, IUserTokenBase public static bool IsValidToken<TUserToken>(this IAcUserTokenDbSet<TUserToken> ctx, Guid userId, string verificationToken) where TUserToken : class, IAcUserTokenBase
=> ctx.UserTokens.Any(x => x.UserId == userId && x.IsActive && x.Token == verificationToken && x.TokenExpiration > DateTime.UtcNow && x.TokenSent < DateTime.UtcNow); => ctx.UserTokens.Any(x => x.UserId == userId && x.IsActive && x.Token == verificationToken && x.TokenExpiration > DateTime.UtcNow && x.TokenSent < DateTime.UtcNow);
public static void DeactivateTokens<TUserToken>(this IAcUserTokenDbSet<TUserToken> ctx, Guid userId) where TUserToken : class, IUserTokenBase public static void DeactivateTokens<TUserToken>(this IAcUserTokenDbSet<TUserToken> ctx, Guid userId) where TUserToken : class, IAcUserTokenBase
{ {
var activeUserTokens = ctx.UserTokens.Where(x => x.UserId == userId && x.IsActive); var activeUserTokens = ctx.UserTokens.Where(x => x.UserId == userId && x.IsActive);

View File

@ -0,0 +1,10 @@
using AyCode.Interfaces.Users;
namespace AyCode.Database.DbSets.Users;
public interface IAcUserChangePasswordDbSet<TUser, TUserToken> : IAcUserDbSetBase<TUser>, IAcUserTokenDbSet<TUserToken>
where TUser : class, IAcUserBase
where TUserToken : class, IAcUserTokenBase
{
}

View File

@ -1,13 +1,12 @@
using AyCode.Database.DbContexts; using AyCode.Database.DbContexts;
using AyCode.Interfaces.Profiles; using AyCode.Interfaces.Profiles;
using AyCode.Interfaces.ServiceProviders;
using AyCode.Interfaces.Users; using AyCode.Interfaces.Users;
using Microsoft.EntityFrameworkCore;
namespace AyCode.Database.DbSets.Users; namespace AyCode.Database.DbSets.Users;
public interface IAcUserDbSet<TUser, TProfile> public interface IAcUserDbSet<TUser, TProfile, TServiceProvider> : IAcUserDbSetBase<TUser>
where TUser : class, IUserBase<TProfile> where TUser : class, IAcUser<TProfile, TServiceProvider>
where TProfile : class, IAcProfileBase where TProfile : class, IAcProfile
{ where TServiceProvider : class, IAcServiceProvider
DbSet<TUser> Users { get; set; } { }
}

View File

@ -0,0 +1,9 @@
using AyCode.Interfaces.Users;
using Microsoft.EntityFrameworkCore;
namespace AyCode.Database.DbSets.Users;
public interface IAcUserDbSetBase<TUser> where TUser : class, IAcUserBase
{
DbSet<TUser> Users { get; set; }
}

View File

@ -3,7 +3,7 @@ using Microsoft.EntityFrameworkCore;
namespace AyCode.Database.DbSets.Users; namespace AyCode.Database.DbSets.Users;
public interface IAcUserTokenDbSet<TUserToken> where TUserToken : class, IUserTokenBase public interface IAcUserTokenDbSet<TUserToken> where TUserToken : class, IAcUserTokenBase
{ {
DbSet<TUserToken> UserTokens { get; set; } DbSet<TUserToken> UserTokens { get; set; }
} }

View File

@ -1,17 +1,23 @@
using AyCode.Interfaces.Profiles; using AyCode.Interfaces.Profiles;
using AyCode.Interfaces.Users; using AyCode.Interfaces.Users;
using Microsoft.EntityFrameworkCore.Metadata.Builders; using Microsoft.EntityFrameworkCore.Metadata.Builders;
using System.Formats.Tar;
using AyCode.Interfaces.ServiceProviders;
namespace AyCode.Database.ModelBuilders.Users; namespace AyCode.Database.ModelBuilders.Users;
public static class AcUserEntityTypeBuilderExtensions public static class AcUserEntityTypeBuilderExtensions
{ {
public static void BuildUserToProfileRelation<TUser, TProfile>(this EntityTypeBuilder<TUser> modelBuilder) where TUser : class, IUserBase<TProfile> where TProfile : class, IAcProfileBase public static void BuildEntityToProfileRelation<TProfileRelation, TProfile>(this EntityTypeBuilder<TProfileRelation> modelBuilder, bool autoInclude = true) where TProfileRelation : class, IAcProfileRelation<TProfile> where TProfile : class, IAcProfile
{ {
//throw new NotImplementedException(); modelBuilder.Navigation(e => e.Profile).AutoInclude(autoInclude);
} }
public static void BuildUserToAddressRelation<TUser, TProfile>(this EntityTypeBuilder<TUser> modelBuilder) where TUser : class, IUserBase<TProfile> where TProfile : class, IAcProfileBase public static void BuildEntityToServiceProviderRelation<TServiceProviderRelation, TServiceProvider>(this EntityTypeBuilder<TServiceProviderRelation> modelBuilder, bool autoInclude = true) where TServiceProviderRelation : class, IAcServiceProviderRelation<TServiceProvider> where TServiceProvider : class, IAcServiceProvider
{
}
public static void BuildEntityToAddressRelation<TProfileRelation, TProfile>(this EntityTypeBuilder<TProfileRelation> modelBuilder) where TProfileRelation : class, IAcProfileRelation<TProfile> where TProfile : class, IAcProfile
{ {
//throw new NotImplementedException(); //throw new NotImplementedException();
} }

View File

@ -1,15 +1,20 @@
using AyCode.Database.DbContexts; using AyCode.Database.DbContexts;
using AyCode.Interfaces.Profiles; using AyCode.Interfaces.Profiles;
using AyCode.Interfaces.ServiceProviders;
using AyCode.Interfaces.Users; using AyCode.Interfaces.Users;
using Microsoft.EntityFrameworkCore.Metadata.Builders; using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace AyCode.Database.ModelBuilders.Users; namespace AyCode.Database.ModelBuilders.Users;
public abstract class AcUserEntityTypeDefaultConfiguration<TUser, TProfile> : IAcEntityTypeConfiguration<TUser> where TUser : class, IUserBase<TProfile> where TProfile : class, IAcProfileBase public abstract class AcUserEntityTypeDefaultConfiguration<TUser, TProfile, TServiceProvider> : IAcEntityTypeConfiguration<TUser>
where TUser : class, IAcUser<TProfile, TServiceProvider>
where TProfile : class, IAcProfile
where TServiceProvider : class, IAcServiceProvider
{ {
public virtual void Configure(EntityTypeBuilder<TUser> modelBuilder) public virtual void Configure(EntityTypeBuilder<TUser> modelBuilder)
{ {
modelBuilder.BuildUserToProfileRelation<TUser, TProfile>(); modelBuilder.BuildEntityToProfileRelation<TUser, TProfile>();
modelBuilder.BuildUserToAddressRelation<TUser, TProfile>(); modelBuilder.BuildEntityToAddressRelation<TUser, TProfile>();
modelBuilder.BuildEntityToServiceProviderRelation<TUser, TServiceProvider>();
} }
} }

View File

@ -10,11 +10,11 @@ using System.Threading.Tasks;
namespace AyCode.Entities.Profiles namespace AyCode.Entities.Profiles
{ {
[Table("Profile")] [Table("Profile")]
public abstract class AcProfileBase : IAcProfileBase public abstract class AcProfile : IAcProfile
{ {
protected AcProfileBase() { } protected AcProfile() { }
protected AcProfileBase(Guid ownerId) : this() protected AcProfile(Guid ownerId) : this()
{ {
OwnerId = ownerId; OwnerId = ownerId;
} }

View File

@ -6,21 +6,8 @@ using AyCode.Interfaces.ServiceProviders;
namespace AyCode.Entities.ServiceProviders namespace AyCode.Entities.ServiceProviders
{ {
[Table("ServiceProviders")] [Table("ServiceProviders")]
public abstract class ServiceProviderBase : IServiceProviderBase public abstract class AcServiceProvider : IAcServiceProvider
{ {
protected ServiceProviderBase() { }
protected ServiceProviderBase(string name, Guid ownerId ) : this(Guid.NewGuid(), name, ownerId) { }
protected ServiceProviderBase(Guid id, string name, Guid ownerId) : this()
{
Id = id;
Name = name;
OwnerId = ownerId;
}
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)] [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public Guid Id { get; set; } public Guid Id { get; set; }
public string Name { get; set; } public string Name { get; set; }
@ -28,6 +15,17 @@ namespace AyCode.Entities.ServiceProviders
public DateTime Created { get; set; } public DateTime Created { get; set; }
public DateTime Modified { get; set; } public DateTime Modified { get; set; }
protected AcServiceProvider() { }
protected AcServiceProvider(string name, Guid ownerId ) : this(Guid.NewGuid(), name, ownerId) { }
protected AcServiceProvider(Guid id, string name, Guid ownerId) : this()
{
Id = id;
Name = name;
OwnerId = ownerId;
}
} }
} }

View File

@ -7,11 +7,13 @@ using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using AyCode.Interfaces.Profiles; using AyCode.Interfaces.Profiles;
using AyCode.Interfaces.Users; using AyCode.Interfaces.Users;
using AyCode.Entities.ServiceProviders;
using AyCode.Interfaces.ServiceProviders;
namespace AyCode.Entities.Users namespace AyCode.Entities.Users
{ {
[Table("Users")] [Table("Users")]
public abstract class UserBase<TProfile> : IUserBase<TProfile> where TProfile : class, IAcProfileBase public abstract class AcUser<TProfile, TServiceProvider> : IAcUser<TProfile, TServiceProvider> where TProfile : class, IAcProfile where TServiceProvider : class, IAcServiceProvider
{ {
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)] [Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public Guid Id { get; set; } public Guid Id { get; set; }
@ -24,35 +26,38 @@ namespace AyCode.Entities.Users
public bool EmailConfirmed { get; set; } public bool EmailConfirmed { get; set; }
public Guid? ProfileId { get; } public Guid ProfileId { get; }
[ForeignKey(nameof(ProfileId))] [ForeignKey(nameof(ProfileId))]
public virtual TProfile Profile { get; set; } public virtual TProfile Profile { get; set; }
//[NotMapped]
public virtual List<TServiceProvider> ServiceProviders { get; set; }
public DateTime Created { get; set; } public DateTime Created { get; set; }
public DateTime Modified { get; set; } public DateTime Modified { get; set; }
protected UserBase() { } protected AcUser() { }
protected UserBase(string email, string password) : this(Guid.NewGuid(), email, password) { } protected AcUser(string email, string password) : this(Guid.NewGuid(), email, password) { }
protected UserBase(Guid id, string email, string password) : this() protected AcUser(Guid id, string email, string password) : this()
{ {
Id = id; Id = id;
EmailAddress = email; EmailAddress = email;
Password = password; Password = password;
} }
protected UserBase(string email, string phoneNumber, string password) : this(Guid.NewGuid(), email, phoneNumber, password) { } protected AcUser(string email, string phoneNumber, string password) : this(Guid.NewGuid(), email, phoneNumber, password) { }
protected UserBase(Guid id, string email, string phoneNumber, string password) : this(id, email, password) protected AcUser(Guid id, string email, string phoneNumber, string password) : this(id, email, password)
{ {
PhoneNumber = phoneNumber; PhoneNumber = phoneNumber;
} }
protected UserBase(string email, string phoneNumber, string password, string refreshToken) : this(Guid.NewGuid(), email, phoneNumber, password, refreshToken) { } protected AcUser(string email, string phoneNumber, string password, string refreshToken) : this(Guid.NewGuid(), email, phoneNumber, password, refreshToken) { }
protected UserBase(Guid id, string email, string phoneNumber, string password, string refreshToken) : this(id, email, phoneNumber, password) protected AcUser(Guid id, string email, string phoneNumber, string password, string refreshToken) : this(id, email, phoneNumber, password)
{ {
RefreshToken = refreshToken; RefreshToken = refreshToken;
} }

View File

@ -5,7 +5,7 @@ using System.ComponentModel.DataAnnotations;
namespace AyCode.Entities.Users; namespace AyCode.Entities.Users;
[Table("UserToken")] [Table("UserToken")]
public abstract class UserTokenBase : IUserTokenBase public abstract class AcUserTokenBase : IAcUserTokenBase
{ {
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get; set; } public int Id { get; set; }

View File

@ -1,6 +1,6 @@
namespace AyCode.Interfaces.Profiles; namespace AyCode.Interfaces.Profiles;
public abstract class AcProfile : IAcProfileBase public abstract class AcProfile : IAcProfile
{ {
public Guid Id { get; set; } public Guid Id { get; set; }
public Guid OwnerId { get; set; } public Guid OwnerId { get; set; }

View File

@ -6,6 +6,6 @@ using AyCode.Interfaces.Profiles.Dtos;
namespace AyCode.Interfaces.Profiles; namespace AyCode.Interfaces.Profiles;
public interface IAcProfileBase : IAcProfileDtoBase, ITimeStampInfo public interface IAcProfile : IAcProfileDtoBase, ITimeStampInfo
{ {
} }

View File

@ -0,0 +1,11 @@
using AyCode.Interfaces.TimeStampInfo;
using AyCode.Interfaces.Users.Dtos;
using AyCode.Interfaces.Users;
namespace AyCode.Interfaces.Profiles;
public interface IAcProfileRelation<TProfile> where TProfile : class, IAcProfile
{
public Guid ProfileId { get; }
public TProfile Profile { get; set; }
}

View File

@ -1,11 +1,12 @@
 
using AyCode.Interfaces.Entities; using AyCode.Interfaces.Entities;
using AyCode.Interfaces.Profiles;
using AyCode.Interfaces.TimeStampInfo; using AyCode.Interfaces.TimeStampInfo;
using System;
namespace AyCode.Interfaces.ServiceProviders; namespace AyCode.Interfaces.ServiceProviders;
public interface IServiceProviderBase : IEntityGuid, ITimeStampInfo public interface IAcServiceProvider : IEntityGuid, ITimeStampInfo, IOwnerId
{ {
string Name { get; } string Name { get; }
Guid OwnerId { get; }
} }

View File

@ -0,0 +1,6 @@
namespace AyCode.Interfaces.ServiceProviders;
public interface IAcServiceProviderRelation<TServiceProvider> where TServiceProvider : class, IAcServiceProvider
{
public List<TServiceProvider> ServiceProviders { get; set; }
}

View File

@ -1,6 +1,11 @@
namespace AyCode.Interfaces.Users.Dtos; using AyCode.Interfaces.Entities;
using AyCode.Interfaces.Profiles;
using AyCode.Interfaces.ServiceProviders;
public interface IAcUserDtoBase : IAcUserDtoMinBase namespace AyCode.Interfaces.Users.Dtos;
public interface IAcUserDtoBase<TProfile, TServiceProvider> : IAcUserDtoMinBase<TProfile>, IAcServiceProviderRelation<TServiceProvider>
where TProfile : class, IAcProfile
where TServiceProvider : class, IAcServiceProvider
{ {
} }

View File

@ -1,10 +1,11 @@
using AyCode.Interfaces.Entities; using AyCode.Interfaces.Entities;
using AyCode.Interfaces.Profiles;
using AyCode.Interfaces.ServiceProviders;
namespace AyCode.Interfaces.Users.Dtos; namespace AyCode.Interfaces.Users.Dtos;
public interface IAcUserDtoDetailBase : IEmailAddress, IAcUserDtoBase public interface IAcUserDtoDetailBase<TProfile, TServiceProvider> : IAcUserBase, IAcUserDtoBase<TProfile, TServiceProvider>
where TProfile : class, IAcProfile
where TServiceProvider : class, IAcServiceProvider
{ {
public string PhoneNumber { get; set; }
public string? RefreshToken { get; set; }
} }

View File

@ -1,9 +1,10 @@
 
using AyCode.Interfaces.Entities; using AyCode.Interfaces.Entities;
using AyCode.Interfaces.Profiles;
namespace AyCode.Interfaces.Users.Dtos; namespace AyCode.Interfaces.Users.Dtos;
public interface IAcUserDtoMinBase : IEntityGuid public interface IAcUserDtoMinBase<TProfile> : IEntityGuid, IAcProfileRelation<TProfile> where TProfile : class, IAcProfile
{ {
} }

View File

@ -0,0 +1,12 @@

using AyCode.Interfaces.Entities;
using AyCode.Interfaces.Profiles;
using AyCode.Interfaces.ServiceProviders;
using AyCode.Interfaces.Users.Dtos;
namespace AyCode.Interfaces.Users;
public interface IAcUser<TProfile, TServiceProvider> : IAcUserDtoDetailBase<TProfile, TServiceProvider>
where TProfile : class, IAcProfile
where TServiceProvider : class, IAcServiceProvider
{ }

View File

@ -0,0 +1,11 @@
using AyCode.Interfaces.Entities;
using AyCode.Interfaces.TimeStampInfo;
using AyCode.Interfaces.Users.Dtos;
namespace AyCode.Interfaces.Users;
public interface IAcUserBase : IEntityGuid, IEmailAddress, IPassword, ITimeStampInfo
{
public string PhoneNumber { get; set; }
public string? RefreshToken { get; set; }
}

View File

@ -5,7 +5,7 @@ using AyCode.Interfaces.TimeStampInfo;
namespace AyCode.Interfaces.Users; namespace AyCode.Interfaces.Users;
public interface IUserTokenBase : IEntity<int>, ITimeStampInfo public interface IAcUserTokenBase : IEntity<int>, ITimeStampInfo
{ {
public Guid UserId { get; set; } public Guid UserId { get; set; }
public bool IsActive { get; set; } public bool IsActive { get; set; }

View File

@ -1,13 +0,0 @@

using AyCode.Interfaces.Entities;
using AyCode.Interfaces.Profiles;
using AyCode.Interfaces.TimeStampInfo;
using AyCode.Interfaces.Users.Dtos;
namespace AyCode.Interfaces.Users;
public interface IUserBase<TProfile> : IAcUserDtoDetailBase, IPassword, ITimeStampInfo where TProfile : class, IAcProfileBase
{
public Guid? ProfileId { get; }
public TProfile Profile { get; set; }
}

View File

@ -1,17 +1,21 @@
using AyCode.Interfaces.Profiles; using AyCode.Interfaces.Profiles;
using AyCode.Interfaces.Profiles.Dtos; using AyCode.Interfaces.Profiles.Dtos;
using AyCode.Interfaces.ServiceProviders;
using AyCode.Interfaces.Users; using AyCode.Interfaces.Users;
using AyCode.Interfaces.Users.Dtos; using AyCode.Interfaces.Users.Dtos;
namespace AyCode.Models.Users; namespace AyCode.Models.Users;
public abstract class AcUserModelDtoBase<TUserDto, TProfile, TProfileDto> : AcUserModelDtoMinBase<TUserDto, TProfile, TProfileDto> public abstract class AcUserModelDtoBase<TUserDto, TProfile, TProfileDto, TServiceProvider> : AcUserModelDtoMinBase<TUserDto, TProfile, TProfileDto>, IAcServiceProviderRelation<TServiceProvider>
where TUserDto : class, IAcUserDtoBase where TUserDto : class, IAcUserDtoBase<TProfile, TServiceProvider>
where TProfile : class, IAcProfileBase where TProfile : class, IAcProfile
where TProfileDto : class, IAcProfileDtoBase where TProfileDto : class, IAcProfileDtoBase
where TServiceProvider : class, IAcServiceProvider
{ {
public List<TServiceProvider> ServiceProviders { get; set; }
protected AcUserModelDtoBase() {} protected AcUserModelDtoBase() {}
protected AcUserModelDtoBase(IUserBase<TProfile> user) : base(user) protected AcUserModelDtoBase(IAcUserDtoBase<TProfile, TServiceProvider> user) : base(user)
{ {
//ServiceProvider... //ServiceProvider...
} }

View File

@ -1,17 +1,19 @@
using AyCode.Interfaces.Profiles; using AyCode.Interfaces.Profiles;
using AyCode.Interfaces.Profiles.Dtos; using AyCode.Interfaces.Profiles.Dtos;
using AyCode.Interfaces.ServiceProviders;
using AyCode.Interfaces.Users; using AyCode.Interfaces.Users;
using AyCode.Interfaces.Users.Dtos; using AyCode.Interfaces.Users.Dtos;
namespace AyCode.Models.Users; namespace AyCode.Models.Users;
public abstract class AcUserModelDtoDetailBase<TUserDtoDetail, TProfile, TProfileDto> : AcUserModelDtoBase<TUserDtoDetail, TProfile, TProfileDto> public abstract class AcUserModelDtoDetailBase<TUserDtoDetail, TProfile, TProfileDto, TServiceProvider> : AcUserModelDtoBase<TUserDtoDetail, TProfile, TProfileDto, TServiceProvider>
where TUserDtoDetail : class, IAcUserDtoDetailBase where TUserDtoDetail : class, IAcUserDtoDetailBase<TProfile, TServiceProvider>
where TProfile : class, IAcProfileBase where TProfile : class, IAcProfile
where TProfileDto : class, IAcProfileDtoBase where TProfileDto : class, IAcProfileDtoBase
where TServiceProvider : class, IAcServiceProvider
{ {
protected AcUserModelDtoDetailBase() {} protected AcUserModelDtoDetailBase() {}
protected AcUserModelDtoDetailBase(IUserBase<TProfile> user) : base(user) protected AcUserModelDtoDetailBase(IAcUserDtoDetailBase<TProfile, TServiceProvider> user) : base(user)
{ {
} }
} }

View File

@ -6,15 +6,15 @@ using AyCode.Interfaces.Users.Dtos;
namespace AyCode.Models.Users; namespace AyCode.Models.Users;
public abstract class AcUserModelDtoMinBase<TUserDtoMin, TProfile, TProfileDto> : AcModelDtoBase public abstract class AcUserModelDtoMinBase<TUserDtoMin, TProfile, TProfileDto> : AcModelDtoBase
where TUserDtoMin : class, IAcUserDtoMinBase where TUserDtoMin : class, IAcUserDtoMinBase<TProfile>
where TProfile : class, IAcProfileBase where TProfile : class, IAcProfile
where TProfileDto : class, IAcProfileDtoBase where TProfileDto : class, IAcProfileDtoBase
{ {
public TUserDtoMin UserDto { get; set;} public TUserDtoMin UserDto { get; set;}
public TProfileDto? Profile { get; set; } public TProfileDto? Profile { get; set; }
protected AcUserModelDtoMinBase() {} protected AcUserModelDtoMinBase() {}
protected AcUserModelDtoMinBase(IUserBase<TProfile> user) : base(user.Id) protected AcUserModelDtoMinBase(IAcUserDtoMinBase<TProfile> user) : base(user.Id)
{ {
Id = user.Id; Id = user.Id;