This is an automated email from the git hooks/post-receive script. New commit to branch feature/bug-on-save in repository pollen. See https://gitlab.nuiton.org/chorem/pollen.git commit 8933f082d59dbffb43a0b5b6db2e57eeba1e42a6 Author: dcosse <cosse@codelutin.com> Date: Wed Oct 9 17:06:16 2019 +0200 refs #249 add poolType as saveVoters parameters to as current pooltype change and not previous one. List validation review to fix validation not working --- .../pollen/rest/api/beans/VoterListSaveBean.java | 11 +++ .../chorem/pollen/rest/api/v1/VoterListApi.java | 6 +- .../pollen/services/service/VoterListService.java | 87 +++++++++++----------- .../src/main/web/js/VoterListService.js | 4 +- 4 files changed, 63 insertions(+), 45 deletions(-) diff --git a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/beans/VoterListSaveBean.java b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/beans/VoterListSaveBean.java index f54697a8..b6d053b2 100644 --- a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/beans/VoterListSaveBean.java +++ b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/beans/VoterListSaveBean.java @@ -21,6 +21,7 @@ package org.chorem.pollen.rest.api.beans; * #L% */ +import org.chorem.pollen.persistence.entity.PollType; import org.chorem.pollen.services.bean.VoterListBean; import org.chorem.pollen.services.bean.VoterListMemberBean; @@ -28,6 +29,8 @@ import org.chorem.pollen.services.bean.VoterListMemberBean; * @author Sylvain Bavencoff - bavencoff@codelutin.com */ public class VoterListSaveBean { + + protected PollType pollType; protected VoterListBean[] listsToSave; @@ -68,4 +71,12 @@ public class VoterListSaveBean { public void setMembersToDelete(VoterListMemberBean[] membersToDelete) { this.membersToDelete = membersToDelete; } + + public PollType getPollType() { + return pollType; + } + + public void setPollType(PollType pollType) { + this.pollType = pollType; + } } diff --git a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/VoterListApi.java b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/VoterListApi.java index 50dd0a2a..042cb74e 100644 --- a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/VoterListApi.java +++ b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/VoterListApi.java @@ -23,6 +23,7 @@ package org.chorem.pollen.rest.api.v1; import com.google.common.collect.Lists; import org.chorem.pollen.persistence.entity.Poll; +import org.chorem.pollen.persistence.entity.PollType; import org.chorem.pollen.persistence.entity.VoterList; import org.chorem.pollen.persistence.entity.VoterListMember; import org.chorem.pollen.rest.api.beans.VoterListSaveBean; @@ -81,6 +82,8 @@ public class VoterListApi { @PathParam("pollId") PollenEntityId<Poll> pollId, VoterListSaveBean voterListSaveBean) throws InvalidFormException { List<String> listIds = Lists.newLinkedList(); + PollType pollType = voterListSaveBean.getPollType(); + for (VoterListBean list : voterListSaveBean.getListsToDelete()) { listIds.add(list.getEntityId()); } @@ -94,7 +97,8 @@ public class VoterListApi { Lists.newArrayList(voterListSaveBean.getListsToSave()), Lists.newArrayList(voterListSaveBean.getMembersToSave()), listIds, - memberIds); + memberIds, + pollType); } @Path("/polls/{pollId}/voterLists/{voterListId}") diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java index 32e5b05c..f4c00112 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/VoterListService.java @@ -28,6 +28,7 @@ import com.google.common.collect.Sets; import org.apache.commons.collections4.CollectionUtils; import org.apache.commons.lang3.tuple.Pair; import org.chorem.pollen.persistence.entity.Poll; +import org.chorem.pollen.persistence.entity.PollType; import org.chorem.pollen.persistence.entity.PollenPrincipal; import org.chorem.pollen.persistence.entity.PollenUser; import org.chorem.pollen.persistence.entity.Question; @@ -200,7 +201,7 @@ public class VoterListService extends PollenServiceSupport { Collections.singletonList(voterList), members, Collections.emptyList(), - Collections.emptyList()); + Collections.emptyList(), null); VoterList result = getVoterListDao().forTopiaIdEquals(voterList.getEntityId()).findUnique(); @@ -218,7 +219,7 @@ public class VoterListService extends PollenServiceSupport { Collections.singletonList(voterList), Collections.emptyList(), Collections.emptyList(), - Collections.emptyList()); + Collections.emptyList(), null); VoterList result = getVoterListDao().forTopiaIdEquals(voterList.getEntityId()).findUnique(); @@ -336,7 +337,7 @@ public class VoterListService extends PollenServiceSupport { Collections.emptyList(), Collections.singletonList(member), Collections.emptyList(), - Collections.emptyList()); + Collections.emptyList(), null); VoterListMember result = getVoterListMemberDao().forTopiaIdEquals(member.getEntityId()).findUnique(); return toVoterListMemberBean(result); @@ -353,7 +354,7 @@ public class VoterListService extends PollenServiceSupport { Collections.emptyList(), Collections.singletonList(member), Collections.emptyList(), - Collections.emptyList()); + Collections.emptyList(), null); VoterListMember result = getVoterListMemberDao().forTopiaIdEquals(member.getEntityId()).findUnique(); return toVoterListMemberBean(result); @@ -371,7 +372,7 @@ public class VoterListService extends PollenServiceSupport { Collections.emptyList(), Collections.emptyList(), Collections.emptyList(), - Collections.singletonList(memberId)); + Collections.singletonList(memberId), null); } @@ -540,9 +541,12 @@ public class VoterListService extends PollenServiceSupport { checkNotBlank(errors, VoterList.PROPERTY_NAME, voterList.getName(), l(getLocale(), "pollen.error.voterList.name.mandatory")); check(errors, VoterList.PROPERTY_WEIGHT, voterList.getWeight() > 0, l(getLocale(), "pollen.error.voterList.weight.greaterThan0")); - if (subLists.isEmpty()) { - checkNotEmpty(errors, "member", members, l(getLocale(), "pollen.error.voterList.member.mandatory")); - } + + final boolean condition = subLists.stream().noneMatch(voterListBean -> voterListBean.getCountMembers() == 0); + check(errors, "member", + condition, + l(getLocale(), "pollen.error.voterList.member.mandatory")); + boolean nameAlreadyUse = sisterNames.contains(voterList.getName()); check(errors, VoterList.PROPERTY_NAME, !nameAlreadyUse, l(getLocale(), "pollen.error.voterList.name.alreadyUsed")); @@ -604,15 +608,24 @@ public class VoterListService extends PollenServiceSupport { List<VoterListBean> listsToSave, List<VoterListMemberBean> membersToSave, List<String> listIdsToDelete, - List<String> memberIdsToDelete) throws InvalidFormException { + List<String> memberIdsToDelete, + PollType pollType) throws InvalidFormException { checkIsConnectedRequired(); checkNotNull(pollId); Poll poll = getPollService().getPoll0(pollId); checkPermission(PollenPermissions.edit(poll)); - - checkVoters(poll, listsToSave, membersToSave); + + // when reaching this code Poll may no be accurate, if user change the poll type the persisted PollType may have + // the previous one. Getting the pool type from args force make sure to use the correct one + // and process the correct validation process + // see bug ref#249 + PollType forcePollType = pollType != null ? pollType : poll.getPollType(); + if (forcePollType == PollType.RESTRICTED) { + checkVoters(poll, listsToSave, membersToSave); + } + checkNotNull(listIdsToDelete); checkNotNull(memberIdsToDelete); @@ -669,49 +682,37 @@ public class VoterListService extends PollenServiceSupport { checkNotNull(membersToSave); // verification des listes de voteurs Map<PollenEntityId<VoterList>, Set<String>> listNameByParentId = Maps.newHashMap(); + + // use to load existing member names + // do not load the name from the members ids that we want to save otherwise they will be consider as duplicated. + Set<String> idsToIgnore = listsToSave.stream().map(VoterListBean::getEntityId).collect(Collectors.toSet()); for (VoterListBean voterList : listsToSave) { - + + List<VoterListMemberBean> members; + List<VoterListBean> subLists; + + members = membersToSave.stream() + .filter(member -> voterList.getId().equals(member.getVoterListId())) + .collect(Collectors.toList()); + + subLists = listsToSave.stream() + .filter(list -> voterList.getId().equals(list.getParentId())) + .collect(Collectors.toList()); + Set<String> sisterNames = listNameByParentId.computeIfAbsent(voterList.getParentId(), parentId -> { if (poll == null || parentId.isNotEmpty() || parentId.isTemporaryId()) { return Sets.newHashSet(); } else { + // do not load names of not new list as they will be consider as duplicated List<VoterList> existingVoterLists = getVoterLists0(poll, parentId.getEntityId()); - return existingVoterLists.stream() + return existingVoterLists.stream() + .filter(voterList0 -> !idsToIgnore.contains(voterList0.getTopiaId())) .map(VoterList::getName) .collect(Collectors.toSet()); } }); - List<VoterListMemberBean> members = Collections.emptyList(); - List<VoterListBean> subLists = Collections.emptyList(); - - - if (voterList.isTemporaryId()) { - - members = membersToSave.stream() - .filter(member -> voterList.getId().equals(member.getVoterListId())) - .collect(Collectors.toList()); - - subLists = listsToSave.stream() - .filter(list -> voterList.getId().equals(list.getParentId())) - .collect(Collectors.toList()); - - } else if (voterList.isPersisted()) { - - VoterList oldVoterList = getVoterList0(poll, voterList.getEntityId()); - sisterNames.remove(oldVoterList.getName()); - - List<VoterListMember> existingVoterListMembers = getVoterListMembers0(voterList.getEntityId()); - members = toBeanList(existingVoterListMembers, this::toVoterListMemberBean); - List<VoterList> existingSubVoterLists = getVoterLists0(poll, voterList.getEntityId()); - subLists = toBeanList(existingSubVoterLists, this::toVoterListBean); - } else if (listsToSave.size() == 1){ - - members = membersToSave; - - } - ErrorMap errorMap = checkVoterList(sisterNames, voterList, members, subLists); errorMap.failIfNotEmpty(); @@ -742,7 +743,7 @@ public class VoterListService extends PollenServiceSupport { Set<String> brotherNames = brotherNamesEmails.getLeft(); Set<String> brotherEmails = brotherNamesEmails.getLeft(); - if (voterListMember.isPersisted()) { + if (voterListMember.isPersisted() && poll != null) { VoterList voterList = getVoterList0(poll, voterListMember.getVoterListId().getEntityId()); diff --git a/pollen-ui-riot-js/src/main/web/js/VoterListService.js b/pollen-ui-riot-js/src/main/web/js/VoterListService.js index 5890748f..e7244780 100644 --- a/pollen-ui-riot-js/src/main/web/js/VoterListService.js +++ b/pollen-ui-riot-js/src/main/web/js/VoterListService.js @@ -267,7 +267,8 @@ class VoterListService extends FetchService { id: voterlist.id, parentId: voterlist.parentId, name: voterlist.name, - weight: voterlist.weight + weight: voterlist.weight, + countMembers : voterlist.countMembers }; }); } @@ -295,6 +296,7 @@ class VoterListService extends FetchService { let url = this._getUrlPrefix(this.pollForm.model.id); return this.put(url, { + pollType: this.pollForm.model.pollType, listsToSave: this.getVoterLists(), membersToSave: this.getVoterListMembers(), listsToDelete: this.voterListsToDelete, -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.