From 2a86c16b85af1f1fbecae1719ad8beb767e7f31e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Holger=20B=C3=B6rchers?= Date: Fri, 24 Jul 2020 21:06:35 +0200 Subject: [PATCH] Added MatBlazor and list of users --- UserService.Test/UnitTest1.cs | 4 +- UserService.db | Bin 36864 -> 40960 bytes UserService/DataModels/Node.cs | 35 ++++-- ...oupsContext.cs => UserServiceDbContext.cs} | 2 +- ....cs => 20200724180034_initial.Designer.cs} | 18 ++- ..._intitial.cs => 20200724180034_initial.cs} | 24 +++- ...s => UserServiceDbContextModelSnapshot.cs} | 16 ++- UserService/Pages/Index.razor | 104 +++++++++++++++++- UserService/Pages/_Host.cshtml | 2 + UserService/Repository/IGroupsRepository.cs | 60 +++++----- UserService/Repository/IRepository.cs | 10 +- UserService/UserService.csproj | 1 + UserService/_Imports.razor | 1 + 13 files changed, 214 insertions(+), 63 deletions(-) rename UserService/DataModels/{GroupsContext.cs => UserServiceDbContext.cs} (93%) rename UserService/Migrations/{20200723192940_intitial.Designer.cs => 20200724180034_initial.Designer.cs} (90%) rename UserService/Migrations/{20200723192940_intitial.cs => 20200724180034_initial.cs} (85%) rename UserService/Migrations/{GroupsContextModelSnapshot.cs => UserServiceDbContextModelSnapshot.cs} (90%) diff --git a/UserService.Test/UnitTest1.cs b/UserService.Test/UnitTest1.cs index a0f0bff..c1b8016 100644 --- a/UserService.Test/UnitTest1.cs +++ b/UserService.Test/UnitTest1.cs @@ -16,7 +16,7 @@ namespace UserService.Test [Test] public async Task Test1() { - using var db = new GroupsContext(); + await using var db = new UserServiceDbContext(); var user = await db.Users.FirstOrDefaultAsync(); var secGroup = await db.SecurityGroups.FirstOrDefaultAsync(); var ous = await db.OrganizationUnits.ToListAsync(); @@ -25,7 +25,7 @@ namespace UserService.Test //var testGroup = new SecurityGroup {CommonName = "Test", Parent = ous.Last()}; //await db.SecurityGroups.AddAsync(testGroup); //var testgroup = await db.SecurityGroups.FindAsync(1); - //testgroup.Members.Add(new UserMember{MemberId = testgroup.Id, UserId = user.Id}); + //testgroup.Members.AddAsync(new UserMember{MemberId = testgroup.Id, UserId = user.Id}); //await db.SaveChangesAsync(); Assert.Pass(); } diff --git a/UserService.db b/UserService.db index c2f051ae112b7a96ebdcc4c44282c76bef0ca56d..c07d1917a2377e4bac4e28b54cd0b686d9124aa3 100644 GIT binary patch delta 742 zcmZozz|?SnX@Wd27Xt#YP1Lawd}ruAc6G3f``fFoPza=hoVMoX?(-0t_x%p%Guko+u zyRcbMU>{$-B@;J;xFUn7zPLCiLqTduYLRzhT3TvSenwtuXmM&$fnITDPG+h@dTwH7 zj$U$pZU9J4Fi6b(KNS4oW{}io6g8HV=VZvp&jALWb4F^KLRo%Zv4VSIURCNpkVz1k zBnxANSswXvAk|KXw-qI4q!tyc!c6?j&7jJ_sLn9Cz+TP}=tl*x1jrr+Mo}OiW)Ik4 zMVPMtAbAE|hRJ*Fr34{bfKvZ}9t4X%x0h%6#=!p#7*x;rCkC*Ia4<59GJ+zLi5DD> zKN#}S(+HcXXce;mSiU880#78nQ;MK z#K`}Yf&b}dL5JJ?x>C&6oH*3;0+q7zJ2CM0@h9+K=U>b31aztazn%;u7lSARqdLfM zA*sbB|ASMLON%l~D&33nOAA!~L&0Az234S{$+`A&`l2wwKU@rw42+^cotzo@Iq9iI z|3ZsXixgne|3T6Wx|8?VO9{xs1pjd{h=T;5+sm_jXW;+7S#ZKDehHuv?2OE!oPPN! zsUVj!@qcFE|H=P(vtYn;en}Q4W=_UGtc=WzjDLZ4f}}rzq(1?rpYbcOv2Zdn{$XNc zVPxcl$g_gN Members { get; set; } = new List(); } @@ -19,16 +19,29 @@ namespace UserService.DataModels public string? LastName { get; set; } public bool IsActive { get; set; } - public IEnumerable MemberOf { get; set; } = new List(); - } + public string FullName => $"{FirstName} {LastName}"; - //public class UserSecurityGroup - //{ - // public int UserId { get; set; } - // public User? User { get; set; } - // public int SecurityGroupId { get; set; } - // public SecurityGroup? SecurityGroup { get; set; } - //} + public IEnumerable MemberOf { get; set; } = new List(); + + public User Clone() + { + return new User + { + Children = Children, + CommonName = CommonName, + Description = Description, + EMail = EMail, + FirstName = FirstName, + Id = Id, + IsActive = IsActive, + LastName = LastName, + MemberOf = MemberOf, + Members = Members, + Parent = Parent, + ParentId = ParentId + }; + } + } public class UserMember { @@ -42,6 +55,7 @@ namespace UserService.DataModels public abstract class Member : Node { + [EmailAddress] public string? EMail { get; set; } public ICollection Members { get; set; } = new List(); @@ -52,7 +66,6 @@ namespace UserService.DataModels public int Id { get; set; } [Required] public string CommonName { get; set; } = "commonName"; public string? Description { get; set; } - public ICollection Children { get; set; } = new List(); public Node? Parent { get; set; } //Parent public int? ParentId { get; set; } diff --git a/UserService/DataModels/GroupsContext.cs b/UserService/DataModels/UserServiceDbContext.cs similarity index 93% rename from UserService/DataModels/GroupsContext.cs rename to UserService/DataModels/UserServiceDbContext.cs index 7ef4d2c..c7a356c 100644 --- a/UserService/DataModels/GroupsContext.cs +++ b/UserService/DataModels/UserServiceDbContext.cs @@ -2,7 +2,7 @@ namespace UserService.DataModels { - public class GroupsContext : DbContext + public class UserServiceDbContext : DbContext { public DbSet Users { get; set; } = null!; public DbSet SecurityGroups { get; set; } = null!; diff --git a/UserService/Migrations/20200723192940_intitial.Designer.cs b/UserService/Migrations/20200724180034_initial.Designer.cs similarity index 90% rename from UserService/Migrations/20200723192940_intitial.Designer.cs rename to UserService/Migrations/20200724180034_initial.Designer.cs index 8090a67..56f4115 100644 --- a/UserService/Migrations/20200723192940_intitial.Designer.cs +++ b/UserService/Migrations/20200724180034_initial.Designer.cs @@ -8,9 +8,9 @@ using UserService.DataModels; namespace UserService.Migrations { - [DbContext(typeof(GroupsContext))] - [Migration("20200723192940_intitial")] - partial class intitial + [DbContext(typeof(UserServiceDbContext))] + [Migration("20200724180034_initial")] + partial class initial { protected override void BuildTargetModel(ModelBuilder modelBuilder) { @@ -83,6 +83,11 @@ namespace UserService.Migrations { b.HasBaseType("UserService.DataModels.Node"); + b.Property("ManagerId") + .HasColumnType("INTEGER"); + + b.HasIndex("ManagerId"); + b.HasDiscriminator().HasValue("OrganizationUnit"); b.HasData( @@ -159,6 +164,13 @@ namespace UserService.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); + + modelBuilder.Entity("UserService.DataModels.OrganizationUnit", b => + { + b.HasOne("UserService.DataModels.Member", "Manager") + .WithMany() + .HasForeignKey("ManagerId"); + }); #pragma warning restore 612, 618 } } diff --git a/UserService/Migrations/20200723192940_intitial.cs b/UserService/Migrations/20200724180034_initial.cs similarity index 85% rename from UserService/Migrations/20200723192940_intitial.cs rename to UserService/Migrations/20200724180034_initial.cs index be9eb32..48000a4 100644 --- a/UserService/Migrations/20200723192940_intitial.cs +++ b/UserService/Migrations/20200724180034_initial.cs @@ -2,7 +2,7 @@ namespace UserService.Migrations { - public partial class intitial : Migration + public partial class initial : Migration { protected override void Up(MigrationBuilder migrationBuilder) { @@ -19,7 +19,8 @@ namespace UserService.Migrations EMail = table.Column(nullable: true), FirstName = table.Column(nullable: true), LastName = table.Column(nullable: true), - IsActive = table.Column(nullable: true) + IsActive = table.Column(nullable: true), + ManagerId = table.Column(nullable: true) }, constraints: table => { @@ -30,6 +31,12 @@ namespace UserService.Migrations 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( @@ -58,13 +65,13 @@ namespace UserService.Migrations migrationBuilder.InsertData( table: "Node", - columns: new[] { "Id", "CommonName", "Description", "Discriminator", "ParentId" }, - values: new object[] { -2, "Users", null, "OrganizationUnit", null }); + columns: new[] { "Id", "CommonName", "Description", "Discriminator", "ParentId", "ManagerId" }, + values: new object[] { -2, "Users", null, "OrganizationUnit", null, null }); migrationBuilder.InsertData( table: "Node", - columns: new[] { "Id", "CommonName", "Description", "Discriminator", "ParentId" }, - values: new object[] { -1, "Groups", null, "OrganizationUnit", null }); + columns: new[] { "Id", "CommonName", "Description", "Discriminator", "ParentId", "ManagerId" }, + values: new object[] { -1, "Groups", null, "OrganizationUnit", null, null }); migrationBuilder.InsertData( table: "Node", @@ -86,6 +93,11 @@ namespace UserService.Migrations table: "Node", column: "ParentId"); + migrationBuilder.CreateIndex( + name: "IX_Node_ManagerId", + table: "Node", + column: "ManagerId"); + migrationBuilder.CreateIndex( name: "IX_UserMembers_UserId", table: "UserMembers", diff --git a/UserService/Migrations/GroupsContextModelSnapshot.cs b/UserService/Migrations/UserServiceDbContextModelSnapshot.cs similarity index 90% rename from UserService/Migrations/GroupsContextModelSnapshot.cs rename to UserService/Migrations/UserServiceDbContextModelSnapshot.cs index 22c0287..b0cb2fc 100644 --- a/UserService/Migrations/GroupsContextModelSnapshot.cs +++ b/UserService/Migrations/UserServiceDbContextModelSnapshot.cs @@ -7,8 +7,8 @@ using UserService.DataModels; namespace UserService.Migrations { - [DbContext(typeof(GroupsContext))] - partial class GroupsContextModelSnapshot : ModelSnapshot + [DbContext(typeof(UserServiceDbContext))] + partial class UserServiceDbContextModelSnapshot : ModelSnapshot { protected override void BuildModel(ModelBuilder modelBuilder) { @@ -81,6 +81,11 @@ namespace UserService.Migrations { b.HasBaseType("UserService.DataModels.Node"); + b.Property("ManagerId") + .HasColumnType("INTEGER"); + + b.HasIndex("ManagerId"); + b.HasDiscriminator().HasValue("OrganizationUnit"); b.HasData( @@ -157,6 +162,13 @@ namespace UserService.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); + + modelBuilder.Entity("UserService.DataModels.OrganizationUnit", b => + { + b.HasOne("UserService.DataModels.Member", "Manager") + .WithMany() + .HasForeignKey("ManagerId"); + }); #pragma warning restore 612, 618 } } diff --git a/UserService/Pages/Index.razor b/UserService/Pages/Index.razor index e54d914..c1287cf 100644 --- a/UserService/Pages/Index.razor +++ b/UserService/Pages/Index.razor @@ -1,7 +1,105 @@ @page "/" +@using UserService.Repository +@using UserService.DataModels +@inject IUsersRepository UsersRepository -

Hello, world!

-Welcome to your new app. +

User service

- +@if (_users == null) +{ +

+ Loading... +

+} +else +{ + + + + + + + + + + + + + + @foreach (var user in _users) + { + + + + + + + + + + + } + +
Common NameFull nameDescriptionE-MailIs active
@user.CommonName@user.FullName@user.Description@user.EMail@user.IsActiveeditdelete
+ Create user +} + + + @if (_userToEdit != null) + { + @(_userToEdit.Id == 0 ? "New" : "Edit") @_userToEdit.CommonName (@_userToEdit.Id) + + +

+ + +

+ +

+ + + + } + else + { + No user selected + } + + No Thanks + OK + + + + +@code { + bool _dialogIsOpen; + User _userToEdit; + + private IReadOnlyList _users; + + protected override async Task OnInitializedAsync() + { + _users = await UsersRepository.GetAllAsync(); + } + + private void EditUser(User user) + { + _dialogIsOpen = true; + _userToEdit = user.Clone(); + } + + async Task OkClick() + { + await UsersRepository.UpdateAsync(_userToEdit).ConfigureAwait(false); + await OnInitializedAsync().ConfigureAwait(false); + _dialogIsOpen = false; + } + + private async Task DeleteUser(User user) + { + await UsersRepository.DeleteAsync(user).ConfigureAwait(false); + await OnInitializedAsync().ConfigureAwait(false); + } + +} \ No newline at end of file diff --git a/UserService/Pages/_Host.cshtml b/UserService/Pages/_Host.cshtml index 20bfceb..daa62cf 100644 --- a/UserService/Pages/_Host.cshtml +++ b/UserService/Pages/_Host.cshtml @@ -14,6 +14,8 @@ + + diff --git a/UserService/Repository/IGroupsRepository.cs b/UserService/Repository/IGroupsRepository.cs index 29fb5fe..26d0e61 100644 --- a/UserService/Repository/IGroupsRepository.cs +++ b/UserService/Repository/IGroupsRepository.cs @@ -10,37 +10,37 @@ namespace UserService.Repository { public class OrganizationUnitRepository : IOrganizationUnitRepository { - public async Task> GetAll(CancellationToken token = default) + public async Task> GetAllAsync(CancellationToken token = default) { - await using var db = new GroupsContext(); + await using var db = new UserServiceDbContext(); return await db.OrganizationUnits.ToListAsync(token); } /// - public async Task Get(Func predicate, + public async Task GetAsync(Func predicate, CancellationToken token = default) { - await using var db = new GroupsContext(); + await using var db = new UserServiceDbContext(); return db.OrganizationUnits.Where(predicate).FirstOrDefault(); } - public async Task Add(OrganizationUnit entity, CancellationToken token = default) + public async Task AddAsync(OrganizationUnit entity, CancellationToken token = default) { - await using var db = new GroupsContext(); + await using var db = new UserServiceDbContext(); await db.OrganizationUnits.AddAsync(@entity, token); await db.SaveChangesAsync(token); } - public async Task Update(OrganizationUnit entity, CancellationToken token = default) + public async Task UpdateAsync(OrganizationUnit entity, CancellationToken token = default) { - await using var db = new GroupsContext(); + await using var db = new UserServiceDbContext(); db.OrganizationUnits.Update(entity); await db.SaveChangesAsync(token); } - public async Task Delete(OrganizationUnit entity, CancellationToken token = default) + public async Task DeleteAsync(OrganizationUnit entity, CancellationToken token = default) { - await using var db = new GroupsContext(); + await using var db = new UserServiceDbContext(); db.OrganizationUnits.Remove(entity); await db.SaveChangesAsync(token); } @@ -49,36 +49,36 @@ namespace UserService.Repository public class SecurityGroupsRepository : ISecurityGroupsRepository { - public async Task> GetAll(CancellationToken token = default) + public async Task> GetAllAsync(CancellationToken token = default) { - await using var db = new GroupsContext(); + await using var db = new UserServiceDbContext(); return await db.SecurityGroups.ToListAsync(token); } /// - public async Task Get(Func predicate, CancellationToken token = default) + public async Task GetAsync(Func predicate, CancellationToken token = default) { - await using var db = new GroupsContext(); + await using var db = new UserServiceDbContext(); return db.SecurityGroups.Where(predicate).FirstOrDefault(); } - public async Task Add(SecurityGroup entity, CancellationToken token = default) + public async Task AddAsync(SecurityGroup entity, CancellationToken token = default) { - await using var db = new GroupsContext(); + await using var db = new UserServiceDbContext(); await db.SecurityGroups.AddAsync(@entity, token); await db.SaveChangesAsync(token); } - public async Task Update(SecurityGroup entity, CancellationToken token = default) + public async Task UpdateAsync(SecurityGroup entity, CancellationToken token = default) { - await using var db = new GroupsContext(); + await using var db = new UserServiceDbContext(); db.SecurityGroups.Update(entity); await db.SaveChangesAsync(token); } - public async Task Delete(SecurityGroup entity, CancellationToken token = default) + public async Task DeleteAsync(SecurityGroup entity, CancellationToken token = default) { - await using var db = new GroupsContext(); + await using var db = new UserServiceDbContext(); db.SecurityGroups.Remove(entity); await db.SaveChangesAsync(token); } @@ -87,36 +87,36 @@ namespace UserService.Repository public class UsersRepository : IUsersRepository { - public async Task> GetAll(CancellationToken token = default) + public async Task> GetAllAsync(CancellationToken token = default) { - await using var db = new GroupsContext(); + await using var db = new UserServiceDbContext(); return await db.Users.ToListAsync(token); } /// - public async Task Get(Func predicate, CancellationToken token = default) + public async Task GetAsync(Func predicate, CancellationToken token = default) { - await using var db = new GroupsContext(); + await using var db = new UserServiceDbContext(); return db.Users.Where(predicate).FirstOrDefault(); } - public async Task Add(User entity, CancellationToken token = default) + public async Task AddAsync(User entity, CancellationToken token = default) { - await using var db = new GroupsContext(); + await using var db = new UserServiceDbContext(); await db.Users.AddAsync(@entity, token); await db.SaveChangesAsync(token); } - public async Task Update(User entity, CancellationToken token = default) + public async Task UpdateAsync(User entity, CancellationToken token = default) { - await using var db = new GroupsContext(); + await using var db = new UserServiceDbContext(); db.Users.Update(entity); await db.SaveChangesAsync(token); } - public async Task Delete(User entity, CancellationToken token = default) + public async Task DeleteAsync(User entity, CancellationToken token = default) { - await using var db = new GroupsContext(); + await using var db = new UserServiceDbContext(); db.Users.Remove(entity); await db.SaveChangesAsync(token); } diff --git a/UserService/Repository/IRepository.cs b/UserService/Repository/IRepository.cs index 53127b2..ee9c8e0 100644 --- a/UserService/Repository/IRepository.cs +++ b/UserService/Repository/IRepository.cs @@ -8,11 +8,11 @@ namespace UserService.Repository { public interface IRepository where T : Node { - Task> GetAll(CancellationToken token = default); - Task Get(Func predicate, CancellationToken token = default); - Task Add(T entity, CancellationToken token = default); - Task Update(T entity, CancellationToken token = default); - Task Delete(T entity, CancellationToken token = default); + Task> GetAllAsync(CancellationToken token = default); + Task GetAsync(Func predicate, CancellationToken token = default); + Task AddAsync(T entity, CancellationToken token = default); + Task UpdateAsync(T entity, CancellationToken token = default); + Task DeleteAsync(T entity, CancellationToken token = default); } public interface IOrganizationUnitRepository : IRepository diff --git a/UserService/UserService.csproj b/UserService/UserService.csproj index 7557523..efaf653 100644 --- a/UserService/UserService.csproj +++ b/UserService/UserService.csproj @@ -6,6 +6,7 @@ + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/UserService/_Imports.razor b/UserService/_Imports.razor index 7343ecf..2e8ba2a 100644 --- a/UserService/_Imports.razor +++ b/UserService/_Imports.razor @@ -7,3 +7,4 @@ @using Microsoft.JSInterop @using UserService @using UserService.Shared +@using MatBlazor \ No newline at end of file