example of roles api for john.

This commit is contained in:
Keith Woodlock
2012-11-21 17:07:50 +00:00
parent 4101cfbcf5
commit 447b180790
11 changed files with 338 additions and 268 deletions
@@ -0,0 +1,22 @@
package org.mifosng.platform.accounting.api.commands;
import java.util.Map;
public class RolePermissionCommand {
private final Long roleId;
private final Map<String, Boolean> permissions;
public RolePermissionCommand(final Long roleId, final Map<String, Boolean> permissionsMap) {
this.roleId = roleId;
this.permissions = permissionsMap;
}
public Map<String, Boolean> getPermissions() {
return this.permissions;
}
public Long getRoleId() {
return this.roleId;
}
}
@@ -15,12 +15,13 @@ import javax.ws.rs.core.Context;
import javax.ws.rs.core.MediaType; import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.UriInfo; import javax.ws.rs.core.UriInfo;
import org.mifosng.platform.accounting.api.commands.RolePermissionCommand;
import org.mifosng.platform.api.commands.RoleCommand; import org.mifosng.platform.api.commands.RoleCommand;
import org.mifosng.platform.api.data.EntityIdentifier; import org.mifosng.platform.api.data.EntityIdentifier;
import org.mifosng.platform.api.data.PermissionData; import org.mifosng.platform.api.data.PermissionData;
import org.mifosng.platform.api.data.PermissionUsageData; import org.mifosng.platform.api.data.PermissionUsageData;
import org.mifosng.platform.api.data.RoleData; import org.mifosng.platform.api.data.RoleData;
import org.mifosng.platform.api.data.RolePermissionData; import org.mifosng.platform.api.data.RolePermissionsData;
import org.mifosng.platform.api.infrastructure.PortfolioApiDataConversionService; import org.mifosng.platform.api.infrastructure.PortfolioApiDataConversionService;
import org.mifosng.platform.api.infrastructure.PortfolioApiJsonSerializerService; import org.mifosng.platform.api.infrastructure.PortfolioApiJsonSerializerService;
import org.mifosng.platform.infrastructure.api.ApiParameterHelper; import org.mifosng.platform.infrastructure.api.ApiParameterHelper;
@@ -57,8 +58,8 @@ public class RolesApiResource {
private PlatformSecurityContext context; private PlatformSecurityContext context;
@GET @GET
@Consumes({MediaType.APPLICATION_JSON}) @Consumes({ MediaType.APPLICATION_JSON })
@Produces({MediaType.APPLICATION_JSON}) @Produces({ MediaType.APPLICATION_JSON })
public String retrieveAllRoles(@Context final UriInfo uriInfo) { public String retrieveAllRoles(@Context final UriInfo uriInfo) {
context.authenticatedUser().validateHasReadPermission(entityType); context.authenticatedUser().validateHasReadPermission(entityType);
@@ -73,8 +74,8 @@ public class RolesApiResource {
@GET @GET
@Path("template") @Path("template")
@Consumes({MediaType.APPLICATION_JSON}) @Consumes({ MediaType.APPLICATION_JSON })
@Produces({MediaType.APPLICATION_JSON}) @Produces({ MediaType.APPLICATION_JSON })
public String retrieveNewRoleDetails(@Context final UriInfo uriInfo) { public String retrieveNewRoleDetails(@Context final UriInfo uriInfo) {
context.authenticatedUser().validateHasReadPermission(entityType); context.authenticatedUser().validateHasReadPermission(entityType);
@@ -90,8 +91,8 @@ public class RolesApiResource {
} }
@POST @POST
@Consumes({MediaType.APPLICATION_JSON}) @Consumes({ MediaType.APPLICATION_JSON })
@Produces({MediaType.APPLICATION_JSON}) @Produces({ MediaType.APPLICATION_JSON })
public String createRole(final String jsonRequestBody) { public String createRole(final String jsonRequestBody) {
final RoleCommand command = this.apiDataConversionService.convertJsonToRoleCommand(null, jsonRequestBody); final RoleCommand command = this.apiDataConversionService.convertJsonToRoleCommand(null, jsonRequestBody);
@@ -101,14 +102,18 @@ public class RolesApiResource {
return this.apiJsonSerializerService.serializeEntityIdentifier(new EntityIdentifier(roleId)); return this.apiJsonSerializerService.serializeEntityIdentifier(new EntityIdentifier(roleId));
} }
// TODO - General thing to fix about REST API is if use partial response approach of fields=id,name,selectedPermissions // TODO - General thing to fix about REST API is if use partial response
// It will return just id,name parameters of RoleData and ignore description, however as PermissionData used in selectedPermissions collection // approach of fields=id,name,selectedPermissions
// also has a field called description it gets ignored also. This is because of the implementation of ParameterListExclusionStrategy which doesnt take // It will return just id,name parameters of RoleData and ignore
// description, however as PermissionData used in selectedPermissions
// collection
// also has a field called description it gets ignored also. This is because
// of the implementation of ParameterListExclusionStrategy which doesnt take
// into account the Object its looking at. // into account the Object its looking at.
@GET @GET
@Path("{roleId}") @Path("{roleId}")
@Consumes({MediaType.APPLICATION_JSON}) @Consumes({ MediaType.APPLICATION_JSON })
@Produces({MediaType.APPLICATION_JSON}) @Produces({ MediaType.APPLICATION_JSON })
public String retrieveRole(@PathParam("roleId") final Long roleId, @Context final UriInfo uriInfo) { public String retrieveRole(@PathParam("roleId") final Long roleId, @Context final UriInfo uriInfo) {
context.authenticatedUser().validateHasReadPermission(entityType); context.authenticatedUser().validateHasReadPermission(entityType);
@@ -130,8 +135,8 @@ public class RolesApiResource {
@PUT @PUT
@Path("{roleId}") @Path("{roleId}")
@Consumes({MediaType.APPLICATION_JSON}) @Consumes({ MediaType.APPLICATION_JSON })
@Produces({MediaType.APPLICATION_JSON}) @Produces({ MediaType.APPLICATION_JSON })
public String updateRole(@PathParam("roleId") final Long roleId, final String jsonRequestBody) { public String updateRole(@PathParam("roleId") final Long roleId, final String jsonRequestBody) {
final RoleCommand command = this.apiDataConversionService.convertJsonToRoleCommand(roleId, jsonRequestBody); final RoleCommand command = this.apiDataConversionService.convertJsonToRoleCommand(roleId, jsonRequestBody);
@@ -143,8 +148,8 @@ public class RolesApiResource {
@GET @GET
@Path("{roleId}/permissions") @Path("{roleId}/permissions")
@Consumes({MediaType.APPLICATION_JSON}) @Consumes({ MediaType.APPLICATION_JSON })
@Produces({MediaType.APPLICATION_JSON}) @Produces({ MediaType.APPLICATION_JSON })
public String retrieveRolePermissions(@PathParam("roleId") final Long roleId, @Context final UriInfo uriInfo) { public String retrieveRolePermissions(@PathParam("roleId") final Long roleId, @Context final UriInfo uriInfo) {
context.authenticatedUser().validateHasReadPermission(entityType); context.authenticatedUser().validateHasReadPermission(entityType);
@@ -154,26 +159,23 @@ public class RolesApiResource {
RoleData role = this.roleReadPlatformService.retrieveRole(roleId); RoleData role = this.roleReadPlatformService.retrieveRole(roleId);
Collection<PermissionUsageData> permissionUsageData = this.permissionReadPlatformService.retrieveAllRolePermissions(roleId); Collection<PermissionUsageData> permissionUsageData = this.permissionReadPlatformService.retrieveAllRolePermissions(roleId);
RolePermissionData rolePermissionData = new RolePermissionData(role.getId(), role.getName(), role.getDescription(), permissionUsageData); RolePermissionsData permissionsData = new RolePermissionsData(role.getId(), role.getName(), role.getDescription(),
permissionUsageData);
return this.apiJsonSerializerService.serializeRolePermissionDataToJson(prettyPrint, responseParameters, rolePermissionData); return this.apiJsonSerializerService.serializeRolePermissionDataToJson(prettyPrint, responseParameters, permissionsData);
} }
@PUT @PUT
@Path("{roleId}/permissions") @Path("{roleId}/permissions")
@Consumes({MediaType.APPLICATION_JSON}) @Consumes({ MediaType.APPLICATION_JSON })
@Produces({MediaType.APPLICATION_JSON}) @Produces({ MediaType.APPLICATION_JSON })
public String updateRolePermissions(@PathParam("roleId") final Long roleId, @Context final UriInfo uriInfo) { public String updateRolePermissions(@PathParam("roleId") final Long roleId, final String jsonRequestBody) {
return "{}";
/*
final Set<String> responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters());
final boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters());
RoleData role = this.roleReadPlatformService.retrieveRole(roleId); final RolePermissionCommand command = this.apiDataConversionService.convertJsonToRolePermissionCommand(roleId, jsonRequestBody);
Collection<PermissionUsageData> permissionUsageData = this.permissionReadPlatformService.retrieveAllRolePermissions(roleId);
RolePermissionData rolePermissionData = new RolePermissionData(role.getId(), role.getName(), role.getDescription(), permissionUsageData);
return this.apiJsonSerializerService.serializeRolePermissionDataToJson(prettyPrint, responseParameters, rolePermissionData);*/ this.roleWritePlatformService.updateRolePermissions(command);
return this.apiJsonSerializerService.serializeEntityIdentifier(new EntityIdentifier(roleId));
} }
} }
@@ -8,8 +8,7 @@ public class PermissionUsageData {
private final String actionName; private final String actionName;
private final Boolean selected; private final Boolean selected;
public PermissionUsageData(final String grouping, final String code, public PermissionUsageData(final String grouping, final String code, final String entityName, final String actionName,
final String entityName, final String actionName,
final Boolean selected) { final Boolean selected) {
this.grouping = grouping; this.grouping = grouping;
this.code = code; this.code = code;
@@ -1,38 +0,0 @@
package org.mifosng.platform.api.data;
import java.util.Collection;
public class RolePermissionData {
private final Long id;
private final String name;
private final String description;
private final Collection<PermissionUsageData> permissionUsageData;
public RolePermissionData(final Long id, final String name,
final String description,
final Collection<PermissionUsageData> permissionUsageData) {
this.id = id;
this.name = name;
this.description = description;
this.permissionUsageData = permissionUsageData;
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public Collection<PermissionUsageData> getPermissionUsageData() {
return permissionUsageData;
}
}
@@ -0,0 +1,37 @@
package org.mifosng.platform.api.data;
import java.util.Collection;
public class RolePermissionsData {
private final Long id;
private final String name;
private final String description;
private final Collection<PermissionUsageData> permissionUsageData;
public RolePermissionsData(final Long id, final String name, final String description,
final Collection<PermissionUsageData> permissionUsageData) {
this.id = id;
this.name = name;
this.description = description;
this.permissionUsageData = permissionUsageData;
}
public Long getId() {
return id;
}
public String getName() {
return name;
}
public String getDescription() {
return description;
}
public Collection<PermissionUsageData> getPermissionUsageData() {
return permissionUsageData;
}
}
@@ -38,7 +38,7 @@ import org.mifosng.platform.api.data.OfficeData;
import org.mifosng.platform.api.data.OfficeTransactionData; import org.mifosng.platform.api.data.OfficeTransactionData;
import org.mifosng.platform.api.data.PermissionData; import org.mifosng.platform.api.data.PermissionData;
import org.mifosng.platform.api.data.RoleData; import org.mifosng.platform.api.data.RoleData;
import org.mifosng.platform.api.data.RolePermissionData; import org.mifosng.platform.api.data.RolePermissionsData;
import org.mifosng.platform.api.data.SavingAccountData; import org.mifosng.platform.api.data.SavingAccountData;
import org.mifosng.platform.api.data.SavingProductData; import org.mifosng.platform.api.data.SavingProductData;
import org.mifosng.platform.api.data.StaffData; import org.mifosng.platform.api.data.StaffData;
@@ -232,7 +232,7 @@ public class GoogleGsonPortfolioApiJsonSerializerService implements PortfolioApi
@Override @Override
public String serializeRolePermissionDataToJson(final boolean prettyPrint, final Set<String> responseParameters, public String serializeRolePermissionDataToJson(final boolean prettyPrint, final Set<String> responseParameters,
final RolePermissionData rolePermissionData) { final RolePermissionsData rolePermissionData) {
final Gson gsonDeserializer = helper.createGsonBuilderWithParameterExclusionSerializationStrategy(ROLE_PERMISSION_DATA_PARAMETERS, final Gson gsonDeserializer = helper.createGsonBuilderWithParameterExclusionSerializationStrategy(ROLE_PERMISSION_DATA_PARAMETERS,
prettyPrint, responseParameters); prettyPrint, responseParameters);
return helper.serializedJsonFrom(gsonDeserializer, rolePermissionData); return helper.serializedJsonFrom(gsonDeserializer, rolePermissionData);
@@ -1,5 +1,6 @@
package org.mifosng.platform.api.infrastructure; package org.mifosng.platform.api.infrastructure;
import org.mifosng.platform.accounting.api.commands.RolePermissionCommand;
import org.mifosng.platform.api.commands.AdjustLoanTransactionCommand; import org.mifosng.platform.api.commands.AdjustLoanTransactionCommand;
import org.mifosng.platform.api.commands.BranchMoneyTransferCommand; import org.mifosng.platform.api.commands.BranchMoneyTransferCommand;
import org.mifosng.platform.api.commands.LoanReassignmentCommand; import org.mifosng.platform.api.commands.LoanReassignmentCommand;
@@ -41,6 +42,8 @@ public interface PortfolioApiDataConversionService {
RoleCommand convertJsonToRoleCommand(Long resourceIdentifier, String json); RoleCommand convertJsonToRoleCommand(Long resourceIdentifier, String json);
RolePermissionCommand convertJsonToRolePermissionCommand(Long roleId, String jsonRequestBody);
UserCommand convertJsonToUserCommand(Long resourceIdentifier, String json); UserCommand convertJsonToUserCommand(Long resourceIdentifier, String json);
BranchMoneyTransferCommand convertJsonToBranchMoneyTransferCommand(String json); BranchMoneyTransferCommand convertJsonToBranchMoneyTransferCommand(String json);
@@ -17,6 +17,7 @@ import java.util.Set;
import org.apache.commons.lang.StringUtils; import org.apache.commons.lang.StringUtils;
import org.joda.time.LocalDate; import org.joda.time.LocalDate;
import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormat;
import org.mifosng.platform.accounting.api.commands.RolePermissionCommand;
import org.mifosng.platform.api.commands.AdjustLoanTransactionCommand; import org.mifosng.platform.api.commands.AdjustLoanTransactionCommand;
import org.mifosng.platform.api.commands.BranchMoneyTransferCommand; import org.mifosng.platform.api.commands.BranchMoneyTransferCommand;
import org.mifosng.platform.api.commands.ChargeCommand; import org.mifosng.platform.api.commands.ChargeCommand;
@@ -264,6 +265,17 @@ public class PortfolioApiDataConversionServiceImpl implements PortfolioApiDataCo
return new RoleCommand(modifiedParameters, resourceIdentifier, name, description, permissionIds); return new RoleCommand(modifiedParameters, resourceIdentifier, name, description, permissionIds);
} }
@Override
public RolePermissionCommand convertJsonToRolePermissionCommand(final Long roleId, final String json) {
if (StringUtils.isBlank(json)) { throw new InvalidJsonException(); }
final Type typeOfMap = new TypeToken<Map<String, Boolean>>() {}.getType();
final Map<String, Boolean> permissionsMap = gsonConverter.fromJson(json, typeOfMap);
return new RolePermissionCommand(roleId, permissionsMap);
}
@Override @Override
public UserCommand convertJsonToUserCommand(final Long resourceIdentifier, final String json) { public UserCommand convertJsonToUserCommand(final Long resourceIdentifier, final String json) {
@@ -36,7 +36,7 @@ import org.mifosng.platform.api.data.OfficeData;
import org.mifosng.platform.api.data.OfficeTransactionData; import org.mifosng.platform.api.data.OfficeTransactionData;
import org.mifosng.platform.api.data.PermissionData; import org.mifosng.platform.api.data.PermissionData;
import org.mifosng.platform.api.data.RoleData; import org.mifosng.platform.api.data.RoleData;
import org.mifosng.platform.api.data.RolePermissionData; import org.mifosng.platform.api.data.RolePermissionsData;
import org.mifosng.platform.api.data.SavingAccountData; import org.mifosng.platform.api.data.SavingAccountData;
import org.mifosng.platform.api.data.SavingProductData; import org.mifosng.platform.api.data.SavingProductData;
import org.mifosng.platform.api.data.StaffData; import org.mifosng.platform.api.data.StaffData;
@@ -57,7 +57,7 @@ public interface PortfolioApiJsonSerializerService {
String serializeRoleDataToJson(boolean prettyPrint, Set<String> responseParameters, RoleData role); String serializeRoleDataToJson(boolean prettyPrint, Set<String> responseParameters, RoleData role);
String serializeRolePermissionDataToJson(boolean prettyPrint, Set<String> responseParameters, RolePermissionData rolePermissionData); String serializeRolePermissionDataToJson(boolean prettyPrint, Set<String> responseParameters, RolePermissionsData rolePermissionData);
String serializeAppUserDataToJson(boolean prettyPrint, Set<String> responseParameters, Collection<AppUserData> users); String serializeAppUserDataToJson(boolean prettyPrint, Set<String> responseParameters, Collection<AppUserData> users);
@@ -1,5 +1,6 @@
package org.mifosng.platform.user.service; package org.mifosng.platform.user.service;
import org.mifosng.platform.accounting.api.commands.RolePermissionCommand;
import org.mifosng.platform.api.commands.RoleCommand; import org.mifosng.platform.api.commands.RoleCommand;
import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.access.prepost.PreAuthorize;
@@ -10,4 +11,7 @@ public interface RoleWritePlatformService {
@PreAuthorize(value = "hasAnyRole('ALL_FUNCTIONS', 'USER_ADMINISTRATION_SUPER_USER', 'UPDATE_ROLE')") @PreAuthorize(value = "hasAnyRole('ALL_FUNCTIONS', 'USER_ADMINISTRATION_SUPER_USER', 'UPDATE_ROLE')")
Long updateRole(RoleCommand command); Long updateRole(RoleCommand command);
@PreAuthorize(value = "hasAnyRole('ALL_FUNCTIONS', 'USER_ADMINISTRATION_SUPER_USER', 'PERMISSIONS_ROLE')")
Long updateRolePermissions(RolePermissionCommand command);
} }
@@ -3,7 +3,9 @@ package org.mifosng.platform.user.service;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map;
import org.mifosng.platform.accounting.api.commands.RolePermissionCommand;
import org.mifosng.platform.api.commands.RoleCommand; import org.mifosng.platform.api.commands.RoleCommand;
import org.mifosng.platform.exceptions.RoleNotFoundException; import org.mifosng.platform.exceptions.RoleNotFoundException;
import org.mifosng.platform.security.PlatformSecurityContext; import org.mifosng.platform.security.PlatformSecurityContext;
@@ -25,7 +27,8 @@ public class RoleWritePlatformServiceJpaRepositoryImpl implements RoleWritePlatf
private final PermissionRepository permissionRepository; private final PermissionRepository permissionRepository;
@Autowired @Autowired
public RoleWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, final RoleRepository roleRepository, final PermissionRepository permissionRepository) { public RoleWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, final RoleRepository roleRepository,
final PermissionRepository permissionRepository) {
this.context = context; this.context = context;
this.roleRepository = roleRepository; this.roleRepository = roleRepository;
this.permissionRepository = permissionRepository; this.permissionRepository = permissionRepository;
@@ -61,9 +64,7 @@ public class RoleWritePlatformServiceJpaRepositoryImpl implements RoleWritePlatf
List<Permission> selectedPermissions = assembleListOfSelectedPermissions(command.getPermissions()); List<Permission> selectedPermissions = assembleListOfSelectedPermissions(command.getPermissions());
Role role = this.roleRepository.findOne(command.getId()); Role role = this.roleRepository.findOne(command.getId());
if (role == null) { if (role == null) { throw new RoleNotFoundException(command.getId()); }
throw new RoleNotFoundException(command.getId());
}
role.update(command, selectedPermissions); role.update(command, selectedPermissions);
this.roleRepository.save(role); this.roleRepository.save(role);
@@ -71,6 +72,34 @@ public class RoleWritePlatformServiceJpaRepositoryImpl implements RoleWritePlatf
return role.getId(); return role.getId();
} }
@Transactional
@Override
public Long updateRolePermissions(final RolePermissionCommand command) {
context.authenticatedUser();
// RoleCommandValidator validator = new RoleCommandValidator(command);
// validator.validateForUpdate();
final Role role = this.roleRepository.findOne(command.getRoleId());
if (role == null) {
throw new RoleNotFoundException(command.getRoleId());
}
Map<String, Boolean> permissions = command.getPermissions();
for (String permissionCode : permissions.keySet()) {
Boolean selected = permissions.get(permissionCode);
if (selected.booleanValue()) {
// this.permissionRepository.findOne(id)
}
}
// role.update(command, selectedPermissions);
this.roleRepository.save(role);
return role.getId();
}
private List<Permission> assembleListOfSelectedPermissions(final String[] selectedPermissionsArray) { private List<Permission> assembleListOfSelectedPermissions(final String[] selectedPermissionsArray) {
List<Long> selectedPermissionIds = new ArrayList<Long>(); List<Long> selectedPermissionIds = new ArrayList<Long>();
List<Permission> selectedPermissions = new ArrayList<Permission>(); List<Permission> selectedPermissions = new ArrayList<Permission>();