using System; using Microsoft.EntityFrameworkCore; using System.Collections.Generic; using UserService.Infrastructure.DataModels; namespace UserService.DatabaseLayer.DataModels { public static class ModelBuilderExtensions { public static void Seed(this ModelBuilder modelBuilder) { if (modelBuilder == null) throw new ArgumentNullException(nameof(modelBuilder)); var groups = new OrganizationUnit { CommonName = "Groups", Id = -1 }; var users = new OrganizationUnit { CommonName = "Users", Id = -2 }; var germany = new OrganizationUnit{CommonName = "Germany", Id = -6, ParentId = -2}; var usa = new OrganizationUnit{CommonName = "USA", Id = -5, ParentId = -2}; var arizona = new OrganizationUnit{CommonName = "Arizona" , Id = -4, ParentId = -5 }; var france = new OrganizationUnit{CommonName = "France" , Id = -3, ParentId = -2 }; modelBuilder.Entity().HasData(users, groups, germany, usa, arizona, france); var user = new User { CommonName = Environment.UserName, IsActive = true, Id = -7, ParentId = users.Id }; modelBuilder.Entity().HasData(user); var secGroup = new SecurityGroup { CommonName = "Global Admin", Id = -8, ParentId = groups.Id }; modelBuilder.Entity().HasData(secGroup); modelBuilder.Entity() .HasData(new UserMember { MemberId = secGroup.Id, UserId = user.Id }); } public static void CreateRelations(this ModelBuilder modelBuilder) { if (modelBuilder == null) throw new ArgumentNullException(nameof(modelBuilder)); modelBuilder.Entity() .HasKey(bc => new { bc.MemberId, bc.UserId }); modelBuilder.Entity() .HasOne(bc => bc.User) .WithMany(b => b!.MemberOf) .HasForeignKey(bc => bc.UserId); modelBuilder.Entity() .HasOne(bc => bc.Member) .WithMany(c => c!.Members) .HasForeignKey(bc => bc.MemberId); modelBuilder.Entity() .HasMany(c => c.Children) .WithOne(e => e.Parent!) .HasForeignKey(bc => bc.ParentId); } } public static class UserExtensions { public static IEnumerable GetSecurityGroups(this User user) { if (user == null) throw new ArgumentNullException(nameof(user)); foreach (var userMember in user.MemberOf) { if (userMember.Member is SecurityGroup securityGroup) { yield return securityGroup; } } } } public static class SecurityGroupExtensions { public static IEnumerable GetUsers(this SecurityGroup securityGroup) { if (securityGroup == null) throw new ArgumentNullException(nameof(securityGroup)); foreach (var userMember in securityGroup.Members) { if (userMember.User is null) continue; yield return userMember.User; } } } }