diff --git a/AyCode.Core.Tests.Internal/Entities/Company.cs b/AyCode.Core.Tests.Internal/Entities/Company.cs index 006153f..776157e 100644 --- a/AyCode.Core.Tests.Internal/Entities/Company.cs +++ b/AyCode.Core.Tests.Internal/Entities/Company.cs @@ -8,7 +8,7 @@ using AyCode.Entities.ServiceProviders; namespace AyCode.Core.Tests.Internal.Entities; -public class Company : AcCompany +public class Company : AcCompany { } \ No newline at end of file diff --git a/AyCode.Database/DataLayers/Users/AcUserDalBase.cs b/AyCode.Database/DataLayers/Users/AcUserDalBase.cs index 79f3bc5..25935ee 100644 --- a/AyCode.Database/DataLayers/Users/AcUserDalBase.cs +++ b/AyCode.Database/DataLayers/Users/AcUserDalBase.cs @@ -21,14 +21,14 @@ using AyCode.Interfaces.ServiceProviders; namespace AyCode.Database.DataLayers.Users { - public abstract class AcUserDalBase : AcDalBase - where TDbContext : AcDbContextBase, IAcUserDbContextBase - where TUser : class, IAcUser - where TProfile : class, IAcProfile + public abstract class AcUserDalBase : AcDalBase + where TDbContext : AcDbContextBase, IAcUserDbContextBase + where TUser : class, IAcUser + where TProfile : class, IAcProfile where TUserToken : class, IAcUserTokenBase where TCompany : class, IAcCompanyBase - where TUserToServiceProvider : class, IAcUserToCompanyBase - where TProfileAddress : class, IAcAddress + where TUserToCompany : class, IAcUserToCompanyBase + where TAddress : class, IAcAddress where TEmailMessage : class, IAcEmailMessageBase { public TUser? GetUserById(Guid userId, bool onlyConfirmed) => Session(x => x.GetUserById(userId, onlyConfirmed)); @@ -58,7 +58,7 @@ namespace AyCode.Database.DataLayers.Users return TransactionAsync(ctx => ctx.AddUser(user)); } - public Task AddUserAsync(TUser user, string profileName, TProfileAddress address, string? firstName = null, string? lastName = null) + public Task AddUserAsync(TUser user, string profileName, TAddress address, string? firstName = null, string? lastName = null) { return TransactionAsync(ctx => { @@ -69,7 +69,7 @@ namespace AyCode.Database.DataLayers.Users }); } - public bool AddUser(TUser user, string profileName, TProfileAddress address, string? firstName = null, string? lastName = null) + public bool AddUser(TUser user, string profileName, TAddress address, string? firstName = null, string? lastName = null) { return Transaction(ctx => { @@ -81,7 +81,7 @@ namespace AyCode.Database.DataLayers.Users }); } - private static TProfile CreateProfile(string profileName, TProfileAddress address, string? firstName, string? lastName) + private static TProfile CreateProfile(string profileName, TAddress address, string? firstName, string? lastName) { var profile = Activator.CreateInstance(); @@ -96,29 +96,8 @@ namespace AyCode.Database.DataLayers.Users return profile; } - public Task RemoveUserAsync(TUser? user) => TransactionAsync(ctx => RemoveUserTransactionBody(user, ctx)); - public Task RemoveUserAsync(Guid userId) => TransactionAsync(ctx => - { - var user = ctx.GetUserById(userId, false); - - return RemoveUserTransactionBody(user, ctx); - }); - - protected virtual bool RemoveUserTransactionBody(TUser? user, TDbContext ctx) - { - if (user == null) return false; - - var profile = ctx.Profiles.FirstOrDefault(x => x.Id == user.ProfileId); - if (profile != null) - { - var address = ctx.Addresses.FirstOrDefault(x => x.Id == profile.AddressId); - if (address != null) ctx.Addresses.Remove(address); - - ctx.Profiles.Remove(profile); - } - - return ctx.RemoveUser(user); - } + public Task RemoveUserAsync(TUser user) => TransactionAsync(ctx => ctx.RemoveUser(user)); + public Task RemoveUserAsync(Guid userId) => TransactionAsync(ctx => ctx.RemoveUser(userId)); public TUser? AuthenticateUser(string? email, string? password, string refreshToken, out AcErrorCode errorCode) { diff --git a/AyCode.Database/DbContexts/Users/AcUserDbContextBase.cs b/AyCode.Database/DbContexts/Users/AcUserDbContextBase.cs index 9656c78..b0ad19e 100644 --- a/AyCode.Database/DbContexts/Users/AcUserDbContextBase.cs +++ b/AyCode.Database/DbContexts/Users/AcUserDbContextBase.cs @@ -9,21 +9,21 @@ using Microsoft.EntityFrameworkCore; namespace AyCode.Database.DbContexts.Users { - public abstract class AcUserDbContextBase : AcDbContextBase, IAcUserDbContextBase - where TUser : class, IAcUser - where TProfile : class, IAcProfile + public abstract class AcUserDbContextBase : AcDbContextBase, IAcUserDbContextBase + where TUser : class, IAcUser + where TProfile : class, IAcProfile where TUserToken : class, IAcUserTokenBase - where TCompany : class, IAcCompany//IAcServiceProviderBase - where TUserToServiceProvider : class, IAcUserToCompanyBase - where TProfileAddress : class, IAcAddress + where TCompany : class, IAcCompany//IAcServiceProviderBase + where TUserToCompany : class, IAcUserToCompanyBase + where TAddress : class, IAcAddress where TEmailMessage : class, IAcEmailMessageBase { public required DbSet Users { get; set; } public required DbSet UserTokens { get; set; } - public DbSet Addresses { get; set; } + public DbSet Addresses { get; set; } public DbSet Profiles { get; set; } public DbSet EmailMessages { get; set; } - + public DbSet Companies { get; set; } protected AcUserDbContextBase() : this(string.Empty) { } @@ -46,8 +46,8 @@ namespace AyCode.Database.DbContexts.Users { base.OnModelCreating(modelBuilder); - new AcUserEntityTypeDefaultConfiguration().Configure(modelBuilder.Entity()); - new AcProfileEntityTypeDefaultConfiguration().Configure(modelBuilder.Entity()); + new AcUserEntityTypeDefaultConfiguration().Configure(modelBuilder.Entity()); + new AcProfileEntityTypeDefaultConfiguration().Configure(modelBuilder.Entity()); //new EmailMessageEntityTypeDefaultConfigurations().Configure(modelBuilder.Entity()); } diff --git a/AyCode.Database/DbContexts/Users/IAcUserDbContextBase.cs b/AyCode.Database/DbContexts/Users/IAcUserDbContextBase.cs index 6897129..1c23919 100644 --- a/AyCode.Database/DbContexts/Users/IAcUserDbContextBase.cs +++ b/AyCode.Database/DbContexts/Users/IAcUserDbContextBase.cs @@ -11,9 +11,7 @@ using AyCode.Interfaces.Users; namespace AyCode.Database.DbContexts.Users; public interface IAcUserDbContextBase - : IAcUserDbSet, IAcUserTokenDbSet, - IAcAddressDbSetBase, IAcProfileDbSetBase, - IAcEmailMessageDbSet + : IAcUserDbSetBase, IAcUserTokenDbSet, IAcEmailMessageDbSet where TUser : class, IAcUser where TProfile : class, IAcProfile diff --git a/AyCode.Database/DbSets/Addresses/IAcAddressDbSetExtensions.cs b/AyCode.Database/DbSets/Addresses/AcAddressDbSetExtensions.cs similarity index 100% rename from AyCode.Database/DbSets/Addresses/IAcAddressDbSetExtensions.cs rename to AyCode.Database/DbSets/Addresses/AcAddressDbSetExtensions.cs diff --git a/AyCode.Database/DbSets/Companies/AcCompanyDbSetExtensions.cs b/AyCode.Database/DbSets/Companies/AcCompanyDbSetExtensions.cs new file mode 100644 index 0000000..44903ec --- /dev/null +++ b/AyCode.Database/DbSets/Companies/AcCompanyDbSetExtensions.cs @@ -0,0 +1,84 @@ +using AyCode.Database.DbSets.Profiles; +using AyCode.Interfaces.Addresses; +using AyCode.Interfaces.Profiles; +using AyCode.Interfaces.Profiles.Dtos; +using AyCode.Interfaces.ServiceProviders; +using AyCode.Interfaces.Users; +using AyCode.Utils.Extensions; +using Microsoft.EntityFrameworkCore; + +namespace AyCode.Database.DbSets.Companies; + +public static class AcCompanyDbSetExtensions +{ + #region Add, Update, Remove + + public static bool AddServiceProvider(this IAcCompanyDbSetBase ctx, TCompany company) + where TCompany : class, IAcCompany + where TProfile : class, IAcProfile + where TAddress : class, IAcAddress + { + var companyProfile = company.Profile; + + if (company.ProfileId.IsNullOrEmpty() || companyProfile.Id != company.ProfileId || companyProfile.AddressId.IsNullOrEmpty() || companyProfile.Address.Id != companyProfile.AddressId) + { + return false; + } + + if (!company.OwnerId.IsNullOrEmpty()) + company.AddUser(company.OwnerId.Value, 1); + + return ctx.Companies.Add(company).State == EntityState.Added; + } + + public static bool UpdateServiceProvider(this IAcCompanyDbSetBase ctx, TCompany company) + where TCompany : class, IAcCompany + where TProfile : class, IAcProfile + where TAddress : class, IAcAddress + { + var companyProfile = company.Profile; + + if (company.ProfileId.IsNullOrEmpty() || companyProfile.Id != company.ProfileId || companyProfile.AddressId.IsNullOrEmpty() || companyProfile.Address.Id != companyProfile.AddressId) + { + return false; + } + + //if (!company.OwnerId.IsNullOrEmpty()) + //{ + // companyProfile + // company.AddUser(company.OwnerId.Value, 1); + //} + + return ctx.Companies.Update(company).State == EntityState.Modified; + } + + public static bool RemoveServiceProvider(this IAcCompanyDbSetBase ctx, TCompany company) + where TCompany : class, IAcCompany + where TProfile : class, IAcProfile + where TAddress : class, IAcAddress + { + ctx.RemoveProfile(company.ProfileId); + + return ctx.Companies.Remove(company).State == EntityState.Deleted; + } + + public static bool RemoveServiceProvider(this IAcCompanyDbSetBase ctx, Guid companyId) + where TCompany : class, IAcCompany + where TProfile : class, IAcProfile + where TAddress : class, IAcAddress + { + var company = ctx.GetServiceProviderById(companyId); + return company == null || ctx.RemoveServiceProvider(company); + } + + #endregion Add, Update, Remove + + public static TCompany? GetServiceProviderById(this IAcCompanyDbSetBase ctx, Guid companyId) where TCompany : class, IAcCompanyBase + => ctx.Companies.FirstOrDefault(x => x.Id == companyId); + + public static IQueryable GetServiceProviders(this IAcCompanyDbSetBase ctx) where TCompany : class, IAcCompanyBase + => ctx.Companies; + + public static List GetServiceProvidersByOwnerId(this IAcCompanyDbSetBase ctx, Guid ownerId) where TCompany : class, IAcCompanyBase + => ctx.Companies.Where(x => x.OwnerId == ownerId).ToList(); +} \ No newline at end of file diff --git a/AyCode.Database/DbSets/Companies/IAcCompanyDbSetBase.cs b/AyCode.Database/DbSets/Companies/IAcCompanyDbSetBase.cs new file mode 100644 index 0000000..4bb0e1a --- /dev/null +++ b/AyCode.Database/DbSets/Companies/IAcCompanyDbSetBase.cs @@ -0,0 +1,26 @@ +using AyCode.Database.DbSets.Profiles; +using AyCode.Database.DbSets.Users; +using AyCode.Interfaces.Addresses; +using AyCode.Interfaces.Profiles; +using AyCode.Interfaces.Profiles.Dtos; +using AyCode.Interfaces.ServiceProviders; +using AyCode.Interfaces.Users; +using Microsoft.EntityFrameworkCore; + +namespace AyCode.Database.DbSets.Companies; + +public interface IAcCompanyDbSetBase where TCompany : class, IAcCompanyBase +{ + DbSet Companies { get; set; } +} + +public interface IAcCompanyDbSetBase : IAcCompanyDbSetBase, IAcProfileDbSetBase + where TCompany : class, IAcCompany + where TProfile : class, IAcProfileDtoBase +{ } + +public interface IAcCompanyDbSetBase : IAcCompanyDbSetBase, IAcProfileDbSetBase + where TCompany : class, IAcCompany + where TProfile : class, IAcProfile + where TAddress : class, IAcAddress +{ } \ No newline at end of file diff --git a/AyCode.Database/DbSets/Profiles/AcProfileDbSetExtensions.cs b/AyCode.Database/DbSets/Profiles/AcProfileDbSetExtensions.cs new file mode 100644 index 0000000..4de65e3 --- /dev/null +++ b/AyCode.Database/DbSets/Profiles/AcProfileDbSetExtensions.cs @@ -0,0 +1,39 @@ +using AyCode.Core.Server.Loggers; +using AyCode.Database.DbSets.Profiles; +using AyCode.Entities; +using AyCode.Interfaces.Addresses; +using AyCode.Interfaces.Profiles.Dtos; +using AyCode.Interfaces.Profiles; +using Microsoft.EntityFrameworkCore; + +namespace AyCode.Database.DbSets.Profiles; + +public static class AcProfileDbSetExtensions +{ + public static TProfile? GetProfileById(this IAcProfileDbSetBase ctx, Guid profileId) where TProfile : class, IAcProfileDtoBase + => ctx.Profiles.FirstOrDefault(u => u.Id == profileId); + + public static bool AddProfile(this IAcProfileDbSetBase ctx, TProfile profile) where TProfile : class, IAcProfileDtoBase + { + return ctx.Profiles.Add(profile).State == EntityState.Added; + } + + public static bool RemoveProfile(this IAcProfileDbSetBase ctx, TProfile profile) + where TProfile : class, IAcProfile + where TAddress : class, IAcAddress + { + var address = ctx.Addresses.FirstOrDefault(x => x.Id == profile.AddressId); + if (address != null) ctx.Addresses.Remove(address); + + return ctx.Profiles.Remove(profile).State == EntityState.Deleted; + } + + public static bool RemoveProfile(this IAcProfileDbSetBase ctx, Guid profileId) + where TProfile : class, IAcProfile + where TAddress : class, IAcAddress + { + var profile = ctx.GetProfileById(profileId); + + return profile != null && ctx.RemoveProfile(profile); + } +} \ No newline at end of file diff --git a/AyCode.Database/DbSets/Profiles/IAcProfileDbSetBase.cs b/AyCode.Database/DbSets/Profiles/IAcProfileDbSetBase.cs index f61271a..c61b7ad 100644 --- a/AyCode.Database/DbSets/Profiles/IAcProfileDbSetBase.cs +++ b/AyCode.Database/DbSets/Profiles/IAcProfileDbSetBase.cs @@ -1,4 +1,7 @@ -using AyCode.Interfaces.Profiles.Dtos; +using AyCode.Database.DbSets.Addresses; +using AyCode.Interfaces.Addresses; +using AyCode.Interfaces.Profiles; +using AyCode.Interfaces.Profiles.Dtos; using AyCode.Interfaces.Users; using Microsoft.EntityFrameworkCore; @@ -7,4 +10,10 @@ namespace AyCode.Database.DbSets.Profiles; public interface IAcProfileDbSetBase where TProfile : class, IAcProfileDtoBase { DbSet Profiles { get; set; } +} + +public interface IAcProfileDbSetBase : IAcProfileDbSetBase, IAcAddressDbSetBase + where TProfile : class, IAcProfile + where TAddress : class, IAcAddress +{ } \ No newline at end of file diff --git a/AyCode.Database/DbSets/Users/AcUserDbSetExtensions.cs b/AyCode.Database/DbSets/Users/AcUserDbSetExtensions.cs index 1f9613a..cdf3a7e 100644 --- a/AyCode.Database/DbSets/Users/AcUserDbSetExtensions.cs +++ b/AyCode.Database/DbSets/Users/AcUserDbSetExtensions.cs @@ -1,13 +1,18 @@ using AyCode.Core.Extensions; using AyCode.Core.Loggers; using AyCode.Core.Server.Loggers; +using AyCode.Database.DbSets.Profiles; using AyCode.Database.Extensions; using AyCode.Entities; using AyCode.Entities.Users; +using AyCode.Interfaces.Addresses; using AyCode.Interfaces.Entities; using AyCode.Interfaces.Profiles; +using AyCode.Interfaces.Profiles.Dtos; +using AyCode.Interfaces.ServiceProviders; using AyCode.Interfaces.Users; using AyCode.Models.Users; +using Microsoft.EntityFrameworkCore; namespace AyCode.Database.DbSets.Users; @@ -58,21 +63,29 @@ public static class AcUserDbSetExtensions { var emailLower = user.EmailAddress.ToLower(); - GlobalLogger.Info($"GetUserByEmail: {emailLower}"); + GlobalLogger.Info($"AddUser: {emailLower}"); - return ctx.Users.Add(user).State == Microsoft.EntityFrameworkCore.EntityState.Added; + return ctx.Users.Add(user).State == EntityState.Added; } - public static bool RemoveUser(this IAcUserDbSetBase ctx, TUser user) where TUser : class, IAcUserBase - => ctx.Users.Remove(user).State == Microsoft.EntityFrameworkCore.EntityState.Deleted; + public static bool RemoveUser(this IAcUserDbSetBase ctx, TUser user) + where TUser : class, IAcUser + where TProfile : class, IAcProfile + where TAddress : class, IAcAddress + { + ctx.RemoveProfile(user.ProfileId); - public static bool RemoveUser(this IAcUserDbSetBase ctx, Guid userId) where TUser : class, IAcUserBase + return ctx.Users.Remove(user).State == EntityState.Deleted; + } + + public static bool RemoveUser(this IAcUserDbSetBase ctx, Guid userId) + where TUser : class, IAcUser + where TProfile : class, IAcProfile + where TAddress : class, IAcAddress { var user = ctx.GetUserById(userId, false); - if (user == null) return false; - - return ctx.RemoveUser(user); + return user != null && ctx.RemoveUser(user); } public static bool UpdateJwtRefreshToken(this IAcUserDbSetBase ctx, TUser user, string refreshToken) where TUser : class, IAcUserBase diff --git a/AyCode.Database/DbSets/Users/IAcUserDbSet.cs b/AyCode.Database/DbSets/Users/IAcUserDbSet.cs deleted file mode 100644 index 9700b6a..0000000 --- a/AyCode.Database/DbSets/Users/IAcUserDbSet.cs +++ /dev/null @@ -1,15 +0,0 @@ -using AyCode.Database.DbContexts; -using AyCode.Interfaces.Addresses; -using AyCode.Interfaces.Profiles; -using AyCode.Interfaces.ServiceProviders; -using AyCode.Interfaces.Users; - -namespace AyCode.Database.DbSets.Users; - -public interface IAcUserDbSet : IAcUserDbSetBase - where TUser : class, IAcUser - where TProfile : class, IAcProfile - where TCompany : class, IAcCompanyBase - where TUserToServiceProvider : class, IAcUserToCompanyBase - where TProfileAddress : class, IAcAddress -{ } \ No newline at end of file diff --git a/AyCode.Database/DbSets/Users/IAcUserDbSetBase.cs b/AyCode.Database/DbSets/Users/IAcUserDbSetBase.cs index e61e751..06f8885 100644 --- a/AyCode.Database/DbSets/Users/IAcUserDbSetBase.cs +++ b/AyCode.Database/DbSets/Users/IAcUserDbSetBase.cs @@ -1,4 +1,10 @@ -using AyCode.Interfaces.Users; +using AyCode.Database.DbSets.Addresses; +using AyCode.Database.DbSets.Companies; +using AyCode.Database.DbSets.Profiles; +using AyCode.Interfaces.Addresses; +using AyCode.Interfaces.Profiles; +using AyCode.Interfaces.ServiceProviders; +using AyCode.Interfaces.Users; using Microsoft.EntityFrameworkCore; namespace AyCode.Database.DbSets.Users; @@ -6,4 +12,25 @@ namespace AyCode.Database.DbSets.Users; public interface IAcUserDbSetBase where TUser : class, IAcUserBase { DbSet Users { get; set; } -} \ No newline at end of file +} + +public interface IAcUserDbSetBase : IAcUserDbSetBase, IAcProfileDbSetBase + where TUser : class, IAcUserBase + where TProfile : class, IAcProfile + where TAddress : class, IAcAddress +{ } + +public interface IAcUserDbSetBase : IAcUserDbSetBase, IAcCompanyDbSetBase + where TUser : class, IAcUserBase + where TProfile : class, IAcProfile + where TCompany : class, IAcCompanyBase + where TAddress : class, IAcAddress +{ } + +public interface IAcUserDbSetBase : IAcUserDbSetBase + where TUser : class, IAcUserBase, IAcUser + where TProfile : class, IAcProfile + where TCompany : class, IAcCompanyBase + where TUserToCompany : class, IAcUserToCompanyBase + where TAddress : class, IAcAddress +{ } \ No newline at end of file diff --git a/AyCode.Database/ModelBuilders/Users/AcUserEntityTypeConfigurations.cs b/AyCode.Database/ModelBuilders/Users/AcUserEntityTypeConfigurations.cs index 95c5477..49111cc 100644 --- a/AyCode.Database/ModelBuilders/Users/AcUserEntityTypeConfigurations.cs +++ b/AyCode.Database/ModelBuilders/Users/AcUserEntityTypeConfigurations.cs @@ -7,17 +7,38 @@ using Microsoft.EntityFrameworkCore.Metadata.Builders; namespace AyCode.Database.ModelBuilders.Users; -public class AcUserEntityTypeDefaultConfiguration : IAcEntityTypeConfiguration - where TUser : class, IAcUser +public class AcUserEntityTypeDefaultConfiguration : IAcEntityTypeConfiguration + where TUser : class, IAcUser where TProfile : class, IAcProfile - where TCompany : class, IAcCompany - where TUserToServiceProvider : class, IAcUserToCompanyBase + where TCompany : class, IAcCompany + where TUserToCompany : class, IAcUserToCompanyBase where TProfileAddress : class, IAcAddress { public virtual void Configure(EntityTypeBuilder modelBuilder) { modelBuilder.BuildEntityToProfileRelation(); //modelBuilder.BuildEntityToAddressRelation(); - modelBuilder.BuildEntityToServiceProviderRelation(); + modelBuilder.BuildEntityToServiceProviderRelation(); + } +} + +public class AcCompanyEntityTypeDefaultConfiguration : IAcEntityTypeConfiguration + where TUser : class, IAcUser + where TProfile : class, IAcProfile + where TCompany : class, IAcCompany + where TUserToCompany : class, IAcUserToCompanyBase + where TProfileAddress : class, IAcAddress +{ + public virtual void Configure(EntityTypeBuilder modelBuilder) + { + modelBuilder.BuildEntityToProfileRelation(); + + //modelBuilder + // .HasMany(e => e.Users) + // .WithMany(e => e.ServiceProviders) + // .UsingEntity(); + + //modelBuilder.Navigation(e => e.Users).AutoInclude(); + modelBuilder.Navigation(e => e.UserToServiceProviders).AutoInclude(); } } diff --git a/AyCode.Entities/ServiceProviders/AcCompany.cs b/AyCode.Entities/ServiceProviders/AcCompany.cs index ae64b4e..1edb946 100644 --- a/AyCode.Entities/ServiceProviders/AcCompany.cs +++ b/AyCode.Entities/ServiceProviders/AcCompany.cs @@ -1,6 +1,8 @@  using System.ComponentModel.DataAnnotations.Schema; using System.ComponentModel.DataAnnotations; +using AyCode.Interfaces.Addresses; +using AyCode.Interfaces.Profiles; using AyCode.Interfaces.Profiles.Dtos; using AyCode.Interfaces.ServiceProviders; using AyCode.Interfaces.Users; @@ -9,10 +11,11 @@ using AyCode.Utils.Extensions; namespace AyCode.Entities.ServiceProviders { [Table("ServiceProviders")] - public abstract class AcCompany : IAcCompany + public abstract class AcCompany : IAcCompany where TUser : class, IAcUserBase - where TUserToServiceProvider : class, IAcUserToCompanyBase - where TProfile : class, IAcProfileDtoBase + where TUserToCompany : class, IAcUserToCompanyBase + where TProfile : class, IAcProfile + where TAddress : class, IAcAddress { [Key, DatabaseGenerated(DatabaseGeneratedOption.None)] public Guid Id { get; set; } @@ -33,8 +36,8 @@ namespace AyCode.Entities.ServiceProviders public Guid AffiliateId { get; set; } public Guid? ReferralId { get; set; } - public virtual List Users { get; set; } - public virtual List UserToServiceProviders { get; set; } + public virtual List Users { get; set; } = []; + public virtual List UserToServiceProviders { get; set; } = []; public DateTime Created { get; set; } public DateTime Modified { get; set; } @@ -69,5 +72,20 @@ namespace AyCode.Entities.ServiceProviders Profile = profile; ProfileId = profile.Id; } + + public void AddUser(Guid userId, int permissions) + { + if (UserToServiceProviders.Any(x => x.UserId == userId)) + return; + + var userToCompany = Activator.CreateInstance(); + + userToCompany.Id = Guid.NewGuid(); + userToCompany.UserId = userId; + userToCompany.ServiceProviderId = Id; + userToCompany.Permissions = permissions; + + UserToServiceProviders.Add(userToCompany); + } } } diff --git a/AyCode.Interfaces/ServiceProviders/IAcCompany.cs b/AyCode.Interfaces/ServiceProviders/IAcCompany.cs index 3a3e1a0..c23c4d8 100644 --- a/AyCode.Interfaces/ServiceProviders/IAcCompany.cs +++ b/AyCode.Interfaces/ServiceProviders/IAcCompany.cs @@ -1,11 +1,31 @@ -using AyCode.Interfaces.Profiles.Dtos; +using AyCode.Interfaces.Addresses; +using AyCode.Interfaces.Profiles.Dtos; using AyCode.Interfaces.Profiles; using AyCode.Interfaces.Users; namespace AyCode.Interfaces.ServiceProviders; -public interface IAcCompany : IAcCompanyBase, IAcUsersRelation, IAcProfileRelation - where TUser : IAcUserBase - where TUserToServiceProvider : IAcUserToCompanyBase +public interface IAcCompany : IAcCompanyBase, IAcProfileRelation where TProfile : IAcProfileDtoBase +{ + public void SetProfile(TProfile profile); +} + +public interface IAcCompany : IAcCompany + where TProfile : IAcProfile + where TAddress : class, IAcAddress +{} + + +public interface IAcCompany : IAcCompany, IAcUsersRelation + where TUser : IAcUserBase + where TUserToCompany : IAcUserToCompanyBase + where TProfile : IAcProfileDtoBase +{} + +public interface IAcCompany : IAcCompany, IAcCompany + where TUser : IAcUserBase + where TUserToCompany : IAcUserToCompanyBase + where TProfile : IAcProfile + where TAddress : class, IAcAddress {} \ No newline at end of file diff --git a/AyCode.Interfaces/ServiceProviders/IAcCompanyBase.cs b/AyCode.Interfaces/ServiceProviders/IAcCompanyBase.cs index 0c5c161..f10524b 100644 --- a/AyCode.Interfaces/ServiceProviders/IAcCompanyBase.cs +++ b/AyCode.Interfaces/ServiceProviders/IAcCompanyBase.cs @@ -14,4 +14,6 @@ public interface IAcCompanyBase : IEntityGuid, IAcProfileForeignKey, ITimeStampI Guid AffiliateId { get; set; } Guid? ReferralId { get; set; } + + public void AddUser(Guid userId, int permissions); } \ No newline at end of file diff --git a/AyCode.Interfaces/Users/Dtos/IAcUserDtoBase.cs b/AyCode.Interfaces/Users/Dtos/IAcUserDtoBase.cs index 00dc072..057ed17 100644 --- a/AyCode.Interfaces/Users/Dtos/IAcUserDtoBase.cs +++ b/AyCode.Interfaces/Users/Dtos/IAcUserDtoBase.cs @@ -4,10 +4,14 @@ using AyCode.Interfaces.Addresses; namespace AyCode.Interfaces.Users.Dtos; -public interface IAcUserDtoBase : IAcUserDtoMinBase, IAcCompanyRelation - where TProfile : IAcProfile +public interface IAcUserDtoBase : IAcUserDtoMinBase + where TProfile : IAcProfile + where TAddress : IAcAddress +{ } + +public interface IAcUserDtoBase : IAcUserDtoBase, IAcCompanyRelation + where TProfile : IAcProfile where TCompany : IAcCompanyBase - where TUserToServiceProvider : IAcUserToCompanyBase - where TProfileAddress : IAcAddress -{ -} \ No newline at end of file + where TUserToCompany : IAcUserToCompanyBase + where TAddress : IAcAddress +{ } \ No newline at end of file diff --git a/AyCode.Interfaces/Users/Dtos/IAcUserDtoDetailBase.cs b/AyCode.Interfaces/Users/Dtos/IAcUserDtoDetailBase.cs index c9060e2..6a7b1e7 100644 --- a/AyCode.Interfaces/Users/Dtos/IAcUserDtoDetailBase.cs +++ b/AyCode.Interfaces/Users/Dtos/IAcUserDtoDetailBase.cs @@ -4,10 +4,14 @@ using AyCode.Interfaces.ServiceProviders; namespace AyCode.Interfaces.Users.Dtos; -public interface IAcUserDtoDetailBase : IAcUserBase, IAcUserDtoBase - where TProfile : IAcProfile +public interface IAcUserDtoDetailBase : IAcUserBase, IAcUserDtoBase + where TProfile : IAcProfile + where TAddress : IAcAddress +{ } + +public interface IAcUserDtoDetailBase : IAcUserDtoDetailBase, IAcUserDtoBase + where TProfile : IAcProfile where TCompany : IAcCompanyBase - where TUserToServiceProvider : IAcUserToCompanyBase - where TProfileAddress : IAcAddress -{ -} \ No newline at end of file + where TUserToCompany : IAcUserToCompanyBase + where TAddress : IAcAddress +{ } \ No newline at end of file diff --git a/AyCode.Interfaces/Users/IAcUser.cs b/AyCode.Interfaces/Users/IAcUser.cs index 4085dd3..57c3718 100644 --- a/AyCode.Interfaces/Users/IAcUser.cs +++ b/AyCode.Interfaces/Users/IAcUser.cs @@ -6,9 +6,14 @@ using AyCode.Interfaces.Users.Dtos; namespace AyCode.Interfaces.Users; -public interface IAcUser : IAcUserDtoDetailBase, IAcProfileForeignKey - where TProfile : IAcProfile +public interface IAcUser : IAcUserDtoDetailBase + where TProfile : IAcProfile + where TAddress : IAcAddress +{ } + +public interface IAcUser : IAcUser, IAcUserDtoDetailBase + where TProfile : IAcProfile where TCompany : IAcCompanyBase - where TUserToServiceProvider : IAcUserToCompanyBase - where TProfileAddress : IAcAddress + where TUserToCompany : IAcUserToCompanyBase + where TAddress : IAcAddress { } \ No newline at end of file