From 35a331debd296a5733837c89be1d3120e73083d4 Mon Sep 17 00:00:00 2001 From: John Woodlock Date: Fri, 16 Nov 2012 22:42:25 +0000 Subject: [PATCH] WIP permissions - add new api to get role permissions --- .../platform/api/RolesApiResource.java | 32 +++++----------- .../api/data/PermissionUsageData.java | 28 ++++++++++++++ .../mifosng/platform/api/data/RoleData.java | 13 +++++++ .../platform/api/data/RolePermissionData.java | 38 +++++++++++++++++++ ...GsonPortfolioApiJsonSerializerService.java | 13 +++++++ .../PortfolioApiJsonSerializerService.java | 3 ++ .../PermissionReadPlatformService.java | 3 ++ .../PermissionReadPlatformServiceImpl.java | 32 ++++++++++++++++ 8 files changed, 140 insertions(+), 22 deletions(-) create mode 100644 mifosng-provider/src/main/java/org/mifosng/platform/api/data/PermissionUsageData.java create mode 100644 mifosng-provider/src/main/java/org/mifosng/platform/api/data/RolePermissionData.java 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 08d8ac58c..6d944124a 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 @@ -18,7 +18,9 @@ import javax.ws.rs.core.UriInfo; 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.infrastructure.PortfolioApiDataConversionService; import org.mifosng.platform.api.infrastructure.PortfolioApiJsonSerializerService; import org.mifosng.platform.infrastructure.api.ApiParameterHelper; @@ -138,37 +140,23 @@ public class RolesApiResource { 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); - Set typicalResponseParameters = new HashSet(Arrays.asList("id", "name", "description", jpw)); - - Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); - if (responseParameters.isEmpty()) { - responseParameters.addAll(typicalResponseParameters); - } - boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); - boolean template = ApiParameterHelper.template(uriInfo.getQueryParameters()); + final Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); + final boolean prettyPrint = ApiParameterHelper.prettyPrint(uriInfo.getQueryParameters()); RoleData role = this.roleReadPlatformService.retrieveRole(roleId); - - if (template) { - Collection availablePermissions = this.permissionReadPlatformService.retrieveAllPermissions(); - availablePermissions.removeAll(role.getSelectedPermissions()); + Collection permissionUsageData = this.permissionReadPlatformService.retrieveAllRolePermissions(roleId); + RolePermissionData rolePermissionData = new RolePermissionData(role.getId(), role.getName(), role.getDescription(), permissionUsageData); - role = new RoleData(role, availablePermissions); - - responseParameters.add("availablePermissions"); - responseParameters.add("selectedPermissions"); - } - return this.apiJsonSerializerService.serializeRoleDataToJson(prettyPrint, responseParameters, role); + return this.apiJsonSerializerService.serializeRolePermissionDataToJson(prettyPrint, responseParameters, rolePermissionData); } - */ + } \ 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 new file mode 100644 index 000000000..b74e44968 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/PermissionUsageData.java @@ -0,0 +1,28 @@ +package org.mifosng.platform.api.data; + +public class PermissionUsageData { + + private final String grouping; + private final String code; + private final Boolean selected; + + public PermissionUsageData(final String grouping, final String code, + final Boolean selected) { + this.grouping = grouping; + this.code = code; + this.selected = selected; + } + + public String getGrouping() { + return grouping; + } + + public String getCode() { + return code; + } + + public Boolean getSelected() { + return selected; + } + +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/RoleData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/RoleData.java index fd3fd4010..73d40ceb7 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/RoleData.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/RoleData.java @@ -61,4 +61,17 @@ public class RoleData { public Collection selectedPermissions() { return this.selectedPermissions; } + + public Long getId() { + return id; + } + + public String getName() { + return name; + } + + public String getDescription() { + return description; + } + } \ 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 new file mode 100644 index 000000000..0d001a584 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/RolePermissionData.java @@ -0,0 +1,38 @@ +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/infrastructure/GoogleGsonPortfolioApiJsonSerializerService.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/GoogleGsonPortfolioApiJsonSerializerService.java index 6ace67acb..7e4adc234 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 @@ -36,6 +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.SavingAccountData; import org.mifosng.platform.api.data.SavingProductData; import org.mifosng.platform.api.data.StaffData; @@ -57,6 +58,8 @@ public class GoogleGsonPortfolioApiJsonSerializerService implements PortfolioApi private static final Set ROLE_DATA_PARAMETERS = new HashSet( Arrays.asList("id", "name", "description", "availablePermissions", "selectedPermissions")); + private static final Set ROLE_PERMISSION_DATA_PARAMETERS = new HashSet( + Arrays.asList("id", "name", "description", "permissionUsageData")); private static final Set APP_USER_DATA_PARAMETERS = new HashSet( Arrays.asList("id", "officeId", "officeName", "username", "firstname", "lastname", "email", "allowedOffices", @@ -297,6 +300,16 @@ public class GoogleGsonPortfolioApiJsonSerializerService implements PortfolioApi return helper.serializedJsonFrom(gsonDeserializer, role); } + @Override + public String serializeRolePermissionDataToJson(final boolean prettyPrint, + final Set responseParameters, + final RolePermissionData rolePermissionData) { + final Gson gsonDeserializer = helper + .createGsonBuilderWithParameterExclusionSerializationStrategy( + ROLE_PERMISSION_DATA_PARAMETERS, prettyPrint, responseParameters); + return helper.serializedJsonFrom(gsonDeserializer, rolePermissionData); + } + @Override public String serializeAppUserDataToJson(final boolean prettyPrint, final Set responseParameters, 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 acb164d0e..6877f5851 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 @@ -34,6 +34,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.SavingAccountData; import org.mifosng.platform.api.data.SavingProductData; import org.mifosng.platform.api.data.StaffData; @@ -53,6 +54,8 @@ public interface PortfolioApiJsonSerializerService { String serializeRoleDataToJson(boolean prettyPrint, Set responseParameters, Collection roles); String serializeRoleDataToJson(boolean prettyPrint, Set responseParameters, RoleData role); + + String serializeRolePermissionDataToJson(boolean prettyPrint, Set responseParameters, RolePermissionData rolePermissionData); String serializeAppUserDataToJson(boolean prettyPrint, Set responseParameters, Collection users); diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/user/service/PermissionReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosng/platform/user/service/PermissionReadPlatformService.java index 0ac1255da..c0803410d 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/user/service/PermissionReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/user/service/PermissionReadPlatformService.java @@ -3,8 +3,11 @@ package org.mifosng.platform.user.service; import java.util.Collection; import org.mifosng.platform.api.data.PermissionData; +import org.mifosng.platform.api.data.PermissionUsageData; public interface PermissionReadPlatformService { Collection retrieveAllPermissions(); + + Collection retrieveAllRolePermissions(Long roleId); } \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/user/service/PermissionReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/user/service/PermissionReadPlatformServiceImpl.java index 2844beb59..dd82ea369 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/user/service/PermissionReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/user/service/PermissionReadPlatformServiceImpl.java @@ -5,6 +5,7 @@ import java.sql.SQLException; import java.util.Collection; import org.mifosng.platform.api.data.PermissionData; +import org.mifosng.platform.api.data.PermissionUsageData; import org.mifosng.platform.infrastructure.JdbcSupport; import org.mifosng.platform.infrastructure.TenantAwareRoutingDataSource; import org.mifosng.platform.security.PlatformSecurityContext; @@ -53,4 +54,35 @@ public class PermissionReadPlatformServiceImpl implements PermissionReadPlatform return " p.id as id, p.default_name as name, p.default_description as description, p.code as code from m_permission p "; } } + + @Override + public Collection retrieveAllRolePermissions(Long roleId) { + + final PermissionUsageDataMapper mapper = new PermissionUsageDataMapper(); + final String sql = mapper.schema(); + + return this.jdbcTemplate.query(sql, mapper, new Object[] {roleId}); + } + + + private static final class PermissionUsageDataMapper implements RowMapper { + + @Override + public PermissionUsageData mapRow(final ResultSet rs, @SuppressWarnings("unused") final int rowNum) throws SQLException { + + final String grouping = rs.getString("grouping"); + final String code = rs.getString("code"); + final Boolean selected = rs.getBoolean("selected"); + + return new PermissionUsageData(grouping, code, selected); + } + + public String schema() { + return " select p.grouping, p.code, if(isnull(rp.role_id), false, true) as selected " + + " from m_permission p " + + " left join m_role_permission rp on rp.permission_id = p.id and rp.role_id = ? " + + " order by p.grouping, p.order_in_grouping, p.code "; + } + } + } \ No newline at end of file