diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/accounting/api/commands/RolePermissionCommand.java b/mifosng-provider/src/main/java/org/mifosng/platform/accounting/api/commands/RolePermissionCommand.java new file mode 100644 index 000000000..c5745a430 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosng/platform/accounting/api/commands/RolePermissionCommand.java @@ -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 permissions; + + public RolePermissionCommand(final Long roleId, final Map permissionsMap) { + this.roleId = roleId; + this.permissions = permissionsMap; + } + + public Map getPermissions() { + return this.permissions; + } + + public Long getRoleId() { + return this.roleId; + } +} diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/RolesApiResource.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/RolesApiResource.java index 8dbab0f39..0527ac514 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/RolesApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/RolesApiResource.java @@ -15,12 +15,13 @@ import javax.ws.rs.core.Context; import javax.ws.rs.core.MediaType; 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.data.EntityIdentifier; import org.mifosng.platform.api.data.PermissionData; import org.mifosng.platform.api.data.PermissionUsageData; 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.PortfolioApiJsonSerializerService; import org.mifosng.platform.infrastructure.api.ApiParameterHelper; @@ -37,143 +38,144 @@ import org.springframework.stereotype.Component; @Scope("singleton") public class RolesApiResource { - @Autowired - private RoleReadPlatformService roleReadPlatformService; + @Autowired + private RoleReadPlatformService roleReadPlatformService; - @Autowired - private PermissionReadPlatformService permissionReadPlatformService; + @Autowired + private PermissionReadPlatformService permissionReadPlatformService; - @Autowired - private RoleWritePlatformService roleWritePlatformService; + @Autowired + private RoleWritePlatformService roleWritePlatformService; - @Autowired - private PortfolioApiDataConversionService apiDataConversionService; - - @Autowired - private PortfolioApiJsonSerializerService apiJsonSerializerService; + @Autowired + private PortfolioApiDataConversionService apiDataConversionService; - private final String entityType = "ROLE"; + @Autowired + private PortfolioApiJsonSerializerService apiJsonSerializerService; + + private final String entityType = "ROLE"; @Autowired private PlatformSecurityContext context; + + @GET + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public String retrieveAllRoles(@Context final UriInfo uriInfo) { + + context.authenticatedUser().validateHasReadPermission(entityType); + + final Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); + final boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); + + final Collection roles = this.roleReadPlatformService.retrieveAllRoles(); + + return this.apiJsonSerializerService.serializeRoleDataToJson(prettyPrint, responseParameters, roles); + } + + @GET + @Path("template") + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public String retrieveNewRoleDetails(@Context final UriInfo uriInfo) { + + context.authenticatedUser().validateHasReadPermission(entityType); + + final Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); + final boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); + + final Collection allPermissions = this.permissionReadPlatformService.retrieveAllPermissions(); + + final RoleData role = new RoleData(allPermissions, new ArrayList()); + + return this.apiJsonSerializerService.serializeRoleDataToJson(prettyPrint, responseParameters, role); + } + + @POST + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public String createRole(final String jsonRequestBody) { + + final RoleCommand command = this.apiDataConversionService.convertJsonToRoleCommand(null, jsonRequestBody); + + final Long roleId = this.roleWritePlatformService.createRole(command); + + 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 + // 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. + @GET + @Path("{roleId}") + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public String retrieveRole(@PathParam("roleId") final Long roleId, @Context final UriInfo uriInfo) { + + context.authenticatedUser().validateHasReadPermission(entityType); + + final Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); + final boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); + final boolean template = ApiParameterHelper.template(uriInfo.getQueryParameters()); + + RoleData role = this.roleReadPlatformService.retrieveRole(roleId); + + if (template) { + final Collection availablePermissions = this.permissionReadPlatformService.retrieveAllPermissions(); + availablePermissions.removeAll(role.selectedPermissions()); + + role = new RoleData(role, availablePermissions); + } + return this.apiJsonSerializerService.serializeRoleDataToJson(prettyPrint, responseParameters, role); + } + + @PUT + @Path("{roleId}") + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public String updateRole(@PathParam("roleId") final Long roleId, final String jsonRequestBody) { + + final RoleCommand command = this.apiDataConversionService.convertJsonToRoleCommand(roleId, jsonRequestBody); + + this.roleWritePlatformService.updateRole(command); + + return this.apiJsonSerializerService.serializeEntityIdentifier(new EntityIdentifier(roleId)); + } + + @GET + @Path("{roleId}/permissions") + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public String retrieveRolePermissions(@PathParam("roleId") final Long roleId, @Context final UriInfo uriInfo) { + + context.authenticatedUser().validateHasReadPermission(entityType); + + final Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); + final boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); + + RoleData role = this.roleReadPlatformService.retrieveRole(roleId); + Collection permissionUsageData = this.permissionReadPlatformService.retrieveAllRolePermissions(roleId); + RolePermissionsData permissionsData = new RolePermissionsData(role.getId(), role.getName(), role.getDescription(), + permissionUsageData); + + return this.apiJsonSerializerService.serializeRolePermissionDataToJson(prettyPrint, responseParameters, permissionsData); + } + - @GET - @Consumes({MediaType.APPLICATION_JSON}) - @Produces({MediaType.APPLICATION_JSON}) - public String retrieveAllRoles(@Context final UriInfo uriInfo) { + @PUT + @Path("{roleId}/permissions") + @Consumes({ MediaType.APPLICATION_JSON }) + @Produces({ MediaType.APPLICATION_JSON }) + public String updateRolePermissions(@PathParam("roleId") final Long roleId, final String jsonRequestBody) { - context.authenticatedUser().validateHasReadPermission(entityType); - - final Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); - final boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); + final RolePermissionCommand command = this.apiDataConversionService.convertJsonToRolePermissionCommand(roleId, jsonRequestBody); - final Collection roles = this.roleReadPlatformService.retrieveAllRoles(); - - return this.apiJsonSerializerService.serializeRoleDataToJson(prettyPrint, responseParameters, roles); - } + this.roleWritePlatformService.updateRolePermissions(command); - @GET - @Path("template") - @Consumes({MediaType.APPLICATION_JSON}) - @Produces({MediaType.APPLICATION_JSON}) - public String retrieveNewRoleDetails(@Context final UriInfo uriInfo) { - - context.authenticatedUser().validateHasReadPermission(entityType); - - final Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); - final boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); - - final Collection allPermissions = this.permissionReadPlatformService.retrieveAllPermissions(); - - final RoleData role = new RoleData(allPermissions, new ArrayList()); - - return this.apiJsonSerializerService.serializeRoleDataToJson(prettyPrint, responseParameters, role); - } - - @POST - @Consumes({MediaType.APPLICATION_JSON}) - @Produces({MediaType.APPLICATION_JSON}) - public String createRole(final String jsonRequestBody) { - - final RoleCommand command = this.apiDataConversionService.convertJsonToRoleCommand(null, jsonRequestBody); - - final Long roleId = this.roleWritePlatformService.createRole(command); - - 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 - // 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. - @GET - @Path("{roleId}") - @Consumes({MediaType.APPLICATION_JSON}) - @Produces({MediaType.APPLICATION_JSON}) - public String retrieveRole(@PathParam("roleId") final Long roleId, @Context final UriInfo uriInfo) { - - context.authenticatedUser().validateHasReadPermission(entityType); - - final Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); - final boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); - final boolean template = ApiParameterHelper.template(uriInfo.getQueryParameters()); - - RoleData role = this.roleReadPlatformService.retrieveRole(roleId); - - if (template) { - final Collection availablePermissions = this.permissionReadPlatformService.retrieveAllPermissions(); - availablePermissions.removeAll(role.selectedPermissions()); - - role = new RoleData(role, availablePermissions); - } - return this.apiJsonSerializerService.serializeRoleDataToJson(prettyPrint, responseParameters, role); - } - - @PUT - @Path("{roleId}") - @Consumes({MediaType.APPLICATION_JSON}) - @Produces({MediaType.APPLICATION_JSON}) - public String updateRole(@PathParam("roleId") final Long roleId, final String jsonRequestBody) { - - final RoleCommand command = this.apiDataConversionService.convertJsonToRoleCommand(roleId, jsonRequestBody); - - this.roleWritePlatformService.updateRole(command); - - return this.apiJsonSerializerService.serializeEntityIdentifier(new EntityIdentifier(roleId)); - } - - @GET - @Path("{roleId}/permissions") - @Consumes({MediaType.APPLICATION_JSON}) - @Produces({MediaType.APPLICATION_JSON}) - public String retrieveRolePermissions(@PathParam("roleId") final Long roleId, @Context final UriInfo uriInfo) { - - context.authenticatedUser().validateHasReadPermission(entityType); - - final Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); - final boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); - - RoleData role = this.roleReadPlatformService.retrieveRole(roleId); - Collection permissionUsageData = this.permissionReadPlatformService.retrieveAllRolePermissions(roleId); - RolePermissionData rolePermissionData = new RolePermissionData(role.getId(), role.getName(), role.getDescription(), permissionUsageData); - - return this.apiJsonSerializerService.serializeRolePermissionDataToJson(prettyPrint, responseParameters, rolePermissionData); - } - - @PUT - @Path("{roleId}/permissions") - @Consumes({MediaType.APPLICATION_JSON}) - @Produces({MediaType.APPLICATION_JSON}) - public String updateRolePermissions(@PathParam("roleId") final Long roleId, @Context final UriInfo uriInfo) { - return "{}"; - /* - final Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); - final boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); - - RoleData role = this.roleReadPlatformService.retrieveRole(roleId); - Collection permissionUsageData = this.permissionReadPlatformService.retrieveAllRolePermissions(roleId); - RolePermissionData rolePermissionData = new RolePermissionData(role.getId(), role.getName(), role.getDescription(), permissionUsageData); - - return this.apiJsonSerializerService.serializeRolePermissionDataToJson(prettyPrint, responseParameters, rolePermissionData);*/ - } - + return this.apiJsonSerializerService.serializeEntityIdentifier(new EntityIdentifier(roleId)); + } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/PermissionUsageData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/PermissionUsageData.java index ca6f5a657..58bab4345 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/PermissionUsageData.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/PermissionUsageData.java @@ -2,40 +2,39 @@ package org.mifosng.platform.api.data; public class PermissionUsageData { - private final String grouping; - private final String code; - private final String entityName; - private final String actionName; - private final Boolean selected; + private final String grouping; + private final String code; + private final String entityName; + private final String actionName; + private final Boolean selected; - public PermissionUsageData(final String grouping, final String code, - final String entityName, final String actionName, - final Boolean selected) { - this.grouping = grouping; - this.code = code; - this.entityName = entityName; - this.actionName = actionName; - this.selected = selected; - } + public PermissionUsageData(final String grouping, final String code, final String entityName, final String actionName, + final Boolean selected) { + this.grouping = grouping; + this.code = code; + this.entityName = entityName; + this.actionName = actionName; + this.selected = selected; + } - public String getGrouping() { - return grouping; - } + public String getGrouping() { + return grouping; + } - public String getCode() { - return code; - } + public String getCode() { + return code; + } - public String getEntityName() { - return entityName; - } + public String getEntityName() { + return entityName; + } - public String getActionName() { - return actionName; - } + public String getActionName() { + return actionName; + } - public Boolean getSelected() { - return selected; - } + public Boolean getSelected() { + return selected; + } } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/RolePermissionData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/RolePermissionData.java deleted file mode 100644 index 0d001a584..000000000 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/RolePermissionData.java +++ /dev/null @@ -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; - - public RolePermissionData(final Long id, final String name, - final String description, - final Collection 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 getPermissionUsageData() { - return permissionUsageData; - } - -} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/RolePermissionsData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/RolePermissionsData.java new file mode 100644 index 000000000..bbcbe1dc8 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/RolePermissionsData.java @@ -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; + + public RolePermissionsData(final Long id, final String name, final String description, + final Collection 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 getPermissionUsageData() { + return permissionUsageData; + } + +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/GoogleGsonPortfolioApiJsonSerializerService.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/GoogleGsonPortfolioApiJsonSerializerService.java index b9fd5933f..71e41b8f1 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/GoogleGsonPortfolioApiJsonSerializerService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/GoogleGsonPortfolioApiJsonSerializerService.java @@ -38,7 +38,7 @@ import org.mifosng.platform.api.data.OfficeData; import org.mifosng.platform.api.data.OfficeTransactionData; import org.mifosng.platform.api.data.PermissionData; 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.SavingProductData; import org.mifosng.platform.api.data.StaffData; @@ -232,7 +232,7 @@ public class GoogleGsonPortfolioApiJsonSerializerService implements PortfolioApi @Override public String serializeRolePermissionDataToJson(final boolean prettyPrint, final Set responseParameters, - final RolePermissionData rolePermissionData) { + final RolePermissionsData rolePermissionData) { final Gson gsonDeserializer = helper.createGsonBuilderWithParameterExclusionSerializationStrategy(ROLE_PERMISSION_DATA_PARAMETERS, prettyPrint, responseParameters); return helper.serializedJsonFrom(gsonDeserializer, rolePermissionData); diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioApiDataConversionService.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioApiDataConversionService.java index 63ec766eb..395f580ad 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioApiDataConversionService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioApiDataConversionService.java @@ -1,5 +1,6 @@ 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.BranchMoneyTransferCommand; import org.mifosng.platform.api.commands.LoanReassignmentCommand; @@ -40,6 +41,8 @@ public interface PortfolioApiDataConversionService { OfficeCommand convertJsonToOfficeCommand(Long resourceIdentifier, String json); RoleCommand convertJsonToRoleCommand(Long resourceIdentifier, String json); + + RolePermissionCommand convertJsonToRolePermissionCommand(Long roleId, String jsonRequestBody); UserCommand convertJsonToUserCommand(Long resourceIdentifier, String json); diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioApiDataConversionServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioApiDataConversionServiceImpl.java index 6cfe58550..cff875e99 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioApiDataConversionServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioApiDataConversionServiceImpl.java @@ -17,6 +17,7 @@ import java.util.Set; import org.apache.commons.lang.StringUtils; import org.joda.time.LocalDate; 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.BranchMoneyTransferCommand; import org.mifosng.platform.api.commands.ChargeCommand; @@ -263,6 +264,17 @@ public class PortfolioApiDataConversionServiceImpl implements PortfolioApiDataCo 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>() {}.getType(); + final Map permissionsMap = gsonConverter.fromJson(json, typeOfMap); + + return new RolePermissionCommand(roleId, permissionsMap); + } @Override public UserCommand convertJsonToUserCommand(final Long resourceIdentifier, final String json) { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioApiJsonSerializerService.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioApiJsonSerializerService.java index 3bc4d7494..6edc533c1 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioApiJsonSerializerService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/PortfolioApiJsonSerializerService.java @@ -36,7 +36,7 @@ import org.mifosng.platform.api.data.OfficeData; import org.mifosng.platform.api.data.OfficeTransactionData; import org.mifosng.platform.api.data.PermissionData; 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.SavingProductData; import org.mifosng.platform.api.data.StaffData; @@ -57,7 +57,7 @@ public interface PortfolioApiJsonSerializerService { String serializeRoleDataToJson(boolean prettyPrint, Set responseParameters, RoleData role); - String serializeRolePermissionDataToJson(boolean prettyPrint, Set responseParameters, RolePermissionData rolePermissionData); + String serializeRolePermissionDataToJson(boolean prettyPrint, Set responseParameters, RolePermissionsData rolePermissionData); String serializeAppUserDataToJson(boolean prettyPrint, Set responseParameters, Collection users); diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/user/service/RoleWritePlatformService.java b/mifosng-provider/src/main/java/org/mifosng/platform/user/service/RoleWritePlatformService.java index d27db1ea6..d592ad237 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/user/service/RoleWritePlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/user/service/RoleWritePlatformService.java @@ -1,13 +1,17 @@ package org.mifosng.platform.user.service; +import org.mifosng.platform.accounting.api.commands.RolePermissionCommand; import org.mifosng.platform.api.commands.RoleCommand; import org.springframework.security.access.prepost.PreAuthorize; public interface RoleWritePlatformService { - + @PreAuthorize(value = "hasAnyRole('ALL_FUNCTIONS', 'USER_ADMINISTRATION_SUPER_USER', 'CREATE_ROLE')") - Long createRole(RoleCommand command); + Long createRole(RoleCommand command); @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); } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/user/service/RoleWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/user/service/RoleWritePlatformServiceJpaRepositoryImpl.java index 537d94de6..0fde6e4e3 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/user/service/RoleWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/user/service/RoleWritePlatformServiceJpaRepositoryImpl.java @@ -3,7 +3,9 @@ package org.mifosng.platform.user.service; import java.util.ArrayList; import java.util.Collection; 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.exceptions.RoleNotFoundException; import org.mifosng.platform.security.PlatformSecurityContext; @@ -19,74 +21,101 @@ import org.springframework.util.ObjectUtils; @Service public class RoleWritePlatformServiceJpaRepositoryImpl implements RoleWritePlatformService { - private final PlatformSecurityContext context; - private final RoleRepository roleRepository; + private final PlatformSecurityContext context; + private final RoleRepository roleRepository; - private final PermissionRepository permissionRepository; - - @Autowired - public RoleWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, final RoleRepository roleRepository, final PermissionRepository permissionRepository) { - this.context = context; - this.roleRepository = roleRepository; - this.permissionRepository = permissionRepository; - } - - @Transactional - @Override - public Long createRole(final RoleCommand command) { - - context.authenticatedUser(); - - RoleCommandValidator validator = new RoleCommandValidator(command); - validator.validateForCreate(); + private final PermissionRepository permissionRepository; - List selectedPermissions = assembleListOfSelectedPermissions(command.getPermissions()); + @Autowired + public RoleWritePlatformServiceJpaRepositoryImpl(final PlatformSecurityContext context, final RoleRepository roleRepository, + final PermissionRepository permissionRepository) { + this.context = context; + this.roleRepository = roleRepository; + this.permissionRepository = permissionRepository; + } - Role entity = new Role(command.getName(), command.getDescription(), selectedPermissions); - - this.roleRepository.save(entity); + @Transactional + @Override + public Long createRole(final RoleCommand command) { - return entity.getId(); - } + context.authenticatedUser(); - @Transactional - @Override - public Long updateRole(RoleCommand command) { - - context.authenticatedUser(); - - RoleCommandValidator validator = new RoleCommandValidator(command); - validator.validateForUpdate(); + RoleCommandValidator validator = new RoleCommandValidator(command); + validator.validateForCreate(); - List selectedPermissions = assembleListOfSelectedPermissions(command.getPermissions()); - - Role role = this.roleRepository.findOne(command.getId()); - if (role == null) { - throw new RoleNotFoundException(command.getId()); - } - role.update(command, selectedPermissions); - - this.roleRepository.save(role); - - return role.getId(); - } - - private List assembleListOfSelectedPermissions(final String[] selectedPermissionsArray) { - List selectedPermissionIds = new ArrayList(); - List selectedPermissions = new ArrayList(); - - if (!ObjectUtils.isEmpty(selectedPermissionsArray)) { - for (String selectedId : selectedPermissionsArray) { - selectedPermissionIds.add(Long.valueOf(selectedId)); - } - - Collection allPermissions = this.permissionRepository.findAll(); - for (Permission permission : allPermissions) { - if (selectedPermissionIds.contains(permission.getId())) { - selectedPermissions.add(permission); - } - } - } - return selectedPermissions; - } + List selectedPermissions = assembleListOfSelectedPermissions(command.getPermissions()); + + Role entity = new Role(command.getName(), command.getDescription(), selectedPermissions); + + this.roleRepository.save(entity); + + return entity.getId(); + } + + @Transactional + @Override + public Long updateRole(RoleCommand command) { + + context.authenticatedUser(); + + RoleCommandValidator validator = new RoleCommandValidator(command); + validator.validateForUpdate(); + + List selectedPermissions = assembleListOfSelectedPermissions(command.getPermissions()); + + Role role = this.roleRepository.findOne(command.getId()); + if (role == null) { throw new RoleNotFoundException(command.getId()); } + role.update(command, selectedPermissions); + + this.roleRepository.save(role); + + 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 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 assembleListOfSelectedPermissions(final String[] selectedPermissionsArray) { + List selectedPermissionIds = new ArrayList(); + List selectedPermissions = new ArrayList(); + + if (!ObjectUtils.isEmpty(selectedPermissionsArray)) { + for (String selectedId : selectedPermissionsArray) { + selectedPermissionIds.add(Long.valueOf(selectedId)); + } + + Collection allPermissions = this.permissionRepository.findAll(); + for (Permission permission : allPermissions) { + if (selectedPermissionIds.contains(permission.getId())) { + selectedPermissions.add(permission); + } + } + } + return selectedPermissions; + } } \ No newline at end of file