public async Task CheckAndSaveNewRole_Error_NameAlreadyTakenAsync() { string roleName = "New Role 1 " + DateTime.Now.Ticks; var permRepo = DatabaseFixture.Storage.GetRepository <IRolePermissionRepository>(); try { // Arrange SaveNewRoleAndGrantsViewModel model = new SaveNewRoleAndGrantsViewModel { // Really unique value RoleName = roleName, Extensions = new System.Collections.Generic.List <string> { "Security" }, PermissionValue = Permission.Write.ToString() }; // Execute var result = await CreateRoleAndGrants.CheckAndSaveNewRoleAndGrantsAsync(DatabaseFixture.Storage, DatabaseFixture.RoleManager, model); // Assert Assert.Null(result); // Read back and expect to find the Role record for the new role var createdRole = await DatabaseFixture.RoleManager.FindByNameAsync(model.RoleName); Assert.NotNull(createdRole); result = await CreateRoleAndGrants.CheckAndSaveNewRoleAndGrantsAsync(DatabaseFixture.Storage, DatabaseFixture.RoleManager, model); Assert.NotNull(result); Assert.Equal("A role with this name already exists", result); } finally { // Cleanup created data var createdRole = await DatabaseFixture.RoleManager.FindByNameAsync(roleName); if (createdRole != null) { foreach (var rolePermission in permRepo.FilteredByRoleId(createdRole.Id)) { permRepo.Delete(rolePermission.RoleId, rolePermission.Extension); } await DatabaseFixture.RoleManager.DeleteAsync(createdRole); } } }
public async Task CheckAndSaveNewRole_OkAsync(string extensionNames_) { string roleName = "New Role 1 " + DateTime.Now.Ticks; var permRepo = DatabaseFixture.Storage.GetRepository <IRolePermissionRepository>(); try { // Arrange string[] extensions = extensionNames_.Split(','); SaveNewRoleAndGrantsViewModel model = new SaveNewRoleAndGrantsViewModel { // Really unique value RoleName = roleName, Extensions = new System.Collections.Generic.List <string>(extensions), PermissionValue = Permission.Write.ToString() }; // Execute var result = await CreateRoleAndGrants.CheckAndSaveNewRoleAndGrantsAsync(DatabaseFixture.Storage, DatabaseFixture.RoleManager, model); // Assert Assert.Null(result); // Read back and assert that we have the expected data // 1. Expect to find the Role record for the new role var createdRole = await DatabaseFixture.RoleManager.FindByNameAsync(model.RoleName); Assert.NotNull(createdRole); // 2. Expect to have an expected number of records in RolePermission table for the new role var rolePermissionRecords = permRepo.FilteredByRoleId(createdRole.Id); Assert.Equal(extensions.Count(), rolePermissionRecords.Count()); } finally { // Cleanup created data var createdRole = await DatabaseFixture.RoleManager.FindByNameAsync(roleName); if (createdRole != null) { foreach (var rolePermission in permRepo.FilteredByRoleId(createdRole.Id)) { permRepo.Delete(rolePermission.RoleId, rolePermission.Extension); } await DatabaseFixture.RoleManager.DeleteAsync(createdRole); } } }
/// <summary> /// First, check that a role with this name doesn't already exist. /// Second, save new data into database. /// </summary> /// <param name="model_">Model with role name and grant data (extensions and permission level)</param> /// <param name="roleManager_"></param> /// <param name="storage_"></param> /// <returns>Not null when something failed, else null when save went ok</returns> public static async Task <string> CheckAndSaveNewRoleAndGrants(SaveNewRoleAndGrantsViewModel model_, RoleManager <IdentityRole <string> > roleManager_, IStorage storage_) { if (await UpdateRole.CheckThatRoleOfThisNameExists(roleManager_, model_.RoleName)) { return("A role with this name already exists"); } try { // Convert the string to the enum var permissionEnum = Enum.Parse <Security.Common.Enums.Permission>(model_.Permission, true); // Save the Role IdentityRole <string> identityRole = new IdentityRole <string> { // Auto-incremented ID Name = model_.RoleName }; await roleManager_.CreateAsync(identityRole); // Save the role-extension-permission link if (model_.Extensions != null) { IRolePermissionRepository repo = storage_.GetRepository <IRolePermissionRepository>(); foreach (string extension in model_.Extensions) { repo.Create(new RolePermission { RoleId = identityRole.Id, PermissionId = permissionEnum.ToString(), Scope = extension }); } } storage_.Save(); return(null); } catch (Exception e) { return($"{e.Message} {e.StackTrace}"); } }
public async Task CheckAndSaveNewRole_Error_NoExtensionSelectedAsync() { string roleName = "New Role 1 " + DateTime.Now.Ticks; var permRepo = DatabaseFixture.Storage.GetRepository <IRolePermissionRepository>(); try { // Arrange SaveNewRoleAndGrantsViewModel model = new SaveNewRoleAndGrantsViewModel { // Really unique value RoleName = roleName, Extensions = null, PermissionValue = Permission.Write.ToString() }; // Execute var result = await CreateRoleAndGrants.CheckAndSaveNewRoleAndGrantsAsync(DatabaseFixture.Storage, DatabaseFixture.RoleManager, model); // Assert Assert.NotNull(result); Assert.Equal("At least one extension must be selected", result); } finally { // Cleanup created data var createdRole = await DatabaseFixture.RoleManager.FindByNameAsync(roleName); if (createdRole != null) { foreach (var rolePermission in permRepo.FilteredByRoleId(createdRole.Id)) { permRepo.Delete(rolePermission.RoleId, rolePermission.Extension); } await DatabaseFixture.RoleManager.DeleteAsync(createdRole); } } }
/// <summary> /// First, check that a role with this name doesn't already exist. /// /// Second, save new data into database. /// </summary> /// <param name="storage_">Storage interface provided by services container.</param> /// <param name="roleManager_">Roles manager object.</param> /// <param name="model_">A <see cref="SaveNewRoleAndGrantsViewModel" /> object.</param> /// <returns>Null if success, otherwise error message.</returns> public static async Task <string> CheckAndSaveNewRoleAndGrantsAsync(IStorage storage_, RoleManager <IdentityRole <string> > roleManager_, SaveNewRoleAndGrantsViewModel model_) { if (await UpdateRoleAndGrants.CheckThatRoleOfThisNameExistsAsync(roleManager_, model_.RoleName)) { return("A role with this name already exists"); } if (model_.Extensions == null || !model_.Extensions.Any()) { return("At least one extension must be selected"); } try { // Convert the string to the enum if (Enum.TryParse <Common.Enums.Permission>(model_.PermissionValue, true, out var permissionEnumValue)) { var permissionEntity = storage_.GetRepository <IPermissionRepository>().Find(permissionEnumValue); // Save the Role IdentityRole <string> identityRole = new IdentityRole <string> { // Auto-incremented ID Name = model_.RoleName }; await roleManager_.CreateAsync(identityRole); // Save the role-extension-permission link if (model_.Extensions != null) { IRolePermissionRepository repo = storage_.GetRepository <IRolePermissionRepository>(); foreach (string extension in model_.Extensions) { repo.Create(new RolePermission { RoleId = identityRole.Id, PermissionId = permissionEntity.Id, Extension = extension }); } } } await storage_.SaveAsync(); return(null); } catch (Exception e) { return($"{e.Message} {e.StackTrace}"); } }
public async Task <IActionResult> SaveNewRoleAndItsPermissionsAsync([FromBody] SaveNewRoleAndGrantsViewModel model_) { string error = await CreateRoleAndGrants.CheckAndSaveNewRoleAndGrantsAsync(Storage, _roleManager, model_); return(StatusCode(string.IsNullOrEmpty(error) ? (int)HttpStatusCode.Created : (int)HttpStatusCode.BadRequest, error)); }
public async Task <ObjectResult> SaveNewRoleAndItsPermissions(SaveNewRoleAndGrantsViewModel model_) { string error = await CreateRoleAndGrants.CheckAndSaveNewRoleAndGrants(model_, _roleManager, Storage); return(StatusCode(string.IsNullOrEmpty(error) ? 201 : 400, error)); }