reorganization of database layer
This commit is contained in:
@ -0,0 +1,73 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
using System.Collections.Generic;
|
||||
|
||||
namespace UserService.DatabaseLayer.DataModels
|
||||
{
|
||||
public static class ModelBuilderExtensions
|
||||
{
|
||||
public static void Seed(this ModelBuilder 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<OrganizationUnit>().HasData(users, groups, germany, usa, arizona, france);
|
||||
var user = new User { CommonName = "holger", IsActive = true, Id = -7, ParentId = germany.Id };
|
||||
modelBuilder.Entity<User>().HasData(user);
|
||||
var secGroup = new SecurityGroup { CommonName = "Global Admin", Id = -8, ParentId = groups.Id };
|
||||
modelBuilder.Entity<SecurityGroup>().HasData(secGroup);
|
||||
|
||||
modelBuilder.Entity<UserMember>()
|
||||
.HasData(new UserMember { MemberId = secGroup.Id, UserId = user.Id });
|
||||
}
|
||||
|
||||
public static void CreateRelations(this ModelBuilder modelBuilder)
|
||||
{
|
||||
modelBuilder.Entity<UserMember>()
|
||||
.HasKey(bc => new { bc.MemberId, bc.UserId });
|
||||
modelBuilder.Entity<UserMember>()
|
||||
.HasOne(bc => bc.User)
|
||||
.WithMany(b => b!.MemberOf)
|
||||
.HasForeignKey(bc => bc.UserId);
|
||||
modelBuilder.Entity<UserMember>()
|
||||
.HasOne(bc => bc.Member)
|
||||
.WithMany(c => c!.Members)
|
||||
.HasForeignKey(bc => bc.MemberId);
|
||||
|
||||
modelBuilder.Entity<Node>()
|
||||
.HasMany(c => c.Children)
|
||||
.WithOne(e => e.Parent!)
|
||||
.HasForeignKey(bc => bc.ParentId);
|
||||
}
|
||||
}
|
||||
|
||||
public static class UserExtensions
|
||||
{
|
||||
public static IEnumerable<SecurityGroup> GetSecurityGroups(this User user)
|
||||
{
|
||||
foreach (var userMember in user.MemberOf)
|
||||
{
|
||||
if (userMember.Member is SecurityGroup securityGroup)
|
||||
{
|
||||
yield return securityGroup;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public static class SecurityGroupExtensions
|
||||
{
|
||||
public static IEnumerable<User> GetUsers(this SecurityGroup securityGroup)
|
||||
{
|
||||
foreach (var userMember in securityGroup.Members)
|
||||
{
|
||||
if (userMember.User is null) continue;
|
||||
yield return userMember.User;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
62
UserService.DatabaseLayer/DataModels/Node.cs
Normal file
62
UserService.DatabaseLayer/DataModels/Node.cs
Normal file
@ -0,0 +1,62 @@
|
||||
#nullable enable
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel.DataAnnotations;
|
||||
|
||||
namespace UserService.DatabaseLayer.DataModels
|
||||
{
|
||||
public class OrganizationUnit : Node
|
||||
{
|
||||
public Member? Manager { get; set; }
|
||||
}
|
||||
|
||||
public class SecurityGroup : Member
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public class User : Member
|
||||
{
|
||||
public string? FirstName { get; set; }
|
||||
public string? LastName { get; set; }
|
||||
public bool IsActive { get; set; }
|
||||
|
||||
public string FullName => $"{FirstName} {LastName}";
|
||||
|
||||
public IEnumerable<UserMember> MemberOf { get; set; } = new List<UserMember>();
|
||||
|
||||
public User Clone() => (User)MemberwiseClone();
|
||||
}
|
||||
|
||||
public class UserMember
|
||||
{
|
||||
public int MemberId { get; set; }
|
||||
public Member? Member { get; set; }
|
||||
|
||||
public int UserId { get; set; }
|
||||
|
||||
public User? User { get; set; }
|
||||
}
|
||||
|
||||
public abstract class Member : Node
|
||||
{
|
||||
[EmailAddress]
|
||||
public string? EMail { get; set; }
|
||||
|
||||
public ICollection<UserMember> Members { get; set; } = new List<UserMember>();
|
||||
}
|
||||
|
||||
public abstract class Node
|
||||
{
|
||||
public int Id { get; set; }
|
||||
[Required] public string CommonName { get; set; } = null!;
|
||||
public string? Description { get; set; }
|
||||
public ICollection<Node> Children { get; set; } = new List<Node>();
|
||||
public Node? Parent { get; set; } //Parent
|
||||
public int? ParentId { get; set; }
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"[{GetType().Name}] {Id:D5} {CommonName}";
|
||||
}
|
||||
}
|
||||
}
|
22
UserService.DatabaseLayer/DataModels/UserServiceDbContext.cs
Normal file
22
UserService.DatabaseLayer/DataModels/UserServiceDbContext.cs
Normal file
@ -0,0 +1,22 @@
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace UserService.DatabaseLayer.DataModels
|
||||
{
|
||||
public class UserServiceDbContext : DbContext
|
||||
{
|
||||
public DbSet<User> Users { get; set; } = null!;
|
||||
public DbSet<SecurityGroup> SecurityGroups { get; set; } = null!;
|
||||
public DbSet<UserMember> UserMembers { get; set; } = null!;
|
||||
public DbSet<OrganizationUnit> OrganizationUnits { get; set; } = null!;
|
||||
|
||||
protected override void OnConfiguring(DbContextOptionsBuilder options)
|
||||
=> options.UseSqlite(@"Data Source=C:\Users\holger\Desktop\UserService\UserService.db");
|
||||
|
||||
/// <inheritdoc />
|
||||
protected override void OnModelCreating(ModelBuilder modelBuilder)
|
||||
{
|
||||
modelBuilder.CreateRelations();
|
||||
modelBuilder.Seed();
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user