diff --git a/AyCode.Database.Tests/DatabaseTestModelBase.cs b/AyCode.Database.Tests/DatabaseTestModelBase.cs index b04328e..b9e7bc5 100644 --- a/AyCode.Database.Tests/DatabaseTestModelBase.cs +++ b/AyCode.Database.Tests/DatabaseTestModelBase.cs @@ -4,10 +4,10 @@ using AyCode.Database.DbContexts; namespace AyCode.Database.Tests; -public abstract class DatabaseTestModelBase : TestModelBase where TDbContext : DbContextBase +public abstract class DatabaseTestModelBase : TestModelBase where TDbContext : AcDbContextBase { protected DatabaseTestModelBase() { - //var dal = new dal + //var acDal = new acDal } } \ No newline at end of file diff --git a/AyCode.Database.Tests/DatabaseTests.cs b/AyCode.Database.Tests/DatabaseTests.cs index 0b8ad84..8f287d8 100644 --- a/AyCode.Database.Tests/DatabaseTests.cs +++ b/AyCode.Database.Tests/DatabaseTests.cs @@ -3,7 +3,7 @@ using AyCode.Database.DbContexts; namespace AyCode.Database.Tests { [TestClass] - public abstract class DatabaseTests : DatabaseTestModelBase + public abstract class DatabaseTests : DatabaseTestModelBase { [TestMethod] public void TestMethod1() diff --git a/AyCode.Database.Tests/Users/UserDbSetTest.cs b/AyCode.Database.Tests/Users/UserDbSetTest.cs index 357c275..7f9a2a9 100644 --- a/AyCode.Database.Tests/Users/UserDbSetTest.cs +++ b/AyCode.Database.Tests/Users/UserDbSetTest.cs @@ -11,12 +11,12 @@ namespace AyCode.Database.Tests.Users { [TestClass] public abstract class UserDbSetTest : DatabaseTestModelBase - where TDbContext : DbContextBase, IUserDbContextBase + where TDbContext : AcDbContextBase, IAcUserDbContextBase where TUser : class, IUserBase where TUserToken : class, IUserTokenBase { - //UserDalBase + //AcUserDalBase //private UserDal _userDal; [TestInitialize] diff --git a/AyCode.Database/DataLayers/DalBase.cs b/AyCode.Database/DataLayers/AcDalBase.cs similarity index 90% rename from AyCode.Database/DataLayers/DalBase.cs rename to AyCode.Database/DataLayers/AcDalBase.cs index 80deac0..4691581 100644 --- a/AyCode.Database/DataLayers/DalBase.cs +++ b/AyCode.Database/DataLayers/AcDalBase.cs @@ -12,7 +12,7 @@ using Microsoft.EntityFrameworkCore; namespace AyCode.Database.DataLayers; -public abstract class DalBase : IDalBase where TDbContext : DbContextBase +public abstract class AcDalBase : IAcDalBase where TDbContext : AcDbContextBase { public string Name { get; private set; } @@ -20,15 +20,15 @@ public abstract class DalBase : IDalBase where TDbContex public TDbContext Context { get; private set; } - //protected DalBase() + //protected AcDalBase() //{ // Name = $"{GetType().Name}"; //} - protected DalBase() : this(Activator.CreateInstance()) + protected AcDalBase() : this(Activator.CreateInstance()) { } - protected DalBase(TDbContext ctx) + protected AcDalBase(TDbContext ctx) { Context = ctx; diff --git a/AyCode.Database/DataLayers/IDalBase.cs b/AyCode.Database/DataLayers/IAcDalBase.cs similarity index 69% rename from AyCode.Database/DataLayers/IDalBase.cs rename to AyCode.Database/DataLayers/IAcDalBase.cs index b30f3f3..8f8bf4f 100644 --- a/AyCode.Database/DataLayers/IDalBase.cs +++ b/AyCode.Database/DataLayers/IAcDalBase.cs @@ -2,12 +2,12 @@ namespace AyCode.Database.DataLayers; -public interface IDalBase //: IDisposable +public interface IAcDalBase //: IDisposable { public string Name { get; } } -public interface IDalBase : IDalBase where TDbContext : DbContextBase +public interface IAcDalBase : IAcDalBase where TDbContext : AcDbContextBase { public bool AutoCloseSession { get; set; } public TDbContext Context { get; } diff --git a/AyCode.Database/DataLayers/PooledDal.cs b/AyCode.Database/DataLayers/PooledDal.cs index 11ffc2b..5ecb808 100644 --- a/AyCode.Database/DataLayers/PooledDal.cs +++ b/AyCode.Database/DataLayers/PooledDal.cs @@ -7,13 +7,13 @@ namespace AyCode.Database.DataLayers { private static readonly PooledDal Instance = new(); - private readonly ConcurrentDictionary> _dataLayersPoolById = new(); - private static ConcurrentDictionary> DataLayersPoolById => Instance._dataLayersPoolById; + private readonly ConcurrentDictionary> _dataLayersPoolById = new(); + private static ConcurrentDictionary> DataLayersPoolById => Instance._dataLayersPoolById; public static int Count => DataLayersPoolById.Count; public static void Clear() => DataLayersPoolById.Clear(); - public static TDal CreateDal() where TDal : IDalBase => Activator.CreateInstance(); + public static TDal CreateDal() where TDal : IAcDalBase => Activator.CreateInstance(); /// /// @@ -21,20 +21,20 @@ namespace AyCode.Database.DataLayers /// /// ONLY SessionId or logged in PlayerId! /// - public static TDal GetDalById(Guid id) where TDal : IDalBase + public static TDal GetDalById(Guid id) where TDal : IAcDalBase { if (id.IsNullOrEmpty()) return CreateDal(); //TODO: A Guid.Empty id-t ÁTGONDOLNI! - J. if (DataLayersPoolById.TryGetValue(id, out var dataLayersByType)) return GetDalByType(dataLayersByType); - dataLayersByType = new ConcurrentDictionary(); + dataLayersByType = new ConcurrentDictionary(); DataLayersPoolById.TryAdd(id, dataLayersByType); return GetDalByType(dataLayersByType); } - private static TDal GetDalByType(ConcurrentDictionary dataLayersByType) where TDal : IDalBase + private static TDal GetDalByType(ConcurrentDictionary dataLayersByType) where TDal : IAcDalBase { if (dataLayersByType.TryGetValue(typeof(TDal), out var dataLayer)) return (TDal)dataLayer; diff --git a/AyCode.Database/DataLayers/Users/UserDalBase.cs b/AyCode.Database/DataLayers/Users/AcUserDalBase.cs similarity index 94% rename from AyCode.Database/DataLayers/Users/UserDalBase.cs rename to AyCode.Database/DataLayers/Users/AcUserDalBase.cs index 240c70e..0a11093 100644 --- a/AyCode.Database/DataLayers/Users/UserDalBase.cs +++ b/AyCode.Database/DataLayers/Users/AcUserDalBase.cs @@ -10,11 +10,12 @@ using AyCode.Interfaces.Users; using Microsoft.EntityFrameworkCore; using AyCode.Database.Extensions; using AyCode.Core.Consts; +using AyCode.Database.DbSets.Users; namespace AyCode.Database.DataLayers.Users { - public abstract class UserDalBase : DalBase, IUserDbContextBase - where TDbContext : DbContextBase, IUserDbContextBase + public abstract class AcUserDalBase : AcDalBase, IAcUserDbContextBase + where TDbContext : AcDbContextBase, IAcUserDbContextBase where TUser : class, IUserBase where TUserToken : class, IUserTokenBase { diff --git a/AyCode.Database/DataLayers/Users/AcUserDalExtension.cs b/AyCode.Database/DataLayers/Users/AcUserDalExtension.cs index b549a13..5dbda8a 100644 --- a/AyCode.Database/DataLayers/Users/AcUserDalExtension.cs +++ b/AyCode.Database/DataLayers/Users/AcUserDalExtension.cs @@ -11,7 +11,7 @@ namespace AyCode.Database.DataLayers.Users { public static class AcUserDalExtension { - //public static bool DeleteUser(this IUserDbContextBase ctx, IUserBase user) + //public static bool DeleteUser(this IAcUserDbContextBase ctx, IUserBase user) //{ // if (user == null) return false; @@ -36,30 +36,19 @@ namespace AyCode.Database.DataLayers.Users // return ctx.Remove(user).State == EntityState.Deleted; //} - public static TUser? GetUserById(this IUserDbSet ctx, Guid userId) where TUser : class, IUserBase - { - return ctx.Users.FirstOrDefault(u => u.Id == userId); - } - - public static TUser? GetUserByEmail(this IUserDbSet ctx, string email) where TUser : class, IUserBase - { - var emailLower = email.ToLower(); - return ctx.Users.FirstOrDefault(u => u.EmailAddress == emailLower); - } - - //public static IEnumerable GetUserConsentsByUserId(this UserDbContextBase ctx, Guid userId) + //public static IEnumerable GetUserConsentsByUserId(this AcUserDbContextBase ctx, Guid userId) // => ctx.UserToUserConsents.Where(u => u.UserId == userId); - //public static bool IsUserConsentsAccepted(this UserDbContextBase ctx, Guid userId) + //public static bool IsUserConsentsAccepted(this AcUserDbContextBase ctx, Guid userId) // => ctx.GetUserConsentsByUserId(userId).Count(x => x.IsAccepted) == AcConst.ConsentCount; - //public static bool SetUserConsentsToAccepted(this UserDbContextBase ctx, Guid userId) + //public static bool SetUserConsentsToAccepted(this AcUserDbContextBase ctx, Guid userId) //{ // var user = ctx.GetUserById(userId); // return ctx.SetUserConsentsToAccepted(user); //} - //public static bool SetUserConsentsToAccepted(this UserDbContextBase ctx, IUserBase? user) + //public static bool SetUserConsentsToAccepted(this AcUserDbContextBase ctx, IUserBase? user) //{ // if (!user.EmailConfirmed) return false; //Ez nem kéne ide... - J. @@ -80,73 +69,7 @@ namespace AyCode.Database.DataLayers.Users //} - public static bool ChangePassword(this IUserDbContextBase ctx, TUser? user, string passwordHash, string verificationToken) - where TUser : class, IUserBase - where TUserToken : class, IUserTokenBase - { - if (user == null || !ctx.IsValidToken(user.Id, verificationToken)) return false; - user.Password = passwordHash; - ctx.Users.Update(user); - - ctx.DeactivateTokens(user.Id); - - return true; - } - - public static TUserToken? UpdateUserTokenSent(this IUserTokenDbSet ctx, Guid userId, string verificationToken, DateTime tokenSentUtc) where TUserToken : class, IUserTokenBase - { - var userToken = ctx.GetUserToken(userId, verificationToken); - - if (userToken == null) return null; - - userToken.TokenSent = tokenSentUtc; - userToken.TokenExpiration ??= tokenSentUtc.AddDays(1); - - var utcNow = DateTime.UtcNow; - userToken.IsActive = tokenSentUtc <= utcNow && userToken.TokenExpiration > utcNow; - - ctx.UserTokens.Update(userToken); - return userToken; - } - - public static TUserToken CreateUserToken(this IUserTokenDbSet ctx, Guid userId, string verificationToken) where TUserToken : class, IUserTokenBase - { - var userToken = Activator.CreateInstance(); - userToken.UserId = userId; - userToken.Token = verificationToken; - - return ctx.CreateUserToken(userToken); - } - - public static TUserToken CreateUserToken(this IUserTokenDbSet ctx, TUserToken userToken) where TUserToken : class, IUserTokenBase - { - ctx.DeactivateTokens(userToken.UserId); - - userToken.IsActive = true; - ctx.UserTokens.Add(userToken); - - return userToken; - } - - public static TUserToken? GetActiveUserToken(this IUserTokenDbSet ctx, Guid userId) where TUserToken : class, IUserTokenBase - => ctx.UserTokens.SingleOrDefault(x => x.UserId == userId && x.IsActive && (x.TokenExpiration == null || x.TokenExpiration > DateTime.UtcNow)); - - public static TUserToken? GetUserToken(this IUserTokenDbSet ctx, Guid userId, string verificationToken) where TUserToken : class?, IUserTokenBase? - => ctx.UserTokens.SingleOrDefault(x => x.UserId == userId && x.Token == verificationToken); - - public static bool IsValidToken(this IUserTokenDbSet ctx, Guid userId, string verificationToken) where TUserToken : class, IUserTokenBase - => ctx.UserTokens.Any(x => x.UserId == userId && x.IsActive && x.Token == verificationToken && x.TokenExpiration > DateTime.UtcNow && x.TokenSent < DateTime.UtcNow); - - public static void DeactivateTokens(this IUserTokenDbSet ctx, Guid userId) where TUserToken : class, IUserTokenBase - { - var activeUserTokens = ctx.UserTokens.Where(x => x.UserId == userId && x.IsActive); - - foreach (var activeUserToken in activeUserTokens) - activeUserToken.IsActive = false; - - ctx.UserTokens.UpdateRange(activeUserTokens); - } ////public static void GetUserDetails(this IUserDal userDal, Guid userId, Action callback) //// => callback(userDal.Get(userId)); diff --git a/AyCode.Database/DbContexts/DbContextBase.cs b/AyCode.Database/DbContexts/AcDbContextBase.cs similarity index 94% rename from AyCode.Database/DbContexts/DbContextBase.cs rename to AyCode.Database/DbContexts/AcDbContextBase.cs index 4915eb0..ddf4afd 100644 --- a/AyCode.Database/DbContexts/DbContextBase.cs +++ b/AyCode.Database/DbContexts/AcDbContextBase.cs @@ -5,23 +5,23 @@ using AyCode.Interfaces.TimeStampInfo; namespace AyCode.Database.DbContexts; -public class DbContextBase : DbContext +public class AcDbContextBase : DbContext { public string Name { get; set; } public Guid SessionId { get; protected set; } = Guid.NewGuid(); - public DbContextBase() + public AcDbContextBase() { //DbInterception.Add(new UtcDateTimeDbCommandInterceptor()); } - public DbContextBase(string name) : this() + public AcDbContextBase(string name) : this() { Name = name; } - public DbContextBase(DbContextOptions options, string name) : base(options) + public AcDbContextBase(DbContextOptions options, string name) : base(options) { Name = name; } diff --git a/AyCode.Database/DbContexts/Users/UserDbContextBase.cs b/AyCode.Database/DbContexts/Users/AcUserDbContextBase.cs similarity index 78% rename from AyCode.Database/DbContexts/Users/UserDbContextBase.cs rename to AyCode.Database/DbContexts/Users/AcUserDbContextBase.cs index 5e596cf..2b20536 100644 --- a/AyCode.Database/DbContexts/Users/UserDbContextBase.cs +++ b/AyCode.Database/DbContexts/Users/AcUserDbContextBase.cs @@ -8,7 +8,7 @@ using Microsoft.EntityFrameworkCore; namespace AyCode.Database.DbContexts.Users { - public abstract class UserDbContextBase : DbContextBase, IUserDbContextBase + public abstract class AcUserDbContextBase : AcDbContextBase, IAcUserDbContextBase where TUser : class, IUserBase where TUserToken : class, IUserTokenBase { diff --git a/AyCode.Database/DbContexts/Users/IAcUserDbContextBase.cs b/AyCode.Database/DbContexts/Users/IAcUserDbContextBase.cs new file mode 100644 index 0000000..ada2210 --- /dev/null +++ b/AyCode.Database/DbContexts/Users/IAcUserDbContextBase.cs @@ -0,0 +1,9 @@ +using AyCode.Database.DbSets.Users; +using AyCode.Interfaces.Users; +using Microsoft.EntityFrameworkCore; + +namespace AyCode.Database.DbContexts.Users; + +public interface IAcUserDbContextBase : IAcUserDbSet, IAcUserTokenDbSet where TUser : class, IUserBase where TUserToken : class, IUserTokenBase +{ +} \ No newline at end of file diff --git a/AyCode.Database/DbContexts/Users/IUserTokenDbContextBase.cs b/AyCode.Database/DbContexts/Users/IAcUserTokenDbContextBase.cs similarity index 63% rename from AyCode.Database/DbContexts/Users/IUserTokenDbContextBase.cs rename to AyCode.Database/DbContexts/Users/IAcUserTokenDbContextBase.cs index 1d9bde6..af10621 100644 --- a/AyCode.Database/DbContexts/Users/IUserTokenDbContextBase.cs +++ b/AyCode.Database/DbContexts/Users/IAcUserTokenDbContextBase.cs @@ -3,7 +3,7 @@ using Microsoft.EntityFrameworkCore; namespace AyCode.Database.DbContexts.Users; -public interface IUserTokenDbContextBase where TUserToken : class, IUserTokenBase +public interface IAcUserTokenDbContextBase where TUserToken : class, IUserTokenBase { DbSet UserToken { get; set; } } \ No newline at end of file diff --git a/AyCode.Database/DbContexts/Users/IUserDbContextBase.cs b/AyCode.Database/DbContexts/Users/IUserDbContextBase.cs deleted file mode 100644 index fb29b3c..0000000 --- a/AyCode.Database/DbContexts/Users/IUserDbContextBase.cs +++ /dev/null @@ -1,9 +0,0 @@ -using AyCode.Database.DbSets.Users; -using AyCode.Interfaces.Users; -using Microsoft.EntityFrameworkCore; - -namespace AyCode.Database.DbContexts.Users; - -public interface IUserDbContextBase : IUserDbSet, IUserTokenDbSet where TUser : class, IUserBase where TUserToken : class, IUserTokenBase -{ -} \ No newline at end of file diff --git a/AyCode.Database/DbSets/Base/IDbSetBase.cs b/AyCode.Database/DbSets/Base/IDbSetBase.cs new file mode 100644 index 0000000..bd4fea8 --- /dev/null +++ b/AyCode.Database/DbSets/Base/IDbSetBase.cs @@ -0,0 +1,24 @@ +using AyCode.Interfaces.Entities; +using Microsoft.EntityFrameworkCore; + +namespace AyCode.Database.DbSets.Base; + +public interface IDbSetGuidBase where TEntity : class, IEntityGuid +{ + DbSet Users { get; set; } +} + +public interface IDbSetIntBase where TEntity : class, IEntityInt +{ + DbSet Users { get; set; } +} + +public interface IDbSetBase where TEntity : class, IEntity +{ + DbSet Users { get; set; } +} + +public interface IDbSetBase where TEntity : class, IEntity +{ + DbSet Users { get; set; } +} \ No newline at end of file diff --git a/AyCode.Database/DbSets/Users/AcUserDbSetExtensions.cs b/AyCode.Database/DbSets/Users/AcUserDbSetExtensions.cs new file mode 100644 index 0000000..8910c9b --- /dev/null +++ b/AyCode.Database/DbSets/Users/AcUserDbSetExtensions.cs @@ -0,0 +1,17 @@ +using AyCode.Interfaces.Users; + +namespace AyCode.Database.DbSets.Users; + +public static class AcUserDbSetExtensions +{ + public static TUser? GetUserById(this IAcUserDbSet ctx, Guid userId) where TUser : class, IUserBase + { + return ctx.Users.FirstOrDefault(u => u.Id == userId); + } + + public static TUser? GetUserByEmail(this IAcUserDbSet ctx, string email) where TUser : class, IUserBase + { + var emailLower = email.ToLower(); + return ctx.Users.FirstOrDefault(u => u.EmailAddress == emailLower); + } +} \ No newline at end of file diff --git a/AyCode.Database/DbSets/Users/AcUserTokenDbSetExtensions.cs b/AyCode.Database/DbSets/Users/AcUserTokenDbSetExtensions.cs new file mode 100644 index 0000000..81d31aa --- /dev/null +++ b/AyCode.Database/DbSets/Users/AcUserTokenDbSetExtensions.cs @@ -0,0 +1,75 @@ +using AyCode.Database.DbContexts.Users; +using AyCode.Interfaces.Users; + +namespace AyCode.Database.DbSets.Users; + +public static class AcUserTokenDbSetExtensions +{ + public static bool ChangePassword(this IAcUserDbContextBase ctx, TUser? user, string passwordHash, string verificationToken) + where TUser : class, IUserBase + where TUserToken : class, IUserTokenBase + { + if (user == null || !ctx.IsValidToken(user.Id, verificationToken)) return false; + + user.Password = passwordHash; + ctx.Users.Update(user); + + ctx.DeactivateTokens(user.Id); + + return true; + } + + public static TUserToken? UpdateUserTokenSent(this IAcUserTokenDbSet ctx, Guid userId, string verificationToken, DateTime tokenSentUtc) where TUserToken : class, IUserTokenBase + { + var userToken = ctx.GetUserToken(userId, verificationToken); + + if (userToken == null) return null; + + userToken.TokenSent = tokenSentUtc; + userToken.TokenExpiration ??= tokenSentUtc.AddDays(1); + + var utcNow = DateTime.UtcNow; + userToken.IsActive = tokenSentUtc <= utcNow && userToken.TokenExpiration > utcNow; + + ctx.UserTokens.Update(userToken); + return userToken; + } + + public static TUserToken CreateUserToken(this IAcUserTokenDbSet ctx, Guid userId, string verificationToken) where TUserToken : class, IUserTokenBase + { + var userToken = Activator.CreateInstance(); + userToken.UserId = userId; + userToken.Token = verificationToken; + + return ctx.CreateUserToken(userToken); + } + + public static TUserToken CreateUserToken(this IAcUserTokenDbSet ctx, TUserToken userToken) where TUserToken : class, IUserTokenBase + { + ctx.DeactivateTokens(userToken.UserId); + + userToken.IsActive = true; + ctx.UserTokens.Add(userToken); + + return userToken; + } + + public static TUserToken? GetActiveUserToken(this IAcUserTokenDbSet ctx, Guid userId) where TUserToken : class, IUserTokenBase + => ctx.UserTokens.SingleOrDefault(x => x.UserId == userId && x.IsActive && (x.TokenExpiration == null || x.TokenExpiration > DateTime.UtcNow)); + + public static TUserToken? GetUserToken(this IAcUserTokenDbSet ctx, Guid userId, string verificationToken) where TUserToken : class?, IUserTokenBase? + => ctx.UserTokens.SingleOrDefault(x => x.UserId == userId && x.Token == verificationToken); + + public static bool IsValidToken(this IAcUserTokenDbSet ctx, Guid userId, string verificationToken) where TUserToken : class, IUserTokenBase + => ctx.UserTokens.Any(x => x.UserId == userId && x.IsActive && x.Token == verificationToken && x.TokenExpiration > DateTime.UtcNow && x.TokenSent < DateTime.UtcNow); + + public static void DeactivateTokens(this IAcUserTokenDbSet ctx, Guid userId) where TUserToken : class, IUserTokenBase + { + var activeUserTokens = ctx.UserTokens.Where(x => x.UserId == userId && x.IsActive); + + foreach (var activeUserToken in activeUserTokens) + activeUserToken.IsActive = false; + + ctx.UserTokens.UpdateRange(activeUserTokens); + } +} \ No newline at end of file diff --git a/AyCode.Database/DbSets/Users/IUserDbSet.cs b/AyCode.Database/DbSets/Users/IAcUserDbSet.cs similarity index 73% rename from AyCode.Database/DbSets/Users/IUserDbSet.cs rename to AyCode.Database/DbSets/Users/IAcUserDbSet.cs index ef7fd12..192e63a 100644 --- a/AyCode.Database/DbSets/Users/IUserDbSet.cs +++ b/AyCode.Database/DbSets/Users/IAcUserDbSet.cs @@ -4,7 +4,7 @@ using Microsoft.EntityFrameworkCore; namespace AyCode.Database.DbSets.Users; -public interface IUserDbSet where TUser : class, IUserBase +public interface IAcUserDbSet where TUser : class, IUserBase { DbSet Users { get; set; } } \ No newline at end of file diff --git a/AyCode.Database/DbSets/Users/IUserTokenDbSet.cs b/AyCode.Database/DbSets/Users/IAcUserTokenDbSet.cs similarity index 64% rename from AyCode.Database/DbSets/Users/IUserTokenDbSet.cs rename to AyCode.Database/DbSets/Users/IAcUserTokenDbSet.cs index 35118c1..80e4d90 100644 --- a/AyCode.Database/DbSets/Users/IUserTokenDbSet.cs +++ b/AyCode.Database/DbSets/Users/IAcUserTokenDbSet.cs @@ -3,7 +3,7 @@ using Microsoft.EntityFrameworkCore; namespace AyCode.Database.DbSets.Users; -public interface IUserTokenDbSet where TUserToken : class, IUserTokenBase +public interface IAcUserTokenDbSet where TUserToken : class, IUserTokenBase { DbSet UserTokens { get; set; } } \ No newline at end of file diff --git a/AyCode.Database/Extensions/AcDalExtension.cs b/AyCode.Database/Extensions/AcDalExtension.cs new file mode 100644 index 0000000..f5bd1ec --- /dev/null +++ b/AyCode.Database/Extensions/AcDalExtension.cs @@ -0,0 +1,39 @@ +using AyCode.Core.Helpers; +using AyCode.Database.DataLayers; +using AyCode.Database.DbContexts; +using AyCode.Interfaces.Entities; + +namespace AyCode.Database.Extensions; + +public static class AcDalExtension +{ + public static Task SessionAsync(this IAcDalBase acDal, Func callback) where TDbContext : AcDbContextBase + => TaskHelper.ToThreadPoolTask(() => acDal.Session(callback)); + + public static Task> SessionAsync(this IAcDalBase acDal, Func> callback) where TEntity : IEntity where TDbContext : AcDbContextBase + => TaskHelper.ToThreadPoolTask(() => acDal.Session(callback)); + + public static TResultType Session(this IAcDalBase acDal, Func callback) where TDbContext : AcDbContextBase + { + using var ctx = acDal.CreateDbContext(); + + return ctx.Session(callback); + } + + public static IEnumerable Session(this IAcDalBase acDal, Func> callback) where TEntity : IEntity where TDbContext : AcDbContextBase + { + using var ctx = acDal.CreateDbContext(); + + return ctx.Session(callback); + } + + public static Task TransactionAsync(this IAcDalBase acDal, Func callbackTransactionBody, bool throwException = false) where TDbContext : AcDbContextBase + => TaskHelper.ToThreadPoolTask(() => acDal.Transaction(callbackTransactionBody, throwException)); + + public static bool Transaction(this IAcDalBase acDal, Func callbackTransactionBody, bool throwException = false) where TDbContext : AcDbContextBase + { + using var ctx = acDal.CreateDbContext(); + + return ctx.Transaction(callbackTransactionBody, throwException); + } +} \ No newline at end of file diff --git a/AyCode.Database/Extensions/DbContextExtension.cs b/AyCode.Database/Extensions/AcDbContextExtension.cs similarity index 98% rename from AyCode.Database/Extensions/DbContextExtension.cs rename to AyCode.Database/Extensions/AcDbContextExtension.cs index 92cca64..7f772bb 100644 --- a/AyCode.Database/Extensions/DbContextExtension.cs +++ b/AyCode.Database/Extensions/AcDbContextExtension.cs @@ -13,7 +13,7 @@ using Microsoft.EntityFrameworkCore.Storage.ValueConversion; namespace AyCode.Database.Extensions { - public static class DbContextExtension + public static class AcDbContextExtension { public static IEntityType? GetEntityType(this DbContext ctx) diff --git a/AyCode.Database/Extensions/DbSessionExtension.cs b/AyCode.Database/Extensions/AcDbSessionExtension.cs similarity index 87% rename from AyCode.Database/Extensions/DbSessionExtension.cs rename to AyCode.Database/Extensions/AcDbSessionExtension.cs index cc23631..411508c 100644 --- a/AyCode.Database/Extensions/DbSessionExtension.cs +++ b/AyCode.Database/Extensions/AcDbSessionExtension.cs @@ -6,12 +6,12 @@ using AyCode.Interfaces.Entities; namespace AyCode.Database.Extensions; -public static class DbSessionExtension +public static class AcDbSessionExtension { - public static Task SessionAsync(this TDbContext ctx, Func callback) where TDbContext : DbContextBase + public static Task SessionAsync(this TDbContext ctx, Func callback) where TDbContext : AcDbContextBase => TaskHelper.ToThreadPoolTask(() => ctx.Session(callback)); - public static TResultType Session(this TDbContext ctx, Func callback) where TDbContext : DbContextBase + public static TResultType Session(this TDbContext ctx, Func callback) where TDbContext : AcDbContextBase { TResultType result; @@ -33,7 +33,7 @@ public static class DbSessionExtension public static IEnumerable Session(this TDbContext ctx, Func> callback) where TEntity : IEntity - where TDbContext : DbContextBase + where TDbContext : AcDbContextBase { foreach (var entity in callback(ctx)) yield return entity; diff --git a/AyCode.Database/Extensions/DbTransactionExtension.cs b/AyCode.Database/Extensions/AcDbTransactionExtension.cs similarity index 89% rename from AyCode.Database/Extensions/DbTransactionExtension.cs rename to AyCode.Database/Extensions/AcDbTransactionExtension.cs index 5c65185..3fd5fa2 100644 --- a/AyCode.Database/Extensions/DbTransactionExtension.cs +++ b/AyCode.Database/Extensions/AcDbTransactionExtension.cs @@ -8,13 +8,13 @@ using AyCode.Core.Consts; namespace AyCode.Database.Extensions; -public static class DbTransactionExtension +public static class AcDbTransactionExtension { /// /// BeginTransaction /// /// - private static IDbContextTransaction OpenTransaction(this TDbContext ctx) where TDbContext : DbContextBase + private static IDbContextTransaction OpenTransaction(this TDbContext ctx) where TDbContext : AcDbContextBase { ctx.Database.AutoTransactionBehavior = AutoTransactionBehavior.Never; @@ -25,7 +25,7 @@ public static class DbTransactionExtension /// /// /// True, ha sikeres volt a Commit. - private static bool CommitTransaction(this TDbContext ctx, bool throwException = false) where TDbContext : DbContextBase + private static bool CommitTransaction(this TDbContext ctx, bool throwException = false) where TDbContext : AcDbContextBase { var result = false; var transaction = ctx.Database?.CurrentTransaction; @@ -51,10 +51,10 @@ public static class DbTransactionExtension return result; } - public static Task TransactionAsync(this TDbContext ctx, Func callbackTransactionBody, bool throwException = false) where TDbContext : DbContextBase + public static Task TransactionAsync(this TDbContext ctx, Func callbackTransactionBody, bool throwException = false) where TDbContext : AcDbContextBase => TaskHelper.ToThreadPoolTask(() => ctx.Transaction(callbackTransactionBody, throwException)); - public static bool Transaction(this TDbContext ctx, Func callbackTransactionBody, bool throwException = false) where TDbContext : DbContextBase + public static bool Transaction(this TDbContext ctx, Func callbackTransactionBody, bool throwException = false) where TDbContext : AcDbContextBase { var result = false; diff --git a/AyCode.Database/Extensions/DalExtension.cs b/AyCode.Database/Extensions/DalExtension.cs deleted file mode 100644 index 8532f4e..0000000 --- a/AyCode.Database/Extensions/DalExtension.cs +++ /dev/null @@ -1,39 +0,0 @@ -using AyCode.Core.Helpers; -using AyCode.Database.DataLayers; -using AyCode.Database.DbContexts; -using AyCode.Interfaces.Entities; - -namespace AyCode.Database.Extensions; - -public static class DalExtension -{ - public static Task SessionAsync(this IDalBase dal, Func callback) where TDbContext : DbContextBase - => TaskHelper.ToThreadPoolTask(() => dal.Session(callback)); - - public static Task> SessionAsync(this IDalBase dal, Func> callback) where TEntity : IEntity where TDbContext : DbContextBase - => TaskHelper.ToThreadPoolTask(() => dal.Session(callback)); - - public static TResultType Session(this IDalBase dal, Func callback) where TDbContext : DbContextBase - { - using var ctx = dal.CreateDbContext(); - - return ctx.Session(callback); - } - - public static IEnumerable Session(this IDalBase dal, Func> callback) where TEntity : IEntity where TDbContext : DbContextBase - { - using var ctx = dal.CreateDbContext(); - - return ctx.Session(callback); - } - - public static Task TransactionAsync(this IDalBase dal, Func callbackTransactionBody, bool throwException = false) where TDbContext : DbContextBase - => TaskHelper.ToThreadPoolTask(() => dal.Transaction(callbackTransactionBody, throwException)); - - public static bool Transaction(this IDalBase dal, Func callbackTransactionBody, bool throwException = false) where TDbContext : DbContextBase - { - using var ctx = dal.CreateDbContext(); - - return ctx.Transaction(callbackTransactionBody, throwException); - } -} \ No newline at end of file diff --git a/AyCode.Entities/Profiles/ProfileBase.cs b/AyCode.Entities/Profiles/ProfileBase.cs index 5760e1b..1861b1a 100644 --- a/AyCode.Entities/Profiles/ProfileBase.cs +++ b/AyCode.Entities/Profiles/ProfileBase.cs @@ -10,10 +10,11 @@ using System.Threading.Tasks; namespace AyCode.Entities.Profiles { [Table("ProfileBase")] - public class ProfileBase : IProfileBase + public abstract class ProfileBase : IProfileBase { - public ProfileBase() { } - public ProfileBase(Guid ownerId) : this() + protected ProfileBase() { } + + protected ProfileBase(Guid ownerId) : this() { OwnerId = ownerId; } diff --git a/AyCode.Entities/Users/UserBase.cs b/AyCode.Entities/Users/UserBase.cs index 1b23c05..411ed62 100644 --- a/AyCode.Entities/Users/UserBase.cs +++ b/AyCode.Entities/Users/UserBase.cs @@ -10,7 +10,7 @@ using AyCode.Interfaces.Users; namespace AyCode.Entities.Users { [Table("Users")] - public class UserBase : IUserBase + public abstract class UserBase : IUserBase { [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] public Guid Id { get; set; } @@ -27,24 +27,27 @@ namespace AyCode.Entities.Users public DateTime Modified { get; set; } - public UserBase() { } + protected UserBase() { } - public UserBase(string email, string password) : this(Guid.NewGuid(), email, password) { } - public UserBase(Guid id, string email, string password) : this() + protected UserBase(string email, string password) : this(Guid.NewGuid(), email, password) { } + + protected UserBase(Guid id, string email, string password) : this() { Id = id; EmailAddress = email; Password = password; } - public UserBase(string email, string phoneNumber, string password) : this(Guid.NewGuid(), email, phoneNumber, password) { } - public UserBase(Guid id, string email, string phoneNumber, string password) : this(id, email, password) + protected UserBase(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) { PhoneNumber = phoneNumber; } - public UserBase(string email, string phoneNumber, string password, string refreshToken) : this(Guid.NewGuid(), email, phoneNumber, password, refreshToken) { } - public UserBase(Guid id, string email, string phoneNumber, string password, string refreshToken) : this(id, email, phoneNumber, password) + protected UserBase(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) { RefreshToken = refreshToken; } diff --git a/AyCode.Entities/Users/UserTokenBase.cs b/AyCode.Entities/Users/UserTokenBase.cs index e34812f..6fd19ff 100644 --- a/AyCode.Entities/Users/UserTokenBase.cs +++ b/AyCode.Entities/Users/UserTokenBase.cs @@ -5,7 +5,7 @@ using System.ComponentModel.DataAnnotations; namespace AyCode.Entities.Users; [Table("UserToken")] -public class UserTokenBase : IUserTokenBase +public abstract class UserTokenBase : IUserTokenBase { [Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)] public int Id { get; set; } diff --git a/AyCode.Interfaces/Entities/IEntity.cs b/AyCode.Interfaces/Entities/IEntity.cs index a3170cf..e211572 100644 --- a/AyCode.Interfaces/Entities/IEntity.cs +++ b/AyCode.Interfaces/Entities/IEntity.cs @@ -8,9 +8,9 @@ namespace AyCode.Interfaces.Entities { } - public interface IEntity : IEntity + public interface IEntity : IEntity { - [Key] T Id { get; set; } + [Key] TPKey Id { get; set; } //T SetId(T id); } }