diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..3d25c9a --- /dev/null +++ b/.editorconfig @@ -0,0 +1,4 @@ +[*.cs] + +# CA1822: Member als statisch markieren +dotnet_diagnostic.CA1822.severity = suggestion diff --git a/UserService.DatabaseLayer/DataModels/ModelBuilderExtensions.cs b/UserService.DatabaseLayer/DataModels/ModelBuilderExtensions.cs index d06cd66..68710ae 100644 --- a/UserService.DatabaseLayer/DataModels/ModelBuilderExtensions.cs +++ b/UserService.DatabaseLayer/DataModels/ModelBuilderExtensions.cs @@ -1,4 +1,5 @@ -using Microsoft.EntityFrameworkCore; +using System; +using Microsoft.EntityFrameworkCore; using System.Collections.Generic; namespace UserService.DatabaseLayer.DataModels @@ -7,6 +8,7 @@ namespace UserService.DatabaseLayer.DataModels { public static void Seed(this ModelBuilder modelBuilder) { + if (modelBuilder == null) throw new ArgumentNullException(nameof(modelBuilder)); var groups = new OrganizationUnit { CommonName = "Groups", Id = -1 }; var users = new OrganizationUnit { CommonName = "Users", Id = -2 }; var germany = new OrganizationUnit{CommonName = "Germany", Id = -6, ParentId = -2}; @@ -25,6 +27,7 @@ namespace UserService.DatabaseLayer.DataModels public static void CreateRelations(this ModelBuilder modelBuilder) { + if (modelBuilder == null) throw new ArgumentNullException(nameof(modelBuilder)); modelBuilder.Entity() .HasKey(bc => new { bc.MemberId, bc.UserId }); modelBuilder.Entity() @@ -47,6 +50,7 @@ namespace UserService.DatabaseLayer.DataModels { 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) @@ -62,6 +66,7 @@ namespace UserService.DatabaseLayer.DataModels { public static IEnumerable GetUsers(this SecurityGroup securityGroup) { + if (securityGroup == null) throw new ArgumentNullException(nameof(securityGroup)); foreach (var userMember in securityGroup.Members) { if (userMember.User is null) continue; diff --git a/UserService.DatabaseLayer/DataModels/Node.cs b/UserService.DatabaseLayer/DataModels/Node.cs index c5b63f1..ed5c873 100644 --- a/UserService.DatabaseLayer/DataModels/Node.cs +++ b/UserService.DatabaseLayer/DataModels/Node.cs @@ -1,7 +1,7 @@ -using System; +#nullable enable +using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; -using System.Text; namespace UserService.DatabaseLayer.DataModels { diff --git a/UserService.DatabaseLayer/Repository/BaseRepository.cs b/UserService.DatabaseLayer/Repository/BaseRepository.cs index 2df2c97..b50f2ee 100644 --- a/UserService.DatabaseLayer/Repository/BaseRepository.cs +++ b/UserService.DatabaseLayer/Repository/BaseRepository.cs @@ -12,7 +12,7 @@ namespace UserService.DatabaseLayer.Repository { public class BaseRepository where T : Node { - protected readonly Func> Context; + protected Func> Context { get; } protected BaseRepository(Func> context) { @@ -22,27 +22,27 @@ namespace UserService.DatabaseLayer.Repository 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); + return await Context(db).Include(x => x.Parent).WhereOrDefault(predicate).ToListAsync(token).ConfigureAwait(false); } public async Task GetAsync(Expression> predicate, CancellationToken token = default) { await using var db = new UserServiceDbContext(); - return await Context(db).FirstOrDefaultAsync(predicate, token); + return await Context(db).FirstOrDefaultAsync(predicate, token).ConfigureAwait(false); } public async Task AddAsync(T entity, CancellationToken token = default) { await using var db = new UserServiceDbContext(); - await Context(db).AddAsync(@entity, token); - await db.SaveChangesAsync(token); + await Context(db).AddAsync(@entity, token).ConfigureAwait(false); + await db.SaveChangesAsync(token).ConfigureAwait(false); } public async Task UpdateAsync(T entity, CancellationToken token = default) { await using var db = new UserServiceDbContext(); Context(db).Update(entity); - var items= await db.SaveChangesAsync(token); + var items= await db.SaveChangesAsync(token).ConfigureAwait(false); return items > 0; } @@ -50,7 +50,7 @@ namespace UserService.DatabaseLayer.Repository { await using var db = new UserServiceDbContext(); Context(db).Remove(entity); - await db.SaveChangesAsync(token); + await db.SaveChangesAsync(token).ConfigureAwait(false); } } } \ No newline at end of file diff --git a/UserService.DatabaseLayer/Repository/OrganizationUnitsRepository.cs b/UserService.DatabaseLayer/Repository/OrganizationUnitsRepository.cs index 08e5222..7a1fa41 100644 --- a/UserService.DatabaseLayer/Repository/OrganizationUnitsRepository.cs +++ b/UserService.DatabaseLayer/Repository/OrganizationUnitsRepository.cs @@ -24,7 +24,7 @@ namespace UserService.DatabaseLayer.Repository var rootOus = await Context(db) .Include(x => x.Parent) .WhereOrDefault(predicate) - .ToListAsync(cancellationToken: token); + .ToListAsync(cancellationToken: token).ConfigureAwait(false); IEnumerable Rec(Node node) { diff --git a/UserService.DatabaseLayer/UserService.DatabaseLayer.csproj b/UserService.DatabaseLayer/UserService.DatabaseLayer.csproj index c6062ce..fc60665 100644 --- a/UserService.DatabaseLayer/UserService.DatabaseLayer.csproj +++ b/UserService.DatabaseLayer/UserService.DatabaseLayer.csproj @@ -7,11 +7,15 @@ - + all runtime; build; native; contentfiles; analyzers; buildtransitive - + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + diff --git a/UserService.Test/UnitTest1.cs b/UserService.Test/UnitTest1.cs index 4fd7428..0b70fc3 100644 --- a/UserService.Test/UnitTest1.cs +++ b/UserService.Test/UnitTest1.cs @@ -19,10 +19,10 @@ namespace UserService.Test public async Task Test1() { await using var db = new UserServiceDbContext(); - var user = await db.Users.FirstOrDefaultAsync(); - var secGroup = await db.SecurityGroups.FirstOrDefaultAsync(); - var ous = await db.OrganizationUnits.ToListAsync(); - var mo = await db.UserMembers.ToListAsync(); + 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.GetUsers(); @@ -38,7 +38,7 @@ namespace UserService.Test public async Task Test2() { await using var db = new UserServiceDbContext(); - var ous = await db.OrganizationUnits.ToListAsync(); + var ous = await db.OrganizationUnits.ToListAsync().ConfigureAwait(false); var sb = new StringBuilder(); NewMethod(ous, null, 0, ref sb); var result = sb.ToString(); diff --git a/UserService.Test/UserService.Test.csproj b/UserService.Test/UserService.Test.csproj index 022e46a..48b2f52 100644 --- a/UserService.Test/UserService.Test.csproj +++ b/UserService.Test/UserService.Test.csproj @@ -1,4 +1,4 @@ - + netcoreapp3.1 @@ -7,9 +7,13 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + - + diff --git a/UserService.db b/UserService.db index dd1435b..e800eca 100644 Binary files a/UserService.db and b/UserService.db differ diff --git a/UserService.sln b/UserService.sln index f9488a0..3136372 100644 --- a/UserService.sln +++ b/UserService.sln @@ -9,6 +9,11 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UserService.Test", "UserSer EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "UserService.DatabaseLayer", "UserService.DatabaseLayer\UserService.DatabaseLayer.csproj", "{4505C991-7E39-416F-94E5-D906DD0D90F9}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{A8D411B0-CD71-4448-9D4F-12898D0CCDD6}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU diff --git a/UserService/Pages/Directory.razor.cs b/UserService/Pages/Directory.razor.cs index 31b6510..2e238b7 100644 --- a/UserService/Pages/Directory.razor.cs +++ b/UserService/Pages/Directory.razor.cs @@ -1,5 +1,4 @@ -using System; -using System.Collections.Generic; +using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Components; @@ -27,14 +26,14 @@ namespace UserService.Pages private async void OnSelectedNodeChanged(Node? value) { if (value == null) return; - Members = await UsersRepository.GetAllAsync(x => x.ParentId == value.Id); + Members = await UsersRepository.GetAllAsync(x => x.ParentId == value.Id).ConfigureAwait(false); } - public IReadOnlyList Members { get; set; } + public IReadOnlyList? Members { get; set; } - [Inject] public IOrganizationUnitsRepository OuRepository { get; set; } + [Inject] public IOrganizationUnitsRepository OuRepository { get; set; } = null!; - [Inject] public IUsersRepository UsersRepository { get; set; } + [Inject] public IUsersRepository UsersRepository { get; set; } = null!; protected override async Task OnInitializedAsync() diff --git a/UserService/Pages/SecurityGroups.razor b/UserService/Pages/SecurityGroups.razor index e21b1e7..21b50da 100644 --- a/UserService/Pages/SecurityGroups.razor +++ b/UserService/Pages/SecurityGroups.razor @@ -4,7 +4,7 @@

Table of all security groups

-@if (SecurityGroups is null) +@if (Groups is null) {

Loading... @@ -12,7 +12,7 @@ } else { - + diff --git a/UserService/Pages/SecurityGroups.razor.cs b/UserService/Pages/SecurityGroups.razor.cs index b1269ba..1c65bfd 100644 --- a/UserService/Pages/SecurityGroups.razor.cs +++ b/UserService/Pages/SecurityGroups.razor.cs @@ -8,18 +8,18 @@ namespace UserService.Pages { public class SecurityGroupsBase : ComponentBase { - [Inject] private ISecurityGroupsRepository? SecurityGroupsRepository { get; set; } - [Inject] private IOrganizationUnitsRepository? OrganizationUnitsRepository { get; set; } + [Inject] private ISecurityGroupsRepository SecurityGroupsRepository { get; set; } = null!; + [Inject] private IOrganizationUnitsRepository OrganizationUnitsRepository { get; set; } = null!; - protected bool DialogIsOpen; - protected SecurityGroup? SecurityGroupToEdit; + protected bool DialogIsOpen { get; set; } + protected SecurityGroup? SecurityGroupToEdit { get; set; } - protected IReadOnlyList? SecurityGroups; - protected IReadOnlyList? OrganizationUnits; + protected IReadOnlyList? Groups { get; set; } + protected IReadOnlyList? OrganizationUnits { get; set; } protected override async Task OnInitializedAsync() { - SecurityGroups = await SecurityGroupsRepository.GetAllAsync().ConfigureAwait(false); + Groups = await SecurityGroupsRepository.GetAllAsync().ConfigureAwait(false); OrganizationUnits = await OrganizationUnitsRepository.GetAllAsync().ConfigureAwait(false); } diff --git a/UserService/Pages/Users.razor b/UserService/Pages/Users.razor index 344483d..16e99a6 100644 --- a/UserService/Pages/Users.razor +++ b/UserService/Pages/Users.razor @@ -29,24 +29,23 @@ else - + @{ - var name = ((User) context).Parent?.CommonName ?? "-"; + var name = ((User) context ).Parent?.CommonName ?? "-"; @name } - @{ - + + + diff --git a/UserService/Pages/Users.razor.cs b/UserService/Pages/Users.razor.cs index cc16240..a134c6f 100644 --- a/UserService/Pages/Users.razor.cs +++ b/UserService/Pages/Users.razor.cs @@ -1,5 +1,7 @@ -using Microsoft.AspNetCore.Components; +using System; +using Microsoft.AspNetCore.Components; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Blazorise.DataGrid; using Microsoft.JSInterop; @@ -20,19 +22,21 @@ namespace UserService.Pages protected override async Task OnInitializedAsync() { - Users = await UsersRepository.GetAllAsync(); + Users = await UsersRepository.GetAllAsync().ConfigureAwait(false); OrganizationUnits = await OrganizationUnitsRepository.GetAllAsync().ConfigureAwait(false); } protected async Task RowInsertedCallback(SavedRowItem> arg) { + if (arg == null) throw new ArgumentNullException(nameof(arg)); var user = arg.Item; user.ParentId = -2; - await UsersRepository.AddAsync(user); + await UsersRepository.AddAsync(user).ConfigureAwait(false); } protected async Task RowDeletingCallback(CancellableRowChange arg) { + if (arg == null) throw new ArgumentNullException(nameof(arg)); var confirmed = await JsRuntime.InvokeAsync("confirm", $"You are about to delete the user {arg.Item.FullName}. Are you sure?").ConfigureAwait(false); if (confirmed) @@ -46,7 +50,10 @@ namespace UserService.Pages protected async Task RowUpdatingCallback(CancellableRowChange> arg) { - var result = await UsersRepository.UpdateAsync(arg.Item); + if (arg == null) throw new ArgumentNullException(nameof(arg)); + var user = arg.Item; + user.Parent = OrganizationUnits.FirstOrDefault(x => x.Id == (int?)arg.Values[nameof(Node.ParentId)]); + var result = await UsersRepository.UpdateAsync(user).ConfigureAwait(false); arg.Cancel = !result; } diff --git a/UserService/Startup.cs b/UserService/Startup.cs index dfd5430..8827107 100644 --- a/UserService/Startup.cs +++ b/UserService/Startup.cs @@ -1,3 +1,4 @@ +using System; using Blazorise; using Blazorise.Bootstrap; using Blazorise.Icons.FontAwesome; @@ -40,6 +41,7 @@ namespace UserService // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { + if (app == null) throw new ArgumentNullException(nameof(app)); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); diff --git a/UserService/UserService.csproj b/UserService/UserService.csproj index ebd1211..1bffdf8 100644 --- a/UserService/UserService.csproj +++ b/UserService/UserService.csproj @@ -5,6 +5,10 @@ enable + + + + @@ -15,6 +19,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive +