Implement UserModels; Add AcProfileBase; improvements, fixes, etc...
This commit is contained in:
parent
68c8268634
commit
73e3cd5812
|
|
@ -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
|
||||
|
||||
{
|
||||
|
|
|
|||
|
|
@ -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));
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
|
|
|
|||
|
|
@ -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
|
||||
{
|
||||
}
|
||||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
}
|
||||
|
|
@ -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();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
|
|
@ -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; }
|
||||
|
||||
|
|
|
|||
|
|
@ -2,5 +2,5 @@
|
|||
|
||||
public interface IOwnerId
|
||||
{
|
||||
Guid OwnerId { get; }
|
||||
Guid OwnerId { get; set; }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,6 +8,6 @@ namespace AyCode.Interfaces.MediaInfo
|
|||
{
|
||||
public interface IMediaUserMediaId
|
||||
{
|
||||
Guid UserMediaId { get; set; }
|
||||
Guid? UserMediaId { get; set; }
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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; }
|
||||
}
|
||||
|
|
@ -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; }
|
||||
}
|
||||
|
|
@ -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
|
||||
{
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,6 @@
|
|||
namespace AyCode.Interfaces.Users.Dtos;
|
||||
|
||||
public interface IAcUserDtoBase : IAcUserDtoMinBase
|
||||
{
|
||||
|
||||
}
|
||||
|
|
@ -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; }
|
||||
|
||||
}
|
||||
|
|
@ -0,0 +1,9 @@
|
|||
|
||||
using AyCode.Interfaces.Entities;
|
||||
|
||||
namespace AyCode.Interfaces.Users.Dtos;
|
||||
|
||||
public interface IAcUserDtoMinBase : IEntityGuid
|
||||
{
|
||||
|
||||
}
|
||||
|
|
@ -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; }
|
||||
}
|
||||
|
|
@ -7,7 +7,7 @@
|
|||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="Dto\" />
|
||||
<Folder Include="Dtos\" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
@ -7,7 +7,7 @@
|
|||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<Folder Include="Dto\" />
|
||||
<Folder Include="Logins\" />
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,7 @@
|
|||
using AyCode.Interfaces.Entities;
|
||||
|
||||
namespace AyCode.Models;
|
||||
|
||||
public interface IAcModelDtoBase : IEntityGuid
|
||||
{
|
||||
}
|
||||
|
|
@ -0,0 +1,8 @@
|
|||
using AyCode.Interfaces.Entities;
|
||||
|
||||
namespace AyCode.Models.Logins;
|
||||
|
||||
public interface IAcLoginDtoBase : IEntityGuid
|
||||
{
|
||||
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
@ -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)
|
||||
{
|
||||
}
|
||||
}
|
||||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue