Compare commits
1 Commits
TryLinqToD
...
main
Author | SHA1 | Date | |
---|---|---|---|
d2c9d60ae9 |
7
.idea/.idea.UserService/riderModule.iml
generated
7
.idea/.idea.UserService/riderModule.iml
generated
@ -1,10 +1,9 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<module type="RIDER_MODULE" version="4">
|
<module type="RIDER_MODULE" version="4">
|
||||||
<component name="NewModuleRootManager">
|
<component name="NewModuleRootManager">
|
||||||
<content url="file://$USER_HOME$/.nuget/packages/linq2db.mysql/3.1.3/contentFiles/any/any/LinqToDB.Templates" />
|
<content url="file://$USER_HOME$/.nuget/packages/microsoft.net.test.sdk/16.7.0/build/netcoreapp2.1" />
|
||||||
<content url="file://$USER_HOME$/.nuget/packages/microsoft.net.test.sdk/16.7.1/build/netcoreapp2.1" />
|
<content url="file://$USER_HOME$/.nuget/packages/microsoft.testplatform.testhost/16.7.0/build/netcoreapp2.1/x64/testhost.dll" />
|
||||||
<content url="file://$USER_HOME$/.nuget/packages/microsoft.testplatform.testhost/16.7.1/build/netcoreapp2.1/x64/testhost.dll" />
|
<content url="file://$USER_HOME$/.nuget/packages/microsoft.testplatform.testhost/16.7.0/build/netcoreapp2.1/x64/testhost.exe" />
|
||||||
<content url="file://$USER_HOME$/.nuget/packages/microsoft.testplatform.testhost/16.7.1/build/netcoreapp2.1/x64/testhost.exe" />
|
|
||||||
<content url="file://$USER_HOME$/.nuget/packages/nunit3testadapter/3.17.0/build/netcoreapp2.1/NUnit3.TestAdapter.dll" />
|
<content url="file://$USER_HOME$/.nuget/packages/nunit3testadapter/3.17.0/build/netcoreapp2.1/NUnit3.TestAdapter.dll" />
|
||||||
<content url="file://$USER_HOME$/.nuget/packages/nunit3testadapter/3.17.0/build/netcoreapp2.1/NUnit3.TestAdapter.pdb" />
|
<content url="file://$USER_HOME$/.nuget/packages/nunit3testadapter/3.17.0/build/netcoreapp2.1/NUnit3.TestAdapter.pdb" />
|
||||||
<content url="file://$USER_HOME$/.nuget/packages/nunit3testadapter/3.17.0/build/netcoreapp2.1/nunit.engine.api.dll" />
|
<content url="file://$USER_HOME$/.nuget/packages/nunit3testadapter/3.17.0/build/netcoreapp2.1/nunit.engine.api.dll" />
|
||||||
|
@ -1,12 +0,0 @@
|
|||||||
using LinqToDB.Configuration;
|
|
||||||
|
|
||||||
namespace UserService.DatabaseLayer.DataModels
|
|
||||||
{
|
|
||||||
public class ConnectionStringSettings : IConnectionStringSettings
|
|
||||||
{
|
|
||||||
public string ConnectionString { get; } = @"Server=srvbo;Database=UserService2;Uid=UserDbAdmin;Pwd=12345678;";
|
|
||||||
public string Name { get; } = "UserServiceDb";
|
|
||||||
public string ProviderName { get; } = "MySqlServer";
|
|
||||||
public bool IsGlobal { get; }
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,78 @@
|
|||||||
|
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<OrganizationUnit>().HasData(users, groups, germany, usa, arizona, france);
|
||||||
|
var user = new User { CommonName = Environment.UserName, IsActive = true, Id = Guid.NewGuid(), ParentId = users.Id };
|
||||||
|
modelBuilder.Entity<User>().HasData(user);
|
||||||
|
var secGroup = new SecurityGroup { CommonName = "Global Admin", Id = Guid.NewGuid(), ParentId = groups.Id };
|
||||||
|
modelBuilder.Entity<SecurityGroup>().HasData(secGroup);
|
||||||
|
|
||||||
|
modelBuilder.Entity<MembersMember>()
|
||||||
|
.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<MembersMember>()
|
||||||
|
.HasKey(bc => new { bc.MemberId, bc.AttachedMemberId });
|
||||||
|
modelBuilder.Entity<MembersMember>()
|
||||||
|
.HasOne(bc => bc.AttachedMember)
|
||||||
|
.WithMany(b => b!.MemberOf)
|
||||||
|
.HasForeignKey(bc => bc.AttachedMemberId);
|
||||||
|
modelBuilder.Entity<MembersMember>()
|
||||||
|
.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)
|
||||||
|
{
|
||||||
|
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<Member> 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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
@ -1,118 +0,0 @@
|
|||||||
//---------------------------------------------------------------------------------------------------
|
|
||||||
// <auto-generated>
|
|
||||||
// This code was generated by T4Model template for T4 (https://github.com/linq2db/linq2db).
|
|
||||||
// Changes to this file may cause incorrect behavior and will be lost if the code is regenerated.
|
|
||||||
// </auto-generated>
|
|
||||||
//---------------------------------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#pragma warning disable 1591
|
|
||||||
#nullable enable
|
|
||||||
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
|
|
||||||
using LinqToDB;
|
|
||||||
using LinqToDB.Mapping;
|
|
||||||
|
|
||||||
namespace UserService.DatabaseLayer.DataModels
|
|
||||||
{
|
|
||||||
/// <summary>
|
|
||||||
/// Database : UserService2
|
|
||||||
/// Data Source : srvbo
|
|
||||||
/// Server Version : 5.5.5-10.3.22-MariaDB-1ubuntu1
|
|
||||||
/// </summary>
|
|
||||||
public partial class UserService2DB : LinqToDB.Data.DataConnection
|
|
||||||
{
|
|
||||||
public ITable<IsMemberOf> IsMemberOfs { get { return this.GetTable<IsMemberOf>(); } }
|
|
||||||
public ITable<NodeModel> NodeModels { get { return this.GetTable<NodeModel>(); } }
|
|
||||||
|
|
||||||
public UserService2DB()
|
|
||||||
{
|
|
||||||
InitDataContext();
|
|
||||||
InitMappingSchema();
|
|
||||||
}
|
|
||||||
|
|
||||||
public UserService2DB(string configuration)
|
|
||||||
: base(configuration)
|
|
||||||
{
|
|
||||||
InitDataContext();
|
|
||||||
InitMappingSchema();
|
|
||||||
}
|
|
||||||
|
|
||||||
partial void InitDataContext ();
|
|
||||||
partial void InitMappingSchema();
|
|
||||||
}
|
|
||||||
|
|
||||||
[Table("IsMemberOf")]
|
|
||||||
public partial class IsMemberOf
|
|
||||||
{
|
|
||||||
[PrimaryKey(1), NotNull] public int NodeId { get; set; } // int(11)
|
|
||||||
[PrimaryKey(2), NotNull] public int NodeMemberId { get; set; } // int(11)
|
|
||||||
|
|
||||||
#region Associations
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// IsMemberOf_ibfk_1
|
|
||||||
/// </summary>
|
|
||||||
[Association(ThisKey="NodeId", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="IsMemberOf_ibfk_1", BackReferenceName="IsMemberOfibfks")]
|
|
||||||
public NodeModel Node { get; set; } = null!;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// IsMemberOf_ibfk_2
|
|
||||||
/// </summary>
|
|
||||||
[Association(ThisKey="NodeMemberId", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="IsMemberOf_ibfk_2", BackReferenceName="IsMemberOfIbfk2BackReferences")]
|
|
||||||
public NodeModel NodeMember { get; set; } = null!;
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
|
|
||||||
[Table("NodeModels")]
|
|
||||||
public partial class NodeModel
|
|
||||||
{
|
|
||||||
[PrimaryKey, Identity ] public int Id { get; set; } // int(11)
|
|
||||||
[Column, NotNull ] public string CommonName { get; set; } = null!; // varchar(64)
|
|
||||||
[Column, Nullable] public string? FirstName { get; set; } // text
|
|
||||||
[Column, Nullable] public string? LastName { get; set; } // text
|
|
||||||
[Column, Nullable] public string? Description { get; set; } // text
|
|
||||||
[Column, Nullable] public int? ParentId { get; set; } // int(11)
|
|
||||||
[Column, Nullable] public int? ManagerId { get; set; } // int(11)
|
|
||||||
[Column, Nullable] public string? EMail { get; set; } // text
|
|
||||||
[Column, Nullable] public bool? IsActive { get; set; } // bit(1)
|
|
||||||
[Column, NotNull ] public string Discriminator { get; set; } = null!; // varchar(16)
|
|
||||||
|
|
||||||
#region Associations
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// IsMemberOf_ibfk_2_BackReference
|
|
||||||
/// </summary>
|
|
||||||
[Association(ThisKey="Id", OtherKey="NodeMemberId", CanBeNull=true, Relationship=Relationship.OneToMany, IsBackReference=true)]
|
|
||||||
public IEnumerable<IsMemberOf> IsMemberOfIbfk2BackReferences { get; set; } = null!;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// IsMemberOf_ibfk_1_BackReference
|
|
||||||
/// </summary>
|
|
||||||
[Association(ThisKey="Id", OtherKey="NodeId", CanBeNull=true, Relationship=Relationship.OneToMany, IsBackReference=true)]
|
|
||||||
public IEnumerable<IsMemberOf> IsMemberOfibfks { get; set; } = null!;
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
|
|
||||||
public static partial class TableExtensions
|
|
||||||
{
|
|
||||||
public static IsMemberOf Find(this ITable<IsMemberOf> table, int NodeId, int NodeMemberId)
|
|
||||||
{
|
|
||||||
return table.FirstOrDefault(t =>
|
|
||||||
t.NodeId == NodeId &&
|
|
||||||
t.NodeMemberId == NodeMemberId);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static NodeModel Find(this ITable<NodeModel> table, int Id)
|
|
||||||
{
|
|
||||||
return table.FirstOrDefault(t =>
|
|
||||||
t.Id == Id);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#pragma warning restore 1591
|
|
@ -1,19 +0,0 @@
|
|||||||
<#@ template language="C#" debug="True" hostSpecific="True" #>
|
|
||||||
<#@ output extension=".generated.cs" #>
|
|
||||||
<#@ include file="$(LinqToDBT4MySqlTemplatesDirectory)LinqToDB.MySql.Tools.ttinclude" #>
|
|
||||||
<#@ include file="$(LinqToDBT4MySqlTemplatesDirectory)PluralizationService.ttinclude" #>
|
|
||||||
<# //@ include file="$(ProjectDir)LinqToDB.Templates\LinqToDB.MySql.Tools.ttinclude" #>
|
|
||||||
<# //@ include file="$(ProjectDir)LinqToDB.Templates\PluralizationService.ttinclude" #>
|
|
||||||
<#
|
|
||||||
|
|
||||||
NamespaceName = "UserService.DatabaseLayer.DataModels";
|
|
||||||
|
|
||||||
// to configure GetSchemaOptions properties, add them here, before load metadata call
|
|
||||||
|
|
||||||
LoadMySqlMetadata("srvbo", "UserService2", "UserDbAdmin", "12345678");
|
|
||||||
// LoadMySqlMetadata(string connectionString);
|
|
||||||
|
|
||||||
// to adjust loaded database model before generation, add your code here, after load metadata, but before GenerateModel() call
|
|
||||||
EnableNullableReferenceTypes = true;
|
|
||||||
GenerateModel();
|
|
||||||
#>
|
|
@ -1,22 +0,0 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using LinqToDB.Configuration;
|
|
||||||
|
|
||||||
namespace UserService.DatabaseLayer.DataModels
|
|
||||||
{
|
|
||||||
public class UserDbSettings : ILinqToDBSettings
|
|
||||||
{
|
|
||||||
public IEnumerable<IDataProviderSettings> DataProviders => Enumerable.Empty<IDataProviderSettings>();
|
|
||||||
|
|
||||||
public string DefaultConfiguration => "MySqlServer";
|
|
||||||
public string DefaultDataProvider => "MySqlServer";
|
|
||||||
|
|
||||||
public IEnumerable<IConnectionStringSettings> ConnectionStrings
|
|
||||||
{
|
|
||||||
get
|
|
||||||
{
|
|
||||||
yield return new ConnectionStringSettings();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
23
UserService.DatabaseLayer/DataModels/UserServiceDbContext.cs
Normal file
23
UserService.DatabaseLayer/DataModels/UserServiceDbContext.cs
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using UserService.Infrastructure.DataModels;
|
||||||
|
|
||||||
|
namespace UserService.DatabaseLayer.DataModels
|
||||||
|
{
|
||||||
|
public class UserServiceDbContext : DbContext
|
||||||
|
{
|
||||||
|
public DbSet<User> Users { get; set; } = null!;
|
||||||
|
public DbSet<SecurityGroup> SecurityGroups { get; set; } = null!;
|
||||||
|
public DbSet<MembersMember> 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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
201
UserService.DatabaseLayer/Migrations/20200906191545_InitialCreate.Designer.cs
generated
Normal file
201
UserService.DatabaseLayer/Migrations/20200906191545_InitialCreate.Designer.cs
generated
Normal file
@ -0,0 +1,201 @@
|
|||||||
|
// <auto-generated />
|
||||||
|
using System;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||||
|
using UserService.DatabaseLayer.DataModels;
|
||||||
|
|
||||||
|
namespace UserService.DatabaseLayer.Migrations
|
||||||
|
{
|
||||||
|
[DbContext(typeof(UserServiceDbContext))]
|
||||||
|
[Migration("20200906191545_InitialCreate")]
|
||||||
|
partial class InitialCreate
|
||||||
|
{
|
||||||
|
protected override void BuildTargetModel(ModelBuilder modelBuilder)
|
||||||
|
{
|
||||||
|
#pragma warning disable 612, 618
|
||||||
|
modelBuilder
|
||||||
|
.HasAnnotation("ProductVersion", "3.1.7");
|
||||||
|
|
||||||
|
modelBuilder.Entity("UserService.Infrastructure.DataModels.MembersMember", b =>
|
||||||
|
{
|
||||||
|
b.Property<Guid>("MemberId")
|
||||||
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
|
b.Property<Guid>("AttachedMemberId")
|
||||||
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
|
b.HasKey("MemberId", "AttachedMemberId");
|
||||||
|
|
||||||
|
b.HasIndex("AttachedMemberId");
|
||||||
|
|
||||||
|
b.ToTable("UserMembers");
|
||||||
|
|
||||||
|
b.HasData(
|
||||||
|
new
|
||||||
|
{
|
||||||
|
MemberId = new Guid("a830a548-8b92-4a95-aa8e-c71ae814c6a3"),
|
||||||
|
AttachedMemberId = new Guid("fd9f5d95-0898-47d4-8d25-6956077ba269")
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("UserService.Infrastructure.DataModels.Node", b =>
|
||||||
|
{
|
||||||
|
b.Property<Guid>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
|
b.Property<string>("CommonName")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
|
b.Property<string>("Description")
|
||||||
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
|
b.Property<string>("Discriminator")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
|
b.Property<Guid?>("ParentId")
|
||||||
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("ParentId");
|
||||||
|
|
||||||
|
b.ToTable("Node");
|
||||||
|
|
||||||
|
b.HasDiscriminator<string>("Discriminator").HasValue("Node");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("UserService.Infrastructure.DataModels.Member", b =>
|
||||||
|
{
|
||||||
|
b.HasBaseType("UserService.Infrastructure.DataModels.Node");
|
||||||
|
|
||||||
|
b.HasDiscriminator().HasValue("Member");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("UserService.Infrastructure.DataModels.OrganizationUnit", b =>
|
||||||
|
{
|
||||||
|
b.HasBaseType("UserService.Infrastructure.DataModels.Node");
|
||||||
|
|
||||||
|
b.Property<Guid?>("ManagerId")
|
||||||
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
|
b.HasIndex("ManagerId");
|
||||||
|
|
||||||
|
b.HasDiscriminator().HasValue("OrganizationUnit");
|
||||||
|
|
||||||
|
b.HasData(
|
||||||
|
new
|
||||||
|
{
|
||||||
|
Id = new Guid("c2366c9c-e79a-45c8-933c-40d0301b2551"),
|
||||||
|
CommonName = "Users"
|
||||||
|
},
|
||||||
|
new
|
||||||
|
{
|
||||||
|
Id = new Guid("c94f4749-b7c7-418d-8c10-bc4253c4b913"),
|
||||||
|
CommonName = "Groups"
|
||||||
|
},
|
||||||
|
new
|
||||||
|
{
|
||||||
|
Id = new Guid("c743fff4-9bdf-45a4-b4c9-391f6fc46433"),
|
||||||
|
CommonName = "Germany",
|
||||||
|
ParentId = new Guid("c2366c9c-e79a-45c8-933c-40d0301b2551")
|
||||||
|
},
|
||||||
|
new
|
||||||
|
{
|
||||||
|
Id = new Guid("cecbf557-59cc-475c-b136-02da39aa4911"),
|
||||||
|
CommonName = "USA",
|
||||||
|
ParentId = new Guid("c2366c9c-e79a-45c8-933c-40d0301b2551")
|
||||||
|
},
|
||||||
|
new
|
||||||
|
{
|
||||||
|
Id = new Guid("89e1d70e-da3d-4cc9-81f1-a2fa76a6d33b"),
|
||||||
|
CommonName = "Arizona",
|
||||||
|
ParentId = new Guid("cecbf557-59cc-475c-b136-02da39aa4911")
|
||||||
|
},
|
||||||
|
new
|
||||||
|
{
|
||||||
|
Id = new Guid("97ad8c82-c5ea-4de1-a474-bf25418a9533"),
|
||||||
|
CommonName = "France",
|
||||||
|
ParentId = new Guid("c2366c9c-e79a-45c8-933c-40d0301b2551")
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("UserService.Infrastructure.DataModels.SecurityGroup", b =>
|
||||||
|
{
|
||||||
|
b.HasBaseType("UserService.Infrastructure.DataModels.Member");
|
||||||
|
|
||||||
|
b.HasDiscriminator().HasValue("SecurityGroup");
|
||||||
|
|
||||||
|
b.HasData(
|
||||||
|
new
|
||||||
|
{
|
||||||
|
Id = new Guid("a830a548-8b92-4a95-aa8e-c71ae814c6a3"),
|
||||||
|
CommonName = "Global Admin",
|
||||||
|
ParentId = new Guid("c94f4749-b7c7-418d-8c10-bc4253c4b913")
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("UserService.Infrastructure.DataModels.User", b =>
|
||||||
|
{
|
||||||
|
b.HasBaseType("UserService.Infrastructure.DataModels.Member");
|
||||||
|
|
||||||
|
b.Property<string>("EMail")
|
||||||
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
|
b.Property<string>("FirstName")
|
||||||
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
|
b.Property<bool>("IsActive")
|
||||||
|
.HasColumnType("INTEGER");
|
||||||
|
|
||||||
|
b.Property<string>("LastName")
|
||||||
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
|
b.HasDiscriminator().HasValue("User");
|
||||||
|
|
||||||
|
b.HasData(
|
||||||
|
new
|
||||||
|
{
|
||||||
|
Id = new Guid("fd9f5d95-0898-47d4-8d25-6956077ba269"),
|
||||||
|
CommonName = "holger",
|
||||||
|
ParentId = new Guid("c2366c9c-e79a-45c8-933c-40d0301b2551"),
|
||||||
|
IsActive = true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("UserService.Infrastructure.DataModels.MembersMember", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("UserService.Infrastructure.DataModels.Member", "AttachedMember")
|
||||||
|
.WithMany("MemberOf")
|
||||||
|
.HasForeignKey("AttachedMemberId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.HasOne("UserService.Infrastructure.DataModels.Member", "Member")
|
||||||
|
.WithMany("Members")
|
||||||
|
.HasForeignKey("MemberId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("UserService.Infrastructure.DataModels.Node", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("UserService.Infrastructure.DataModels.Node", "Parent")
|
||||||
|
.WithMany("Children")
|
||||||
|
.HasForeignKey("ParentId");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("UserService.Infrastructure.DataModels.OrganizationUnit", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("UserService.Infrastructure.DataModels.Member", "Manager")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("ManagerId");
|
||||||
|
});
|
||||||
|
#pragma warning restore 612, 618
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,136 @@
|
|||||||
|
using System;
|
||||||
|
using Microsoft.EntityFrameworkCore.Migrations;
|
||||||
|
|
||||||
|
namespace UserService.DatabaseLayer.Migrations
|
||||||
|
{
|
||||||
|
public partial class InitialCreate : Migration
|
||||||
|
{
|
||||||
|
protected override void Up(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "Node",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
Id = table.Column<Guid>(nullable: false),
|
||||||
|
CommonName = table.Column<string>(nullable: false),
|
||||||
|
Description = table.Column<string>(nullable: true),
|
||||||
|
ParentId = table.Column<Guid>(nullable: true),
|
||||||
|
Discriminator = table.Column<string>(nullable: false),
|
||||||
|
FirstName = table.Column<string>(nullable: true),
|
||||||
|
LastName = table.Column<string>(nullable: true),
|
||||||
|
IsActive = table.Column<bool>(nullable: true),
|
||||||
|
EMail = table.Column<string>(nullable: true),
|
||||||
|
ManagerId = table.Column<Guid>(nullable: true)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_Node", x => x.Id);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_Node_Node_ParentId",
|
||||||
|
column: x => x.ParentId,
|
||||||
|
principalTable: "Node",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Restrict);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_Node_Node_ManagerId",
|
||||||
|
column: x => x.ManagerId,
|
||||||
|
principalTable: "Node",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Restrict);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.CreateTable(
|
||||||
|
name: "UserMembers",
|
||||||
|
columns: table => new
|
||||||
|
{
|
||||||
|
MemberId = table.Column<Guid>(nullable: false),
|
||||||
|
AttachedMemberId = table.Column<Guid>(nullable: false)
|
||||||
|
},
|
||||||
|
constraints: table =>
|
||||||
|
{
|
||||||
|
table.PrimaryKey("PK_UserMembers", x => new { x.MemberId, x.AttachedMemberId });
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_UserMembers_Node_AttachedMemberId",
|
||||||
|
column: x => x.AttachedMemberId,
|
||||||
|
principalTable: "Node",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
table.ForeignKey(
|
||||||
|
name: "FK_UserMembers_Node_MemberId",
|
||||||
|
column: x => x.MemberId,
|
||||||
|
principalTable: "Node",
|
||||||
|
principalColumn: "Id",
|
||||||
|
onDelete: ReferentialAction.Cascade);
|
||||||
|
});
|
||||||
|
|
||||||
|
migrationBuilder.InsertData(
|
||||||
|
table: "Node",
|
||||||
|
columns: new[] { "Id", "CommonName", "Description", "Discriminator", "ParentId", "ManagerId" },
|
||||||
|
values: new object[] { new Guid("c2366c9c-e79a-45c8-933c-40d0301b2551"), "Users", null, "OrganizationUnit", null, null });
|
||||||
|
|
||||||
|
migrationBuilder.InsertData(
|
||||||
|
table: "Node",
|
||||||
|
columns: new[] { "Id", "CommonName", "Description", "Discriminator", "ParentId", "ManagerId" },
|
||||||
|
values: new object[] { new Guid("c94f4749-b7c7-418d-8c10-bc4253c4b913"), "Groups", null, "OrganizationUnit", null, null });
|
||||||
|
|
||||||
|
migrationBuilder.InsertData(
|
||||||
|
table: "Node",
|
||||||
|
columns: new[] { "Id", "CommonName", "Description", "Discriminator", "ParentId", "ManagerId" },
|
||||||
|
values: new object[] { new Guid("c743fff4-9bdf-45a4-b4c9-391f6fc46433"), "Germany", null, "OrganizationUnit", new Guid("c2366c9c-e79a-45c8-933c-40d0301b2551"), null });
|
||||||
|
|
||||||
|
migrationBuilder.InsertData(
|
||||||
|
table: "Node",
|
||||||
|
columns: new[] { "Id", "CommonName", "Description", "Discriminator", "ParentId", "ManagerId" },
|
||||||
|
values: new object[] { new Guid("cecbf557-59cc-475c-b136-02da39aa4911"), "USA", null, "OrganizationUnit", new Guid("c2366c9c-e79a-45c8-933c-40d0301b2551"), null });
|
||||||
|
|
||||||
|
migrationBuilder.InsertData(
|
||||||
|
table: "Node",
|
||||||
|
columns: new[] { "Id", "CommonName", "Description", "Discriminator", "ParentId", "ManagerId" },
|
||||||
|
values: new object[] { new Guid("97ad8c82-c5ea-4de1-a474-bf25418a9533"), "France", null, "OrganizationUnit", new Guid("c2366c9c-e79a-45c8-933c-40d0301b2551"), null });
|
||||||
|
|
||||||
|
migrationBuilder.InsertData(
|
||||||
|
table: "Node",
|
||||||
|
columns: new[] { "Id", "CommonName", "Description", "Discriminator", "ParentId", "EMail", "FirstName", "IsActive", "LastName" },
|
||||||
|
values: new object[] { new Guid("fd9f5d95-0898-47d4-8d25-6956077ba269"), "holger", null, "User", new Guid("c2366c9c-e79a-45c8-933c-40d0301b2551"), null, null, true, null });
|
||||||
|
|
||||||
|
migrationBuilder.InsertData(
|
||||||
|
table: "Node",
|
||||||
|
columns: new[] { "Id", "CommonName", "Description", "Discriminator", "ParentId" },
|
||||||
|
values: new object[] { new Guid("a830a548-8b92-4a95-aa8e-c71ae814c6a3"), "Global Admin", null, "SecurityGroup", new Guid("c94f4749-b7c7-418d-8c10-bc4253c4b913") });
|
||||||
|
|
||||||
|
migrationBuilder.InsertData(
|
||||||
|
table: "Node",
|
||||||
|
columns: new[] { "Id", "CommonName", "Description", "Discriminator", "ParentId", "ManagerId" },
|
||||||
|
values: new object[] { new Guid("89e1d70e-da3d-4cc9-81f1-a2fa76a6d33b"), "Arizona", null, "OrganizationUnit", new Guid("cecbf557-59cc-475c-b136-02da39aa4911"), null });
|
||||||
|
|
||||||
|
migrationBuilder.InsertData(
|
||||||
|
table: "UserMembers",
|
||||||
|
columns: new[] { "MemberId", "AttachedMemberId" },
|
||||||
|
values: new object[] { new Guid("a830a548-8b92-4a95-aa8e-c71ae814c6a3"), new Guid("fd9f5d95-0898-47d4-8d25-6956077ba269") });
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_Node_ParentId",
|
||||||
|
table: "Node",
|
||||||
|
column: "ParentId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_Node_ManagerId",
|
||||||
|
table: "Node",
|
||||||
|
column: "ManagerId");
|
||||||
|
|
||||||
|
migrationBuilder.CreateIndex(
|
||||||
|
name: "IX_UserMembers_AttachedMemberId",
|
||||||
|
table: "UserMembers",
|
||||||
|
column: "AttachedMemberId");
|
||||||
|
}
|
||||||
|
|
||||||
|
protected override void Down(MigrationBuilder migrationBuilder)
|
||||||
|
{
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "UserMembers");
|
||||||
|
|
||||||
|
migrationBuilder.DropTable(
|
||||||
|
name: "Node");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,199 @@
|
|||||||
|
// <auto-generated />
|
||||||
|
using System;
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
||||||
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
||||||
|
using UserService.DatabaseLayer.DataModels;
|
||||||
|
|
||||||
|
namespace UserService.DatabaseLayer.Migrations
|
||||||
|
{
|
||||||
|
[DbContext(typeof(UserServiceDbContext))]
|
||||||
|
partial class UserServiceDbContextModelSnapshot : ModelSnapshot
|
||||||
|
{
|
||||||
|
protected override void BuildModel(ModelBuilder modelBuilder)
|
||||||
|
{
|
||||||
|
#pragma warning disable 612, 618
|
||||||
|
modelBuilder
|
||||||
|
.HasAnnotation("ProductVersion", "3.1.7");
|
||||||
|
|
||||||
|
modelBuilder.Entity("UserService.Infrastructure.DataModels.MembersMember", b =>
|
||||||
|
{
|
||||||
|
b.Property<Guid>("MemberId")
|
||||||
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
|
b.Property<Guid>("AttachedMemberId")
|
||||||
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
|
b.HasKey("MemberId", "AttachedMemberId");
|
||||||
|
|
||||||
|
b.HasIndex("AttachedMemberId");
|
||||||
|
|
||||||
|
b.ToTable("UserMembers");
|
||||||
|
|
||||||
|
b.HasData(
|
||||||
|
new
|
||||||
|
{
|
||||||
|
MemberId = new Guid("a830a548-8b92-4a95-aa8e-c71ae814c6a3"),
|
||||||
|
AttachedMemberId = new Guid("fd9f5d95-0898-47d4-8d25-6956077ba269")
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("UserService.Infrastructure.DataModels.Node", b =>
|
||||||
|
{
|
||||||
|
b.Property<Guid>("Id")
|
||||||
|
.ValueGeneratedOnAdd()
|
||||||
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
|
b.Property<string>("CommonName")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
|
b.Property<string>("Description")
|
||||||
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
|
b.Property<string>("Discriminator")
|
||||||
|
.IsRequired()
|
||||||
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
|
b.Property<Guid?>("ParentId")
|
||||||
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
|
b.HasKey("Id");
|
||||||
|
|
||||||
|
b.HasIndex("ParentId");
|
||||||
|
|
||||||
|
b.ToTable("Node");
|
||||||
|
|
||||||
|
b.HasDiscriminator<string>("Discriminator").HasValue("Node");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("UserService.Infrastructure.DataModels.Member", b =>
|
||||||
|
{
|
||||||
|
b.HasBaseType("UserService.Infrastructure.DataModels.Node");
|
||||||
|
|
||||||
|
b.HasDiscriminator().HasValue("Member");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("UserService.Infrastructure.DataModels.OrganizationUnit", b =>
|
||||||
|
{
|
||||||
|
b.HasBaseType("UserService.Infrastructure.DataModels.Node");
|
||||||
|
|
||||||
|
b.Property<Guid?>("ManagerId")
|
||||||
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
|
b.HasIndex("ManagerId");
|
||||||
|
|
||||||
|
b.HasDiscriminator().HasValue("OrganizationUnit");
|
||||||
|
|
||||||
|
b.HasData(
|
||||||
|
new
|
||||||
|
{
|
||||||
|
Id = new Guid("c2366c9c-e79a-45c8-933c-40d0301b2551"),
|
||||||
|
CommonName = "Users"
|
||||||
|
},
|
||||||
|
new
|
||||||
|
{
|
||||||
|
Id = new Guid("c94f4749-b7c7-418d-8c10-bc4253c4b913"),
|
||||||
|
CommonName = "Groups"
|
||||||
|
},
|
||||||
|
new
|
||||||
|
{
|
||||||
|
Id = new Guid("c743fff4-9bdf-45a4-b4c9-391f6fc46433"),
|
||||||
|
CommonName = "Germany",
|
||||||
|
ParentId = new Guid("c2366c9c-e79a-45c8-933c-40d0301b2551")
|
||||||
|
},
|
||||||
|
new
|
||||||
|
{
|
||||||
|
Id = new Guid("cecbf557-59cc-475c-b136-02da39aa4911"),
|
||||||
|
CommonName = "USA",
|
||||||
|
ParentId = new Guid("c2366c9c-e79a-45c8-933c-40d0301b2551")
|
||||||
|
},
|
||||||
|
new
|
||||||
|
{
|
||||||
|
Id = new Guid("89e1d70e-da3d-4cc9-81f1-a2fa76a6d33b"),
|
||||||
|
CommonName = "Arizona",
|
||||||
|
ParentId = new Guid("cecbf557-59cc-475c-b136-02da39aa4911")
|
||||||
|
},
|
||||||
|
new
|
||||||
|
{
|
||||||
|
Id = new Guid("97ad8c82-c5ea-4de1-a474-bf25418a9533"),
|
||||||
|
CommonName = "France",
|
||||||
|
ParentId = new Guid("c2366c9c-e79a-45c8-933c-40d0301b2551")
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("UserService.Infrastructure.DataModels.SecurityGroup", b =>
|
||||||
|
{
|
||||||
|
b.HasBaseType("UserService.Infrastructure.DataModels.Member");
|
||||||
|
|
||||||
|
b.HasDiscriminator().HasValue("SecurityGroup");
|
||||||
|
|
||||||
|
b.HasData(
|
||||||
|
new
|
||||||
|
{
|
||||||
|
Id = new Guid("a830a548-8b92-4a95-aa8e-c71ae814c6a3"),
|
||||||
|
CommonName = "Global Admin",
|
||||||
|
ParentId = new Guid("c94f4749-b7c7-418d-8c10-bc4253c4b913")
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("UserService.Infrastructure.DataModels.User", b =>
|
||||||
|
{
|
||||||
|
b.HasBaseType("UserService.Infrastructure.DataModels.Member");
|
||||||
|
|
||||||
|
b.Property<string>("EMail")
|
||||||
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
|
b.Property<string>("FirstName")
|
||||||
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
|
b.Property<bool>("IsActive")
|
||||||
|
.HasColumnType("INTEGER");
|
||||||
|
|
||||||
|
b.Property<string>("LastName")
|
||||||
|
.HasColumnType("TEXT");
|
||||||
|
|
||||||
|
b.HasDiscriminator().HasValue("User");
|
||||||
|
|
||||||
|
b.HasData(
|
||||||
|
new
|
||||||
|
{
|
||||||
|
Id = new Guid("fd9f5d95-0898-47d4-8d25-6956077ba269"),
|
||||||
|
CommonName = "holger",
|
||||||
|
ParentId = new Guid("c2366c9c-e79a-45c8-933c-40d0301b2551"),
|
||||||
|
IsActive = true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("UserService.Infrastructure.DataModels.MembersMember", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("UserService.Infrastructure.DataModels.Member", "AttachedMember")
|
||||||
|
.WithMany("MemberOf")
|
||||||
|
.HasForeignKey("AttachedMemberId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
|
||||||
|
b.HasOne("UserService.Infrastructure.DataModels.Member", "Member")
|
||||||
|
.WithMany("Members")
|
||||||
|
.HasForeignKey("MemberId")
|
||||||
|
.OnDelete(DeleteBehavior.Cascade)
|
||||||
|
.IsRequired();
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("UserService.Infrastructure.DataModels.Node", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("UserService.Infrastructure.DataModels.Node", "Parent")
|
||||||
|
.WithMany("Children")
|
||||||
|
.HasForeignKey("ParentId");
|
||||||
|
});
|
||||||
|
|
||||||
|
modelBuilder.Entity("UserService.Infrastructure.DataModels.OrganizationUnit", b =>
|
||||||
|
{
|
||||||
|
b.HasOne("UserService.Infrastructure.DataModels.Member", "Manager")
|
||||||
|
.WithMany()
|
||||||
|
.HasForeignKey("ManagerId");
|
||||||
|
});
|
||||||
|
#pragma warning restore 612, 618
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,13 +1,63 @@
|
|||||||
using LinqToDB.Data;
|
#nullable enable
|
||||||
|
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Linq.Expressions;
|
||||||
|
using System.Threading;
|
||||||
|
using System.Threading.Tasks;
|
||||||
using UserService.DatabaseLayer.DataModels;
|
using UserService.DatabaseLayer.DataModels;
|
||||||
|
using UserService.Infrastructure.DataModels;
|
||||||
|
|
||||||
namespace UserService.DatabaseLayer.Repositories
|
namespace UserService.DatabaseLayer.Repositories
|
||||||
{
|
{
|
||||||
public abstract class BaseRepository
|
public class BaseRepository<T> where T : Node
|
||||||
{
|
{
|
||||||
protected BaseRepository()
|
protected BaseRepository(Func<UserServiceDbContext, DbSet<T>> context)
|
||||||
{
|
{
|
||||||
DataConnection.DefaultSettings = new UserDbSettings();
|
Context = context;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected Func<UserServiceDbContext, DbSet<T>> Context { get; }
|
||||||
|
public async Task AddAsync(T entity, CancellationToken token = default)
|
||||||
|
{
|
||||||
|
await using var db = new UserServiceDbContext();
|
||||||
|
await Context(db).AddAsync(@entity, token).ConfigureAwait(false);
|
||||||
|
await db.SaveChangesAsync(token).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual async Task DeleteAsync(T entity, CancellationToken token = default)
|
||||||
|
{
|
||||||
|
await using var db = new UserServiceDbContext();
|
||||||
|
Context(db).Remove(entity);
|
||||||
|
await db.SaveChangesAsync(token).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual async Task<IReadOnlyList<T>> GetAllAsync(Expression<Func<T, bool>>? predicate = null, CancellationToken token = default)
|
||||||
|
{
|
||||||
|
await using var db = new UserServiceDbContext();
|
||||||
|
return await Context(db)
|
||||||
|
.Include(x => x.Parent)
|
||||||
|
.WhereOrDefault(predicate)
|
||||||
|
.ToListAsync(token)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
public virtual async Task<T?> GetAsync(Expression<Func<T, bool>> predicate, CancellationToken token = default)
|
||||||
|
{
|
||||||
|
await using var db = new UserServiceDbContext();
|
||||||
|
return await Context(db)
|
||||||
|
.Include(x => x.Parent)
|
||||||
|
.FirstOrDefaultAsync(predicate, token)
|
||||||
|
.ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
public virtual async Task<bool> UpdateAsync(T entity, CancellationToken token = default)
|
||||||
|
{
|
||||||
|
await using var db = new UserServiceDbContext();
|
||||||
|
Context(db).Update(entity);
|
||||||
|
var items = await db.SaveChangesAsync(token).ConfigureAwait(false);
|
||||||
|
return items > 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -4,16 +4,15 @@ using System.Collections.Generic;
|
|||||||
using System.Linq.Expressions;
|
using System.Linq.Expressions;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using UserService.DatabaseLayer.DataModels;
|
|
||||||
using UserService.Infrastructure.DataModels;
|
using UserService.Infrastructure.DataModels;
|
||||||
|
|
||||||
namespace UserService.DatabaseLayer.Repositories
|
namespace UserService.DatabaseLayer.Repositories
|
||||||
{
|
{
|
||||||
public interface IRepository<T> where T : class
|
public interface IRepository<T> where T : Node
|
||||||
{
|
{
|
||||||
Task<IReadOnlyList<T>> GetAllAsync(Expression<Func<NodeModel, bool>>? predicate = null, CancellationToken token = default);
|
Task<IReadOnlyList<T>> GetAllAsync(Expression<Func<T, bool>>? predicate = null, CancellationToken token = default);
|
||||||
Task<T?> GetAsync(Expression<Func<NodeModel, bool>> predicate, CancellationToken token = default);
|
Task<T?> GetAsync(Expression<Func<T, bool>> predicate, CancellationToken token = default);
|
||||||
Task<int> AddAsync(T entity, CancellationToken token = default);
|
Task AddAsync(T entity, CancellationToken token = default);
|
||||||
Task<bool> UpdateAsync(T entity, CancellationToken token = default);
|
Task<bool> UpdateAsync(T entity, CancellationToken token = default);
|
||||||
Task DeleteAsync(T entity, CancellationToken token = default);
|
Task DeleteAsync(T entity, CancellationToken token = default);
|
||||||
}
|
}
|
||||||
|
@ -4,84 +4,48 @@ using System.Linq;
|
|||||||
using System.Linq.Expressions;
|
using System.Linq.Expressions;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using LinqToDB;
|
using Microsoft.EntityFrameworkCore;
|
||||||
using UserService.DatabaseLayer.DataModels;
|
using UserService.DatabaseLayer.DataModels;
|
||||||
using UserService.Infrastructure.DataModels;
|
using UserService.Infrastructure.DataModels;
|
||||||
|
|
||||||
namespace UserService.DatabaseLayer.Repositories
|
namespace UserService.DatabaseLayer.Repositories
|
||||||
{
|
{
|
||||||
public class OrganizationUnitsRepository : BaseRepository, IOrganizationUnitsRepository
|
public class OrganizationUnitsRepository : BaseRepository<OrganizationUnit>, IOrganizationUnitsRepository
|
||||||
{
|
{
|
||||||
public async Task<IReadOnlyList<OrganizationUnit>> GetAllAsync(Expression<Func<NodeModel, bool>>? predicate = null, CancellationToken token = default)
|
public OrganizationUnitsRepository() : base(x => x.OrganizationUnits)
|
||||||
{
|
{
|
||||||
await using var db = new UserService2DB();
|
}
|
||||||
var organizationUnits = await db.NodeModels
|
|
||||||
.Where(x => x.Discriminator == nameof(OrganizationUnit))
|
/// <inheritdoc cref="GetAllAsync" />
|
||||||
|
public override async Task<IReadOnlyList<OrganizationUnit>> GetAllAsync(
|
||||||
|
Expression<Func<OrganizationUnit, bool>>? predicate = null, CancellationToken token = default)
|
||||||
|
{
|
||||||
|
await using var db = new UserServiceDbContext();
|
||||||
|
var rootOus = await Context(db)
|
||||||
|
.Include(x => x.Parent)
|
||||||
.WhereOrDefault(predicate)
|
.WhereOrDefault(predicate)
|
||||||
.Select(x => new OrganizationUnit
|
|
||||||
{
|
|
||||||
Id = x.Id,
|
|
||||||
CommonName = x.CommonName,
|
|
||||||
Description = x.Description,
|
|
||||||
ParentId = x.ParentId,
|
|
||||||
})
|
|
||||||
.ToListAsync(token).ConfigureAwait(false);
|
.ToListAsync(token).ConfigureAwait(false);
|
||||||
return organizationUnits;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<OrganizationUnit?> GetAsync(Expression<Func<NodeModel, bool>> predicate, CancellationToken token = default)
|
IEnumerable<OrganizationUnit> Rec(Node node)
|
||||||
{
|
|
||||||
await using var db = new UserService2DB();
|
|
||||||
var result = await db.NodeModels
|
|
||||||
.Where(predicate)
|
|
||||||
.Select(x => new OrganizationUnit
|
|
||||||
{
|
|
||||||
Id = x.Id,
|
|
||||||
CommonName = x.CommonName,
|
|
||||||
Description = x.Description,
|
|
||||||
ParentId = x.ParentId,
|
|
||||||
ManagerId = x.ManagerId,
|
|
||||||
}).FirstOrDefaultAsync(token).ConfigureAwait(false);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<int> AddAsync(OrganizationUnit entity, CancellationToken token = default)
|
|
||||||
{
|
|
||||||
if (entity == null) throw new ArgumentNullException(nameof(entity));
|
|
||||||
await using var db = new UserService2DB();
|
|
||||||
|
|
||||||
var managerId = entity.Manager?.Id;
|
|
||||||
return await db.NodeModels.InsertWithInt32IdentityAsync(() => new NodeModel
|
|
||||||
{
|
{
|
||||||
CommonName = entity.CommonName,
|
if (!(node is OrganizationUnit organizationUnit)) yield break;
|
||||||
Description = entity.Description,
|
yield return organizationUnit;
|
||||||
Discriminator = nameof(OrganizationUnit),
|
foreach (var ouChild in rootOus.Where(x => x.ParentId != null && x.ParentId == organizationUnit.Id))
|
||||||
ParentId = entity.ParentId,
|
|
||||||
ManagerId = managerId,
|
|
||||||
}, token).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task<bool> UpdateAsync(OrganizationUnit entity, CancellationToken token = default)
|
|
||||||
{
|
|
||||||
if (entity == null) throw new ArgumentNullException(nameof(entity));
|
|
||||||
await using var db = new UserService2DB();
|
|
||||||
var managerId = entity.Manager?.Id;
|
|
||||||
var changedRows = await db.NodeModels.UpdateAsync(x => x.Id == entity.Id,
|
|
||||||
x => new NodeModel
|
|
||||||
{
|
{
|
||||||
CommonName = entity.CommonName,
|
foreach (var unit in Rec(ouChild))
|
||||||
Description = entity.Description,
|
{
|
||||||
Discriminator = nameof(OrganizationUnit),
|
yield return unit;
|
||||||
ParentId = entity.ParentId,
|
}
|
||||||
ManagerId = managerId,
|
}
|
||||||
}, token).ConfigureAwait(false);
|
}
|
||||||
return changedRows > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
public async Task DeleteAsync(OrganizationUnit entity, CancellationToken token = default)
|
var result = new List<OrganizationUnit>();
|
||||||
{
|
foreach (var ou in rootOus.Where(x => x.ParentId is null))
|
||||||
await using var db = new UserService2DB();
|
{
|
||||||
await db.NodeModels.DeleteAsync(x => x.Id == entity.Id, token).ConfigureAwait(false);
|
result.AddRange(Rec(ou));
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,43 +1,53 @@
|
|||||||
#nullable enable
|
#nullable enable
|
||||||
|
|
||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
using System.Linq.Expressions;
|
using System.Linq.Expressions;
|
||||||
using System.Threading;
|
using System.Threading;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using LinqToDB;
|
|
||||||
using UserService.DatabaseLayer.DataModels;
|
using UserService.DatabaseLayer.DataModels;
|
||||||
using UserService.Infrastructure.DataModels;
|
using UserService.Infrastructure.DataModels;
|
||||||
|
|
||||||
namespace UserService.DatabaseLayer.Repositories
|
namespace UserService.DatabaseLayer.Repositories
|
||||||
{
|
{
|
||||||
public class SecurityGroupsRepository : ISecurityGroupsRepository
|
public class SecurityGroupsRepository : BaseRepository<SecurityGroup>, ISecurityGroupsRepository
|
||||||
{
|
{
|
||||||
public Task<IReadOnlyList<SecurityGroup>> GetAllAsync(Expression<Func<NodeModel, bool>>? predicate = null, CancellationToken token = default)
|
public SecurityGroupsRepository() : base(x => x.SecurityGroups)
|
||||||
{
|
{
|
||||||
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<SecurityGroup?> GetAsync(Expression<Func<NodeModel, bool>> predicate, CancellationToken token = default)
|
public override async Task<IReadOnlyList<SecurityGroup>> GetAllAsync(Expression<Func<SecurityGroup, bool>>? predicate = null, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
await using var db = new UserServiceDbContext();
|
||||||
|
return await Context(db)
|
||||||
|
.Include(x => x.Parent)
|
||||||
|
.Include(x => x.Members)
|
||||||
|
.ThenInclude(x=> x.AttachedMember)
|
||||||
|
.WhereOrDefault(predicate)
|
||||||
|
.ToListAsync(token).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<int> AddAsync(SecurityGroup entity, CancellationToken token = default)
|
public override async Task<SecurityGroup?> GetAsync(Expression<Func<SecurityGroup, bool>> predicate, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
await using var db = new UserServiceDbContext();
|
||||||
|
return await Context(db)
|
||||||
|
.Include(x => x.Parent)
|
||||||
|
.Include(x => x.Members)
|
||||||
|
.ThenInclude(x=> x.AttachedMember)
|
||||||
|
.FirstOrDefaultAsync(predicate, token).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task<bool> UpdateAsync(SecurityGroup entity, CancellationToken token = default)
|
public override async Task<bool> UpdateAsync(SecurityGroup entity, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
if (entity == null) throw new ArgumentNullException(nameof(entity));
|
||||||
}
|
|
||||||
|
|
||||||
public async Task DeleteAsync(SecurityGroup entity, CancellationToken token = default)
|
await using var db = new UserServiceDbContext();
|
||||||
{
|
Context(db).Update(entity);
|
||||||
await using var db = new UserService2DB();
|
db.UserMembers.UpdateRange(entity.Members);
|
||||||
await db.NodeModels.DeleteAsync(x => x.Id == entity.Id, token).ConfigureAwait(false);
|
var items = await db.SaveChangesAsync(token).ConfigureAwait(false);
|
||||||
|
return items > 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,101 +1,11 @@
|
|||||||
using System;
|
using UserService.Infrastructure.DataModels;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Linq.Expressions;
|
|
||||||
using System.Threading;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using LinqToDB;
|
|
||||||
using UserService.DatabaseLayer.DataModels;
|
|
||||||
using UserService.Infrastructure.DataModels;
|
|
||||||
|
|
||||||
namespace UserService.DatabaseLayer.Repositories
|
namespace UserService.DatabaseLayer.Repositories
|
||||||
{
|
{
|
||||||
public class UsersRepository : BaseRepository, IUsersRepository
|
public class UsersRepository : BaseRepository<User>, IUsersRepository
|
||||||
{
|
{
|
||||||
/// <inheritdoc />
|
public UsersRepository() : base(x => x.Users)
|
||||||
public async Task<IReadOnlyList<User>> GetAllAsync(Expression<Func<NodeModel, bool>>? predicate = null,
|
|
||||||
CancellationToken token = default)
|
|
||||||
{
|
{
|
||||||
await using var db = new UserService2DB();
|
|
||||||
var users = await db.NodeModels
|
|
||||||
.Where(x => x.Discriminator == nameof(User))
|
|
||||||
.WhereOrDefault(predicate)
|
|
||||||
.Select(x => new User
|
|
||||||
{
|
|
||||||
Id = x.Id,
|
|
||||||
CommonName = x.CommonName,
|
|
||||||
Description = x.Description,
|
|
||||||
FirstName = x.FirstName,
|
|
||||||
LastName = x.LastName,
|
|
||||||
IsActive = x.IsActive ?? false,
|
|
||||||
EMail = x.EMail,
|
|
||||||
ParentId = x.ParentId,
|
|
||||||
})
|
|
||||||
.ToListAsync(token).ConfigureAwait(false);
|
|
||||||
return users;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<User?> GetAsync(Expression<Func<NodeModel, bool>> predicate,
|
|
||||||
CancellationToken token = default)
|
|
||||||
{
|
|
||||||
await using var db = new UserService2DB();
|
|
||||||
var result = await db.NodeModels
|
|
||||||
.Where(predicate)
|
|
||||||
.Select(x => new User
|
|
||||||
{
|
|
||||||
Id = x.Id,
|
|
||||||
CommonName = x.CommonName,
|
|
||||||
Description = x.Description,
|
|
||||||
FirstName = x.FirstName,
|
|
||||||
LastName = x.LastName,
|
|
||||||
IsActive = x.IsActive ?? false,
|
|
||||||
EMail = x.EMail
|
|
||||||
}).FirstOrDefaultAsync(token).ConfigureAwait(false);
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<int> AddAsync(User entity, CancellationToken token = default)
|
|
||||||
{
|
|
||||||
await using var db = new UserService2DB();
|
|
||||||
|
|
||||||
return await db.NodeModels.InsertWithInt32IdentityAsync(() => new NodeModel
|
|
||||||
{
|
|
||||||
CommonName = entity.CommonName,
|
|
||||||
FirstName = entity.FirstName,
|
|
||||||
LastName = entity.LastName,
|
|
||||||
Description = entity.Description,
|
|
||||||
EMail = entity.EMail,
|
|
||||||
IsActive = entity.IsActive,
|
|
||||||
Discriminator = nameof(User),
|
|
||||||
}, token).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<bool> UpdateAsync(User entity, CancellationToken token = default)
|
|
||||||
{
|
|
||||||
await using var db = new UserService2DB();
|
|
||||||
|
|
||||||
var changedRows = await db.NodeModels.UpdateAsync(x => x.Id == entity.Id,
|
|
||||||
x => new NodeModel
|
|
||||||
{
|
|
||||||
CommonName = entity.CommonName,
|
|
||||||
FirstName = entity.FirstName,
|
|
||||||
LastName = entity.LastName,
|
|
||||||
Description = entity.Description,
|
|
||||||
EMail = entity.EMail,
|
|
||||||
IsActive = entity.IsActive,
|
|
||||||
Discriminator = nameof(User),
|
|
||||||
}, token).ConfigureAwait(false);
|
|
||||||
return changedRows > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task DeleteAsync(User entity, CancellationToken token = default)
|
|
||||||
{
|
|
||||||
await using var db = new UserService2DB();
|
|
||||||
await db.NodeModels.DeleteAsync(x => x.Id == entity.Id, token).ConfigureAwait(false);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,48 +1,21 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
<TargetFramework>net5.0</TargetFramework>
|
||||||
<LangVersion>latest</LangVersion>
|
<LangVersion>latest</LangVersion>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="DataModels\UserDatabase.generated.cs">
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="5.0.13">
|
||||||
<DesignTime>True</DesignTime>
|
<PrivateAssets>all</PrivateAssets>
|
||||||
<AutoGen>True</AutoGen>
|
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
||||||
<DependentUpon>UserDatabase.tt</DependentUpon>
|
</PackageReference>
|
||||||
</None>
|
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="5.0.13" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="linq2db.MySql" Version="3.1.3" />
|
<ProjectReference Include="..\UserService.Infrastructure\UserService.Infrastructure.csproj" />
|
||||||
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="3.3.0">
|
</ItemGroup>
|
||||||
<PrivateAssets>all</PrivateAssets>
|
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
|
||||||
</PackageReference>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<ProjectReference Include="..\UserService.Infrastructure\UserService.Infrastructure.csproj" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<Service Include="{508349b6-6b84-4df5-91f0-309beebad82d}" />
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<Compile Update="DataModels\UserDatabase.generated.cs">
|
|
||||||
<DesignTime>True</DesignTime>
|
|
||||||
<AutoGen>True</AutoGen>
|
|
||||||
<DependentUpon>UserDatabase.tt</DependentUpon>
|
|
||||||
</Compile>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<None Update="DataModels\UserDatabase.tt">
|
|
||||||
<Generator>TextTemplatingFileGenerator</Generator>
|
|
||||||
<LastGenOutput>UserDatabase.generated.cs</LastGenOutput>
|
|
||||||
</None>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -4,6 +4,8 @@ namespace UserService.Infrastructure.DataModels
|
|||||||
{
|
{
|
||||||
public abstract class Member : Node
|
public abstract class Member : Node
|
||||||
{
|
{
|
||||||
|
public ISet<MembersMember> Members { get; set; } = new HashSet<MembersMember>();
|
||||||
|
|
||||||
public ISet<MembersMember> MemberOf { get; set; } = null!;
|
public ISet<MembersMember> MemberOf { get; set; } = null!;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,18 +1,33 @@
|
|||||||
#nullable enable
|
#nullable enable
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.ComponentModel.DataAnnotations;
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
|
||||||
namespace UserService.Infrastructure.DataModels
|
namespace UserService.Infrastructure.DataModels
|
||||||
{
|
{
|
||||||
public abstract class Node : ICloneable
|
public abstract class Node : ICloneable, IComparable<Node>
|
||||||
{
|
{
|
||||||
public int Id { get; set; }
|
public Guid Id { get; set; }
|
||||||
[Required] public string CommonName { get; set; } = null!;
|
[Required] public string CommonName { get; set; } = null!;
|
||||||
public string? Description { get; set; }
|
public string? Description { get; set; }
|
||||||
|
public ISet<Node> Children { get; set; } = new SortedSet<Node>();
|
||||||
|
public Node? Parent { get; set; } //Parent
|
||||||
|
public Guid? ParentId { get; set; }
|
||||||
|
|
||||||
public override string ToString() => CommonName;
|
public override string ToString() => CommonName;
|
||||||
public int? ParentId { get; set; }
|
|
||||||
|
public int Level => Parent?.Level + 1 ?? 0;
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public virtual object Clone() => MemberwiseClone();
|
public virtual object Clone() => MemberwiseClone();
|
||||||
|
|
||||||
|
public int CompareTo(Node? other)
|
||||||
|
{
|
||||||
|
if (ReferenceEquals(this, other)) return 0;
|
||||||
|
if (ReferenceEquals(null, other)) return 1;
|
||||||
|
var commonNameComparison = string.Compare(CommonName, other.CommonName, StringComparison.Ordinal);
|
||||||
|
if (commonNameComparison != 0) return commonNameComparison;
|
||||||
|
return Id.CompareTo(other.Id);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -3,6 +3,5 @@
|
|||||||
public class OrganizationUnit : Node
|
public class OrganizationUnit : Node
|
||||||
{
|
{
|
||||||
public Member? Manager { get; set; }
|
public Member? Manager { get; set; }
|
||||||
public int? ManagerId { get; set; }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,9 +1,6 @@
|
|||||||
using System.Collections.Generic;
|
namespace UserService.Infrastructure.DataModels
|
||||||
|
|
||||||
namespace UserService.Infrastructure.DataModels
|
|
||||||
{
|
{
|
||||||
public class SecurityGroup : Member
|
public class SecurityGroup : Member
|
||||||
{
|
{
|
||||||
public ISet<MembersMember> Members { get; set; } = new HashSet<MembersMember>();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,4 +1,6 @@
|
|||||||
using System.ComponentModel.DataAnnotations;
|
using System.Collections.Generic;
|
||||||
|
using System.ComponentModel.DataAnnotations;
|
||||||
|
using System.Linq;
|
||||||
|
|
||||||
namespace UserService.Infrastructure.DataModels
|
namespace UserService.Infrastructure.DataModels
|
||||||
{
|
{
|
||||||
|
@ -7,11 +7,7 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="System.ComponentModel.Annotations" Version="4.7.0" />
|
<PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
<ItemGroup>
|
|
||||||
<Folder Include="DataModels\" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -1,61 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using NUnit.Framework;
|
|
||||||
using UserService.DatabaseLayer.Repositories;
|
|
||||||
using UserService.Infrastructure.DataModels;
|
|
||||||
|
|
||||||
namespace UserService.Test
|
|
||||||
{
|
|
||||||
public class OrgUnitRepositoryTests
|
|
||||||
{
|
|
||||||
private OrganizationUnitsRepository _repository;
|
|
||||||
|
|
||||||
[OneTimeSetUp]
|
|
||||||
public void SetUp()
|
|
||||||
{
|
|
||||||
_repository = new OrganizationUnitsRepository();
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
[Order(2)]
|
|
||||||
public async Task Test1()
|
|
||||||
{
|
|
||||||
var entities = await _repository.GetAllAsync().ConfigureAwait(false);
|
|
||||||
Assert.AreEqual(entities.Count, 4);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
[Order(1)]
|
|
||||||
public async Task Test2()
|
|
||||||
{
|
|
||||||
var ou = new OrganizationUnit {CommonName = "Users", Description = "Users"};
|
|
||||||
var id = await _repository.AddAsync(ou).ConfigureAwait(false);
|
|
||||||
ou = new OrganizationUnit {CommonName = "USA", Description = "Users", ParentId = id};
|
|
||||||
id = await _repository.AddAsync(ou).ConfigureAwait(false);
|
|
||||||
ou = new OrganizationUnit { CommonName = "Arizona", Description = "Users", ParentId = id };
|
|
||||||
id = await _repository.AddAsync(ou).ConfigureAwait(false);
|
|
||||||
ou = new OrganizationUnit { CommonName = "Germany", Description = "Users", ParentId = id };
|
|
||||||
await _repository.AddAsync(ou).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
[Order(3)]
|
|
||||||
public async Task Test3()
|
|
||||||
{
|
|
||||||
var entity = await _repository.GetAsync(x => x.CommonName == "Users").ConfigureAwait(false);
|
|
||||||
entity.Description = DateTime.Now.ToString("O");
|
|
||||||
await _repository.UpdateAsync(entity).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
[Order(4)]
|
|
||||||
public async Task Test4()
|
|
||||||
{
|
|
||||||
var entity = await _repository.GetAllAsync().ConfigureAwait(false);
|
|
||||||
foreach (var organizationUnit in entity)
|
|
||||||
{
|
|
||||||
await _repository.DeleteAsync(organizationUnit).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
58
UserService.Test/UnitTest1.cs
Normal file
58
UserService.Test/UnitTest1.cs
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
using Microsoft.EntityFrameworkCore;
|
||||||
|
using NUnit.Framework;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Text;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using UserService.DatabaseLayer.DataModels;
|
||||||
|
using UserService.Infrastructure.DataModels;
|
||||||
|
|
||||||
|
namespace UserService.Test
|
||||||
|
{
|
||||||
|
public class Tests
|
||||||
|
{
|
||||||
|
[SetUp]
|
||||||
|
public void Setup()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task Test1()
|
||||||
|
{
|
||||||
|
await using var db = new UserServiceDbContext();
|
||||||
|
var user = await db.Users.FirstOrDefaultAsync().ConfigureAwait(false);
|
||||||
|
var secGroup = await db.SecurityGroups.FirstOrDefaultAsync().ConfigureAwait(false);
|
||||||
|
var ous = await db.OrganizationUnits.ToListAsync().ConfigureAwait(false);
|
||||||
|
var mo = await db.UserMembers.ToListAsync().ConfigureAwait(false);
|
||||||
|
|
||||||
|
var securityGroupsOfUser = user.GetSecurityGroups();
|
||||||
|
var usersOfSecurityGroup = secGroup.GetAttachedMembers();
|
||||||
|
//var testGroup = new SecurityGroup {CommonName = "Test", Parent = ous.Last()};
|
||||||
|
//await db.SecurityGroups.AddAsync(testGroup);
|
||||||
|
//var testgroup = await db.SecurityGroups.FindAsync(1);
|
||||||
|
//testgroup.Members.AddAsync(new UserMember{MemberId = testgroup.Id, UserId = user.Id});
|
||||||
|
//await db.SaveChangesAsync();
|
||||||
|
Assert.Pass();
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public async Task Test2()
|
||||||
|
{
|
||||||
|
await using var db = new UserServiceDbContext();
|
||||||
|
var ous = await db.OrganizationUnits.ToListAsync().ConfigureAwait(false);
|
||||||
|
var sb = new StringBuilder();
|
||||||
|
NewMethod(ous, null, 0, ref sb);
|
||||||
|
var result = sb.ToString();
|
||||||
|
Assert.Pass();
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void NewMethod(IEnumerable<OrganizationUnit> ous, Node parent, int level, ref StringBuilder sb)
|
||||||
|
{
|
||||||
|
foreach (var unit in ous.Where(x => x.Parent == parent))
|
||||||
|
{
|
||||||
|
sb.AppendLine(string.Concat(Enumerable.Repeat(' ', 4 * level)) + unit.CommonName);
|
||||||
|
NewMethod(unit.Children.OfType<OrganizationUnit>(), unit, level + 1, ref sb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,58 +0,0 @@
|
|||||||
using NUnit.Framework;
|
|
||||||
using System;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
using UserService.DatabaseLayer.Repositories;
|
|
||||||
using UserService.Infrastructure.DataModels;
|
|
||||||
|
|
||||||
namespace UserService.Test
|
|
||||||
{
|
|
||||||
public class UserRepositoryTests
|
|
||||||
{
|
|
||||||
private UsersRepository _repository;
|
|
||||||
|
|
||||||
[OneTimeSetUp]
|
|
||||||
public void SetUp()
|
|
||||||
{
|
|
||||||
_repository = new UsersRepository();
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
[Order(2)]
|
|
||||||
public async Task Test1()
|
|
||||||
{
|
|
||||||
var users = await _repository.GetAllAsync().ConfigureAwait(false);
|
|
||||||
Assert.AreEqual(users.Count, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
[Order(1)]
|
|
||||||
public async Task Test2()
|
|
||||||
{
|
|
||||||
var user = new User
|
|
||||||
{
|
|
||||||
CommonName = "holger",
|
|
||||||
FirstName = "Holger",
|
|
||||||
LastName = "Börchers",
|
|
||||||
IsActive = true
|
|
||||||
};
|
|
||||||
await _repository.AddAsync(user).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
[Order(3)]
|
|
||||||
public async Task Test3()
|
|
||||||
{
|
|
||||||
var user = await _repository.GetAsync(x => x.CommonName == "holger").ConfigureAwait(false);
|
|
||||||
user.Description = DateTime.Now.ToString("O");
|
|
||||||
await _repository.UpdateAsync(user).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
|
||||||
[Order(4)]
|
|
||||||
public async Task Test4()
|
|
||||||
{
|
|
||||||
var user = await _repository.GetAsync(x => x.CommonName == "holger").ConfigureAwait(false);
|
|
||||||
await _repository.DeleteAsync(user).ConfigureAwait(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,7 +1,7 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
<TargetFramework>net5.0</TargetFramework>
|
||||||
|
|
||||||
<IsPackable>false</IsPackable>
|
<IsPackable>false</IsPackable>
|
||||||
|
|
||||||
@ -9,17 +9,13 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="3.3.0">
|
<PackageReference Include="nunit" Version="3.13.2" />
|
||||||
<PrivateAssets>all</PrivateAssets>
|
<PackageReference Include="NUnit3TestAdapter" Version="4.2.0" />
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.0.0" />
|
||||||
</PackageReference>
|
|
||||||
<PackageReference Include="nunit" Version="3.12.0" />
|
|
||||||
<PackageReference Include="NUnit3TestAdapter" Version="3.17.0" />
|
|
||||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.7.1" />
|
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\UserService.DatabaseLayer\UserService.DatabaseLayer.csproj" />
|
<ProjectReference Include="..\UserService\UserService.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
@ -39,7 +39,7 @@ namespace UserService.Pages
|
|||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
OrganizationUnits = (await OuRepository.GetAllAsync().ConfigureAwait(false))
|
OrganizationUnits = (await OuRepository.GetAllAsync().ConfigureAwait(false))
|
||||||
.Where(x => x.ParentId is null)
|
.Where(x => x.Parent is null)
|
||||||
.ToList();
|
.ToList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ else
|
|||||||
<Select TValue="Guid?" SelectedValue="@((Guid?)(context.CellValue))" SelectedValueChanged="@(v => context.CellValue = v)" >
|
<Select TValue="Guid?" SelectedValue="@((Guid?)(context.CellValue))" SelectedValueChanged="@(v => context.CellValue = v)" >
|
||||||
@foreach (var item in OrganizationUnits ?? Enumerable.Empty<OrganizationUnit>())
|
@foreach (var item in OrganizationUnits ?? Enumerable.Empty<OrganizationUnit>())
|
||||||
{
|
{
|
||||||
<SelectItem TValue="int" Value="@(item.Id)">@item.CommonName</SelectItem>
|
<SelectItem TValue="Guid" Value="@(item.Id)">@item.CommonName</SelectItem>
|
||||||
}
|
}
|
||||||
</Select>
|
</Select>
|
||||||
</EditTemplate>
|
</EditTemplate>
|
||||||
|
@ -56,8 +56,8 @@ namespace UserService.Pages
|
|||||||
if (arg == null) throw new ArgumentNullException(nameof(arg));
|
if (arg == null) throw new ArgumentNullException(nameof(arg));
|
||||||
var securityGroup = arg.Item;
|
var securityGroup = arg.Item;
|
||||||
securityGroup.MapFields(arg.Values);
|
securityGroup.MapFields(arg.Values);
|
||||||
//securityGroup.Parent =
|
securityGroup.Parent =
|
||||||
// OrganizationUnits?.FirstOrDefault(x => x.Id == (Guid?)arg.Values[nameof(Node.Parent.Id)]);
|
OrganizationUnits?.FirstOrDefault(x => x.Id == (Guid?)arg.Values[nameof(Node.ParentId)]);
|
||||||
var result = await SecurityGroupsRepository.UpdateAsync(securityGroup).ConfigureAwait(false);
|
var result = await SecurityGroupsRepository.UpdateAsync(securityGroup).ConfigureAwait(false);
|
||||||
arg.Cancel = !result;
|
arg.Cancel = !result;
|
||||||
}
|
}
|
||||||
@ -98,7 +98,9 @@ namespace UserService.Pages
|
|||||||
if (SelectedSecurityGroup is null) return;
|
if (SelectedSecurityGroup is null) return;
|
||||||
if (!SelectedSecurityGroup.Members.Add(new MembersMember
|
if (!SelectedSecurityGroup.Members.Add(new MembersMember
|
||||||
{
|
{
|
||||||
|
MemberId = SelectedSecurityGroup.Id,
|
||||||
Member = SelectedSecurityGroup,
|
Member = SelectedSecurityGroup,
|
||||||
|
AttachedMemberId = SelectedMember.Id,
|
||||||
AttachedMember = SelectedMember
|
AttachedMember = SelectedMember
|
||||||
}))
|
}))
|
||||||
{
|
{
|
||||||
|
@ -93,7 +93,7 @@ else
|
|||||||
<Select TValue="Guid?" SelectedValue="@((Guid?)(context.CellValue))" SelectedValueChanged="@(v => context.CellValue = v)" >
|
<Select TValue="Guid?" SelectedValue="@((Guid?)(context.CellValue))" SelectedValueChanged="@(v => context.CellValue = v)" >
|
||||||
@foreach (var item in OrganizationUnits ?? Enumerable.Empty<OrganizationUnit>())
|
@foreach (var item in OrganizationUnits ?? Enumerable.Empty<OrganizationUnit>())
|
||||||
{
|
{
|
||||||
<SelectItem TValue="int" Value="@(item.Id)">@item.CommonName</SelectItem>
|
<SelectItem TValue="Guid" Value="@(item.Id)">@item.CommonName</SelectItem>
|
||||||
}
|
}
|
||||||
</Select>
|
</Select>
|
||||||
</EditTemplate>
|
</EditTemplate>
|
||||||
|
@ -39,7 +39,7 @@ namespace UserService.Pages
|
|||||||
if (arg is null) throw new ArgumentNullException(nameof(arg));
|
if (arg is null) throw new ArgumentNullException(nameof(arg));
|
||||||
var user = arg.Item;
|
var user = arg.Item;
|
||||||
await UsersRepository.AddAsync(user).ConfigureAwait(false);
|
await UsersRepository.AddAsync(user).ConfigureAwait(false);
|
||||||
//user.Parent = OrganizationUnits?.FirstOrDefault(x => x.Id == user.ParentId);
|
user.Parent = OrganizationUnits?.FirstOrDefault(x => x.Id == user.ParentId);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override async Task RowDeletingCallback(CancellableRowChange<User> arg)
|
protected override async Task RowDeletingCallback(CancellableRowChange<User> arg)
|
||||||
@ -71,7 +71,7 @@ namespace UserService.Pages
|
|||||||
if (arg == null) throw new ArgumentNullException(nameof(arg));
|
if (arg == null) throw new ArgumentNullException(nameof(arg));
|
||||||
var user = arg.Item;
|
var user = arg.Item;
|
||||||
user.MapFields(arg.Values);
|
user.MapFields(arg.Values);
|
||||||
user.ParentId = (int?)arg.Values[nameof(Node.ParentId)];
|
user.Parent = OrganizationUnits?.FirstOrDefault(x => x.Id == (Guid?)arg.Values[nameof(Node.ParentId)]);
|
||||||
var result = await UsersRepository.UpdateAsync(user).ConfigureAwait(false);
|
var result = await UsersRepository.UpdateAsync(user).ConfigureAwait(false);
|
||||||
arg.Cancel = !result;
|
arg.Cancel = !result;
|
||||||
}
|
}
|
||||||
|
@ -1,31 +1,27 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk.Web">
|
<Project Sdk="Microsoft.NET.Sdk.Web">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>netcoreapp3.1</TargetFramework>
|
<TargetFramework>net5.0</TargetFramework>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
<LangVersion>latest</LangVersion>
|
<LangVersion>latest</LangVersion>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<None Include="..\.editorconfig" Link=".editorconfig" />
|
<None Include="..\.editorconfig" Link=".editorconfig" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<ProjectReference Include="..\UserService.DatabaseLayer\UserService.DatabaseLayer.csproj" />
|
<ProjectReference Include="..\UserService.DatabaseLayer\UserService.DatabaseLayer.csproj" />
|
||||||
<ProjectReference Include="..\UserService.Infrastructure\UserService.Infrastructure.csproj" />
|
<ProjectReference Include="..\UserService.Infrastructure\UserService.Infrastructure.csproj" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Blazorise.Bootstrap" Version="0.9.1.2" />
|
<PackageReference Include="Blazorise.Bootstrap" Version="0.9.5.4" />
|
||||||
<PackageReference Include="Blazorise.Components" Version="0.9.1.2" />
|
<PackageReference Include="Blazorise.Components" Version="0.9.5.4" />
|
||||||
<PackageReference Include="Blazorise.DataGrid" Version="0.9.1.2" />
|
<PackageReference Include="Blazorise.DataGrid" Version="0.9.5.4" />
|
||||||
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="0.9.1.2" />
|
<PackageReference Include="Blazorise.Icons.FontAwesome" Version="0.9.5.4" />
|
||||||
<PackageReference Include="Blazorise.Sidebar" Version="0.9.1.2" />
|
<PackageReference Include="Blazorise.Sidebar" Version="0.9.5.4" />
|
||||||
<PackageReference Include="Blazorise.TreeView" Version="0.9.1.2" />
|
<PackageReference Include="Blazorise.TreeView" Version="0.9.5.4" />
|
||||||
<PackageReference Include="Microsoft.CodeAnalysis.FxCopAnalyzers" Version="3.3.0">
|
</ItemGroup>
|
||||||
<PrivateAssets>all</PrivateAssets>
|
|
||||||
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
|
|
||||||
</PackageReference>
|
|
||||||
</ItemGroup>
|
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user