Implement UserModels; Add AcProfileBase; improvements, fixes, etc...

This commit is contained in:
jozsef.b@aycode.com 2023-12-18 23:07:53 +01:00
parent 68c8268634
commit 73e3cd5812
28 changed files with 211 additions and 40 deletions

View File

@ -1,14 +1,16 @@
using AyCode.Database.DataLayers.Users;
using AyCode.Database.DbContexts;
using AyCode.Database.DbContexts.Users;
using AyCode.Interfaces.Profiles;
using AyCode.Interfaces.Users;
namespace AyCode.Database.Tests.Users
{
public abstract class AcUserDalTestBase<TDal, TDbContext, TUser, TUserToken> : AcDatabaseTestModelBase<TDal, TDbContext>
where TDal : AcUserDalBase<TDbContext, TUser, TUserToken>
where TDbContext : AcDbContextBase, IAcUserDbContextBase<TUser, TUserToken>
where TUser : class, IUserBase
public abstract class AcUserDalTestBase<TDal, TDbContext, TUser, TProfile, TUserToken> : AcDatabaseTestModelBase<TDal, TDbContext>
where TDal : AcUserDalBase<TDbContext, TUser, TProfile, TUserToken>
where TDbContext : AcDbContextBase, IAcUserDbContextBase<TUser, TProfile, TUserToken>
where TUser : class, IUserBase<TProfile>
where TProfile : class, IAcProfileBase
where TUserToken : class, IUserTokenBase
{

View File

@ -11,12 +11,14 @@ using Microsoft.EntityFrameworkCore;
using AyCode.Database.Extensions;
using AyCode.Core.Consts;
using AyCode.Database.DbSets.Users;
using AyCode.Interfaces.Profiles;
namespace AyCode.Database.DataLayers.Users
{
public abstract class AcUserDalBase<TDbContext, TUser, TUserToken> : AcDalBase<TDbContext>
where TDbContext : AcDbContextBase, IAcUserDbContextBase<TUser, TUserToken>
where TUser : class, IUserBase
public abstract class AcUserDalBase<TDbContext, TUser, TProfile, TUserToken> : AcDalBase<TDbContext>
where TDbContext : AcDbContextBase, IAcUserDbContextBase<TUser, TProfile, TUserToken>
where TUser : class, IUserBase<TProfile>
where TProfile : class, IAcProfileBase
where TUserToken : class, IUserTokenBase
{
public TUser? GetUserById(Guid userId) => Session(x => x.GetUserById(userId));

View File

@ -3,13 +3,15 @@ using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AyCode.Interfaces.Profiles;
using AyCode.Interfaces.Users;
using Microsoft.EntityFrameworkCore;
namespace AyCode.Database.DbContexts.Users
{
public abstract class AcUserDbContextBase<TUser, TUserToken> : AcDbContextBase, IAcUserDbContextBase<TUser, TUserToken>
where TUser : class, IUserBase
public abstract class AcUserDbContextBase<TUser, TProfile, TUserToken> : AcDbContextBase, IAcUserDbContextBase<TUser, TProfile, TUserToken>
where TUser : class, IUserBase<TProfile>
where TProfile : class, IAcProfileBase
where TUserToken : class, IUserTokenBase
{
public required DbSet<TUser> Users { get; set; }

View File

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

View File

@ -1,20 +1,26 @@
using AyCode.Core.Logger;
using AyCode.Entities.Users;
using AyCode.Interfaces.Profiles;
using AyCode.Interfaces.Users;
namespace AyCode.Database.DbSets.Users;
public static class AcUserDbSetExtensions
{
public static TUser? GetUserById<TUser>(this IAcUserDbSet<TUser> ctx, Guid userId) where TUser : class, IUserBase
{
return ctx.Users.FirstOrDefault(u => u.Id == userId);
}
public static TUser? GetUserById<TUser, TProfile>(this IAcUserDbSet<TUser, TProfile> ctx, Guid userId) where TUser : class, IUserBase<TProfile> where TProfile : class, IAcProfileBase
=> ctx.GetUsersById(userId).FirstOrDefault();
public static TUser? GetUserByEmail<TUser>(this IAcUserDbSet<TUser> ctx, string email) where TUser : class, IUserBase
public static TUser? GetUserByEmail<TUser, TProfile>(this IAcUserDbSet<TUser, TProfile> ctx, string email) where TUser : class, IUserBase<TProfile> where TProfile : class, IAcProfileBase
=> 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
=> 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
{
Logger.Info($"GetUserByEmail: {email}");
var emailLower = email.ToLower();
return ctx.Users.FirstOrDefault(u => u.EmailAddress == emailLower);
return ctx.Users.Where(u => u.EmailAddress == emailLower);
}
}

View File

@ -1,12 +1,14 @@
using AyCode.Database.DbContexts.Users;
using AyCode.Interfaces.Profiles;
using AyCode.Interfaces.Users;
namespace AyCode.Database.DbSets.Users;
public static class AcUserTokenDbSetExtensions
{
public static bool ChangePassword<TUser, TUserToken>(this IAcUserDbContextBase<TUser, TUserToken> ctx, TUser? user, string passwordHash, string verificationToken)
where TUser : class, IUserBase
public static bool ChangePassword<TUser, TProfile, TUserToken>(this IAcUserDbContextBase<TUser, TProfile, TUserToken> ctx, TUser? user, string passwordHash, string verificationToken)
where TUser : class, IUserBase<TProfile>
where TProfile : class, IAcProfileBase
where TUserToken : class, IUserTokenBase
{
if (user == null || !ctx.IsValidToken(user.Id, verificationToken)) return false;

View File

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

View File

@ -1,16 +1,17 @@
using AyCode.Interfaces.Users;
using AyCode.Interfaces.Profiles;
using AyCode.Interfaces.Users;
using Microsoft.EntityFrameworkCore.Metadata.Builders;
namespace AyCode.Database.ModelBuilders.Users;
public static class AcUserEntityTypeBuilderExtensions
{
public static void BuildUserToProfileRelation<TUser>(this EntityTypeBuilder<TUser> modelBuilder) where TUser : class, IUserBase
public static void BuildUserToProfileRelation<TUser, TProfile>(this EntityTypeBuilder<TUser> modelBuilder) where TUser : class, IUserBase<TProfile> where TProfile : class, IAcProfileBase
{
//throw new NotImplementedException();
}
public static void BuildUserToAddressRelation<TUser>(this EntityTypeBuilder<TUser> modelBuilder) where TUser : class, IUserBase
public static void BuildUserToAddressRelation<TUser, TProfile>(this EntityTypeBuilder<TUser> modelBuilder) where TUser : class, IUserBase<TProfile> where TProfile : class, IAcProfileBase
{
//throw new NotImplementedException();
}

View File

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

View File

@ -9,20 +9,23 @@ using System.Threading.Tasks;
namespace AyCode.Entities.Profiles
{
[Table("ProfileBase")]
public abstract class ProfileBase : IProfileBase
[Table("Profile")]
public abstract class AcProfileBase : IAcProfileBase
{
protected ProfileBase() { }
protected AcProfileBase() { }
protected ProfileBase(Guid ownerId) : this()
protected AcProfileBase(Guid ownerId) : this()
{
OwnerId = ownerId;
}
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public Guid Id { get; set; }
public Guid OwnerId { get; }
public Guid UserMediaId { get; set; }
public Guid OwnerId { get; set; }
public Guid? UserMediaId { get; set; }
public string? Name { get; set; }
public string? ThumbnailUrl { get ; set; }
public DateTime Created { get; set; }
public DateTime Modified { get; set; }

View File

@ -5,12 +5,13 @@ using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using AyCode.Interfaces.Profiles;
using AyCode.Interfaces.Users;
namespace AyCode.Entities.Users
{
[Table("Users")]
public abstract class UserBase : IUserBase
public abstract class UserBase<TProfile> : IUserBase<TProfile> where TProfile : class, IAcProfileBase
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public Guid Id { get; set; }
@ -23,6 +24,10 @@ namespace AyCode.Entities.Users
public bool EmailConfirmed { get; set; }
public Guid? ProfileId { get; }
[ForeignKey(nameof(ProfileId))]
public virtual TProfile Profile { get; set; }
public DateTime Created { get; set; }
public DateTime Modified { get; set; }

View File

@ -2,5 +2,5 @@
public interface IOwnerId
{
Guid OwnerId { get; }
Guid OwnerId { get; set; }
}

View File

@ -8,6 +8,6 @@ namespace AyCode.Interfaces.MediaInfo
{
public interface IMediaUserMediaId
{
Guid UserMediaId { get; set; }
Guid? UserMediaId { get; set; }
}
}

View File

@ -0,0 +1,15 @@
namespace AyCode.Interfaces.Profiles;
public abstract class AcProfile : IAcProfileBase
{
public Guid Id { get; set; }
public Guid OwnerId { get; set; }
public Guid? UserMediaId { get; set; }
public string? Name { get; set; }
public string? ThumbnailUrl { get; set; }
public DateTime Created { get; set; }
public DateTime Modified { get; set; }
}

View File

@ -0,0 +1,9 @@
using AyCode.Interfaces.Entities;
using AyCode.Interfaces.MediaInfo;
namespace AyCode.Interfaces.Profiles.Dtos;
public interface IAcProfileDtoBase : IEntityGuid, IOwnerId, IMediaInfo
{
string? Name { get; set; }
}

View File

@ -2,10 +2,10 @@
using AyCode.Interfaces.TimeStampInfo;
using AyCode.Interfaces.MediaInfo;
using AyCode.Interfaces.Entities;
using AyCode.Interfaces.Profiles.Dtos;
namespace AyCode.Interfaces.Profiles;
public interface IProfileBase : IEntityGuid, IOwnerId, ITimeStampInfo, IMediaInfo
public interface IAcProfileBase : IAcProfileDtoBase, ITimeStampInfo
{
}

View File

@ -0,0 +1,6 @@
namespace AyCode.Interfaces.Users.Dtos;
public interface IAcUserDtoBase : IAcUserDtoMinBase
{
}

View File

@ -0,0 +1,10 @@
using AyCode.Interfaces.Entities;
namespace AyCode.Interfaces.Users.Dtos;
public interface IAcUserDtoDetailBase : IEmailAddress, IAcUserDtoBase
{
public string PhoneNumber { get; set; }
public string? RefreshToken { get; set; }
}

View File

@ -0,0 +1,9 @@

using AyCode.Interfaces.Entities;
namespace AyCode.Interfaces.Users.Dtos;
public interface IAcUserDtoMinBase : IEntityGuid
{
}

View File

@ -1,10 +1,13 @@

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

View File

@ -7,7 +7,7 @@
</PropertyGroup>
<ItemGroup>
<Folder Include="Dto\" />
<Folder Include="Dtos\" />
</ItemGroup>
<ItemGroup>

View File

@ -0,0 +1,11 @@
using AyCode.Interfaces.Entities;
namespace AyCode.Models;
public abstract class AcModelDtoBase : IAcModelDtoBase
{
public Guid Id { get; set; }
protected AcModelDtoBase(){}
protected AcModelDtoBase(Guid id) => Id = id;
}

View File

@ -7,7 +7,7 @@
</PropertyGroup>
<ItemGroup>
<Folder Include="Dto\" />
<Folder Include="Logins\" />
</ItemGroup>
<ItemGroup>

View File

@ -0,0 +1,7 @@
using AyCode.Interfaces.Entities;
namespace AyCode.Models;
public interface IAcModelDtoBase : IEntityGuid
{
}

View File

@ -0,0 +1,8 @@
using AyCode.Interfaces.Entities;
namespace AyCode.Models.Logins;
public interface IAcLoginDtoBase : IEntityGuid
{
}

View File

@ -0,0 +1,26 @@
using AyCode.Interfaces.Profiles;
using AyCode.Interfaces.Profiles.Dtos;
using AyCode.Interfaces.Users;
using AyCode.Interfaces.Users.Dtos;
namespace AyCode.Models.Users;
public abstract class AcUserModelDtoBase<TUserDto, TProfile, TProfileDto> : AcUserModelDtoMinBase<TUserDto, TProfile>
where TUserDto : class, IAcUserDtoBase
where TProfile : class, IAcProfileBase
where TProfileDto : class, IAcProfileDtoBase
{
public TProfileDto Profile { get; set; }
protected AcUserModelDtoBase() {}
protected AcUserModelDtoBase(IUserBase<TProfile> user, TProfile? profile) : base(user)
{
if (profile == null) return;
Profile = Activator.CreateInstance<TProfileDto>();
Profile.Id = profile.Id;
Profile.Name = profile.Name;
Profile.OwnerId = profile.OwnerId;
}
}

View File

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

View File

@ -0,0 +1,19 @@
using AyCode.Interfaces.Profiles;
using AyCode.Interfaces.Users;
using AyCode.Interfaces.Users.Dtos;
namespace AyCode.Models.Users;
public abstract class AcUserModelDtoMinBase<TUserDtoMin, TProfile> : AcModelDtoBase where TUserDtoMin : IAcUserDtoMinBase where TProfile : class, IAcProfileBase
{
public TUserDtoMin UserDto { get; set;}
protected AcUserModelDtoMinBase() {}
protected AcUserModelDtoMinBase(IUserBase<TProfile> user) : base(user.Id)
{
Id = user.Id;
UserDto = Activator.CreateInstance<TUserDtoMin>();
UserDto.Id = user.Id;
}
}