try another way to implement the data stucture
This commit is contained in:
parent
410062daae
commit
1b387adae1
@ -1,36 +0,0 @@
|
|||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using LinqToDB.Configuration;
|
|
||||||
|
|
||||||
namespace DataModels
|
|
||||||
{
|
|
||||||
public class ConnectionStringSettings : IConnectionStringSettings
|
|
||||||
{
|
|
||||||
public string ConnectionString { get; set; }
|
|
||||||
public string Name { get; set; }
|
|
||||||
public string ProviderName { get; set; }
|
|
||||||
public bool IsGlobal => false;
|
|
||||||
}
|
|
||||||
|
|
||||||
public class MySettings : 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
|
|
||||||
{
|
|
||||||
Name = "Northwind",
|
|
||||||
ProviderName = "MySqlServer",
|
|
||||||
ConnectionString = @"Server=srvbo;Database=UserService;Uid=UserDbAdmin;Pwd=12345678;"
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -0,0 +1,12 @@
|
|||||||
|
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; }
|
||||||
|
}
|
||||||
|
}
|
@ -15,29 +15,25 @@ using System.Linq;
|
|||||||
using LinqToDB;
|
using LinqToDB;
|
||||||
using LinqToDB.Mapping;
|
using LinqToDB.Mapping;
|
||||||
|
|
||||||
namespace DataModels
|
namespace UserService.DatabaseLayer.DataModels
|
||||||
{
|
{
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Database : UserService
|
/// Database : UserService2
|
||||||
/// Data Source : srvbo
|
/// Data Source : srvbo
|
||||||
/// Server Version : 5.5.5-10.3.22-MariaDB-1ubuntu1
|
/// Server Version : 5.5.5-10.3.22-MariaDB-1ubuntu1
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public partial class UserServiceDB : LinqToDB.Data.DataConnection
|
public partial class UserService2DB : LinqToDB.Data.DataConnection
|
||||||
{
|
{
|
||||||
public ITable<Member> Members { get { return this.GetTable<Member>(); } }
|
public ITable<IsMemberOf> IsMemberOfs { get { return this.GetTable<IsMemberOf>(); } }
|
||||||
public ITable<MembersMember> MembersMembers { get { return this.GetTable<MembersMember>(); } }
|
public ITable<NodeModel> NodeModels { get { return this.GetTable<NodeModel>(); } }
|
||||||
public ITable<Node> Nodes { get { return this.GetTable<Node>(); } }
|
|
||||||
public ITable<OrganizationUnit> OrganizationUnits { get { return this.GetTable<OrganizationUnit>(); } }
|
|
||||||
public ITable<SecurityGroup> SecurityGroups { get { return this.GetTable<SecurityGroup>(); } }
|
|
||||||
public ITable<User> Users { get { return this.GetTable<User>(); } }
|
|
||||||
|
|
||||||
public UserServiceDB()
|
public UserService2DB()
|
||||||
{
|
{
|
||||||
InitDataContext();
|
InitDataContext();
|
||||||
InitMappingSchema();
|
InitMappingSchema();
|
||||||
}
|
}
|
||||||
|
|
||||||
public UserServiceDB(string configuration)
|
public UserService2DB(string configuration)
|
||||||
: base(configuration)
|
: base(configuration)
|
||||||
{
|
{
|
||||||
InitDataContext();
|
InitDataContext();
|
||||||
@ -48,167 +44,94 @@ namespace DataModels
|
|||||||
partial void InitMappingSchema();
|
partial void InitMappingSchema();
|
||||||
}
|
}
|
||||||
|
|
||||||
[Table("Members")]
|
[Table("IsMemberOf")]
|
||||||
public partial class Member
|
public partial class IsMemberOf
|
||||||
{
|
{
|
||||||
[Column, NotNull] public int Id { get; set; } // int(11)
|
[PrimaryKey(1), NotNull] public int NodeId { get; set; } // int(11)
|
||||||
|
[PrimaryKey(2), NotNull] public int NodeMemberId { get; set; } // int(11)
|
||||||
|
|
||||||
#region Associations
|
#region Associations
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// MembersMember_ibfk_2_BackReference
|
/// IsMemberOf_ibfk_1
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Association(ThisKey="Id", OtherKey="AttachedMemberId", CanBeNull=true, Relationship=Relationship.OneToMany, IsBackReference=true)]
|
[Association(ThisKey="NodeId", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="IsMemberOf_ibfk_1", BackReferenceName="IsMemberOfibfks")]
|
||||||
public IEnumerable<MembersMember> MembersMemberibfks { get; set; } = null!;
|
public NodeModel Node { get; set; } = null!;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Members_ibfk_2
|
/// IsMemberOf_ibfk_2
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Association(ThisKey="Id", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="Members_ibfk_2", BackReferenceName="Membersibfks")]
|
[Association(ThisKey="NodeMemberId", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="IsMemberOf_ibfk_2", BackReferenceName="IsMemberOfIbfk2BackReferences")]
|
||||||
public Node Node { get; set; } = null!;
|
public NodeModel NodeMember { get; set; } = null!;
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// SecurityGroups_ibfk_2_BackReference
|
|
||||||
/// </summary>
|
|
||||||
[Association(ThisKey="Id", OtherKey="Id", CanBeNull=true, Relationship=Relationship.OneToMany, IsBackReference=true)]
|
|
||||||
public IEnumerable<SecurityGroup> SecurityGroupsibfks { get; set; } = null!;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Users_ibfk_2_BackReference
|
|
||||||
/// </summary>
|
|
||||||
[Association(ThisKey="Id", OtherKey="Id", CanBeNull=true, Relationship=Relationship.OneToMany, IsBackReference=true)]
|
|
||||||
public IEnumerable<User> Usersibfks { get; set; } = null!;
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
[Table("MembersMember")]
|
[Table("NodeModels")]
|
||||||
public partial class MembersMember
|
public partial class NodeModel
|
||||||
{
|
{
|
||||||
[PrimaryKey(1), NotNull] public int MemberId { get; set; } // int(11)
|
[PrimaryKey, Identity ] public int Id { get; set; } // int(11)
|
||||||
[PrimaryKey(2), NotNull] public int AttachedMemberId { 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, NotNull ] public bool IsActive { get; set; } // bit(1)
|
||||||
|
[Column, NotNull ] public string Discriminator { get; set; } = null!; // text
|
||||||
|
|
||||||
#region Associations
|
#region Associations
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// MembersMember_ibfk_2
|
/// NodeModels_ibfk_2_BackReference
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Association(ThisKey="AttachedMemberId", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="MembersMember_ibfk_2", BackReferenceName="MembersMemberibfks")]
|
[Association(ThisKey="Id", OtherKey="ManagerId", CanBeNull=true, Relationship=Relationship.OneToMany, IsBackReference=true)]
|
||||||
public Member AttachedMember { get; set; } = null!;
|
public IEnumerable<NodeModel> Ibfks { get; set; } = null!;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// MembersMember_ibfk_3
|
/// IsMemberOf_ibfk_2_BackReference
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Association(ThisKey="MemberId", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="MembersMember_ibfk_3", BackReferenceName="MembersMemberibfks")]
|
[Association(ThisKey="Id", OtherKey="NodeMemberId", CanBeNull=true, Relationship=Relationship.OneToMany, IsBackReference=true)]
|
||||||
public SecurityGroup Member { get; set; } = null!;
|
public IEnumerable<IsMemberOf> IsMemberOfIbfk2BackReferences { get; set; } = null!;
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
|
|
||||||
[Table("Nodes")]
|
|
||||||
public partial class Node
|
|
||||||
{
|
|
||||||
[PrimaryKey, Identity] public int Id { get; set; } // int(11)
|
|
||||||
[Column, NotNull ] public string CommonName { get; set; } = null!; // text
|
|
||||||
|
|
||||||
#region Associations
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Members_ibfk_2_BackReference
|
/// IsMemberOf_ibfk_1_BackReference
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Association(ThisKey="Id", OtherKey="Id", CanBeNull=true, Relationship=Relationship.OneToMany, IsBackReference=true)]
|
[Association(ThisKey="Id", OtherKey="NodeId", CanBeNull=true, Relationship=Relationship.OneToMany, IsBackReference=true)]
|
||||||
public IEnumerable<Member> Membersibfks { get; set; } = null!;
|
public IEnumerable<IsMemberOf> IsMemberOfibfks { get; set; } = null!;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// OrganizationUnits_ibfk_2_BackReference
|
/// NodeModels_ibfk_2
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Association(ThisKey="Id", OtherKey="Id", CanBeNull=true, Relationship=Relationship.OneToMany, IsBackReference=true)]
|
[Association(ThisKey="ManagerId", OtherKey="Id", CanBeNull=true, Relationship=Relationship.ManyToOne, KeyName="NodeModels_ibfk_2", BackReferenceName="Ibfks")]
|
||||||
public IEnumerable<OrganizationUnit> OrganizationUnitsibfks { get; set; } = null!;
|
public NodeModel? Manager { get; set; }
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
|
|
||||||
[Table("OrganizationUnits")]
|
|
||||||
public partial class OrganizationUnit
|
|
||||||
{
|
|
||||||
[Column, NotNull ] public int Id { get; set; } // int(11)
|
|
||||||
[Column, Nullable] public int? ManagerId { get; set; } // int(11)
|
|
||||||
[Column, Nullable] public int? ParentId { get; set; } // int(11)
|
|
||||||
|
|
||||||
#region Associations
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// OrganizationUnits_ibfk_3_BackReference
|
/// NodeModels_ibfk_3_BackReference
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Association(ThisKey="Id", OtherKey="ParentId", CanBeNull=true, Relationship=Relationship.OneToMany, IsBackReference=true)]
|
[Association(ThisKey="Id", OtherKey="ParentId", CanBeNull=true, Relationship=Relationship.OneToMany, IsBackReference=true)]
|
||||||
public IEnumerable<OrganizationUnit> Ibfks { get; set; } = null!;
|
public IEnumerable<NodeModel> NodeModelsIbfk3BackReferences { get; set; } = null!;
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// OrganizationUnits_ibfk_2
|
/// NodeModels_ibfk_3
|
||||||
/// </summary>
|
/// </summary>
|
||||||
[Association(ThisKey="Id", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="OrganizationUnits_ibfk_2", BackReferenceName="OrganizationUnitsibfks")]
|
[Association(ThisKey="ParentId", OtherKey="Id", CanBeNull=true, Relationship=Relationship.ManyToOne, KeyName="NodeModels_ibfk_3", BackReferenceName="NodeModelsIbfk3BackReferences")]
|
||||||
public Node Node { get; set; } = null!;
|
public NodeModel? Parent { get; set; }
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// OrganizationUnits_ibfk_3
|
|
||||||
/// </summary>
|
|
||||||
[Association(ThisKey="ParentId", OtherKey="Id", CanBeNull=true, Relationship=Relationship.ManyToOne, KeyName="OrganizationUnits_ibfk_3", BackReferenceName="Ibfks")]
|
|
||||||
public OrganizationUnit? Parent { get; set; }
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
|
|
||||||
[Table("SecurityGroups")]
|
|
||||||
public partial class SecurityGroup
|
|
||||||
{
|
|
||||||
[Column, NotNull] public int Id { get; set; } // int(11)
|
|
||||||
|
|
||||||
#region Associations
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// SecurityGroups_ibfk_2
|
|
||||||
/// </summary>
|
|
||||||
[Association(ThisKey="Id", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="SecurityGroups_ibfk_2", BackReferenceName="SecurityGroupsibfks")]
|
|
||||||
public Member Member { get; set; } = null!;
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// MembersMember_ibfk_3_BackReference
|
|
||||||
/// </summary>
|
|
||||||
[Association(ThisKey="Id", OtherKey="MemberId", CanBeNull=true, Relationship=Relationship.OneToMany, IsBackReference=true)]
|
|
||||||
public IEnumerable<MembersMember> MembersMemberibfks { get; set; } = null!;
|
|
||||||
|
|
||||||
#endregion
|
|
||||||
}
|
|
||||||
|
|
||||||
[Table("Users")]
|
|
||||||
public partial class User
|
|
||||||
{
|
|
||||||
[Column, NotNull ] public int Id { get; set; } // int(11)
|
|
||||||
[Column, Nullable] public string? FirstName { get; set; } // text
|
|
||||||
[Column, Nullable] public string? LastName { get; set; } // text
|
|
||||||
[Column, NotNull ] public bool IsActive { get; set; } // bit(1)
|
|
||||||
|
|
||||||
#region Associations
|
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// Users_ibfk_2
|
|
||||||
/// </summary>
|
|
||||||
[Association(ThisKey="Id", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="Users_ibfk_2", BackReferenceName="Usersibfks")]
|
|
||||||
public Member Member { get; set; } = null!;
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|
||||||
public static partial class TableExtensions
|
public static partial class TableExtensions
|
||||||
{
|
{
|
||||||
public static MembersMember Find(this ITable<MembersMember> table, int MemberId, int AttachedMemberId)
|
public static IsMemberOf Find(this ITable<IsMemberOf> table, int NodeId, int NodeMemberId)
|
||||||
{
|
{
|
||||||
return table.FirstOrDefault(t =>
|
return table.FirstOrDefault(t =>
|
||||||
t.MemberId == MemberId &&
|
t.NodeId == NodeId &&
|
||||||
t.AttachedMemberId == AttachedMemberId);
|
t.NodeMemberId == NodeMemberId);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Node Find(this ITable<Node> table, int Id)
|
public static NodeModel Find(this ITable<NodeModel> table, int Id)
|
||||||
{
|
{
|
||||||
return table.FirstOrDefault(t =>
|
return table.FirstOrDefault(t =>
|
||||||
t.Id == Id);
|
t.Id == Id);
|
||||||
|
@ -6,11 +6,11 @@
|
|||||||
<# //@ include file="$(ProjectDir)LinqToDB.Templates\PluralizationService.ttinclude" #>
|
<# //@ include file="$(ProjectDir)LinqToDB.Templates\PluralizationService.ttinclude" #>
|
||||||
<#
|
<#
|
||||||
|
|
||||||
NamespaceName = "DataModels";
|
NamespaceName = "UserService.DatabaseLayer.DataModels";
|
||||||
|
|
||||||
// to configure GetSchemaOptions properties, add them here, before load metadata call
|
// to configure GetSchemaOptions properties, add them here, before load metadata call
|
||||||
|
|
||||||
LoadMySqlMetadata("srvbo", "UserService", "UserDbAdmin", "12345678");
|
LoadMySqlMetadata("srvbo", "UserService2", "UserDbAdmin", "12345678");
|
||||||
// LoadMySqlMetadata(string connectionString);
|
// LoadMySqlMetadata(string connectionString);
|
||||||
|
|
||||||
// to adjust loaded database model before generation, add your code here, after load metadata, but before GenerateModel() call
|
// to adjust loaded database model before generation, add your code here, after load metadata, but before GenerateModel() call
|
||||||
|
22
UserService.DatabaseLayer/DataModels/UserDbSettings.cs
Normal file
22
UserService.DatabaseLayer/DataModels/UserDbSettings.cs
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
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();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
13
UserService.DatabaseLayer/Repositories/BaseRepository.cs
Normal file
13
UserService.DatabaseLayer/Repositories/BaseRepository.cs
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
using LinqToDB.Data;
|
||||||
|
using UserService.DatabaseLayer.DataModels;
|
||||||
|
|
||||||
|
namespace UserService.DatabaseLayer.Repositories
|
||||||
|
{
|
||||||
|
public abstract class BaseRepository
|
||||||
|
{
|
||||||
|
protected BaseRepository()
|
||||||
|
{
|
||||||
|
DataConnection.DefaultSettings = new UserDbSettings();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -4,14 +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 DataModels;
|
using UserService.DatabaseLayer.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 : class
|
||||||
{
|
{
|
||||||
Task<IReadOnlyList<T>> GetAllAsync(Expression<Func<T, bool>>? predicate = null, CancellationToken token = default);
|
Task<IReadOnlyList<T>> GetAllAsync(Expression<Func<NodeModel, bool>>? predicate = null, CancellationToken token = default);
|
||||||
Task<T?> GetAsync(Expression<Func<T, bool>> predicate, CancellationToken token = default);
|
Task<T?> GetAsync(Expression<Func<NodeModel, bool>> predicate, CancellationToken token = default);
|
||||||
Task 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);
|
||||||
|
@ -3,38 +3,34 @@ 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 DataModels;
|
using UserService.DatabaseLayer.DataModels;
|
||||||
|
using UserService.Infrastructure.DataModels;
|
||||||
|
|
||||||
namespace UserService.DatabaseLayer.Repositories
|
namespace UserService.DatabaseLayer.Repositories
|
||||||
{
|
{
|
||||||
public class OrganizationUnitsRepository : IOrganizationUnitsRepository
|
public class OrganizationUnitsRepository : IOrganizationUnitsRepository
|
||||||
{
|
{
|
||||||
/// <inheritdoc />
|
public Task<IReadOnlyList<OrganizationUnit>> GetAllAsync(Expression<Func<NodeModel, bool>>? predicate = null, CancellationToken token = default)
|
||||||
public async Task<IReadOnlyList<OrganizationUnit>> GetAllAsync(Expression<Func<OrganizationUnit, bool>>? predicate = null, CancellationToken token = default)
|
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
public Task<OrganizationUnit?> GetAsync(Expression<Func<NodeModel, bool>> predicate, CancellationToken token = default)
|
||||||
public async Task<OrganizationUnit?> GetAsync(Expression<Func<OrganizationUnit, bool>> predicate, CancellationToken token = default)
|
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
public Task AddAsync(OrganizationUnit entity, CancellationToken token = default)
|
||||||
public async Task AddAsync(OrganizationUnit entity, CancellationToken token = default)
|
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
public Task<bool> UpdateAsync(OrganizationUnit entity, CancellationToken token = default)
|
||||||
public async Task<bool> UpdateAsync(OrganizationUnit entity, CancellationToken token = default)
|
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
public Task DeleteAsync(OrganizationUnit entity, CancellationToken token = default)
|
||||||
public async Task DeleteAsync(OrganizationUnit entity, CancellationToken token = default)
|
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
@ -5,40 +5,39 @@ 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 DataModels;
|
using LinqToDB;
|
||||||
|
using UserService.DatabaseLayer.DataModels;
|
||||||
|
using UserService.Infrastructure.DataModels;
|
||||||
|
|
||||||
namespace UserService.DatabaseLayer.Repositories
|
namespace UserService.DatabaseLayer.Repositories
|
||||||
{
|
{
|
||||||
public class SecurityGroupsRepository : ISecurityGroupsRepository
|
public class SecurityGroupsRepository : ISecurityGroupsRepository
|
||||||
{
|
{
|
||||||
/// <inheritdoc />
|
public Task<IReadOnlyList<SecurityGroup>> GetAllAsync(Expression<Func<NodeModel, bool>>? predicate = null, CancellationToken token = default)
|
||||||
public async Task<IReadOnlyList<SecurityGroup>> GetAllAsync(Expression<Func<SecurityGroup, bool>>? predicate = null, CancellationToken token = default)
|
{
|
||||||
|
|
||||||
|
throw new NotImplementedException();
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<SecurityGroup?> GetAsync(Expression<Func<NodeModel, bool>> predicate, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
public Task AddAsync(SecurityGroup entity, CancellationToken token = default)
|
||||||
public async Task<SecurityGroup?> GetAsync(Expression<Func<SecurityGroup, bool>> predicate, CancellationToken token = default)
|
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
public Task<bool> UpdateAsync(SecurityGroup entity, CancellationToken token = default)
|
||||||
public async Task AddAsync(SecurityGroup entity, CancellationToken token = default)
|
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
throw new NotImplementedException();
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task<bool> UpdateAsync(SecurityGroup entity, CancellationToken token = default)
|
|
||||||
{
|
|
||||||
throw new NotImplementedException();
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
|
||||||
public async Task DeleteAsync(SecurityGroup entity, CancellationToken token = default)
|
public async Task DeleteAsync(SecurityGroup entity, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
await using var db = new UserService2DB();
|
||||||
|
await db.NodeModels.DeleteAsync(x => x.Id == entity.Id, token).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -4,65 +4,99 @@ 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 DataModels;
|
|
||||||
using LinqToDB;
|
using LinqToDB;
|
||||||
using LinqToDB.Data;
|
using LinqToDB.Data;
|
||||||
|
using UserService.DatabaseLayer.DataModels;
|
||||||
|
using UserService.Infrastructure.DataModels;
|
||||||
|
|
||||||
namespace UserService.DatabaseLayer.Repositories
|
namespace UserService.DatabaseLayer.Repositories
|
||||||
{
|
{
|
||||||
public class UsersRepository : IUsersRepository
|
public class UsersRepository : BaseRepository, IUsersRepository
|
||||||
{
|
{
|
||||||
public UsersRepository()
|
|
||||||
{
|
|
||||||
DataConnection.DefaultSettings = new MySettings();
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public async Task<IReadOnlyList<User>> GetAllAsync(Expression<Func<User, bool>>? predicate = null,
|
public async Task<IReadOnlyList<User>> GetAllAsync(Expression<Func<NodeModel, bool>>? predicate = null,
|
||||||
CancellationToken token = default)
|
CancellationToken token = default)
|
||||||
{
|
{
|
||||||
await using var db = new UserServiceDB();
|
await using var db = new UserService2DB();
|
||||||
return await db.Users.LoadWith(x=> x.Member).LoadWith(x=> x.Member.Node).WhereOrDefault(predicate).ToListAsync(token: token).ConfigureAwait(false);
|
var users = await db.NodeModels
|
||||||
|
.LoadWith(x=> x.Parent)
|
||||||
|
.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,
|
||||||
|
EMail = x.EMail,
|
||||||
|
ParentId = x.ParentId,
|
||||||
|
})
|
||||||
|
.ToListAsync(token).ConfigureAwait(false);
|
||||||
|
return users;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public async Task<User?> GetAsync(Expression<Func<User, bool>> predicate, CancellationToken token = default)
|
public async Task<User?> GetAsync(Expression<Func<NodeModel, bool>> predicate, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
await using var db = new UserServiceDB();
|
await using var db = new UserService2DB();
|
||||||
var result = await db.Users.FirstOrDefaultAsync(predicate, token: token).ConfigureAwait(false);
|
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,
|
||||||
|
EMail = x.EMail
|
||||||
|
}).FirstOrDefaultAsync(token).ConfigureAwait(false);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public async Task AddAsync(User entity, CancellationToken token = default)
|
public async Task AddAsync(User entity, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
await using var db = new UserServiceDB();
|
await using var db = new UserService2DB();
|
||||||
var nodeId =
|
|
||||||
await db.Nodes.InsertWithInt32IdentityAsync(() => new Node {CommonName = "holger"}, token: token);
|
|
||||||
await db.Members.InsertAsync(() => new Member {Id = nodeId}, token: token);
|
|
||||||
|
|
||||||
await db.Users.InsertAsync(() => new User
|
await db.NodeModels.InsertAsync(() => new NodeModel
|
||||||
{
|
{
|
||||||
Id = nodeId,
|
CommonName = entity.CommonName,
|
||||||
FirstName = entity.FirstName,
|
FirstName = entity.FirstName,
|
||||||
LastName = entity.LastName,
|
LastName = entity.LastName,
|
||||||
IsActive = entity.IsActive
|
Description = entity.Description,
|
||||||
|
EMail = entity.EMail,
|
||||||
}, token: token).ConfigureAwait(false);
|
IsActive = entity.IsActive,
|
||||||
|
Discriminator = nameof(User),
|
||||||
|
}, token).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <inheritdoc />
|
/// <inheritdoc />
|
||||||
public async Task<bool> UpdateAsync(User entity, CancellationToken token = default)
|
public async Task<bool> UpdateAsync(User entity, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
throw new NotImplementedException();
|
await using var db = new UserService2DB();
|
||||||
|
|
||||||
|
var changedRows = await db.NodeModels.UpdateAsync(x => new NodeModel
|
||||||
|
{
|
||||||
|
Id = entity.Id,
|
||||||
|
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 />
|
/// <inheritdoc />
|
||||||
public async Task DeleteAsync(User entity, CancellationToken token = default)
|
public async Task DeleteAsync(User entity, CancellationToken token = default)
|
||||||
{
|
{
|
||||||
await using var db = new UserServiceDB();
|
await using var db = new UserService2DB();
|
||||||
await db.Users.DeleteAsync(x => x.Id == entity.Id, token: token);
|
await db.NodeModels.DeleteAsync(x => x.Id == entity.Id, token).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -22,6 +22,10 @@
|
|||||||
</PackageReference>
|
</PackageReference>
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
|
<ItemGroup>
|
||||||
|
<ProjectReference Include="..\UserService.Infrastructure\UserService.Infrastructure.csproj" />
|
||||||
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Service Include="{508349b6-6b84-4df5-91f0-309beebad82d}" />
|
<Service Include="{508349b6-6b84-4df5-91f0-309beebad82d}" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
@ -4,8 +4,6 @@ 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!;
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -5,29 +5,15 @@ using System.ComponentModel.DataAnnotations;
|
|||||||
|
|
||||||
namespace UserService.Infrastructure.DataModels
|
namespace UserService.Infrastructure.DataModels
|
||||||
{
|
{
|
||||||
public abstract class Node : ICloneable, IComparable<Node>
|
public abstract class Node : ICloneable
|
||||||
{
|
{
|
||||||
public Guid Id { get; set; }
|
public int 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 (other is null) return 1;
|
|
||||||
var commonNameComparison = string.Compare(CommonName, other.CommonName, StringComparison.Ordinal);
|
|
||||||
if (commonNameComparison != 0) return commonNameComparison;
|
|
||||||
return Id.CompareTo(other.Id);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,4 +1,6 @@
|
|||||||
namespace UserService.Infrastructure.DataModels
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace UserService.Infrastructure.DataModels
|
||||||
{
|
{
|
||||||
public class OrganizationUnit : Node
|
public class OrganizationUnit : Node
|
||||||
{
|
{
|
||||||
|
@ -1,6 +1,9 @@
|
|||||||
namespace UserService.Infrastructure.DataModels
|
using System.Collections.Generic;
|
||||||
|
|
||||||
|
namespace UserService.Infrastructure.DataModels
|
||||||
{
|
{
|
||||||
public class SecurityGroup : Member
|
public class SecurityGroup : Member
|
||||||
{
|
{
|
||||||
|
public ISet<MembersMember> Members { get; set; } = new HashSet<MembersMember>();
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,34 +1,56 @@
|
|||||||
using NUnit.Framework;
|
using NUnit.Framework;
|
||||||
|
using System;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using DataModels;
|
|
||||||
using UserService.DatabaseLayer.Repositories;
|
using UserService.DatabaseLayer.Repositories;
|
||||||
|
using UserService.Infrastructure.DataModels;
|
||||||
|
|
||||||
namespace UserService.Test
|
namespace UserService.Test
|
||||||
{
|
{
|
||||||
public class Tests
|
public class UserRepositoryTests
|
||||||
{
|
{
|
||||||
[SetUp]
|
|
||||||
public void Setup()
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
[Order(2)]
|
||||||
public async Task Test1()
|
public async Task Test1()
|
||||||
{
|
{
|
||||||
var usersRepository = new UsersRepository();
|
var usersRepository = new UsersRepository();
|
||||||
var users = await usersRepository.GetAllAsync();
|
var users = await usersRepository.GetAllAsync().ConfigureAwait(false);
|
||||||
Assert.AreEqual(users.Count, 1);
|
Assert.AreEqual(users.Count, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
|
[Order(1)]
|
||||||
public async Task Test2()
|
public async Task Test2()
|
||||||
{
|
{
|
||||||
var usersRepository = new UsersRepository();
|
var usersRepository = new UsersRepository();
|
||||||
var user = new User
|
var user = new User
|
||||||
{
|
{
|
||||||
FirstName = "Holger", LastName = "Börchers", IsActive = true
|
CommonName = "holger",
|
||||||
|
FirstName = "Holger",
|
||||||
|
LastName = "Börchers",
|
||||||
|
IsActive = true
|
||||||
};
|
};
|
||||||
await usersRepository.AddAsync(user);
|
await usersRepository.AddAsync(user).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
[Order(3)]
|
||||||
|
public async Task Test3()
|
||||||
|
{
|
||||||
|
var usersRepository = new UsersRepository();
|
||||||
|
|
||||||
|
var user = await usersRepository.GetAsync(x => x.CommonName == "holger").ConfigureAwait(false);
|
||||||
|
user.Description = DateTime.Now.ToString("O");
|
||||||
|
await usersRepository.UpdateAsync(user).ConfigureAwait(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
[Order(4)]
|
||||||
|
public async Task Test4()
|
||||||
|
{
|
||||||
|
var usersRepository = new UsersRepository();
|
||||||
|
|
||||||
|
var user = await usersRepository.GetAsync(x => x.CommonName == "holger").ConfigureAwait(false);
|
||||||
|
await usersRepository.DeleteAsync(user).ConfigureAwait(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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="Guid" Value="@(item.Id)">@item.CommonName</SelectItem>
|
<SelectItem TValue="int" 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.ParentId)]);
|
// OrganizationUnits?.FirstOrDefault(x => x.Id == (Guid?)arg.Values[nameof(Node.Parent.Id)]);
|
||||||
var result = await SecurityGroupsRepository.UpdateAsync(securityGroup).ConfigureAwait(false);
|
var result = await SecurityGroupsRepository.UpdateAsync(securityGroup).ConfigureAwait(false);
|
||||||
arg.Cancel = !result;
|
arg.Cancel = !result;
|
||||||
}
|
}
|
||||||
@ -98,9 +98,7 @@ 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="Guid" Value="@(item.Id)">@item.CommonName</SelectItem>
|
<SelectItem TValue="int" Value="@(item.Id)">@item.CommonName</SelectItem>
|
||||||
}
|
}
|
||||||
</Select>
|
</Select>
|
||||||
</EditTemplate>
|
</EditTemplate>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user