MIFOSX-97: redo permissions for maker-checker and roles. api expects json map of permissions labelled by parameter name 'permissions'

This commit is contained in:
Keith Woodlock
2012-12-06 23:30:36 +00:00
parent 5ca0604aa2
commit c966892b37
18 changed files with 170 additions and 308 deletions
@@ -6,28 +6,35 @@ import java.util.List;
import org.joda.time.LocalDate; import org.joda.time.LocalDate;
import org.mifosplatform.commands.domain.CommandSource; import org.mifosplatform.commands.domain.CommandSource;
import org.mifosplatform.commands.exception.UnsupportedCommandException; import org.mifosplatform.commands.exception.UnsupportedCommandException;
import org.mifosplatform.infrastructure.core.api.JsonCommand;
import org.mifosplatform.infrastructure.core.data.EntityIdentifier;
import org.mifosplatform.infrastructure.core.serialization.ExcludeNothingWithPrettyPrintingOffJsonSerializerGoogleGson;
import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper;
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
import org.mifosplatform.portfolio.client.service.RollbackTransactionAsCommandIsNotApprovedByCheckerException; import org.mifosplatform.portfolio.client.service.RollbackTransactionAsCommandIsNotApprovedByCheckerException;
import org.mifosplatform.useradministration.command.PermissionsCommand;
import org.mifosplatform.useradministration.domain.AppUser; import org.mifosplatform.useradministration.domain.AppUser;
import org.mifosplatform.useradministration.serialization.PermissionsCommandFromCommandJsonDeserializer;
import org.mifosplatform.useradministration.service.PermissionWritePlatformService; import org.mifosplatform.useradministration.service.PermissionWritePlatformService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.google.gson.JsonElement;
@Service @Service
public class PermissionsCommandHandler implements CommandSourceHandler { public class PermissionsCommandHandler implements CommandSourceHandler {
private final PlatformSecurityContext context; private final PlatformSecurityContext context;
private final PermissionsCommandFromCommandJsonDeserializer commandFromCommandJsonDeserializer; private final FromJsonHelper fromApiJsonHelper;
private final ExcludeNothingWithPrettyPrintingOffJsonSerializerGoogleGson toApiJsonSerializer;
private final PermissionWritePlatformService permissionWritePlatformService; private final PermissionWritePlatformService permissionWritePlatformService;
@Autowired @Autowired
public PermissionsCommandHandler(final PlatformSecurityContext context, public PermissionsCommandHandler(final PlatformSecurityContext context,
final PermissionsCommandFromCommandJsonDeserializer commandFromCommandJsonDeserializer, final FromJsonHelper fromApiJsonHelper,
final ExcludeNothingWithPrettyPrintingOffJsonSerializerGoogleGson toApiJsonSerializer,
final PermissionWritePlatformService permissionWritePlatformService) { final PermissionWritePlatformService permissionWritePlatformService) {
this.context = context; this.context = context;
this.commandFromCommandJsonDeserializer = commandFromCommandJsonDeserializer; this.fromApiJsonHelper = fromApiJsonHelper;
this.toApiJsonSerializer = toApiJsonSerializer;
this.permissionWritePlatformService = permissionWritePlatformService; this.permissionWritePlatformService = permissionWritePlatformService;
} }
@@ -37,15 +44,18 @@ public class PermissionsCommandHandler implements CommandSourceHandler {
final AppUser maker = context.authenticatedUser(); final AppUser maker = context.authenticatedUser();
final LocalDate asToday = new LocalDate(); final LocalDate asToday = new LocalDate();
final JsonElement parsedCommand = this.fromApiJsonHelper.parse(commandSource.json());
final JsonCommand command = JsonCommand.from(commandSource.json(), parsedCommand, this.fromApiJsonHelper);
CommandSource commandSourceResult = commandSource.copy(); CommandSource commandSourceResult = commandSource.copy();
if (commandSource.isUpdate()) { if (commandSource.isUpdate()) {
try { try {
final PermissionsCommand command = this.commandFromCommandJsonDeserializer.commandFromCommandJson( EntityIdentifier result = this.permissionWritePlatformService.updateMakerCheckerPermissions(command);
commandSource.resourceId(), commandSource.json());
this.permissionWritePlatformService.updateMakerCheckerPermissions(command);
final String jsonOfChangesOnly = toApiJsonSerializer.serialize(result.getChanges());
commandSourceResult.updateJsonTo(jsonOfChangesOnly);
commandSourceResult.markAsChecked(maker, asToday); commandSourceResult.markAsChecked(maker, asToday);
} catch (RollbackTransactionAsCommandIsNotApprovedByCheckerException e) { } catch (RollbackTransactionAsCommandIsNotApprovedByCheckerException e) {
// swallow this rollback transaction by design // swallow this rollback transaction by design
@@ -62,15 +72,19 @@ public class PermissionsCommandHandler implements CommandSourceHandler {
final AppUser checker = context.authenticatedUser(); final AppUser checker = context.authenticatedUser();
final JsonElement parsedCommand = this.fromApiJsonHelper.parse(commandSourceResult.json());
final JsonCommand command = JsonCommand.withMakerCheckerApproval(commandSourceResult.json(), parsedCommand, this.fromApiJsonHelper);
if (commandSourceResult.isUpdate()) { if (commandSourceResult.isUpdate()) {
final List<String> allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "USER_ADMINISTRATION_SUPER_USER", final List<String> allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "USER_ADMINISTRATION_SUPER_USER",
"UPDATE_PERMISSION_CHECKER"); "UPDATE_PERMISSION_CHECKER");
context.authenticatedUser().validateHasPermissionTo("UPDATE_PERMISSION_CHECKER", allowedPermissions); context.authenticatedUser().validateHasPermissionTo("UPDATE_PERMISSION_CHECKER", allowedPermissions);
final PermissionsCommand command = this.commandFromCommandJsonDeserializer.commandFromCommandJson( EntityIdentifier result = this.permissionWritePlatformService.updateMakerCheckerPermissions(command);
commandSourceResult.resourceId(), commandSourceResult.json(), true);
final String jsonOfChangesOnly = toApiJsonSerializer.serialize(result.getChanges());
this.permissionWritePlatformService.updateMakerCheckerPermissions(command); commandSourceResult.updateJsonTo(jsonOfChangesOnly);
commandSourceResult.markAsChecked(checker, new LocalDate()); commandSourceResult.markAsChecked(checker, new LocalDate());
} else { } else {
throw new UnsupportedCommandException(commandSourceResult.commandName()); throw new UnsupportedCommandException(commandSourceResult.commandName());
@@ -6,33 +6,40 @@ import java.util.List;
import org.joda.time.LocalDate; import org.joda.time.LocalDate;
import org.mifosplatform.commands.domain.CommandSource; import org.mifosplatform.commands.domain.CommandSource;
import org.mifosplatform.commands.exception.UnsupportedCommandException; import org.mifosplatform.commands.exception.UnsupportedCommandException;
import org.mifosplatform.infrastructure.core.api.JsonCommand;
import org.mifosplatform.infrastructure.core.data.EntityIdentifier;
import org.mifosplatform.infrastructure.core.serialization.ExcludeNothingWithPrettyPrintingOffJsonSerializerGoogleGson;
import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper;
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
import org.mifosplatform.portfolio.client.service.RollbackTransactionAsCommandIsNotApprovedByCheckerException; import org.mifosplatform.portfolio.client.service.RollbackTransactionAsCommandIsNotApprovedByCheckerException;
import org.mifosplatform.useradministration.command.RoleCommand; import org.mifosplatform.useradministration.command.RoleCommand;
import org.mifosplatform.useradministration.command.RolePermissionCommand;
import org.mifosplatform.useradministration.domain.AppUser; import org.mifosplatform.useradministration.domain.AppUser;
import org.mifosplatform.useradministration.serialization.RoleCommandFromCommandJsonDeserializer; import org.mifosplatform.useradministration.serialization.RoleCommandFromCommandJsonDeserializer;
import org.mifosplatform.useradministration.serialization.RolePermissionsCommandFromCommandJsonDeserializer;
import org.mifosplatform.useradministration.service.RoleWritePlatformService; import org.mifosplatform.useradministration.service.RoleWritePlatformService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import com.google.gson.JsonElement;
@Service @Service
public class RoleCommandHandler implements CommandSourceHandler { public class RoleCommandHandler implements CommandSourceHandler {
private final PlatformSecurityContext context; private final PlatformSecurityContext context;
private final RoleWritePlatformService writePlatformService; private final RoleWritePlatformService writePlatformService;
private final RoleCommandFromCommandJsonDeserializer commandFromCommandJsonDeserializer; private final RoleCommandFromCommandJsonDeserializer commandFromCommandJsonDeserializer;
private final RolePermissionsCommandFromCommandJsonDeserializer permissionsCommandFromCommandJsonDeserializer; private final FromJsonHelper fromApiJsonHelper;
private final ExcludeNothingWithPrettyPrintingOffJsonSerializerGoogleGson toApiJsonSerializer;
@Autowired @Autowired
public RoleCommandHandler(final PlatformSecurityContext context, public RoleCommandHandler(final PlatformSecurityContext context,
final RoleCommandFromCommandJsonDeserializer commandFromCommandJsonDeserializer, final RoleCommandFromCommandJsonDeserializer commandFromCommandJsonDeserializer,
final RolePermissionsCommandFromCommandJsonDeserializer permissionsCommandFromCommandJsonDeserializer, final FromJsonHelper fromApiJsonHelper,
final ExcludeNothingWithPrettyPrintingOffJsonSerializerGoogleGson toApiJsonSerializer,
final RoleWritePlatformService writePlatformService) { final RoleWritePlatformService writePlatformService) {
this.context = context; this.context = context;
this.commandFromCommandJsonDeserializer = commandFromCommandJsonDeserializer; this.commandFromCommandJsonDeserializer = commandFromCommandJsonDeserializer;
this.permissionsCommandFromCommandJsonDeserializer = permissionsCommandFromCommandJsonDeserializer; this.fromApiJsonHelper = fromApiJsonHelper;
this.toApiJsonSerializer = toApiJsonSerializer;
this.writePlatformService = writePlatformService; this.writePlatformService = writePlatformService;
} }
@@ -72,10 +79,14 @@ public class RoleCommandHandler implements CommandSourceHandler {
} }
} else if (commandSource.isUpdateRolePermissions()) { } else if (commandSource.isUpdateRolePermissions()) {
try { try {
final RolePermissionCommand command = this.permissionsCommandFromCommandJsonDeserializer.commandFromCommandJson(
resourceId, commandSource.json()); final JsonElement parsedCommand = this.fromApiJsonHelper.parse(commandSource.json());
final JsonCommand command = JsonCommand.from(commandSource.json(), parsedCommand, this.fromApiJsonHelper);
newResourceId = this.writePlatformService.updateRolePermissions(command);
EntityIdentifier result = this.writePlatformService.updateRolePermissions(resourceId, command);
final String jsonOfChangesOnly = toApiJsonSerializer.serialize(result.getChanges());
commandSourceResult.updateJsonTo(jsonOfChangesOnly);
commandSourceResult.markAsChecked(maker, asToday); commandSourceResult.markAsChecked(maker, asToday);
} catch (RollbackTransactionAsCommandIsNotApprovedByCheckerException e) { } catch (RollbackTransactionAsCommandIsNotApprovedByCheckerException e) {
@@ -117,10 +128,14 @@ public class RoleCommandHandler implements CommandSourceHandler {
"PERMISSIONS_ROLE_CHECKER"); "PERMISSIONS_ROLE_CHECKER");
context.authenticatedUser().validateHasPermissionTo("PERMISSIONS_ROLE_CHECKER", allowedPermissions); context.authenticatedUser().validateHasPermissionTo("PERMISSIONS_ROLE_CHECKER", allowedPermissions);
final RolePermissionCommand command = this.permissionsCommandFromCommandJsonDeserializer.commandFromCommandJson(resourceId, final JsonElement parsedCommand = this.fromApiJsonHelper.parse(commandSourceResult.json());
commandSourceResult.json()); final JsonCommand command = JsonCommand.from(commandSourceResult.json(), parsedCommand, this.fromApiJsonHelper);
resourceId = this.writePlatformService.updateRolePermissions(command); EntityIdentifier result = this.writePlatformService.updateRolePermissions(resourceId, command);
final String jsonOfChangesOnly = toApiJsonSerializer.serialize(result.getChanges());
commandSourceResult.updateJsonTo(jsonOfChangesOnly);
commandSourceResult.markAsChecked(checker, new LocalDate()); commandSourceResult.markAsChecked(checker, new LocalDate());
} else if (commandSourceResult.isDelete()) { throw new UnsupportedCommandException(commandSourceResult.commandName()); } } else if (commandSourceResult.isDelete()) { throw new UnsupportedCommandException(commandSourceResult.commandName()); }
@@ -1,10 +1,14 @@
package org.mifosplatform.infrastructure.core.api; package org.mifosplatform.infrastructure.core.api;
import java.lang.reflect.Type;
import java.util.Map;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.joda.time.LocalDate; import org.joda.time.LocalDate;
import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper; import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper;
import com.google.gson.JsonElement; import com.google.gson.JsonElement;
import com.google.gson.reflect.TypeToken;
/** /**
* Immutable representation of a command. * Immutable representation of a command.
@@ -91,6 +95,16 @@ public final class JsonCommand {
public String locale() { public String locale() {
return stringValueOfParameterNamed("locale"); return stringValueOfParameterNamed("locale");
} }
public Map<String, Boolean> mapValueOfParameterNamed(final String parameterName) {
final Type typeOfMap = new TypeToken<Map<String, Boolean>>() {}.getType();
if (parsedCommand.getAsJsonObject().has(parameterName)) {
parsedCommand.getAsJsonObject().get(parameterName);
}
return this.fromApiJsonHelper.extractMap(typeOfMap, jsonCommand);
}
public boolean isChangeInLongParameterNamed(final String parameterName, final Long existingValue) { public boolean isChangeInLongParameterNamed(final String parameterName, final Long existingValue) {
boolean isChanged = false; boolean isChanged = false;
@@ -24,8 +24,8 @@ public class EntityIdentifier {
return new EntityIdentifier(resourceId, makerCheckerId, null); return new EntityIdentifier(resourceId, makerCheckerId, null);
} }
public static EntityIdentifier withChanges(final Long resourceId, final Map<String, Object> changesOnly) { public static EntityIdentifier withChanges(final Long resourceId, final Map<String, Object> changes) {
return new EntityIdentifier(resourceId, null, changesOnly); return new EntityIdentifier(resourceId, null, changes);
} }
public EntityIdentifier() { public EntityIdentifier() {
@@ -22,7 +22,6 @@ import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSeriali
import org.mifosplatform.infrastructure.core.serialization.DefaultToApiJsonSerializer; import org.mifosplatform.infrastructure.core.serialization.DefaultToApiJsonSerializer;
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
import org.mifosplatform.useradministration.data.PermissionUsageData; import org.mifosplatform.useradministration.data.PermissionUsageData;
import org.mifosplatform.useradministration.serialization.PermissionsCommandFromApiJsonDeserializer;
import org.mifosplatform.useradministration.service.PermissionReadPlatformService; import org.mifosplatform.useradministration.service.PermissionReadPlatformService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope; import org.springframework.context.annotation.Scope;
@@ -39,20 +38,17 @@ public class PermissionsApiResource {
private final PlatformSecurityContext context; private final PlatformSecurityContext context;
private final PermissionReadPlatformService permissionReadPlatformService; private final PermissionReadPlatformService permissionReadPlatformService;
private final PermissionsCommandFromApiJsonDeserializer fromApiJsonDeserializer;
private final DefaultToApiJsonSerializer<PermissionUsageData> toApiJsonSerializer; private final DefaultToApiJsonSerializer<PermissionUsageData> toApiJsonSerializer;
private final ApiRequestParameterHelper apiRequestParameterHelper; private final ApiRequestParameterHelper apiRequestParameterHelper;
private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService; private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService;
@Autowired @Autowired
public PermissionsApiResource(final PlatformSecurityContext context, final PermissionReadPlatformService readPlatformService, public PermissionsApiResource(final PlatformSecurityContext context, final PermissionReadPlatformService readPlatformService,
final PermissionsCommandFromApiJsonDeserializer fromApiJsonDeserializer,
final DefaultToApiJsonSerializer<PermissionUsageData> toApiJsonSerializer, final DefaultToApiJsonSerializer<PermissionUsageData> toApiJsonSerializer,
final ApiRequestParameterHelper apiRequestParameterHelper, final ApiRequestParameterHelper apiRequestParameterHelper,
final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService) { final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService) {
this.context = context; this.context = context;
this.permissionReadPlatformService = readPlatformService; this.permissionReadPlatformService = readPlatformService;
this.fromApiJsonDeserializer = fromApiJsonDeserializer;
this.toApiJsonSerializer = toApiJsonSerializer; this.toApiJsonSerializer = toApiJsonSerializer;
this.apiRequestParameterHelper = apiRequestParameterHelper; this.apiRequestParameterHelper = apiRequestParameterHelper;
this.commandsSourceWritePlatformService = commandsSourceWritePlatformService; this.commandsSourceWritePlatformService = commandsSourceWritePlatformService;
@@ -85,10 +81,8 @@ public class PermissionsApiResource {
final List<String> allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "USER_ADMINISTRATION_SUPER_USER", "UPDATE_PERMISSION"); final List<String> allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "USER_ADMINISTRATION_SUPER_USER", "UPDATE_PERMISSION");
context.authenticatedUser().validateHasPermissionTo("UPDATE_PERMISSION", allowedPermissions); context.authenticatedUser().validateHasPermissionTo("UPDATE_PERMISSION", allowedPermissions);
final String commandSerializedAsJson = this.fromApiJsonDeserializer.serializedCommandJsonFromApiJson(apiRequestBodyAsJson);
final EntityIdentifier result = this.commandsSourceWritePlatformService.logCommandSource("UPDATE", "permissions", null, final EntityIdentifier result = this.commandsSourceWritePlatformService.logCommandSource("UPDATE", "permissions", null,
commandSerializedAsJson); apiRequestBodyAsJson);
return this.toApiJsonSerializer.serialize(result); return this.toApiJsonSerializer.serialize(result);
} }
@@ -1,6 +1,5 @@
package org.mifosplatform.useradministration.api; package org.mifosplatform.useradministration.api;
import java.util.ArrayList;
import java.util.Arrays; import java.util.Arrays;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
@@ -28,12 +27,10 @@ import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSeriali
import org.mifosplatform.infrastructure.core.serialization.DefaultToApiJsonSerializer; import org.mifosplatform.infrastructure.core.serialization.DefaultToApiJsonSerializer;
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
import org.mifosplatform.useradministration.command.RoleCommand; import org.mifosplatform.useradministration.command.RoleCommand;
import org.mifosplatform.useradministration.command.RolePermissionCommand;
import org.mifosplatform.useradministration.data.PermissionUsageData; import org.mifosplatform.useradministration.data.PermissionUsageData;
import org.mifosplatform.useradministration.data.RoleData; import org.mifosplatform.useradministration.data.RoleData;
import org.mifosplatform.useradministration.data.RolePermissionsData; import org.mifosplatform.useradministration.data.RolePermissionsData;
import org.mifosplatform.useradministration.serialization.RoleCommandFromApiJsonDeserializer; import org.mifosplatform.useradministration.serialization.RoleCommandFromApiJsonDeserializer;
import org.mifosplatform.useradministration.serialization.RolePermissionsCommandFromApiJsonDeserializer;
import org.mifosplatform.useradministration.service.PermissionReadPlatformService; import org.mifosplatform.useradministration.service.PermissionReadPlatformService;
import org.mifosplatform.useradministration.service.RoleReadPlatformService; import org.mifosplatform.useradministration.service.RoleReadPlatformService;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@@ -62,10 +59,8 @@ public class RolesApiResource {
private final PlatformSecurityContext context; private final PlatformSecurityContext context;
private final RoleReadPlatformService roleReadPlatformService; private final RoleReadPlatformService roleReadPlatformService;
private final PermissionReadPlatformService permissionReadPlatformService; private final PermissionReadPlatformService permissionReadPlatformService;
private final RoleCommandFromApiJsonDeserializer fromApiJsonDeserializer; private final RoleCommandFromApiJsonDeserializer fromApiJsonDeserializer;
private final DefaultToApiJsonSerializer<RoleData> toApiJsonSerializer; private final DefaultToApiJsonSerializer<RoleData> toApiJsonSerializer;
private final RolePermissionsCommandFromApiJsonDeserializer permissionsfromApiJsonDeserializer;
private final DefaultToApiJsonSerializer<RolePermissionsData> permissionsToApiJsonSerializer; private final DefaultToApiJsonSerializer<RolePermissionsData> permissionsToApiJsonSerializer;
private final ApiRequestParameterHelper apiRequestParameterHelper; private final ApiRequestParameterHelper apiRequestParameterHelper;
private final PortfolioCommandsReadPlatformService commandSourceReadPlatformService; private final PortfolioCommandsReadPlatformService commandSourceReadPlatformService;
@@ -75,7 +70,6 @@ public class RolesApiResource {
public RolesApiResource(final PlatformSecurityContext context, final RoleReadPlatformService readPlatformService, public RolesApiResource(final PlatformSecurityContext context, final RoleReadPlatformService readPlatformService,
final PermissionReadPlatformService permissionReadPlatformService, final PermissionReadPlatformService permissionReadPlatformService,
final RoleCommandFromApiJsonDeserializer fromApiJsonDeserializer, final RoleCommandFromApiJsonDeserializer fromApiJsonDeserializer,
final RolePermissionsCommandFromApiJsonDeserializer permissionsfromApiJsonDeserializer,
final DefaultToApiJsonSerializer<RoleData> toApiJsonSerializer, final DefaultToApiJsonSerializer<RoleData> toApiJsonSerializer,
final DefaultToApiJsonSerializer<RolePermissionsData> permissionsToApiJsonSerializer, final DefaultToApiJsonSerializer<RolePermissionsData> permissionsToApiJsonSerializer,
final ApiRequestParameterHelper apiRequestParameterHelper, final ApiRequestParameterHelper apiRequestParameterHelper,
@@ -85,7 +79,6 @@ public class RolesApiResource {
this.roleReadPlatformService = readPlatformService; this.roleReadPlatformService = readPlatformService;
this.permissionReadPlatformService = permissionReadPlatformService; this.permissionReadPlatformService = permissionReadPlatformService;
this.fromApiJsonDeserializer = fromApiJsonDeserializer; this.fromApiJsonDeserializer = fromApiJsonDeserializer;
this.permissionsfromApiJsonDeserializer = permissionsfromApiJsonDeserializer;
this.toApiJsonSerializer = toApiJsonSerializer; this.toApiJsonSerializer = toApiJsonSerializer;
this.permissionsToApiJsonSerializer = permissionsToApiJsonSerializer; this.permissionsToApiJsonSerializer = permissionsToApiJsonSerializer;
this.apiRequestParameterHelper = apiRequestParameterHelper; this.apiRequestParameterHelper = apiRequestParameterHelper;
@@ -182,35 +175,11 @@ public class RolesApiResource {
final RoleData role = this.roleReadPlatformService.retrieveRole(roleId); final RoleData role = this.roleReadPlatformService.retrieveRole(roleId);
final Collection<PermissionUsageData> permissionUsageData = this.permissionReadPlatformService.retrieveAllRolePermissions(roleId); final Collection<PermissionUsageData> permissionUsageData = this.permissionReadPlatformService.retrieveAllRolePermissions(roleId);
Collection<PermissionUsageData> currentChanges = null; Collection<PermissionUsageData> currentChanges = null;
if (settings.isCommandIdPassed()) {
currentChanges = handleRequestToIntegrateProposedChangesFromCommand(roleId, settings.getCommandId());
}
final RolePermissionsData permissionsData = role.toRolePermissionData(permissionUsageData, currentChanges); final RolePermissionsData permissionsData = role.toRolePermissionData(permissionUsageData, currentChanges);
return this.permissionsToApiJsonSerializer.serialize(settings, permissionsData, PERMISSIONS_RESPONSE_DATA_PARAMETERS); return this.permissionsToApiJsonSerializer.serialize(settings, permissionsData, PERMISSIONS_RESPONSE_DATA_PARAMETERS);
} }
private Collection<PermissionUsageData> handleRequestToIntegrateProposedChangesFromCommand(final Long roleId, final Long commandId) {
final CommandSourceData entry = this.commandSourceReadPlatformService.retrieveById(commandId);
return assemblePermissionChanges(roleId, entry);
}
private Collection<PermissionUsageData> assemblePermissionChanges(final Long roleId, final CommandSourceData entry) {
final RolePermissionCommand changesOnly = this.permissionsfromApiJsonDeserializer.commandFromApiJson(roleId, entry.json());
// assemble map of string/booleans into PermissionUsageData
Collection<PermissionUsageData> proposedChanges = new ArrayList<PermissionUsageData>();
for (final String permissionCode : changesOnly.getPermissions().keySet()) {
final boolean isSelected = changesOnly.getPermissions().get(permissionCode).booleanValue();
final PermissionUsageData item = PermissionUsageData.from(permissionCode, isSelected);
proposedChanges.add(item);
}
return proposedChanges;
}
@PUT @PUT
@Path("{roleId}/permissions") @Path("{roleId}/permissions")
@Consumes({ MediaType.APPLICATION_JSON }) @Consumes({ MediaType.APPLICATION_JSON })
@@ -220,11 +189,8 @@ public class RolesApiResource {
final List<String> allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "USER_ADMINISTRATION_SUPER_USER", "PERMISSIONS_ROLE"); final List<String> allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "USER_ADMINISTRATION_SUPER_USER", "PERMISSIONS_ROLE");
context.authenticatedUser().validateHasPermissionTo("PERMISSIONS_ROLE", allowedPermissions); context.authenticatedUser().validateHasPermissionTo("PERMISSIONS_ROLE", allowedPermissions);
final String commandSerializedAsJson = this.permissionsfromApiJsonDeserializer
.serializedCommandJsonFromApiJson(apiRequestBodyAsJson);
final EntityIdentifier result = this.commandsSourceWritePlatformService.logCommandSource("UPDATEPERMISSIONS", "roles", roleId, final EntityIdentifier result = this.commandsSourceWritePlatformService.logCommandSource("UPDATEPERMISSIONS", "roles", roleId,
commandSerializedAsJson); apiRequestBodyAsJson);
return this.toApiJsonSerializer.serialize(result); return this.toApiJsonSerializer.serialize(result);
} }
@@ -8,18 +8,12 @@ import java.util.Map;
public class PermissionsCommand { public class PermissionsCommand {
private final Map<String, Boolean> permissions; private final Map<String, Boolean> permissions;
private final transient boolean makerCheckerApproval;
public PermissionsCommand(final Map<String, Boolean> permissionsMap, final boolean makerCheckerApproval) { public PermissionsCommand(final Map<String, Boolean> permissionsMap) {
this.permissions = permissionsMap; this.permissions = permissionsMap;
this.makerCheckerApproval = makerCheckerApproval;
} }
public Map<String, Boolean> getPermissions() { public Map<String, Boolean> getPermissions() {
return this.permissions; return this.permissions;
} }
public boolean isApprovedByChecker() {
return this.makerCheckerApproval;
}
} }
@@ -1,32 +0,0 @@
package org.mifosplatform.useradministration.command;
import java.util.Map;
/**
* Immutable command for updating permissions against a role.
*/
public class RolePermissionCommand {
private final transient Long roleId;
private final Map<String, Boolean> permissions;
private final transient boolean makerCheckerApproval;
public RolePermissionCommand(final Long roleId, final Map<String, Boolean> permissionsMap, final boolean makerCheckerApproval) {
this.roleId = roleId;
this.permissions = permissionsMap;
this.makerCheckerApproval = makerCheckerApproval;
}
public Map<String, Boolean> getPermissions() {
return this.permissions;
}
public Long getRoleId() {
return this.roleId;
}
public boolean isApprovedByChecker() {
return this.makerCheckerApproval;
}
}
@@ -51,7 +51,10 @@ public class Permission extends AbstractPersistable<Long> {
return this.grouping; return this.grouping;
} }
public void enableMakerChecker(final boolean canMakerChecker) { public boolean enableMakerChecker(final boolean canMakerChecker) {
final boolean isUpdatedValueSame = (this.canMakerChecker == canMakerChecker);
this.canMakerChecker = canMakerChecker; this.canMakerChecker = canMakerChecker;
return !isUpdatedValueSame;
} }
} }
@@ -38,7 +38,7 @@ public class Role extends AbstractAuditableCustom<AppUser, Long> {
this.name = name.trim(); this.name = name.trim();
this.description = description.trim(); this.description = description.trim();
} }
public void update(final RoleCommand command) { public void update(final RoleCommand command) {
if (command.isNameChanged()) { if (command.isNameChanged()) {
this.name = command.getName(); this.name = command.getName();
@@ -48,11 +48,11 @@ public class Role extends AbstractAuditableCustom<AppUser, Long> {
this.description = command.getDescription(); this.description = command.getDescription();
} }
} }
public boolean addPermission(final Permission permission) { public boolean addPermission(final Permission permission) {
return this.permissions.add(permission); return this.permissions.add(permission);
} }
public boolean removePermission(final Permission permission) { public boolean removePermission(final Permission permission) {
return this.permissions.remove(permission); return this.permissions.remove(permission);
} }
@@ -75,4 +75,15 @@ public class Role extends AbstractAuditableCustom<AppUser, Long> {
public RoleData toData() { public RoleData toData() {
return new RoleData(this.getId(), this.name, this.description, null); return new RoleData(this.getId(), this.name, this.description, null);
} }
public boolean updatePermission(final Permission permission, final boolean isSelected) {
boolean changed = false;
if (isSelected) {
changed = addPermission(permission);
} else {
changed = removePermission(permission);
}
return changed;
}
} }
@@ -1,8 +1,14 @@
package org.mifosplatform.useradministration.serialization; package org.mifosplatform.useradministration.serialization;
import java.lang.reflect.Type; import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set;
import org.apache.commons.lang.StringUtils;
import org.mifosplatform.infrastructure.core.exception.InvalidJsonException;
import org.mifosplatform.infrastructure.core.serialization.AbstractFromApiJsonDeserializer;
import org.mifosplatform.infrastructure.core.serialization.CommandSerializer; import org.mifosplatform.infrastructure.core.serialization.CommandSerializer;
import org.mifosplatform.infrastructure.core.serialization.FromApiJsonDeserializer; import org.mifosplatform.infrastructure.core.serialization.FromApiJsonDeserializer;
import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper; import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper;
@@ -17,41 +23,29 @@ import com.google.gson.reflect.TypeToken;
* {@link PermissionsCommand}'s. * {@link PermissionsCommand}'s.
*/ */
@Component @Component
public final class PermissionsCommandFromApiJsonDeserializer implements FromApiJsonDeserializer<PermissionsCommand> { public final class PermissionsCommandFromApiJsonDeserializer extends AbstractFromApiJsonDeserializer<PermissionsCommand> {
/**
* The parameters supported for this command.
*/
private final Set<String> supportedParameters = new HashSet<String>(Arrays.asList("permissions"));
private final FromJsonHelper fromApiJsonHelper; private final FromJsonHelper fromApiJsonHelper;
private final CommandSerializer commandSerializerService;
@Autowired @Autowired
public PermissionsCommandFromApiJsonDeserializer(final FromJsonHelper fromApiJsonHelper, public PermissionsCommandFromApiJsonDeserializer(final FromJsonHelper fromApiJsonHelper,
final CommandSerializer commandSerializerService) { final CommandSerializer commandSerializerService) {
super(commandSerializerService);
this.fromApiJsonHelper = fromApiJsonHelper; this.fromApiJsonHelper = fromApiJsonHelper;
this.commandSerializerService = commandSerializerService;
}
@Override
public PermissionsCommand commandFromApiJson(final String json) {
return commandFromApiJson(null, json);
} }
@Override @Override
public PermissionsCommand commandFromApiJson(@SuppressWarnings("unused") final Long resourceId, final String json) { public PermissionsCommand commandFromApiJson(@SuppressWarnings("unused") final Long resourceId, final String json) {
final Type typeOfMap = new TypeToken<Map<String, Boolean>>() {}.getType(); if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); }
final Map<String, Boolean> permissionsMap = fromApiJsonHelper.extractMap(typeOfMap, json);
final Type typeOfMap = new TypeToken<Map<String, Object>>() {}.getType();
return new PermissionsCommand(permissionsMap, false); fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, supportedParameters);
}
return fromApiJsonHelper.fromJson(json, PermissionsCommand.class);
@Override
public String serializedCommandJsonFromApiJson(final String json) {
final PermissionsCommand command = commandFromApiJson(json);
return this.commandSerializerService.serializeCommandToJson(command);
}
@Override
public String serializedCommandJsonFromApiJson(final Long roleId, final String json) {
final PermissionsCommand command = commandFromApiJson(roleId, json);
return this.commandSerializerService.serializeCommandToJson(command);
} }
} }
@@ -1,43 +0,0 @@
package org.mifosplatform.useradministration.serialization;
import org.apache.commons.lang.StringUtils;
import org.mifosplatform.infrastructure.core.exception.InvalidJsonException;
import org.mifosplatform.infrastructure.core.serialization.FromCommandJsonDeserializer;
import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper;
import org.mifosplatform.useradministration.command.PermissionsCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
*
*/
@Component
public final class PermissionsCommandFromCommandJsonDeserializer implements FromCommandJsonDeserializer<PermissionsCommand> {
private final FromJsonHelper fromJsonHelper;
@Autowired
public PermissionsCommandFromCommandJsonDeserializer(final FromJsonHelper fromApiJsonHelper) {
this.fromJsonHelper = fromApiJsonHelper;
}
@Override
public PermissionsCommand commandFromCommandJson(final String commandAsJson) {
return commandFromCommandJson(null, commandAsJson);
}
@Override
public PermissionsCommand commandFromCommandJson(final Long roleId, final String commandAsJson) {
return commandFromCommandJson(roleId, commandAsJson, false);
}
@Override
public PermissionsCommand commandFromCommandJson(@SuppressWarnings("unused") final Long resourceId, final String commandAsJson,
final boolean makerCheckerApproval) {
if (StringUtils.isBlank(commandAsJson)) { throw new InvalidJsonException(); }
final PermissionsCommand command = fromJsonHelper.fromJson(commandAsJson, PermissionsCommand.class);
return new PermissionsCommand(command.getPermissions(), makerCheckerApproval);
}
}
@@ -1,58 +0,0 @@
package org.mifosplatform.useradministration.serialization;
import java.lang.reflect.Type;
import java.util.Map;
import org.mifosplatform.infrastructure.core.serialization.CommandSerializer;
import org.mifosplatform.infrastructure.core.serialization.FromApiJsonDeserializer;
import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper;
import org.mifosplatform.useradministration.command.RoleCommand;
import org.mifosplatform.useradministration.command.RolePermissionCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.google.gson.reflect.TypeToken;
/**
* Implementation of {@link FromApiJsonDeserializer} for {@link RoleCommand}'s.
*/
@Component
public final class RolePermissionsCommandFromApiJsonDeserializer implements FromApiJsonDeserializer<RolePermissionCommand> {
private final FromJsonHelper fromApiJsonHelper;
private final CommandSerializer commandSerializerService;
@Autowired
public RolePermissionsCommandFromApiJsonDeserializer(final FromJsonHelper fromApiJsonHelper,
final CommandSerializer commandSerializerService) {
this.fromApiJsonHelper = fromApiJsonHelper;
this.commandSerializerService = commandSerializerService;
}
@Override
public RolePermissionCommand commandFromApiJson(final String json) {
return commandFromApiJson(null, json);
}
@Override
public RolePermissionCommand commandFromApiJson(final Long roleId, final String json) {
final Type typeOfMap = new TypeToken<Map<String, Boolean>>() {}.getType();
final Map<String, Boolean> permissionsMap = fromApiJsonHelper.extractMap(typeOfMap, json);
return new RolePermissionCommand(roleId, permissionsMap, false);
}
@Override
public String serializedCommandJsonFromApiJson(final String json) {
final RolePermissionCommand command = commandFromApiJson(json);
return this.commandSerializerService.serializeCommandToJson(command);
}
@Override
public String serializedCommandJsonFromApiJson(final Long roleId, final String json) {
final RolePermissionCommand command = commandFromApiJson(roleId, json);
return this.commandSerializerService.serializeCommandToJson(command);
}
}
@@ -1,42 +0,0 @@
package org.mifosplatform.useradministration.serialization;
import org.apache.commons.lang.StringUtils;
import org.mifosplatform.infrastructure.core.exception.InvalidJsonException;
import org.mifosplatform.infrastructure.core.serialization.FromCommandJsonDeserializer;
import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper;
import org.mifosplatform.useradministration.command.RolePermissionCommand;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
*
*/
@Component
public final class RolePermissionsCommandFromCommandJsonDeserializer implements FromCommandJsonDeserializer<RolePermissionCommand> {
private final FromJsonHelper fromJsonHelper;
@Autowired
public RolePermissionsCommandFromCommandJsonDeserializer(final FromJsonHelper fromApiJsonHelper) {
this.fromJsonHelper = fromApiJsonHelper;
}
@Override
public RolePermissionCommand commandFromCommandJson(final String commandAsJson) {
return commandFromCommandJson(null, commandAsJson);
}
@Override
public RolePermissionCommand commandFromCommandJson(final Long roleId, final String commandAsJson) {
return commandFromCommandJson(roleId, commandAsJson, false);
}
@Override
public RolePermissionCommand commandFromCommandJson(final Long roleId, final String commandAsJson, final boolean makerCheckerApproval) {
if (StringUtils.isBlank(commandAsJson)) { throw new InvalidJsonException(); }
final RolePermissionCommand command = fromJsonHelper.fromJson(commandAsJson, RolePermissionCommand.class);
return new RolePermissionCommand(roleId, command.getPermissions(), makerCheckerApproval);
}
}
@@ -1,8 +1,9 @@
package org.mifosplatform.useradministration.service; package org.mifosplatform.useradministration.service;
import org.mifosplatform.useradministration.command.PermissionsCommand; import org.mifosplatform.infrastructure.core.api.JsonCommand;
import org.mifosplatform.infrastructure.core.data.EntityIdentifier;
public interface PermissionWritePlatformService { public interface PermissionWritePlatformService {
void updateMakerCheckerPermissions(PermissionsCommand command); EntityIdentifier updateMakerCheckerPermissions(JsonCommand command);
} }
@@ -1,13 +1,17 @@
package org.mifosplatform.useradministration.service; package org.mifosplatform.useradministration.service;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.mifosplatform.infrastructure.core.api.JsonCommand;
import org.mifosplatform.infrastructure.core.data.EntityIdentifier;
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
import org.mifosplatform.useradministration.command.PermissionsCommand; import org.mifosplatform.useradministration.command.PermissionsCommand;
import org.mifosplatform.useradministration.domain.Permission; import org.mifosplatform.useradministration.domain.Permission;
import org.mifosplatform.useradministration.domain.PermissionRepository; import org.mifosplatform.useradministration.domain.PermissionRepository;
import org.mifosplatform.useradministration.exception.PermissionNotFoundException; import org.mifosplatform.useradministration.exception.PermissionNotFoundException;
import org.mifosplatform.useradministration.serialization.PermissionsCommandFromApiJsonDeserializer;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@@ -17,39 +21,52 @@ public class PermissionWritePlatformServiceJpaRepositoryImpl implements Permissi
private final PlatformSecurityContext context; private final PlatformSecurityContext context;
private final PermissionRepository permissionRepository; private final PermissionRepository permissionRepository;
private final PermissionsCommandFromApiJsonDeserializer fromApiJsonDeserializer;
@Autowired @Autowired
public PermissionWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, public PermissionWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context,
final PermissionRepository permissionRepository) { final PermissionRepository permissionRepository,
final PermissionsCommandFromApiJsonDeserializer fromApiJsonDeserializer) {
this.context = context; this.context = context;
this.permissionRepository = permissionRepository; this.permissionRepository = permissionRepository;
this.fromApiJsonDeserializer = fromApiJsonDeserializer;
} }
@Transactional @Transactional
@Override @Override
public void updateMakerCheckerPermissions(final PermissionsCommand command) { public EntityIdentifier updateMakerCheckerPermissions(final JsonCommand command) {
context.authenticatedUser(); context.authenticatedUser();
final Collection<Permission> allPermissions = this.permissionRepository.findAll(); final Collection<Permission> allPermissions = this.permissionRepository.findAll();
final PermissionsCommand permissionsCommand = this.fromApiJsonDeserializer.commandFromApiJson(command.json());
final Map<String, Boolean> commandPermissions = command.getPermissions(); final Map<String, Boolean> commandPermissions = permissionsCommand.getPermissions();
final Map<String, Object> changes = new HashMap<String, Object>();
final Map<String, Boolean> changedPermissions = new HashMap<String, Boolean>();
for (final String permissionCode : commandPermissions.keySet()) { for (final String permissionCode : commandPermissions.keySet()) {
final Permission permission = findPermissionByCode(allPermissions, permissionCode); final Permission permission = findPermissionInCollectionByCode(allPermissions, permissionCode);
if (permission.getCode().endsWith("_CHECKER") || permission.getCode().startsWith("READ_") if (permission.getCode().endsWith("_CHECKER") || permission.getCode().startsWith("READ_")
|| permission.getGrouping().equalsIgnoreCase("special")) { throw new PermissionNotFoundException(permissionCode); } || permission.getGrouping().equalsIgnoreCase("special")) { throw new PermissionNotFoundException(permissionCode); }
final boolean isSelected = commandPermissions.get(permissionCode).booleanValue(); final boolean isSelected = commandPermissions.get(permissionCode).booleanValue();
permission.enableMakerChecker(isSelected); boolean changed = permission.enableMakerChecker(isSelected);
if (changed) {
this.permissionRepository.save(permission); changedPermissions.put(permissionCode, isSelected);
this.permissionRepository.save(permission);
// Typical rollback if maker-checker enabled not here - does it make sense to have a maker checker task for enabling maker-checker for other tasks? }
} }
if (!changedPermissions.isEmpty()) {
changes.put("permissions", changedPermissions);
}
return EntityIdentifier.withChanges(null, changes);
} }
private Permission findPermissionByCode(Collection<Permission> allPermissions, String permissionCode) { private Permission findPermissionInCollectionByCode(final Collection<Permission> allPermissions, final String permissionCode) {
if (allPermissions != null) { if (allPermissions != null) {
for (Permission permission : allPermissions) { for (Permission permission : allPermissions) {
@@ -1,7 +1,8 @@
package org.mifosplatform.useradministration.service; package org.mifosplatform.useradministration.service;
import org.mifosplatform.infrastructure.core.api.JsonCommand;
import org.mifosplatform.infrastructure.core.data.EntityIdentifier;
import org.mifosplatform.useradministration.command.RoleCommand; import org.mifosplatform.useradministration.command.RoleCommand;
import org.mifosplatform.useradministration.command.RolePermissionCommand;
public interface RoleWritePlatformService { public interface RoleWritePlatformService {
@@ -9,5 +10,5 @@ public interface RoleWritePlatformService {
Long updateRole(RoleCommand command); Long updateRole(RoleCommand command);
Long updateRolePermissions(RolePermissionCommand command); EntityIdentifier updateRolePermissions(Long roleId, JsonCommand command);
} }
@@ -1,19 +1,23 @@
package org.mifosplatform.useradministration.service; package org.mifosplatform.useradministration.service;
import java.util.Collection; import java.util.Collection;
import java.util.HashMap;
import java.util.Map; import java.util.Map;
import org.mifosplatform.infrastructure.core.api.JsonCommand;
import org.mifosplatform.infrastructure.core.data.EntityIdentifier;
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext; import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
import org.mifosplatform.organisation.monetary.service.ConfigurationDomainService; import org.mifosplatform.organisation.monetary.service.ConfigurationDomainService;
import org.mifosplatform.portfolio.client.service.RollbackTransactionAsCommandIsNotApprovedByCheckerException; import org.mifosplatform.portfolio.client.service.RollbackTransactionAsCommandIsNotApprovedByCheckerException;
import org.mifosplatform.useradministration.command.PermissionsCommand;
import org.mifosplatform.useradministration.command.RoleCommand; import org.mifosplatform.useradministration.command.RoleCommand;
import org.mifosplatform.useradministration.command.RolePermissionCommand;
import org.mifosplatform.useradministration.domain.Permission; import org.mifosplatform.useradministration.domain.Permission;
import org.mifosplatform.useradministration.domain.PermissionRepository; import org.mifosplatform.useradministration.domain.PermissionRepository;
import org.mifosplatform.useradministration.domain.Role; import org.mifosplatform.useradministration.domain.Role;
import org.mifosplatform.useradministration.domain.RoleRepository; import org.mifosplatform.useradministration.domain.RoleRepository;
import org.mifosplatform.useradministration.exception.PermissionNotFoundException; import org.mifosplatform.useradministration.exception.PermissionNotFoundException;
import org.mifosplatform.useradministration.exception.RoleNotFoundException; import org.mifosplatform.useradministration.exception.RoleNotFoundException;
import org.mifosplatform.useradministration.serialization.PermissionsCommandFromApiJsonDeserializer;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional; import org.springframework.transaction.annotation.Transactional;
@@ -25,15 +29,18 @@ public class RoleWritePlatformServiceJpaRepositoryImpl implements RoleWritePlatf
private final RoleRepository roleRepository; private final RoleRepository roleRepository;
private final PermissionRepository permissionRepository; private final PermissionRepository permissionRepository;
private final ConfigurationDomainService configurationDomainService; private final ConfigurationDomainService configurationDomainService;
private final PermissionsCommandFromApiJsonDeserializer fromApiJsonDeserializer;
@Autowired @Autowired
public RoleWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, final RoleRepository roleRepository, public RoleWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, final RoleRepository roleRepository,
final PermissionRepository permissionRepository, final PermissionRepository permissionRepository,
final ConfigurationDomainService configurationDomainService) { final ConfigurationDomainService configurationDomainService,
final PermissionsCommandFromApiJsonDeserializer fromApiJsonDeserializer) {
this.context = context; this.context = context;
this.roleRepository = roleRepository; this.roleRepository = roleRepository;
this.permissionRepository = permissionRepository; this.permissionRepository = permissionRepository;
this.configurationDomainService = configurationDomainService; this.configurationDomainService = configurationDomainService;
this.fromApiJsonDeserializer = fromApiJsonDeserializer;
} }
@Transactional @Transactional
@@ -72,31 +79,37 @@ public class RoleWritePlatformServiceJpaRepositoryImpl implements RoleWritePlatf
@Transactional @Transactional
@Override @Override
public Long updateRolePermissions(final RolePermissionCommand command) { public EntityIdentifier updateRolePermissions(final Long roleId, final JsonCommand command) {
context.authenticatedUser(); context.authenticatedUser();
final Role role = this.roleRepository.findOne(command.getRoleId()); final Role role = this.roleRepository.findOne(roleId);
if (role == null) { throw new RoleNotFoundException(command.getRoleId()); } if (role == null) { throw new RoleNotFoundException(roleId); }
final Collection<Permission> allPermissions = this.permissionRepository.findAll(); final Collection<Permission> allPermissions = this.permissionRepository.findAll();
final Map<String, Boolean> commandPermissions = command.getPermissions(); final PermissionsCommand permissionsCommand = this.fromApiJsonDeserializer.commandFromApiJson(command.json());
final Map<String, Boolean> commandPermissions = permissionsCommand.getPermissions();
final Map<String, Object> changes = new HashMap<String, Object>();
final Map<String, Boolean> changedPermissions = new HashMap<String, Boolean>();
for (final String permissionCode : commandPermissions.keySet()) { for (final String permissionCode : commandPermissions.keySet()) {
final boolean isSelected = commandPermissions.get(permissionCode).booleanValue(); final boolean isSelected = commandPermissions.get(permissionCode).booleanValue();
final Permission permission = findPermissionByCode(allPermissions, permissionCode); final Permission permission = findPermissionByCode(allPermissions, permissionCode);
if (isSelected) { boolean changed = role.updatePermission(permission, isSelected);
role.addPermission(permission); if (changed) {
} else { changedPermissions.put(permissionCode, isSelected);
role.removePermission(permission);
} }
} }
this.roleRepository.save(role); if (!changedPermissions.isEmpty()) {
changes.put("permissions", changedPermissions);
this.roleRepository.save(role);
}
if (this.configurationDomainService.isMakerCheckerEnabledForTask("PERMISSIONS_ROLE") && !command.isApprovedByChecker()) { throw new RollbackTransactionAsCommandIsNotApprovedByCheckerException(); } if (this.configurationDomainService.isMakerCheckerEnabledForTask("PERMISSIONS_ROLE") && !command.isApprovedByChecker()) { throw new RollbackTransactionAsCommandIsNotApprovedByCheckerException(); }
return role.getId(); return EntityIdentifier.withChanges(role.getId(), changes);
} }
private Permission findPermissionByCode(Collection<Permission> allPermissions, String permissionCode) { private Permission findPermissionByCode(Collection<Permission> allPermissions, String permissionCode) {