diff --git a/UserService.DatabaseLayer/DataModels/Class1.cs b/UserService.DatabaseLayer/DataModels/Class1.cs new file mode 100644 index 0000000..57e9da2 --- /dev/null +++ b/UserService.DatabaseLayer/DataModels/Class1.cs @@ -0,0 +1,36 @@ +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 DataProviders => Enumerable.Empty(); + + public string DefaultConfiguration => "MySqlServer"; + public string DefaultDataProvider => "MySqlServer"; + + public IEnumerable ConnectionStrings + { + get + { + yield return + new ConnectionStringSettings + { + Name = "Northwind", + ProviderName = "MySqlServer", + ConnectionString = @"Server=srvbo;Database=UserService;Uid=UserDbAdmin;Pwd=12345678;" + }; + } + } + } +} \ No newline at end of file diff --git a/UserService.DatabaseLayer/DataModels/ModelBuilderExtensions.cs b/UserService.DatabaseLayer/DataModels/ModelBuilderExtensions.cs deleted file mode 100644 index f5aacf7..0000000 --- a/UserService.DatabaseLayer/DataModels/ModelBuilderExtensions.cs +++ /dev/null @@ -1,78 +0,0 @@ -using System; -using Microsoft.EntityFrameworkCore; -using System.Collections.Generic; -using UserService.Infrastructure.DataModels; - -namespace UserService.DatabaseLayer.DataModels -{ - public static class ModelBuilderExtensions - { - public static void Seed(this ModelBuilder modelBuilder) - { - if (modelBuilder == null) throw new ArgumentNullException(nameof(modelBuilder)); - var groups = new OrganizationUnit { CommonName = "Groups", Id = Guid.NewGuid() }; - var users = new OrganizationUnit { CommonName = "Users", Id = Guid.NewGuid() }; - var germany = new OrganizationUnit { CommonName = "Germany", Id = Guid.NewGuid(), ParentId = users.Id }; - var usa = new OrganizationUnit { CommonName = "USA", Id = Guid.NewGuid(), ParentId = users.Id }; - var arizona = new OrganizationUnit { CommonName = "Arizona", Id = Guid.NewGuid(), ParentId = usa.Id }; - var france = new OrganizationUnit { CommonName = "France", Id = Guid.NewGuid(), ParentId = users.Id }; - modelBuilder.Entity().HasData(users, groups, germany, usa, arizona, france); - var user = new User { CommonName = Environment.UserName, IsActive = true, Id = Guid.NewGuid(), ParentId = users.Id }; - modelBuilder.Entity().HasData(user); - var secGroup = new SecurityGroup { CommonName = "Global Admin", Id = Guid.NewGuid(), ParentId = groups.Id }; - modelBuilder.Entity().HasData(secGroup); - - modelBuilder.Entity() - .HasData(new MembersMember { MemberId = secGroup.Id, AttachedMemberId = user.Id }); - } - - public static void CreateRelations(this ModelBuilder modelBuilder) - { - if (modelBuilder == null) throw new ArgumentNullException(nameof(modelBuilder)); - modelBuilder.Entity() - .HasKey(bc => new { bc.MemberId, bc.AttachedMemberId }); - modelBuilder.Entity() - .HasOne(bc => bc.AttachedMember) - .WithMany(b => b!.MemberOf) - .HasForeignKey(bc => bc.AttachedMemberId); - modelBuilder.Entity() - .HasOne(bc => bc.Member) - .WithMany(c => c!.Members) - .HasForeignKey(bc => bc.MemberId); - modelBuilder.Entity() - .HasMany(c => c.Children) - .WithOne(e => e.Parent!) - .HasForeignKey(bc => bc.ParentId); - } - } - - public static class UserExtensions - { - public static IEnumerable GetSecurityGroups(this User user) - { - if (user == null) throw new ArgumentNullException(nameof(user)); - foreach (var userMember in user.MemberOf) - { - if (userMember.Member is SecurityGroup securityGroup) - { - yield return securityGroup; - } - } - } - - } - - public static class SecurityGroupExtensions - { - public static IEnumerable GetAttachedMembers(this SecurityGroup securityGroup) - { - if (securityGroup == null) throw new ArgumentNullException(nameof(securityGroup)); - foreach (var userMember in securityGroup.Members) - { - if (userMember.AttachedMember is null) continue; - yield return userMember.AttachedMember; - } - } - - } -} \ No newline at end of file diff --git a/UserService.DatabaseLayer/DataModels/UserDatabase.generated.cs b/UserService.DatabaseLayer/DataModels/UserDatabase.generated.cs index 0f251f6..ef256d5 100644 --- a/UserService.DatabaseLayer/DataModels/UserDatabase.generated.cs +++ b/UserService.DatabaseLayer/DataModels/UserDatabase.generated.cs @@ -6,6 +6,7 @@ //--------------------------------------------------------------------------------------------------- #pragma warning disable 1591 +#nullable enable using System; using System.Collections.Generic; @@ -17,11 +18,11 @@ using LinqToDB.Mapping; namespace DataModels { /// - /// Database : UserDatabase + /// Database : UserService /// Data Source : srvbo /// Server Version : 5.5.5-10.3.22-MariaDB-1ubuntu1 /// - public partial class UserDatabaseDB : LinqToDB.Data.DataConnection + public partial class UserServiceDB : LinqToDB.Data.DataConnection { public ITable Members { get { return this.GetTable(); } } public ITable MembersMembers { get { return this.GetTable(); } } @@ -30,13 +31,13 @@ namespace DataModels public ITable SecurityGroups { get { return this.GetTable(); } } public ITable Users { get { return this.GetTable(); } } - public UserDatabaseDB() + public UserServiceDB() { InitDataContext(); InitMappingSchema(); } - public UserDatabaseDB(string configuration) + public UserServiceDB(string configuration) : base(configuration) { InitDataContext(); @@ -58,31 +59,31 @@ namespace DataModels /// MembersMember_ibfk_2_BackReference /// [Association(ThisKey="Id", OtherKey="AttachedMemberId", CanBeNull=true, Relationship=Relationship.OneToMany, IsBackReference=true)] - public IEnumerable MembersMemberIbfk2BackReferences { get; set; } + public IEnumerable MembersMemberIbfk2BackReferences { get; set; } = null!; /// /// MembersMember_ibfk_1_BackReference /// [Association(ThisKey="Id", OtherKey="MemberId", CanBeNull=true, Relationship=Relationship.OneToMany, IsBackReference=true)] - public IEnumerable MembersMemberibfks { get; set; } + public IEnumerable MembersMemberibfks { get; set; } = null!; /// - /// Members_ibfk_1 + /// Members_ibfk_2 /// - [Association(ThisKey="Id", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="Members_ibfk_1", BackReferenceName="Membersibfks")] - public Node Node { get; set; } + [Association(ThisKey="Id", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="Members_ibfk_2", BackReferenceName="Membersibfks")] + public Node Node { get; set; } = null!; /// - /// SecurityGroups_ibfk_1_BackReference + /// SecurityGroups_ibfk_2_BackReference /// [Association(ThisKey="Id", OtherKey="Id", CanBeNull=true, Relationship=Relationship.OneToMany, IsBackReference=true)] - public IEnumerable SecurityGroupsibfks { get; set; } + public IEnumerable SecurityGroupsibfks { get; set; } = null!; /// - /// Users_ibfk_1_BackReference + /// Users_ibfk_2_BackReference /// [Association(ThisKey="Id", OtherKey="Id", CanBeNull=true, Relationship=Relationship.OneToMany, IsBackReference=true)] - public IEnumerable Usersibfks { get; set; } + public IEnumerable Usersibfks { get; set; } = null!; #endregion } @@ -99,13 +100,13 @@ namespace DataModels /// MembersMember_ibfk_2 /// [Association(ThisKey="AttachedMemberId", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="MembersMember_ibfk_2", BackReferenceName="MembersMemberIbfk2BackReferences")] - public Member AttachedMember { get; set; } + public Member AttachedMember { get; set; } = null!; /// /// MembersMember_ibfk_1 /// [Association(ThisKey="MemberId", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="MembersMember_ibfk_1", BackReferenceName="MembersMemberibfks")] - public Member Member { get; set; } + public Member Member { get; set; } = null!; #endregion } @@ -113,21 +114,22 @@ namespace DataModels [Table("Nodes")] public partial class Node { - [PrimaryKey, Identity] public int Id { get; set; } // int(11) + [PrimaryKey, Identity] public int Id { get; set; } // int(11) + [Column, NotNull ] public string CommonName { get; set; } = null!; // text #region Associations /// - /// Members_ibfk_1_BackReference + /// Members_ibfk_2_BackReference /// [Association(ThisKey="Id", OtherKey="Id", CanBeNull=true, Relationship=Relationship.OneToMany, IsBackReference=true)] - public IEnumerable Membersibfks { get; set; } + public IEnumerable Membersibfks { get; set; } = null!; /// - /// OrganizationUnits_ibfk_1_BackReference + /// OrganizationUnits_ibfk_2_BackReference /// [Association(ThisKey="Id", OtherKey="Id", CanBeNull=true, Relationship=Relationship.OneToMany, IsBackReference=true)] - public IEnumerable OrganizationUnitsibfks { get; set; } + public IEnumerable OrganizationUnitsibfks { get; set; } = null!; #endregion } @@ -142,10 +144,10 @@ namespace DataModels #region Associations /// - /// OrganizationUnits_ibfk_1 + /// OrganizationUnits_ibfk_2 /// - [Association(ThisKey="Id", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="OrganizationUnits_ibfk_1", BackReferenceName="OrganizationUnitsibfks")] - public Node Node { get; set; } + [Association(ThisKey="Id", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="OrganizationUnits_ibfk_2", BackReferenceName="OrganizationUnitsibfks")] + public Node Node { get; set; } = null!; #endregion } @@ -158,10 +160,10 @@ namespace DataModels #region Associations /// - /// SecurityGroups_ibfk_1 + /// SecurityGroups_ibfk_2 /// - [Association(ThisKey="Id", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="SecurityGroups_ibfk_1", BackReferenceName="SecurityGroupsibfks")] - public Member Member { get; set; } + [Association(ThisKey="Id", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="SecurityGroups_ibfk_2", BackReferenceName="SecurityGroupsibfks")] + public Member Member { get; set; } = null!; #endregion } @@ -169,18 +171,18 @@ namespace DataModels [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) + [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 /// - /// Users_ibfk_1 + /// Users_ibfk_2 /// - [Association(ThisKey="Id", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="Users_ibfk_1", BackReferenceName="Usersibfks")] - public Member Member { get; set; } + [Association(ThisKey="Id", OtherKey="Id", CanBeNull=false, Relationship=Relationship.ManyToOne, KeyName="Users_ibfk_2", BackReferenceName="Usersibfks")] + public Member Member { get; set; } = null!; #endregion } diff --git a/UserService.DatabaseLayer/DataModels/UserDatabase.tt b/UserService.DatabaseLayer/DataModels/UserDatabase.tt index e36269d..17a0d55 100644 --- a/UserService.DatabaseLayer/DataModels/UserDatabase.tt +++ b/UserService.DatabaseLayer/DataModels/UserDatabase.tt @@ -5,50 +5,15 @@ <# //@ include file="$(ProjectDir)LinqToDB.Templates\LinqToDB.MySql.Tools.ttinclude" #> <# //@ include file="$(ProjectDir)LinqToDB.Templates\PluralizationService.ttinclude" #> <# - /* - 1. Create new *.tt file (e.g. MyDatabase.tt) in a folder where you would like to generate your data model - and copy content from this file to it. For example: - - MyProject - DataModels - MyDatabase.tt - - 2. Modify the connection settings below to connect to your database. - - 3. Add connection string to the web/app.config file: - - - - - - 4. To access your database use the following code: - - using (var db = new MyDatabaseDB()) - { - var q = - from c in db.Customers - select c; - - foreach (var c in q) - Console.WriteLine(c.ContactName); - } - - 5. See more at https://linq2db.github.io/articles/T4.html - - IMPORTANT: if running .tt file gives you error like this: - "error : Failed to resolve include text for file: C:\...\$(LinqToDBT4TemplatesDirectory)LinqToDB..Tools.ttinclude" - check tt file properties. - Custom tool must be set to TextTemplatingFileGenerator, not TextTemplatingFilePreprocessor or any other value. - */ - + NamespaceName = "DataModels"; // to configure GetSchemaOptions properties, add them here, before load metadata call - LoadMySqlMetadata("srvbo", "UserDatabase", "UserDbAdmin", "12345678"); -// LoadMySqlMetadata(string connectionString); + LoadMySqlMetadata("srvbo", "UserService", "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(); #> diff --git a/UserService.DatabaseLayer/DataModels/UserServiceDbContext.cs b/UserService.DatabaseLayer/DataModels/UserServiceDbContext.cs deleted file mode 100644 index 6d0cf38..0000000 --- a/UserService.DatabaseLayer/DataModels/UserServiceDbContext.cs +++ /dev/null @@ -1,23 +0,0 @@ -using Microsoft.EntityFrameworkCore; -using UserService.Infrastructure.DataModels; - -namespace UserService.DatabaseLayer.DataModels -{ - public class UserServiceDbContext : DbContext - { - public DbSet Users { get; set; } = null!; - public DbSet SecurityGroups { get; set; } = null!; - public DbSet UserMembers { get; set; } = null!; - public DbSet OrganizationUnits { get; set; } = null!; - - protected override void OnConfiguring(DbContextOptionsBuilder options) - => options.UseSqlite(@"Data Source=C:\Users\holger\Desktop\UserService\UserService.db"); - - /// - protected override void OnModelCreating(ModelBuilder modelBuilder) - { - modelBuilder.CreateRelations(); - modelBuilder.Seed(); - } - } -} \ No newline at end of file diff --git a/UserService.DatabaseLayer/Migrations/20200906191545_InitialCreate.Designer.cs b/UserService.DatabaseLayer/Migrations/20200906191545_InitialCreate.Designer.cs deleted file mode 100644 index 0bf84dd..0000000 --- a/UserService.DatabaseLayer/Migrations/20200906191545_InitialCreate.Designer.cs +++ /dev/null @@ -1,201 +0,0 @@ -// -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("MemberId") - .HasColumnType("TEXT"); - - b.Property("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("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("CommonName") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Description") - .HasColumnType("TEXT"); - - b.Property("Discriminator") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("ParentId") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("ParentId"); - - b.ToTable("Node"); - - b.HasDiscriminator("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("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("EMail") - .HasColumnType("TEXT"); - - b.Property("FirstName") - .HasColumnType("TEXT"); - - b.Property("IsActive") - .HasColumnType("INTEGER"); - - b.Property("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 - } - } -} diff --git a/UserService.DatabaseLayer/Migrations/20200906191545_InitialCreate.cs b/UserService.DatabaseLayer/Migrations/20200906191545_InitialCreate.cs deleted file mode 100644 index 7c248c1..0000000 --- a/UserService.DatabaseLayer/Migrations/20200906191545_InitialCreate.cs +++ /dev/null @@ -1,136 +0,0 @@ -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(nullable: false), - CommonName = table.Column(nullable: false), - Description = table.Column(nullable: true), - ParentId = table.Column(nullable: true), - Discriminator = table.Column(nullable: false), - FirstName = table.Column(nullable: true), - LastName = table.Column(nullable: true), - IsActive = table.Column(nullable: true), - EMail = table.Column(nullable: true), - ManagerId = table.Column(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(nullable: false), - AttachedMemberId = table.Column(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"); - } - } -} diff --git a/UserService.DatabaseLayer/Migrations/UserServiceDbContextModelSnapshot.cs b/UserService.DatabaseLayer/Migrations/UserServiceDbContextModelSnapshot.cs deleted file mode 100644 index 6819060..0000000 --- a/UserService.DatabaseLayer/Migrations/UserServiceDbContextModelSnapshot.cs +++ /dev/null @@ -1,199 +0,0 @@ -// -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("MemberId") - .HasColumnType("TEXT"); - - b.Property("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("Id") - .ValueGeneratedOnAdd() - .HasColumnType("TEXT"); - - b.Property("CommonName") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("Description") - .HasColumnType("TEXT"); - - b.Property("Discriminator") - .IsRequired() - .HasColumnType("TEXT"); - - b.Property("ParentId") - .HasColumnType("TEXT"); - - b.HasKey("Id"); - - b.HasIndex("ParentId"); - - b.ToTable("Node"); - - b.HasDiscriminator("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("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("EMail") - .HasColumnType("TEXT"); - - b.Property("FirstName") - .HasColumnType("TEXT"); - - b.Property("IsActive") - .HasColumnType("INTEGER"); - - b.Property("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 - } - } -} diff --git a/UserService.DatabaseLayer/Repositories/BaseRepository.cs b/UserService.DatabaseLayer/Repositories/BaseRepository.cs deleted file mode 100644 index 14a3f36..0000000 --- a/UserService.DatabaseLayer/Repositories/BaseRepository.cs +++ /dev/null @@ -1,63 +0,0 @@ -#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.Infrastructure.DataModels; - -namespace UserService.DatabaseLayer.Repositories -{ - public class BaseRepository where T : Node - { - protected BaseRepository(Func> context) - { - Context = context; - } - - protected Func> 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> GetAllAsync(Expression>? 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 GetAsync(Expression> 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 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; - } - } -} \ No newline at end of file diff --git a/UserService.DatabaseLayer/Repositories/IRepository.cs b/UserService.DatabaseLayer/Repositories/IRepository.cs index 5baa696..15e3ac0 100644 --- a/UserService.DatabaseLayer/Repositories/IRepository.cs +++ b/UserService.DatabaseLayer/Repositories/IRepository.cs @@ -4,11 +4,11 @@ using System.Collections.Generic; using System.Linq.Expressions; using System.Threading; using System.Threading.Tasks; -using UserService.Infrastructure.DataModels; +using DataModels; namespace UserService.DatabaseLayer.Repositories { - public interface IRepository where T : Node + public interface IRepository where T : class { Task> GetAllAsync(Expression>? predicate = null, CancellationToken token = default); Task GetAsync(Expression> predicate, CancellationToken token = default); diff --git a/UserService.DatabaseLayer/Repositories/OrganizationUnitsRepository.cs b/UserService.DatabaseLayer/Repositories/OrganizationUnitsRepository.cs index c131691..3584b1d 100644 --- a/UserService.DatabaseLayer/Repositories/OrganizationUnitsRepository.cs +++ b/UserService.DatabaseLayer/Repositories/OrganizationUnitsRepository.cs @@ -1,51 +1,42 @@ using System; using System.Collections.Generic; -using System.Linq; using System.Linq.Expressions; using System.Threading; using System.Threading.Tasks; -using Microsoft.EntityFrameworkCore; -using UserService.DatabaseLayer.DataModels; -using UserService.Infrastructure.DataModels; +using DataModels; namespace UserService.DatabaseLayer.Repositories { - public class OrganizationUnitsRepository : BaseRepository, IOrganizationUnitsRepository + public class OrganizationUnitsRepository : IOrganizationUnitsRepository { - public OrganizationUnitsRepository() : base(x => x.OrganizationUnits) + /// + public async Task> GetAllAsync(Expression>? predicate = null, CancellationToken token = default) { + throw new NotImplementedException(); } - /// - public override async Task> GetAllAsync( - Expression>? predicate = null, CancellationToken token = default) + /// + public async Task GetAsync(Expression> predicate, CancellationToken token = default) { - await using var db = new UserServiceDbContext(); - var rootOus = await Context(db) - .Include(x => x.Parent) - .WhereOrDefault(predicate) - .ToListAsync(token).ConfigureAwait(false); + throw new NotImplementedException(); + } - IEnumerable Rec(Node node) - { - if (!(node is OrganizationUnit organizationUnit)) yield break; - yield return organizationUnit; - foreach (var ouChild in rootOus.Where(x => x.ParentId != null && x.ParentId == organizationUnit.Id)) - { - foreach (var unit in Rec(ouChild)) - { - yield return unit; - } - } - } + /// + public async Task AddAsync(OrganizationUnit entity, CancellationToken token = default) + { + throw new NotImplementedException(); + } - var result = new List(); - foreach (var ou in rootOus.Where(x => x.ParentId is null)) - { - result.AddRange(Rec(ou)); - } + /// + public async Task UpdateAsync(OrganizationUnit entity, CancellationToken token = default) + { + throw new NotImplementedException(); + } - return result; + /// + public async Task DeleteAsync(OrganizationUnit entity, CancellationToken token = default) + { + throw new NotImplementedException(); } } } \ No newline at end of file diff --git a/UserService.DatabaseLayer/Repositories/SecurityGroupsRepository.cs b/UserService.DatabaseLayer/Repositories/SecurityGroupsRepository.cs index 7ce56c2..ff6eea7 100644 --- a/UserService.DatabaseLayer/Repositories/SecurityGroupsRepository.cs +++ b/UserService.DatabaseLayer/Repositories/SecurityGroupsRepository.cs @@ -1,53 +1,44 @@ #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.Infrastructure.DataModels; +using DataModels; namespace UserService.DatabaseLayer.Repositories { - public class SecurityGroupsRepository : BaseRepository, ISecurityGroupsRepository + public class SecurityGroupsRepository : ISecurityGroupsRepository { - public SecurityGroupsRepository() : base(x => x.SecurityGroups) + /// + public async Task> GetAllAsync(Expression>? predicate = null, CancellationToken token = default) { + throw new NotImplementedException(); } - public override async Task> GetAllAsync(Expression>? predicate = null, CancellationToken token = default) + /// + public async Task GetAsync(Expression> predicate, CancellationToken token = default) { - 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); + throw new NotImplementedException(); } - public override async Task GetAsync(Expression> predicate, CancellationToken token = default) + /// + public async Task AddAsync(SecurityGroup entity, CancellationToken token = default) { - 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); + throw new NotImplementedException(); } - public override async Task UpdateAsync(SecurityGroup entity, CancellationToken token = default) + /// + public async Task UpdateAsync(SecurityGroup entity, CancellationToken token = default) { - if (entity == null) throw new ArgumentNullException(nameof(entity)); + throw new NotImplementedException(); + } - await using var db = new UserServiceDbContext(); - Context(db).Update(entity); - db.UserMembers.UpdateRange(entity.Members); - var items = await db.SaveChangesAsync(token).ConfigureAwait(false); - return items > 0; + /// + public async Task DeleteAsync(SecurityGroup entity, CancellationToken token = default) + { + throw new NotImplementedException(); } } } \ No newline at end of file diff --git a/UserService.DatabaseLayer/Repositories/UsersRepository.cs b/UserService.DatabaseLayer/Repositories/UsersRepository.cs index f3e4e9e..db9998e 100644 --- a/UserService.DatabaseLayer/Repositories/UsersRepository.cs +++ b/UserService.DatabaseLayer/Repositories/UsersRepository.cs @@ -1,11 +1,68 @@ -using UserService.Infrastructure.DataModels; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Threading; +using System.Threading.Tasks; +using DataModels; +using LinqToDB; +using LinqToDB.Data; namespace UserService.DatabaseLayer.Repositories { - public class UsersRepository : BaseRepository, IUsersRepository + public class UsersRepository : IUsersRepository { - public UsersRepository() : base(x => x.Users) + public UsersRepository() { + DataConnection.DefaultSettings = new MySettings(); + + } + + /// + public async Task> GetAllAsync(Expression>? predicate = null, + CancellationToken token = default) + { + await using var db = new UserServiceDB(); + return await db.Users.LoadWith(x=> x.Member).LoadWith(x=> x.Member.Node).WhereOrDefault(predicate).ToListAsync(token: token).ConfigureAwait(false); + } + + /// + public async Task GetAsync(Expression> predicate, CancellationToken token = default) + { + await using var db = new UserServiceDB(); + var result = await db.Users.FirstOrDefaultAsync(predicate, token: token).ConfigureAwait(false); + return result; + } + + /// + public async Task AddAsync(User entity, CancellationToken token = default) + { + await using var db = new UserServiceDB(); + 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 + { + Id = nodeId, + FirstName = entity.FirstName, + LastName = entity.LastName, + IsActive = entity.IsActive + + }, token: token).ConfigureAwait(false); + } + + /// + public async Task UpdateAsync(User entity, CancellationToken token = default) + { + throw new NotImplementedException(); + } + + /// + public async Task DeleteAsync(User entity, CancellationToken token = default) + { + await using var db = new UserServiceDB(); + await db.Users.DeleteAsync(x => x.Id == entity.Id, token: token); } } } \ No newline at end of file diff --git a/UserService.DatabaseLayer/UserService.DatabaseLayer.csproj b/UserService.DatabaseLayer/UserService.DatabaseLayer.csproj index 9e90ae7..214b21f 100644 --- a/UserService.DatabaseLayer/UserService.DatabaseLayer.csproj +++ b/UserService.DatabaseLayer/UserService.DatabaseLayer.csproj @@ -22,10 +22,6 @@ - - - - diff --git a/UserService.Infrastructure/UserService.Infrastructure.csproj b/UserService.Infrastructure/UserService.Infrastructure.csproj index 4d4eefc..f4d9791 100644 --- a/UserService.Infrastructure/UserService.Infrastructure.csproj +++ b/UserService.Infrastructure/UserService.Infrastructure.csproj @@ -10,4 +10,8 @@ + + + + diff --git a/UserService.Test/UnitTest1.cs b/UserService.Test/UnitTest1.cs index a1e0c96..644195b 100644 --- a/UserService.Test/UnitTest1.cs +++ b/UserService.Test/UnitTest1.cs @@ -1,11 +1,7 @@ -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; +using DataModels; +using UserService.DatabaseLayer.Repositories; namespace UserService.Test { @@ -19,40 +15,20 @@ namespace UserService.Test [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(); + var usersRepository = new UsersRepository(); + var users = await usersRepository.GetAllAsync(); + Assert.AreEqual(users.Count, 1); } [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 ous, Node parent, int level, ref StringBuilder sb) - { - foreach (var unit in ous.Where(x => x.Parent == parent)) + var usersRepository = new UsersRepository(); + var user = new User { - sb.AppendLine(string.Concat(Enumerable.Repeat(' ', 4 * level)) + unit.CommonName); - NewMethod(unit.Children.OfType(), unit, level + 1, ref sb); - } + FirstName = "Holger", LastName = "Börchers", IsActive = true + }; + await usersRepository.AddAsync(user); } } } \ No newline at end of file diff --git a/UserService.Test/UserService.Test.csproj b/UserService.Test/UserService.Test.csproj index 650e42f..3f4d40a 100644 --- a/UserService.Test/UserService.Test.csproj +++ b/UserService.Test/UserService.Test.csproj @@ -19,7 +19,7 @@ - +