From 32ba284c6d13c25230f21f22eb4872dfd7fca98f Mon Sep 17 00:00:00 2001 From: Michal Dudzinski Date: Fri, 10 Aug 2012 10:43:00 +0200 Subject: [PATCH] FIXED MIFOSX-24: General Issues with Groups so far --- .../patch-0006_add_unique_to_group_name.sql | 1 + .../platform/api/GroupsApiResource.java | 10 +++++- .../platform/api/data/ClientMemberData.java | 31 +++++++++++++++++ .../mifosng/platform/api/data/GroupData.java | 13 ++++++++ .../ApiDataConversionServiceImpl.java | 2 +- .../mifosng/platform/group/domain/Group.java | 11 +++++-- .../group/service/GroupCommandValidator.java | 2 ++ .../service/GroupReadPlatformService.java | 4 ++- .../service/GroupReadPlatformServiceImpl.java | 33 +++++++++++++++++++ ...WritePlatformServiceJpaRepositoryImpl.java | 5 ++- 10 files changed, 105 insertions(+), 7 deletions(-) create mode 100644 mifosng-db/patches/patch-0006_add_unique_to_group_name.sql create mode 100644 mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientMemberData.java diff --git a/mifosng-db/patches/patch-0006_add_unique_to_group_name.sql b/mifosng-db/patches/patch-0006_add_unique_to_group_name.sql new file mode 100644 index 000000000..953bd3b35 --- /dev/null +++ b/mifosng-db/patches/patch-0006_add_unique_to_group_name.sql @@ -0,0 +1 @@ +ALTER TABLE portfolio_group ADD UNIQUE (name); diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/GroupsApiResource.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/GroupsApiResource.java index e34bedc3c..2cd483564 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/GroupsApiResource.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/GroupsApiResource.java @@ -19,6 +19,7 @@ import javax.ws.rs.core.Response; import javax.ws.rs.core.UriInfo; import org.mifosng.platform.api.commands.GroupCommand; +import org.mifosng.platform.api.data.ClientMemberData; import org.mifosng.platform.api.data.EntityIdentifier; import org.mifosng.platform.api.data.GroupData; import org.mifosng.platform.api.infrastructure.ApiDataConversionService; @@ -49,7 +50,7 @@ public class GroupsApiResource { public String retrieveAllGroups(@Context final UriInfo uriInfo){ Set typicalResponseParameters = new HashSet( - Arrays.asList("id", "name", "externalId") + Arrays.asList("id", "name", "externalId", "clientMembers") ); Set responseParameters = ApiParameterHelper.extractFieldsForResponseIfProvided(uriInfo.getQueryParameters()); @@ -61,6 +62,10 @@ public class GroupsApiResource { Collection groups = this.groupReadPlatformService.retrieveAllGroups(); + for (GroupData group : groups){ + group.setClientMembers(this.groupReadPlatformService.retrieveClientMembers(group.getId())); + } + return this.apiDataConversionService.convertGroupDataToJson(prettyPrint, responseParameters, groups.toArray(new GroupData[groups.size()])); } @@ -82,6 +87,9 @@ public class GroupsApiResource { GroupData group = this.groupReadPlatformService.retrieveGroup(groupId); + Collection clientMembers = this.groupReadPlatformService.retrieveClientMembers(groupId); + group.setClientMembers(clientMembers); + return this.apiDataConversionService.convertGroupDataToJson(prettyPrint, responseParameters, group); } diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientMemberData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientMemberData.java new file mode 100644 index 000000000..8d61cb141 --- /dev/null +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/ClientMemberData.java @@ -0,0 +1,31 @@ +package org.mifosng.platform.api.data; + +import org.apache.commons.lang.StringUtils; + +public class ClientMemberData { + + private final Long id; + private final String displayName; + + public ClientMemberData(final Long id, final String firstname, final String lastname) { + this.id = id; + + StringBuilder displayNameBuilder = new StringBuilder(firstname); + if (StringUtils.isNotBlank(displayNameBuilder.toString())) { + displayNameBuilder.append(' '); + } + displayNameBuilder.append(lastname); + + this.displayName = displayNameBuilder.toString(); + + } + + public Long getId() { + return id; + } + + public String getDisplayName() { + return displayName; + } + +} \ No newline at end of file diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/GroupData.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/GroupData.java index 27239cfa8..d96491ecf 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/data/GroupData.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/data/GroupData.java @@ -1,11 +1,16 @@ package org.mifosng.platform.api.data; +import java.util.ArrayList; +import java.util.Collection; + public class GroupData { private final Long id; private final String name; private final String externalId; + private Collection clientMembers = new ArrayList(); + public GroupData(Long id, String name, String externalId) { super(); this.id = id; @@ -25,4 +30,12 @@ public class GroupData { return externalId; } + public Collection getClientMembers() { + return clientMembers; + } + + public void setClientMembers(Collection clientMembers) { + this.clientMembers = clientMembers; + } + } diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiDataConversionServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiDataConversionServiceImpl.java index 19e5b5c4d..8e6435b33 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiDataConversionServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/api/infrastructure/ApiDataConversionServiceImpl.java @@ -380,7 +380,7 @@ public class ApiDataConversionServiceImpl implements ApiDataConversionService { @Override public String convertGroupDataToJson(boolean prettyPrint, Set responseParameters, GroupData... groups) { final Set supportedParameters = new HashSet( - Arrays.asList("id", "name", "externalId") + Arrays.asList("id", "name", "externalId", "clientMembers") ); final Set parameterNamesToSkip = new HashSet(); diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/group/domain/Group.java b/mifosng-provider/src/main/java/org/mifosng/platform/group/domain/Group.java index cffd868b5..797b36eae 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/group/domain/Group.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/group/domain/Group.java @@ -20,7 +20,7 @@ import org.mifosng.platform.user.domain.AppUser; @Table(name = "portfolio_group") public class Group extends AbstractAuditableCustom { - @Column(name = "name", length = 100) + @Column(name = "name", length = 100, unique = true) private String name; @Column(name = "external_id", length = 100, unique = true) @@ -34,7 +34,7 @@ public class Group extends AbstractAuditableCustom { joinColumns = @JoinColumn(name = "group_id"), inverseJoinColumns = @JoinColumn(name = "client_id")) private Set clientMembers; - + public Group() { this.name = null; this.externalId = null; @@ -61,7 +61,7 @@ public class Group extends AbstractAuditableCustom { } } - public void update(GroupCommand command) { + public void update(final GroupCommand command, final Set clientMembers) { if (command.isExternalIdChanged()) { this.externalId = command.getExternalId(); } @@ -69,6 +69,10 @@ public class Group extends AbstractAuditableCustom { if (command.isNameChanged()) { this.name = command.getName(); } + + if (clientMembers != null && command.isClientMembersChanged()){ + this.clientMembers = clientMembers; + } } public void addClientMember(final Client member){ @@ -83,6 +87,7 @@ public class Group extends AbstractAuditableCustom { public void delete() { this.deleted = true; this.externalId = this.getId() + "_" + this.externalId; + this.name = this.getId() + "_" + this.name; } public boolean isDeleted() { diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupCommandValidator.java b/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupCommandValidator.java index 57f2ec2a2..a2b99f2f5 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupCommandValidator.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupCommandValidator.java @@ -42,6 +42,8 @@ public class GroupCommandValidator { baseDataValidator.reset().parameter("name").value(command.getName()).ignoreIfNull().notBlank(); baseDataValidator.reset().parameter("externalId").value(command.getExternalId()).ignoreIfNull().notExceedingLengthOf(100); + baseDataValidator.reset().parameter("clientMembers").value(command.getClientMembers()).ignoreIfNull(); + if (!dataValidationErrors.isEmpty()) { throw new PlatformApiDataValidationException("validation.msg.validation.errors.exist", "Validation errors exist.", dataValidationErrors); } diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupReadPlatformService.java b/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupReadPlatformService.java index 069787c15..3ec820fad 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupReadPlatformService.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupReadPlatformService.java @@ -2,6 +2,7 @@ package org.mifosng.platform.group.service; import java.util.Collection; +import org.mifosng.platform.api.data.ClientMemberData; import org.mifosng.platform.api.data.GroupData; public interface GroupReadPlatformService { @@ -9,5 +10,6 @@ public interface GroupReadPlatformService { Collection retrieveAllGroups(); GroupData retrieveGroup(Long groupId); - + + Collection retrieveClientMembers(Long groupId); } diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupReadPlatformServiceImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupReadPlatformServiceImpl.java index bb43e610d..2697bf5f1 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupReadPlatformServiceImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupReadPlatformServiceImpl.java @@ -4,6 +4,8 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.Collection; +import org.apache.commons.lang.StringUtils; +import org.mifosng.platform.api.data.ClientMemberData; import org.mifosng.platform.api.data.GroupData; import org.mifosng.platform.exceptions.GroupNotFoundException; import org.mifosng.platform.infrastructure.TenantAwareRoutingDataSource; @@ -73,4 +75,35 @@ public class GroupReadPlatformServiceImpl implements GroupReadPlatformService { } + @Override + public Collection retrieveClientMembers(Long groupId){ + + this.context.authenticatedUser(); + + ClientMemberSummaryDataMapper rm = new ClientMemberSummaryDataMapper(); + + String sql = "select " + rm.clientMemberSummarySchema() + " where cm.is_deleted = 0 and pgc.group_id = ?"; + + return this.jdbcTemplate.query(sql, rm, new Object[] {groupId}); + } + + private static final class ClientMemberSummaryDataMapper implements RowMapper { + + public String clientMemberSummarySchema() { + return "cm.id, cm.firstname, cm.lastname from portfolio_client cm INNER JOIN portfolio_group_client pgc ON pgc.client_id = cm.id"; + } + + @Override + public ClientMemberData mapRow(ResultSet rs, int rowNum) throws SQLException { + Long id = rs.getLong("id"); + String firstname = rs.getString("firstname"); + String lastname = rs.getString("lastname"); + if (StringUtils.isBlank(firstname)) { + firstname = ""; + } + return new ClientMemberData(id, firstname, lastname); + } + + } + } diff --git a/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupWritePlatformServiceJpaRepositoryImpl.java b/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupWritePlatformServiceJpaRepositoryImpl.java index 737592b07..500e9d0d7 100644 --- a/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupWritePlatformServiceJpaRepositoryImpl.java +++ b/mifosng-provider/src/main/java/org/mifosng/platform/group/service/GroupWritePlatformServiceJpaRepositoryImpl.java @@ -65,7 +65,10 @@ public class GroupWritePlatformServiceJpaRepositoryImpl implements GroupWritePla if (groupForUpdate == null || groupForUpdate.isDeleted()) { throw new GroupNotFoundException(command.getId()); } - groupForUpdate.update(command); + + final Set clientMembers = assembleSetOfClients(command); + + groupForUpdate.update(command, clientMembers); groupRepository.save(groupForUpdate);