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.mifosplatform.commands.domain.CommandSource;
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.portfolio.client.service.RollbackTransactionAsCommandIsNotApprovedByCheckerException;
import org.mifosplatform.useradministration.command.PermissionsCommand;
import org.mifosplatform.useradministration.domain.AppUser;
import org.mifosplatform.useradministration.serialization.PermissionsCommandFromCommandJsonDeserializer;
import org.mifosplatform.useradministration.service.PermissionWritePlatformService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.google.gson.JsonElement;
@Service
public class PermissionsCommandHandler implements CommandSourceHandler {
private final PlatformSecurityContext context;
private final PermissionsCommandFromCommandJsonDeserializer commandFromCommandJsonDeserializer;
private final FromJsonHelper fromApiJsonHelper;
private final ExcludeNothingWithPrettyPrintingOffJsonSerializerGoogleGson toApiJsonSerializer;
private final PermissionWritePlatformService permissionWritePlatformService;
@Autowired
public PermissionsCommandHandler(final PlatformSecurityContext context,
final PermissionsCommandFromCommandJsonDeserializer commandFromCommandJsonDeserializer,
final FromJsonHelper fromApiJsonHelper,
final ExcludeNothingWithPrettyPrintingOffJsonSerializerGoogleGson toApiJsonSerializer,
final PermissionWritePlatformService permissionWritePlatformService) {
this.context = context;
this.commandFromCommandJsonDeserializer = commandFromCommandJsonDeserializer;
this.fromApiJsonHelper = fromApiJsonHelper;
this.toApiJsonSerializer = toApiJsonSerializer;
this.permissionWritePlatformService = permissionWritePlatformService;
}
@@ -37,15 +44,18 @@ public class PermissionsCommandHandler implements CommandSourceHandler {
final AppUser maker = context.authenticatedUser();
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();
if (commandSource.isUpdate()) {
try {
final PermissionsCommand command = this.commandFromCommandJsonDeserializer.commandFromCommandJson(
commandSource.resourceId(), commandSource.json());
this.permissionWritePlatformService.updateMakerCheckerPermissions(command);
EntityIdentifier result = this.permissionWritePlatformService.updateMakerCheckerPermissions(command);
final String jsonOfChangesOnly = toApiJsonSerializer.serialize(result.getChanges());
commandSourceResult.updateJsonTo(jsonOfChangesOnly);
commandSourceResult.markAsChecked(maker, asToday);
} catch (RollbackTransactionAsCommandIsNotApprovedByCheckerException e) {
// swallow this rollback transaction by design
@@ -62,15 +72,19 @@ public class PermissionsCommandHandler implements CommandSourceHandler {
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()) {
final List<String> allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "USER_ADMINISTRATION_SUPER_USER",
"UPDATE_PERMISSION_CHECKER");
context.authenticatedUser().validateHasPermissionTo("UPDATE_PERMISSION_CHECKER", allowedPermissions);
final PermissionsCommand command = this.commandFromCommandJsonDeserializer.commandFromCommandJson(
commandSourceResult.resourceId(), commandSourceResult.json(), true);
this.permissionWritePlatformService.updateMakerCheckerPermissions(command);
EntityIdentifier result = this.permissionWritePlatformService.updateMakerCheckerPermissions(command);
final String jsonOfChangesOnly = toApiJsonSerializer.serialize(result.getChanges());
commandSourceResult.updateJsonTo(jsonOfChangesOnly);
commandSourceResult.markAsChecked(checker, new LocalDate());
} else {
throw new UnsupportedCommandException(commandSourceResult.commandName());
@@ -6,33 +6,40 @@ import java.util.List;
import org.joda.time.LocalDate;
import org.mifosplatform.commands.domain.CommandSource;
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.portfolio.client.service.RollbackTransactionAsCommandIsNotApprovedByCheckerException;
import org.mifosplatform.useradministration.command.RoleCommand;
import org.mifosplatform.useradministration.command.RolePermissionCommand;
import org.mifosplatform.useradministration.domain.AppUser;
import org.mifosplatform.useradministration.serialization.RoleCommandFromCommandJsonDeserializer;
import org.mifosplatform.useradministration.serialization.RolePermissionsCommandFromCommandJsonDeserializer;
import org.mifosplatform.useradministration.service.RoleWritePlatformService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.google.gson.JsonElement;
@Service
public class RoleCommandHandler implements CommandSourceHandler {
private final PlatformSecurityContext context;
private final RoleWritePlatformService writePlatformService;
private final RoleCommandFromCommandJsonDeserializer commandFromCommandJsonDeserializer;
private final RolePermissionsCommandFromCommandJsonDeserializer permissionsCommandFromCommandJsonDeserializer;
private final FromJsonHelper fromApiJsonHelper;
private final ExcludeNothingWithPrettyPrintingOffJsonSerializerGoogleGson toApiJsonSerializer;
@Autowired
public RoleCommandHandler(final PlatformSecurityContext context,
final RoleCommandFromCommandJsonDeserializer commandFromCommandJsonDeserializer,
final RolePermissionsCommandFromCommandJsonDeserializer permissionsCommandFromCommandJsonDeserializer,
final FromJsonHelper fromApiJsonHelper,
final ExcludeNothingWithPrettyPrintingOffJsonSerializerGoogleGson toApiJsonSerializer,
final RoleWritePlatformService writePlatformService) {
this.context = context;
this.commandFromCommandJsonDeserializer = commandFromCommandJsonDeserializer;
this.permissionsCommandFromCommandJsonDeserializer = permissionsCommandFromCommandJsonDeserializer;
this.fromApiJsonHelper = fromApiJsonHelper;
this.toApiJsonSerializer = toApiJsonSerializer;
this.writePlatformService = writePlatformService;
}
@@ -72,10 +79,14 @@ public class RoleCommandHandler implements CommandSourceHandler {
}
} else if (commandSource.isUpdateRolePermissions()) {
try {
final RolePermissionCommand command = this.permissionsCommandFromCommandJsonDeserializer.commandFromCommandJson(
resourceId, commandSource.json());
newResourceId = this.writePlatformService.updateRolePermissions(command);
final JsonElement parsedCommand = this.fromApiJsonHelper.parse(commandSource.json());
final JsonCommand command = JsonCommand.from(commandSource.json(), parsedCommand, this.fromApiJsonHelper);
EntityIdentifier result = this.writePlatformService.updateRolePermissions(resourceId, command);
final String jsonOfChangesOnly = toApiJsonSerializer.serialize(result.getChanges());
commandSourceResult.updateJsonTo(jsonOfChangesOnly);
commandSourceResult.markAsChecked(maker, asToday);
} catch (RollbackTransactionAsCommandIsNotApprovedByCheckerException e) {
@@ -117,10 +128,14 @@ public class RoleCommandHandler implements CommandSourceHandler {
"PERMISSIONS_ROLE_CHECKER");
context.authenticatedUser().validateHasPermissionTo("PERMISSIONS_ROLE_CHECKER", allowedPermissions);
final RolePermissionCommand command = this.permissionsCommandFromCommandJsonDeserializer.commandFromCommandJson(resourceId,
commandSourceResult.json());
resourceId = this.writePlatformService.updateRolePermissions(command);
final JsonElement parsedCommand = this.fromApiJsonHelper.parse(commandSourceResult.json());
final JsonCommand command = JsonCommand.from(commandSourceResult.json(), parsedCommand, this.fromApiJsonHelper);
EntityIdentifier result = this.writePlatformService.updateRolePermissions(resourceId, command);
final String jsonOfChangesOnly = toApiJsonSerializer.serialize(result.getChanges());
commandSourceResult.updateJsonTo(jsonOfChangesOnly);
commandSourceResult.markAsChecked(checker, new LocalDate());
} else if (commandSourceResult.isDelete()) { throw new UnsupportedCommandException(commandSourceResult.commandName()); }
@@ -1,10 +1,14 @@
package org.mifosplatform.infrastructure.core.api;
import java.lang.reflect.Type;
import java.util.Map;
import org.apache.commons.lang.StringUtils;
import org.joda.time.LocalDate;
import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper;
import com.google.gson.JsonElement;
import com.google.gson.reflect.TypeToken;
/**
* Immutable representation of a command.
@@ -91,6 +95,16 @@ public final class JsonCommand {
public String 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) {
boolean isChanged = false;
@@ -24,8 +24,8 @@ public class EntityIdentifier {
return new EntityIdentifier(resourceId, makerCheckerId, null);
}
public static EntityIdentifier withChanges(final Long resourceId, final Map<String, Object> changesOnly) {
return new EntityIdentifier(resourceId, null, changesOnly);
public static EntityIdentifier withChanges(final Long resourceId, final Map<String, Object> changes) {
return new EntityIdentifier(resourceId, null, changes);
}
public EntityIdentifier() {
@@ -22,7 +22,6 @@ import org.mifosplatform.infrastructure.core.serialization.ApiRequestJsonSeriali
import org.mifosplatform.infrastructure.core.serialization.DefaultToApiJsonSerializer;
import org.mifosplatform.infrastructure.security.service.PlatformSecurityContext;
import org.mifosplatform.useradministration.data.PermissionUsageData;
import org.mifosplatform.useradministration.serialization.PermissionsCommandFromApiJsonDeserializer;
import org.mifosplatform.useradministration.service.PermissionReadPlatformService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
@@ -39,20 +38,17 @@ public class PermissionsApiResource {
private final PlatformSecurityContext context;
private final PermissionReadPlatformService permissionReadPlatformService;
private final PermissionsCommandFromApiJsonDeserializer fromApiJsonDeserializer;
private final DefaultToApiJsonSerializer<PermissionUsageData> toApiJsonSerializer;
private final ApiRequestParameterHelper apiRequestParameterHelper;
private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService;
@Autowired
public PermissionsApiResource(final PlatformSecurityContext context, final PermissionReadPlatformService readPlatformService,
final PermissionsCommandFromApiJsonDeserializer fromApiJsonDeserializer,
final DefaultToApiJsonSerializer<PermissionUsageData> toApiJsonSerializer,
final ApiRequestParameterHelper apiRequestParameterHelper,
final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService) {
this.context = context;
this.permissionReadPlatformService = readPlatformService;
this.fromApiJsonDeserializer = fromApiJsonDeserializer;
this.toApiJsonSerializer = toApiJsonSerializer;
this.apiRequestParameterHelper = apiRequestParameterHelper;
this.commandsSourceWritePlatformService = commandsSourceWritePlatformService;
@@ -85,10 +81,8 @@ public class PermissionsApiResource {
final List<String> allowedPermissions = Arrays.asList("ALL_FUNCTIONS", "USER_ADMINISTRATION_SUPER_USER", "UPDATE_PERMISSION");
context.authenticatedUser().validateHasPermissionTo("UPDATE_PERMISSION", allowedPermissions);
final String commandSerializedAsJson = this.fromApiJsonDeserializer.serializedCommandJsonFromApiJson(apiRequestBodyAsJson);
final EntityIdentifier result = this.commandsSourceWritePlatformService.logCommandSource("UPDATE", "permissions", null,
commandSerializedAsJson);
apiRequestBodyAsJson);
return this.toApiJsonSerializer.serialize(result);
}
@@ -1,6 +1,5 @@
package org.mifosplatform.useradministration.api;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
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.security.service.PlatformSecurityContext;
import org.mifosplatform.useradministration.command.RoleCommand;
import org.mifosplatform.useradministration.command.RolePermissionCommand;
import org.mifosplatform.useradministration.data.PermissionUsageData;
import org.mifosplatform.useradministration.data.RoleData;
import org.mifosplatform.useradministration.data.RolePermissionsData;
import org.mifosplatform.useradministration.serialization.RoleCommandFromApiJsonDeserializer;
import org.mifosplatform.useradministration.serialization.RolePermissionsCommandFromApiJsonDeserializer;
import org.mifosplatform.useradministration.service.PermissionReadPlatformService;
import org.mifosplatform.useradministration.service.RoleReadPlatformService;
import org.springframework.beans.factory.annotation.Autowired;
@@ -62,10 +59,8 @@ public class RolesApiResource {
private final PlatformSecurityContext context;
private final RoleReadPlatformService roleReadPlatformService;
private final PermissionReadPlatformService permissionReadPlatformService;
private final RoleCommandFromApiJsonDeserializer fromApiJsonDeserializer;
private final DefaultToApiJsonSerializer<RoleData> toApiJsonSerializer;
private final RolePermissionsCommandFromApiJsonDeserializer permissionsfromApiJsonDeserializer;
private final DefaultToApiJsonSerializer<RolePermissionsData> permissionsToApiJsonSerializer;
private final ApiRequestParameterHelper apiRequestParameterHelper;
private final PortfolioCommandsReadPlatformService commandSourceReadPlatformService;
@@ -75,7 +70,6 @@ public class RolesApiResource {
public RolesApiResource(final PlatformSecurityContext context, final RoleReadPlatformService readPlatformService,
final PermissionReadPlatformService permissionReadPlatformService,
final RoleCommandFromApiJsonDeserializer fromApiJsonDeserializer,
final RolePermissionsCommandFromApiJsonDeserializer permissionsfromApiJsonDeserializer,
final DefaultToApiJsonSerializer<RoleData> toApiJsonSerializer,
final DefaultToApiJsonSerializer<RolePermissionsData> permissionsToApiJsonSerializer,
final ApiRequestParameterHelper apiRequestParameterHelper,
@@ -85,7 +79,6 @@ public class RolesApiResource {
this.roleReadPlatformService = readPlatformService;
this.permissionReadPlatformService = permissionReadPlatformService;
this.fromApiJsonDeserializer = fromApiJsonDeserializer;
this.permissionsfromApiJsonDeserializer = permissionsfromApiJsonDeserializer;
this.toApiJsonSerializer = toApiJsonSerializer;
this.permissionsToApiJsonSerializer = permissionsToApiJsonSerializer;
this.apiRequestParameterHelper = apiRequestParameterHelper;
@@ -182,35 +175,11 @@ public class RolesApiResource {
final RoleData role = this.roleReadPlatformService.retrieveRole(roleId);
final Collection<PermissionUsageData> permissionUsageData = this.permissionReadPlatformService.retrieveAllRolePermissions(roleId);
Collection<PermissionUsageData> currentChanges = null;
if (settings.isCommandIdPassed()) {
currentChanges = handleRequestToIntegrateProposedChangesFromCommand(roleId, settings.getCommandId());
}
final RolePermissionsData permissionsData = role.toRolePermissionData(permissionUsageData, currentChanges);
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
@Path("{roleId}/permissions")
@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");
context.authenticatedUser().validateHasPermissionTo("PERMISSIONS_ROLE", allowedPermissions);
final String commandSerializedAsJson = this.permissionsfromApiJsonDeserializer
.serializedCommandJsonFromApiJson(apiRequestBodyAsJson);
final EntityIdentifier result = this.commandsSourceWritePlatformService.logCommandSource("UPDATEPERMISSIONS", "roles", roleId,
commandSerializedAsJson);
apiRequestBodyAsJson);
return this.toApiJsonSerializer.serialize(result);
}
@@ -8,18 +8,12 @@ import java.util.Map;
public class PermissionsCommand {
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.makerCheckerApproval = makerCheckerApproval;
}
public Map<String, Boolean> getPermissions() {
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;
}
public void enableMakerChecker(final boolean canMakerChecker) {
public boolean enableMakerChecker(final boolean canMakerChecker) {
final boolean isUpdatedValueSame = (this.canMakerChecker == canMakerChecker);
this.canMakerChecker = canMakerChecker;
return !isUpdatedValueSame;
}
}
@@ -38,7 +38,7 @@ public class Role extends AbstractAuditableCustom<AppUser, Long> {
this.name = name.trim();
this.description = description.trim();
}
public void update(final RoleCommand command) {
if (command.isNameChanged()) {
this.name = command.getName();
@@ -48,11 +48,11 @@ public class Role extends AbstractAuditableCustom<AppUser, Long> {
this.description = command.getDescription();
}
}
public boolean addPermission(final Permission permission) {
return this.permissions.add(permission);
}
public boolean removePermission(final Permission permission) {
return this.permissions.remove(permission);
}
@@ -75,4 +75,15 @@ public class Role extends AbstractAuditableCustom<AppUser, Long> {
public RoleData toData() {
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;
import java.lang.reflect.Type;
import java.util.Arrays;
import java.util.HashSet;
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.FromApiJsonDeserializer;
import org.mifosplatform.infrastructure.core.serialization.FromJsonHelper;
@@ -17,41 +23,29 @@ import com.google.gson.reflect.TypeToken;
* {@link PermissionsCommand}'s.
*/
@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 CommandSerializer commandSerializerService;
@Autowired
public PermissionsCommandFromApiJsonDeserializer(final FromJsonHelper fromApiJsonHelper,
final CommandSerializer commandSerializerService) {
super(commandSerializerService);
this.fromApiJsonHelper = fromApiJsonHelper;
this.commandSerializerService = commandSerializerService;
}
@Override
public PermissionsCommand commandFromApiJson(final String json) {
return commandFromApiJson(null, json);
}
@Override
public PermissionsCommand commandFromApiJson(@SuppressWarnings("unused") final Long resourceId, final String json) {
final Type typeOfMap = new TypeToken<Map<String, Boolean>>() {}.getType();
final Map<String, Boolean> permissionsMap = fromApiJsonHelper.extractMap(typeOfMap, json);
return new PermissionsCommand(permissionsMap, false);
}
@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);
if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); }
final Type typeOfMap = new TypeToken<Map<String, Object>>() {}.getType();
fromApiJsonHelper.checkForUnsupportedParameters(typeOfMap, json, supportedParameters);
return fromApiJsonHelper.fromJson(json, PermissionsCommand.class);
}
}
@@ -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;
import org.mifosplatform.useradministration.command.PermissionsCommand;
import org.mifosplatform.infrastructure.core.api.JsonCommand;
import org.mifosplatform.infrastructure.core.data.EntityIdentifier;
public interface PermissionWritePlatformService {
void updateMakerCheckerPermissions(PermissionsCommand command);
EntityIdentifier updateMakerCheckerPermissions(JsonCommand command);
}
@@ -1,13 +1,17 @@
package org.mifosplatform.useradministration.service;
import java.util.Collection;
import java.util.HashMap;
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.useradministration.command.PermissionsCommand;
import org.mifosplatform.useradministration.domain.Permission;
import org.mifosplatform.useradministration.domain.PermissionRepository;
import org.mifosplatform.useradministration.exception.PermissionNotFoundException;
import org.mifosplatform.useradministration.serialization.PermissionsCommandFromApiJsonDeserializer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -17,39 +21,52 @@ public class PermissionWritePlatformServiceJpaRepositoryImpl implements Permissi
private final PlatformSecurityContext context;
private final PermissionRepository permissionRepository;
private final PermissionsCommandFromApiJsonDeserializer fromApiJsonDeserializer;
@Autowired
public PermissionWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context,
final PermissionRepository permissionRepository) {
final PermissionRepository permissionRepository,
final PermissionsCommandFromApiJsonDeserializer fromApiJsonDeserializer) {
this.context = context;
this.permissionRepository = permissionRepository;
this.fromApiJsonDeserializer = fromApiJsonDeserializer;
}
@Transactional
@Override
public void updateMakerCheckerPermissions(final PermissionsCommand command) {
public EntityIdentifier updateMakerCheckerPermissions(final JsonCommand command) {
context.authenticatedUser();
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()) {
final Permission permission = findPermissionByCode(allPermissions, permissionCode);
final Permission permission = findPermissionInCollectionByCode(allPermissions, permissionCode);
if (permission.getCode().endsWith("_CHECKER") || permission.getCode().startsWith("READ_")
|| permission.getGrouping().equalsIgnoreCase("special")) { throw new PermissionNotFoundException(permissionCode); }
final boolean isSelected = commandPermissions.get(permissionCode).booleanValue();
permission.enableMakerChecker(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?
boolean changed = permission.enableMakerChecker(isSelected);
if (changed) {
changedPermissions.put(permissionCode, isSelected);
this.permissionRepository.save(permission);
}
}
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) {
for (Permission permission : allPermissions) {
@@ -1,7 +1,8 @@
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.RolePermissionCommand;
public interface RoleWritePlatformService {
@@ -9,5 +10,5 @@ public interface RoleWritePlatformService {
Long updateRole(RoleCommand command);
Long updateRolePermissions(RolePermissionCommand command);
EntityIdentifier updateRolePermissions(Long roleId, JsonCommand command);
}
@@ -1,19 +1,23 @@
package org.mifosplatform.useradministration.service;
import java.util.Collection;
import java.util.HashMap;
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.organisation.monetary.service.ConfigurationDomainService;
import org.mifosplatform.portfolio.client.service.RollbackTransactionAsCommandIsNotApprovedByCheckerException;
import org.mifosplatform.useradministration.command.PermissionsCommand;
import org.mifosplatform.useradministration.command.RoleCommand;
import org.mifosplatform.useradministration.command.RolePermissionCommand;
import org.mifosplatform.useradministration.domain.Permission;
import org.mifosplatform.useradministration.domain.PermissionRepository;
import org.mifosplatform.useradministration.domain.Role;
import org.mifosplatform.useradministration.domain.RoleRepository;
import org.mifosplatform.useradministration.exception.PermissionNotFoundException;
import org.mifosplatform.useradministration.exception.RoleNotFoundException;
import org.mifosplatform.useradministration.serialization.PermissionsCommandFromApiJsonDeserializer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -25,15 +29,18 @@ public class RoleWritePlatformServiceJpaRepositoryImpl implements RoleWritePlatf
private final RoleRepository roleRepository;
private final PermissionRepository permissionRepository;
private final ConfigurationDomainService configurationDomainService;
private final PermissionsCommandFromApiJsonDeserializer fromApiJsonDeserializer;
@Autowired
public RoleWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, final RoleRepository roleRepository,
final PermissionRepository permissionRepository,
final ConfigurationDomainService configurationDomainService) {
final ConfigurationDomainService configurationDomainService,
final PermissionsCommandFromApiJsonDeserializer fromApiJsonDeserializer) {
this.context = context;
this.roleRepository = roleRepository;
this.permissionRepository = permissionRepository;
this.configurationDomainService = configurationDomainService;
this.fromApiJsonDeserializer = fromApiJsonDeserializer;
}
@Transactional
@@ -72,31 +79,37 @@ public class RoleWritePlatformServiceJpaRepositoryImpl implements RoleWritePlatf
@Transactional
@Override
public Long updateRolePermissions(final RolePermissionCommand command) {
public EntityIdentifier updateRolePermissions(final Long roleId, final JsonCommand command) {
context.authenticatedUser();
final Role role = this.roleRepository.findOne(command.getRoleId());
if (role == null) { throw new RoleNotFoundException(command.getRoleId()); }
final Role role = this.roleRepository.findOne(roleId);
if (role == null) { throw new RoleNotFoundException(roleId); }
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()) {
final boolean isSelected = commandPermissions.get(permissionCode).booleanValue();
final Permission permission = findPermissionByCode(allPermissions, permissionCode);
if (isSelected) {
role.addPermission(permission);
} else {
role.removePermission(permission);
boolean changed = role.updatePermission(permission, isSelected);
if (changed) {
changedPermissions.put(permissionCode, isSelected);
}
}
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(); }
return role.getId();
return EntityIdentifier.withChanges(role.getId(), changes);
}
private Permission findPermissionByCode(Collection<Permission> allPermissions, String permissionCode) {