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 = Guid.NewGuid() }; var users = new OrganizationUnit { CommonName = "Users", Id = Guid.NewGuid() }; var germany = new OrganizationUnit { CommonName = "Germany", Id = Guid.NewGuid(), ParentId = users.Id }; var usa = new OrganizationUnit { CommonName = "USA", Id = Guid.NewGuid(), ParentId = users.Id }; var arizona = new OrganizationUnit { CommonName = "Arizona", Id = Guid.NewGuid(), ParentId = usa.Id }; var france = new OrganizationUnit { CommonName = "France", Id = Guid.NewGuid(), ParentId = users.Id }; modelBuilder.Entity().HasData(users, groups, germany, usa, arizona, france); var user = new User { CommonName = Environment.UserName, IsActive = true, Id = Guid.NewGuid(), ParentId = users.Id }; modelBuilder.Entity().HasData(user); var secGroup = new SecurityGroup { CommonName = "Global Admin", Id = Guid.NewGuid(), ParentId = groups.Id }; modelBuilder.Entity().HasData(secGroup); modelBuilder.Entity() .HasData(new MembersMember { MemberId = secGroup.Id, AttachedMemberId = user.Id }); } public static void CreateRelations(this ModelBuilder modelBuilder) { if (modelBuilder == null) throw new ArgumentNullException(nameof(modelBuilder)); modelBuilder.Entity() .HasKey(bc => new { bc.MemberId, AttachedMemberId = bc.AttachedMemberId }); modelBuilder.Entity() .HasOne(bc => bc.AttachedMember) .WithMany(b => b!.MemberOf) .HasForeignKey(bc => bc.AttachedMemberId); 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 GetAttachedMembers(this SecurityGroup securityGroup) { if (securityGroup == null) throw new ArgumentNullException(nameof(securityGroup)); foreach (var userMember in securityGroup.Members) { if (userMember.AttachedMember is null) continue; yield return userMember.AttachedMember; } } } }