Adding Roles event source to Orchard.Roles [Core Module Change]

This commit is contained in:
sfmskywalker
2014-05-26 12:01:27 +02:00
parent f49a5d74f4
commit 58ad9671b9
13 changed files with 85 additions and 7 deletions

View File

@@ -5,6 +5,7 @@ using Orchard.ContentManagement.Drivers;
using Orchard.Data;
using Orchard.ContentManagement;
using Orchard.Localization;
using Orchard.Roles.Events;
using Orchard.Roles.Models;
using Orchard.Roles.Services;
using Orchard.Roles.ViewModels;
@@ -19,6 +20,7 @@ namespace Orchard.Roles.Drivers {
private readonly INotifier _notifier;
private readonly IAuthenticationService _authenticationService;
private readonly IAuthorizationService _authorizationService;
private readonly IRoleEventHandler _roleEventHandlers;
private const string TemplateName = "Parts/Roles.UserRoles";
public UserRolesPartDriver(
@@ -26,12 +28,15 @@ namespace Orchard.Roles.Drivers {
IRoleService roleService,
INotifier notifier,
IAuthenticationService authenticationService,
IAuthorizationService authorizationService) {
IAuthorizationService authorizationService,
IRoleEventHandler roleEventHandlers) {
_userRolesRepository = userRolesRepository;
_roleService = roleService;
_notifier = notifier;
_authenticationService = authenticationService;
_authorizationService = authorizationService;
_roleEventHandlers = roleEventHandlers;
T = NullLocalizer.Instance;
}
@@ -70,16 +75,18 @@ namespace Orchard.Roles.Drivers {
var model = BuildEditorViewModel(userRolesPart);
if (updater.TryUpdateModel(model, Prefix, null, null)) {
var currentUserRoleRecords = _userRolesRepository.Fetch(x => x.UserId == model.User.Id);
var currentUserRoleRecords = _userRolesRepository.Fetch(x => x.UserId == model.User.Id).ToArray();
var currentRoleRecords = currentUserRoleRecords.Select(x => x.Role);
var targetRoleRecords = model.Roles.Where(x => x.Granted).Select(x => _roleService.GetRole(x.RoleId));
var targetRoleRecords = model.Roles.Where(x => x.Granted).Select(x => _roleService.GetRole(x.RoleId)).ToArray();
foreach (var addingRole in targetRoleRecords.Where(x => !currentRoleRecords.Contains(x))) {
_notifier.Warning(T("Adding role {0} to user {1}", addingRole.Name, userRolesPart.As<IUser>().UserName));
_userRolesRepository.Create(new UserRolesPartRecord { UserId = model.User.Id, Role = addingRole });
_roleEventHandlers.UserAdded(new UserAddedContext {Role = addingRole, User = model.User});
}
foreach (var removingRole in currentUserRoleRecords.Where(x => !targetRoleRecords.Contains(x.Role))) {
_notifier.Warning(T("Removing role {0} from user {1}", removingRole.Role.Name, userRolesPart.As<IUser>().UserName));
_userRolesRepository.Delete(removingRole);
_roleEventHandlers.UserRemoved(new UserRemovedContext { Role = removingRole.Role, User = model.User });
}
}
return ContentShape("Parts_Roles_UserRoles_Edit",

View File

@@ -0,0 +1,11 @@
using Orchard.Events;
namespace Orchard.Roles.Events {
public interface IRoleEventHandler : IEventHandler {
void Created(RoleCreatedContext context);
void Removed(RoleRemovedContext context);
void PermissionsChanged(PermissionAddedContext context);
void UserAdded(UserAddedContext context);
void UserRemoved(UserRemovedContext context);
}
}

View File

@@ -0,0 +1,3 @@
namespace Orchard.Roles.Events {
public class PermissionAddedContext : PermissionRoleContext {}
}

View File

@@ -0,0 +1,3 @@
namespace Orchard.Roles.Events {
public class PermissionRemovedContext : PermissionRoleContext {}
}

View File

@@ -0,0 +1,7 @@
using Orchard.Roles.Models;
namespace Orchard.Roles.Events {
public class PermissionRoleContext : RoleContext {
public PermissionRecord Permission { get; set; }
}
}

View File

@@ -0,0 +1,7 @@
using Orchard.Roles.Models;
namespace Orchard.Roles.Events {
public class RoleContext {
public RoleRecord Role { get; set; }
}
}

View File

@@ -0,0 +1,3 @@
namespace Orchard.Roles.Events {
public class RoleCreatedContext : RoleContext {}
}

View File

@@ -0,0 +1,3 @@
namespace Orchard.Roles.Events {
public class RoleRemovedContext : RoleContext {}
}

View File

@@ -0,0 +1,3 @@
namespace Orchard.Roles.Events {
public class UserAddedContext : UserRoleContext {}
}

View File

@@ -0,0 +1,3 @@
namespace Orchard.Roles.Events {
public class UserRemovedContext : UserRoleContext {}
}

View File

@@ -0,0 +1,7 @@
using Orchard.Security;
namespace Orchard.Roles.Events {
public class UserRoleContext : RoleContext {
public IUser User { get; set; }
}
}

View File

@@ -72,6 +72,16 @@
<Compile Include="Commands\RoleCommands.cs" />
<Compile Include="Controllers\AdminController.cs" />
<Compile Include="Drivers\UserTaskDriver.cs" />
<Compile Include="Events\IRoleEventHandler.cs" />
<Compile Include="Events\PermissionAddedContext.cs" />
<Compile Include="Events\PermissionRemovedContext.cs" />
<Compile Include="Events\PermissionRoleContext.cs" />
<Compile Include="Events\RoleContext.cs" />
<Compile Include="Events\RoleCreatedContext.cs" />
<Compile Include="Events\RoleRemovedContext.cs" />
<Compile Include="Events\UserAddedContext.cs" />
<Compile Include="Events\UserRemovedContext.cs" />
<Compile Include="Events\UserRoleContext.cs" />
<Compile Include="Forms\SelectRolesForms.cs" />
<Compile Include="Forms\UserTaskForms.cs" />
<Compile Include="ImportExport\RolesCustomExportStep.cs" />

View File

@@ -6,6 +6,7 @@ using Orchard.Caching;
using Orchard.Data;
using Orchard.Localization;
using Orchard.Logging;
using Orchard.Roles.Events;
using Orchard.Roles.Models;
using Orchard.Security.Permissions;
@@ -20,6 +21,7 @@ namespace Orchard.Roles.Services {
private readonly IEnumerable<IPermissionProvider> _permissionProviders;
private readonly ICacheManager _cacheManager;
private readonly ISignals _signals;
private readonly IRoleEventHandler _roleEventHandlers;
public RoleService(
IRepository<RoleRecord> roleRepository,
@@ -27,14 +29,16 @@ namespace Orchard.Roles.Services {
IRepository<UserRolesPartRecord> userRolesRepository,
IEnumerable<IPermissionProvider> permissionProviders,
ICacheManager cacheManager,
ISignals signals
) {
ISignals signals,
IRoleEventHandler roleEventHandlers) {
_roleRepository = roleRepository;
_permissionRepository = permissionRepository;
_userRolesRepository = userRolesRepository;
_permissionProviders = permissionProviders;
_cacheManager = cacheManager;
_signals = signals;
_roleEventHandlers = roleEventHandlers;
Logger = NullLogger.Instance;
T = NullLocalizer.Instance;
}
@@ -59,7 +63,9 @@ namespace Orchard.Roles.Services {
if (GetRoleByName(roleName) != null)
return;
_roleRepository.Create(new RoleRecord { Name = roleName });
var roleRecord = new RoleRecord {Name = roleName};
_roleRepository.Create(roleRecord);
_roleEventHandlers.Created(new RoleCreatedContext { Role = roleRecord });
TriggerSignal();
}
@@ -74,7 +80,9 @@ namespace Orchard.Roles.Services {
RoleRecord roleRecord = GetRoleByName(roleName);
PermissionRecord permissionRecord = _permissionRepository.Get(x => x.Name == permissionName);
roleRecord.RolesPermissions.Add(new RolesPermissionsRecord { Permission = permissionRecord, Role = roleRecord });
_roleEventHandlers.PermissionsChanged(new PermissionAddedContext { Role = roleRecord, Permission = permissionRecord });
TriggerSignal();
}
public void UpdateRole(int id, string roleName, IEnumerable<string> rolePermissions) {
@@ -92,6 +100,7 @@ namespace Orchard.Roles.Services {
}
PermissionRecord permissionRecord = _permissionRepository.Get(x => x.Name == permission);
roleRecord.RolesPermissions.Add(new RolesPermissionsRecord { Permission = permissionRecord, Role = roleRecord });
_roleEventHandlers.PermissionsChanged(new PermissionAddedContext { Role = roleRecord, Permission = permissionRecord });
}
TriggerSignal();
}
@@ -125,7 +134,9 @@ namespace Orchard.Roles.Services {
_userRolesRepository.Delete(userRoleRecord);
}
_roleRepository.Delete(GetRole(id));
var roleRecord = GetRole(id);
_roleRepository.Delete(roleRecord);
_roleEventHandlers.Removed(new RoleRemovedContext { Role = roleRecord});
TriggerSignal();
}