diff --git a/AyCode.Database.Tests/Users/AcUserDalTestBase.cs b/AyCode.Database.Tests/Users/AcUserDalTestBase.cs index 69a8536..0552417 100644 --- a/AyCode.Database.Tests/Users/AcUserDalTestBase.cs +++ b/AyCode.Database.Tests/Users/AcUserDalTestBase.cs @@ -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 : AcDatabaseTestModelBase - where TDal : AcUserDalBase - where TDbContext : AcDbContextBase, IAcUserDbContextBase - where TUser : class, IUserBase + public abstract class AcUserDalTestBase : AcDatabaseTestModelBase + where TDal : AcUserDalBase + where TDbContext : AcDbContextBase, IAcUserDbContextBase + where TUser : class, IUserBase + where TProfile : class, IAcProfileBase where TUserToken : class, IUserTokenBase { diff --git a/AyCode.Database/DataLayers/Users/AcUserDalBase.cs b/AyCode.Database/DataLayers/Users/AcUserDalBase.cs index b5d6ef1..815a817 100644 --- a/AyCode.Database/DataLayers/Users/AcUserDalBase.cs +++ b/AyCode.Database/DataLayers/Users/AcUserDalBase.cs @@ -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 : AcDalBase - where TDbContext : AcDbContextBase, IAcUserDbContextBase - where TUser : class, IUserBase + public abstract class AcUserDalBase : AcDalBase + where TDbContext : AcDbContextBase, IAcUserDbContextBase + where TUser : class, IUserBase + where TProfile : class, IAcProfileBase where TUserToken : class, IUserTokenBase { public TUser? GetUserById(Guid userId) => Session(x => x.GetUserById(userId)); diff --git a/AyCode.Database/DbContexts/Users/AcUserDbContextBase.cs b/AyCode.Database/DbContexts/Users/AcUserDbContextBase.cs index 7bc256e..3f77677 100644 --- a/AyCode.Database/DbContexts/Users/AcUserDbContextBase.cs +++ b/AyCode.Database/DbContexts/Users/AcUserDbContextBase.cs @@ -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 : AcDbContextBase, IAcUserDbContextBase - where TUser : class, IUserBase + public abstract class AcUserDbContextBase : AcDbContextBase, IAcUserDbContextBase + where TUser : class, IUserBase + where TProfile : class, IAcProfileBase where TUserToken : class, IUserTokenBase { public required DbSet Users { get; set; } diff --git a/AyCode.Database/DbContexts/Users/IAcUserDbContextBase.cs b/AyCode.Database/DbContexts/Users/IAcUserDbContextBase.cs index ada2210..c6e6966 100644 --- a/AyCode.Database/DbContexts/Users/IAcUserDbContextBase.cs +++ b/AyCode.Database/DbContexts/Users/IAcUserDbContextBase.cs @@ -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 : IAcUserDbSet, IAcUserTokenDbSet where TUser : class, IUserBase where TUserToken : class, IUserTokenBase +public interface IAcUserDbContextBase : IAcUserDbSet, IAcUserTokenDbSet + where TUser : class, IUserBase + where TProfile : class, IAcProfileBase + where TUserToken : class, IUserTokenBase { } \ No newline at end of file diff --git a/AyCode.Database/DbSets/Users/AcUserDbSetExtensions.cs b/AyCode.Database/DbSets/Users/AcUserDbSetExtensions.cs index 73697a3..0f1aa3c 100644 --- a/AyCode.Database/DbSets/Users/AcUserDbSetExtensions.cs +++ b/AyCode.Database/DbSets/Users/AcUserDbSetExtensions.cs @@ -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(this IAcUserDbSet ctx, Guid userId) where TUser : class, IUserBase - { - return ctx.Users.FirstOrDefault(u => u.Id == userId); - } + public static TUser? GetUserById(this IAcUserDbSet ctx, Guid userId) where TUser : class, IUserBase where TProfile : class, IAcProfileBase + => ctx.GetUsersById(userId).FirstOrDefault(); - public static TUser? GetUserByEmail(this IAcUserDbSet ctx, string email) where TUser : class, IUserBase + public static TUser? GetUserByEmail(this IAcUserDbSet ctx, string email) where TUser : class, IUserBase where TProfile : class, IAcProfileBase + => ctx.GetUsersByEmail(email).FirstOrDefault(); + + public static IQueryable GetUsersById(this IAcUserDbSet ctx, Guid userId) where TUser : class, IUserBase where TProfile : class, IAcProfileBase + => ctx.Users.Where(u => u.Id == userId); + + public static IQueryable GetUsersByEmail(this IAcUserDbSet ctx, string email) where TUser : class, IUserBase 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); } } \ No newline at end of file diff --git a/AyCode.Database/DbSets/Users/AcUserTokenDbSetExtensions.cs b/AyCode.Database/DbSets/Users/AcUserTokenDbSetExtensions.cs index 0a59abf..c78b62a 100644 --- a/AyCode.Database/DbSets/Users/AcUserTokenDbSetExtensions.cs +++ b/AyCode.Database/DbSets/Users/AcUserTokenDbSetExtensions.cs @@ -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(this IAcUserDbContextBase ctx, TUser? user, string passwordHash, string verificationToken) - where TUser : class, IUserBase + public static bool ChangePassword(this IAcUserDbContextBase ctx, TUser? user, string passwordHash, string verificationToken) + where TUser : class, IUserBase + where TProfile : class, IAcProfileBase where TUserToken : class, IUserTokenBase { if (user == null || !ctx.IsValidToken(user.Id, verificationToken)) return false; diff --git a/AyCode.Database/DbSets/Users/IAcUserDbSet.cs b/AyCode.Database/DbSets/Users/IAcUserDbSet.cs index 192e63a..1ae7fb1 100644 --- a/AyCode.Database/DbSets/Users/IAcUserDbSet.cs +++ b/AyCode.Database/DbSets/Users/IAcUserDbSet.cs @@ -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 where TUser : class, IUserBase +public interface IAcUserDbSet + where TUser : class, IUserBase + where TProfile : class, IAcProfileBase { DbSet Users { get; set; } } \ No newline at end of file diff --git a/AyCode.Database/ModelBuilders/Users/AcUserEntityTypeBuilderExtensions.cs b/AyCode.Database/ModelBuilders/Users/AcUserEntityTypeBuilderExtensions.cs index 77b19bb..2432a0a 100644 --- a/AyCode.Database/ModelBuilders/Users/AcUserEntityTypeBuilderExtensions.cs +++ b/AyCode.Database/ModelBuilders/Users/AcUserEntityTypeBuilderExtensions.cs @@ -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(this EntityTypeBuilder modelBuilder) where TUser : class, IUserBase + public static void BuildUserToProfileRelation(this EntityTypeBuilder modelBuilder) where TUser : class, IUserBase where TProfile : class, IAcProfileBase { //throw new NotImplementedException(); } - public static void BuildUserToAddressRelation(this EntityTypeBuilder modelBuilder) where TUser : class, IUserBase + public static void BuildUserToAddressRelation(this EntityTypeBuilder modelBuilder) where TUser : class, IUserBase where TProfile : class, IAcProfileBase { //throw new NotImplementedException(); } diff --git a/AyCode.Database/ModelBuilders/Users/AcUserEntityTypeConfigurations.cs b/AyCode.Database/ModelBuilders/Users/AcUserEntityTypeConfigurations.cs index 10774e0..7eaa10e 100644 --- a/AyCode.Database/ModelBuilders/Users/AcUserEntityTypeConfigurations.cs +++ b/AyCode.Database/ModelBuilders/Users/AcUserEntityTypeConfigurations.cs @@ -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 : IAcEntityTypeConfiguration where TUser : class, IUserBase +public abstract class AcUserEntityTypeDefaultConfiguration : IAcEntityTypeConfiguration where TUser : class, IUserBase where TProfile : class, IAcProfileBase { public virtual void Configure(EntityTypeBuilder modelBuilder) { - modelBuilder.BuildUserToProfileRelation(); - modelBuilder.BuildUserToAddressRelation(); + modelBuilder.BuildUserToProfileRelation(); + modelBuilder.BuildUserToAddressRelation(); } } diff --git a/AyCode.Entities/Profiles/ProfileBase.cs b/AyCode.Entities/Profiles/AcProfileBase.cs similarity index 65% rename from AyCode.Entities/Profiles/ProfileBase.cs rename to AyCode.Entities/Profiles/AcProfileBase.cs index 1861b1a..5be6748 100644 --- a/AyCode.Entities/Profiles/ProfileBase.cs +++ b/AyCode.Entities/Profiles/AcProfileBase.cs @@ -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; } diff --git a/AyCode.Entities/Users/UserBase.cs b/AyCode.Entities/Users/UserBase.cs index 411ed62..0aa6112 100644 --- a/AyCode.Entities/Users/UserBase.cs +++ b/AyCode.Entities/Users/UserBase.cs @@ -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 : IUserBase 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; } diff --git a/AyCode.Interfaces/IOwnerId.cs b/AyCode.Interfaces/IOwnerId.cs index 12b7540..41b525c 100644 --- a/AyCode.Interfaces/IOwnerId.cs +++ b/AyCode.Interfaces/IOwnerId.cs @@ -2,5 +2,5 @@ public interface IOwnerId { - Guid OwnerId { get; } + Guid OwnerId { get; set; } } diff --git a/AyCode.Interfaces/MediaInfo/IMediaUserMediaId.cs b/AyCode.Interfaces/MediaInfo/IMediaUserMediaId.cs index 24eb552..0e06d01 100644 --- a/AyCode.Interfaces/MediaInfo/IMediaUserMediaId.cs +++ b/AyCode.Interfaces/MediaInfo/IMediaUserMediaId.cs @@ -8,6 +8,6 @@ namespace AyCode.Interfaces.MediaInfo { public interface IMediaUserMediaId { - Guid UserMediaId { get; set; } + Guid? UserMediaId { get; set; } } } diff --git a/AyCode.Interfaces/Profiles/AcProfile.cs b/AyCode.Interfaces/Profiles/AcProfile.cs new file mode 100644 index 0000000..42a3064 --- /dev/null +++ b/AyCode.Interfaces/Profiles/AcProfile.cs @@ -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; } +} \ No newline at end of file diff --git a/AyCode.Interfaces/Profiles/Dtos/IAcProfileDtoBase.cs b/AyCode.Interfaces/Profiles/Dtos/IAcProfileDtoBase.cs new file mode 100644 index 0000000..46ef611 --- /dev/null +++ b/AyCode.Interfaces/Profiles/Dtos/IAcProfileDtoBase.cs @@ -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; } +} \ No newline at end of file diff --git a/AyCode.Interfaces/Profiles/IProfileBase.cs b/AyCode.Interfaces/Profiles/IAcProfileBase.cs similarity index 62% rename from AyCode.Interfaces/Profiles/IProfileBase.cs rename to AyCode.Interfaces/Profiles/IAcProfileBase.cs index c688ca4..3767b2f 100644 --- a/AyCode.Interfaces/Profiles/IProfileBase.cs +++ b/AyCode.Interfaces/Profiles/IAcProfileBase.cs @@ -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 { - } \ No newline at end of file diff --git a/AyCode.Interfaces/Users/Dtos/IAcUserDtoBase.cs b/AyCode.Interfaces/Users/Dtos/IAcUserDtoBase.cs new file mode 100644 index 0000000..ae48e15 --- /dev/null +++ b/AyCode.Interfaces/Users/Dtos/IAcUserDtoBase.cs @@ -0,0 +1,6 @@ +namespace AyCode.Interfaces.Users.Dtos; + +public interface IAcUserDtoBase : IAcUserDtoMinBase +{ + +} \ No newline at end of file diff --git a/AyCode.Interfaces/Users/Dtos/IAcUserDtoDetailBase.cs b/AyCode.Interfaces/Users/Dtos/IAcUserDtoDetailBase.cs new file mode 100644 index 0000000..53a84a9 --- /dev/null +++ b/AyCode.Interfaces/Users/Dtos/IAcUserDtoDetailBase.cs @@ -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; } + +} \ No newline at end of file diff --git a/AyCode.Interfaces/Users/Dtos/IAcUserDtoMinBase.cs b/AyCode.Interfaces/Users/Dtos/IAcUserDtoMinBase.cs new file mode 100644 index 0000000..c18a506 --- /dev/null +++ b/AyCode.Interfaces/Users/Dtos/IAcUserDtoMinBase.cs @@ -0,0 +1,9 @@ + +using AyCode.Interfaces.Entities; + +namespace AyCode.Interfaces.Users.Dtos; + +public interface IAcUserDtoMinBase : IEntityGuid +{ + +} \ No newline at end of file diff --git a/AyCode.Interfaces/Users/IUserBase.cs b/AyCode.Interfaces/Users/IUserBase.cs index 98caa66..ab8fa97 100644 --- a/AyCode.Interfaces/Users/IUserBase.cs +++ b/AyCode.Interfaces/Users/IUserBase.cs @@ -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 : IAcUserDtoDetailBase, IPassword, ITimeStampInfo where TProfile : class, IAcProfileBase { - public string? RefreshToken { get; set; } + public Guid? ProfileId { get; } + public TProfile Profile { get; set; } } \ No newline at end of file diff --git a/AyCode.Models.Server/AyCode.Models.Server.csproj b/AyCode.Models.Server/AyCode.Models.Server.csproj index aa26416..5b62685 100644 --- a/AyCode.Models.Server/AyCode.Models.Server.csproj +++ b/AyCode.Models.Server/AyCode.Models.Server.csproj @@ -7,7 +7,7 @@ - + diff --git a/AyCode.Models/AcModelDtoBase.cs b/AyCode.Models/AcModelDtoBase.cs new file mode 100644 index 0000000..02162f7 --- /dev/null +++ b/AyCode.Models/AcModelDtoBase.cs @@ -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; +} \ No newline at end of file diff --git a/AyCode.Models/AyCode.Models.csproj b/AyCode.Models/AyCode.Models.csproj index b798032..4362a07 100644 --- a/AyCode.Models/AyCode.Models.csproj +++ b/AyCode.Models/AyCode.Models.csproj @@ -7,7 +7,7 @@ - + diff --git a/AyCode.Models/IAcModelDtoBase.cs b/AyCode.Models/IAcModelDtoBase.cs new file mode 100644 index 0000000..ccd9161 --- /dev/null +++ b/AyCode.Models/IAcModelDtoBase.cs @@ -0,0 +1,7 @@ +using AyCode.Interfaces.Entities; + +namespace AyCode.Models; + +public interface IAcModelDtoBase : IEntityGuid +{ +} \ No newline at end of file diff --git a/AyCode.Models/Logins/IAcLoginDtoBase.cs b/AyCode.Models/Logins/IAcLoginDtoBase.cs new file mode 100644 index 0000000..805ae70 --- /dev/null +++ b/AyCode.Models/Logins/IAcLoginDtoBase.cs @@ -0,0 +1,8 @@ +using AyCode.Interfaces.Entities; + +namespace AyCode.Models.Logins; + +public interface IAcLoginDtoBase : IEntityGuid +{ + +} \ No newline at end of file diff --git a/AyCode.Models/Users/AcUserModelDtoBase.cs b/AyCode.Models/Users/AcUserModelDtoBase.cs new file mode 100644 index 0000000..0f09824 --- /dev/null +++ b/AyCode.Models/Users/AcUserModelDtoBase.cs @@ -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 : AcUserModelDtoMinBase + where TUserDto : class, IAcUserDtoBase + where TProfile : class, IAcProfileBase + where TProfileDto : class, IAcProfileDtoBase +{ + public TProfileDto Profile { get; set; } + + protected AcUserModelDtoBase() {} + protected AcUserModelDtoBase(IUserBase user, TProfile? profile) : base(user) + { + if (profile == null) return; + + Profile = Activator.CreateInstance(); + + Profile.Id = profile.Id; + Profile.Name = profile.Name; + Profile.OwnerId = profile.OwnerId; + } +} \ No newline at end of file diff --git a/AyCode.Models/Users/AcUserModelDtoDetailBase.cs b/AyCode.Models/Users/AcUserModelDtoDetailBase.cs new file mode 100644 index 0000000..254dba2 --- /dev/null +++ b/AyCode.Models/Users/AcUserModelDtoDetailBase.cs @@ -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 : AcUserModelDtoBase + where TUserDtoDetail : class, IAcUserDtoDetailBase + where TProfile : class, IAcProfileBase + where TProfileDto : class, IAcProfileDtoBase +{ + protected AcUserModelDtoDetailBase() {} + protected AcUserModelDtoDetailBase(IUserBase user, TProfile profile) : base(user, profile) + { + } +} \ No newline at end of file diff --git a/AyCode.Models/Users/AcUserModelDtoMinBase.cs b/AyCode.Models/Users/AcUserModelDtoMinBase.cs new file mode 100644 index 0000000..5fe28a3 --- /dev/null +++ b/AyCode.Models/Users/AcUserModelDtoMinBase.cs @@ -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 : AcModelDtoBase where TUserDtoMin : IAcUserDtoMinBase where TProfile : class, IAcProfileBase +{ + public TUserDtoMin UserDto { get; set;} + + protected AcUserModelDtoMinBase() {} + protected AcUserModelDtoMinBase(IUserBase user) : base(user.Id) + { + Id = user.Id; + + UserDto = Activator.CreateInstance(); + UserDto.Id = user.Id; + } +} \ No newline at end of file