This is an automated email from the git hooks/post-receive script. New commit to branch develop in repository pollen. See https://gitlab.nuiton.org/chorem/pollen.git commit 8e0592b8a8b1b66ecf574996db724a3e05b0a195 Author: Kevin Morin <morin@codelutin.com> Date: Mon Apr 24 16:45:18 2017 +0200 refs #11 add service and api to assign a poll to a connected user --- .../org/chorem/pollen/rest/api/v1/PollApi.java | 4 ++ pollen-rest-api/src/main/resources/mapping | 33 +++++++------- .../pollen/services/service/PollService.java | 51 ++++++++++++++++------ .../pollen/services/service/PollServiceTest.java | 46 +++++++++++++++++++ 4 files changed, 104 insertions(+), 30 deletions(-) diff --git a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/PollApi.java b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/PollApi.java index a770f07..732839b 100644 --- a/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/PollApi.java +++ b/pollen-rest-api/src/main/java/org/chorem/pollen/rest/api/v1/PollApi.java @@ -129,4 +129,8 @@ public class PollApi extends WebMotionController { return pollService.exportPoll(pollId.getEntityId()); } + + public PollBean assignPoll(PollService pollService, PollenEntityId<Poll> pollId) { + return pollService.assignPollToConnectedUser(pollId.getEntityId()); + } } diff --git a/pollen-rest-api/src/main/resources/mapping b/pollen-rest-api/src/main/resources/mapping index 6d2f707..c1a63e2 100644 --- a/pollen-rest-api/src/main/resources/mapping +++ b/pollen-rest-api/src/main/resources/mapping @@ -100,27 +100,28 @@ DELETE /v1/favoriteLists/{favoriteListId}/lists/{childListId} FavoriteListApi. # PollApi -GET /v1/polls/new PollApi.getNewPoll -GET /v1/polls PollApi.getPolls -GET /v1/polls/created PollApi.getCreatedPolls -GET /v1/polls/invited PollApi.getInvitedPolls -GET /v1/polls/participated PollApi.getParticipatedPolls -POST /v1/polls PollApi.createPoll -POST,GET /v1/polls/create PollApi.createPoll -GET /v1/polls/edit PollApi.editPoll +GET /v1/polls/new PollApi.getNewPoll +GET /v1/polls PollApi.getPolls +GET /v1/polls/created PollApi.getCreatedPolls +GET /v1/polls/invited PollApi.getInvitedPolls +GET /v1/polls/participated PollApi.getParticipatedPolls +POST /v1/polls PollApi.createPoll +POST,GET /v1/polls/create PollApi.createPoll +GET /v1/polls/edit PollApi.editPoll #fix me -POST,PUT /v1/polls/{pollId} PollApi.editPoll -POST /v1/polls/{pollId}/edit PollApi.editPoll +POST,PUT /v1/polls/{pollId} PollApi.editPoll +POST /v1/polls/{pollId}/edit PollApi.editPoll -GET /v1/polls/{pollId} PollApi.getPoll -DELETE /v1/polls/{pollId} PollApi.deletePoll +GET /v1/polls/{pollId} PollApi.getPoll +DELETE /v1/polls/{pollId} PollApi.deletePoll -POST /v1/polls/{pollId}/clone PollApi.clonePoll +POST /v1/polls/{pollId}/clone PollApi.clonePoll -GET /v1/polls/{pollId}/export PollApi.exportPoll -PUT /v1/polls/{pollId}/close PollApi.closePoll -PUT /v1/polls/{pollId}/reopen PollApi.reopenPoll +GET /v1/polls/{pollId}/export PollApi.exportPoll +PUT /v1/polls/{pollId}/close PollApi.closePoll +PUT /v1/polls/{pollId}/reopen PollApi.reopenPoll +PUT /v1/polls/{pollId}/assign PollApi.assignPoll # PollenResourceApi diff --git a/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java b/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java index b18f3e8..d9404ee 100644 --- a/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java +++ b/pollen-services/src/main/java/org/chorem/pollen/services/service/PollService.java @@ -38,6 +38,7 @@ import org.chorem.pollen.services.bean.PollenEntityRef; import org.chorem.pollen.services.bean.VoterListBean; import org.chorem.pollen.services.bean.VoterListMemberBean; import org.chorem.pollen.services.service.security.PermissionVerb; +import org.chorem.pollen.services.service.security.PollenUnauthorizedException; import org.chorem.pollen.votecounting.VoteCountingNotFound; import org.nuiton.util.pagination.PaginationParameter; import org.nuiton.util.pagination.PaginationResult; @@ -367,6 +368,32 @@ public class PollService extends PollenServiceSupport { } + public PollBean assignPollToConnectedUser(String pollId) { + + getSecurityContext().isConnected(); + + checkNotNull(pollId); + checkPermission(PermissionVerb.editPoll, pollId); + + Poll poll = getPoll0(pollId); + PollenUser creator = poll.getCreator().getPollenUser(); + PollenUser connectedUser = getConnectedUser(); + + if (creator != null) { + if (!creator.equals(connectedUser)) { + throw new PollenUnauthorizedException(connectedUser.getEmail()); + } else { + // no poll assigned + return null; + } + } + + poll.getCreator().setPollenUser(connectedUser); + commit(); + + return toBean(PollBean.class, poll, pollBeanFunction); + } + protected Poll savePoll(PollBean poll, List<ChoiceBean> choices) { boolean pollExists = poll.isPersisted(); @@ -388,24 +415,20 @@ public class PollService extends PollenServiceSupport { PollenPrincipal creatorToPersist = getSecurityService().generatePollenPrincipal(); - toSave.setCreator(creatorToPersist); - - existingChoices = new ArrayList<>(); - - } - - // -- creator -- // - - PollenUser connectedUser = getConnectedUser(); + // -- creator -- // - if (connectedUser != null) { + PollenUser connectedUser = getConnectedUser(); + if (connectedUser != null) { + // link to connected user + creatorToPersist.setPollenUser(connectedUser); - // link to connected user - toSave.getCreator().setPollenUser(connectedUser); + } else if (getSecurityContext().getMainPrincipal() == null) { + getSecurityContext().setMainPrincipal(creatorToPersist); + } - } else if (getSecurityContext().getMainPrincipal() == null){ + toSave.setCreator(creatorToPersist); - getSecurityContext().setMainPrincipal(toSave.getCreator()); + existingChoices = new ArrayList<>(); } diff --git a/pollen-services/src/test/java/org/chorem/pollen/services/service/PollServiceTest.java b/pollen-services/src/test/java/org/chorem/pollen/services/service/PollServiceTest.java index 11d0cd6..41de729 100644 --- a/pollen-services/src/test/java/org/chorem/pollen/services/service/PollServiceTest.java +++ b/pollen-services/src/test/java/org/chorem/pollen/services/service/PollServiceTest.java @@ -24,10 +24,16 @@ package org.chorem.pollen.services.service; import org.chorem.pollen.persistence.entity.ChoiceType; import org.chorem.pollen.persistence.entity.Poll; import org.chorem.pollen.persistence.entity.PollType; +import org.chorem.pollen.persistence.entity.PollenUser; import org.chorem.pollen.services.AbstractPollenServiceTest; +import org.chorem.pollen.services.PollenFixtures; import org.chorem.pollen.services.bean.ChoiceBean; import org.chorem.pollen.services.bean.PollBean; import org.chorem.pollen.services.bean.PollenEntityRef; +import org.chorem.pollen.services.service.security.PollenAuthenticationException; +import org.chorem.pollen.services.service.security.PollenInvalidPermissionException; +import org.chorem.pollen.services.service.security.PollenInvalidSessionTokenException; +import org.chorem.pollen.services.service.security.PollenUnauthorizedException; import org.chorem.pollen.services.service.security.SecurityService; import org.chorem.pollen.services.test.FakePollenSecurityContext; import org.junit.Assert; @@ -529,4 +535,44 @@ public class PollServiceTest extends AbstractPollenServiceTest { // // } + @Test + public void testAssignPollToConnectedUser() throws PollenInvalidSessionTokenException, PollenAuthenticationException { + Poll poll = fixture(PollenFixtures.POLL_NORMAL_ID); + Assert.assertNull(poll.getCreator().getPollenUser()); + try { + service.assignPollToConnectedUser(poll.getTopiaId()); + Assert.fail("An error should be thrown as no user is connected"); + + } catch (PollenInvalidPermissionException e) { + Assert.assertNull(poll.getCreator().getPollenUser()); + } + + login("tony@pollen.fake", "fake"); + try { + service.assignPollToConnectedUser(poll.getTopiaId()); + Assert.fail("An error should be thrown if the connected user does not provide the permission to edit the poll"); + + } catch (PollenInvalidPermissionException e) { + Assert.assertNull(poll.getCreator().getPollenUser()); + } + + securityService.getSecurityContext().setMainPrincipal(poll.getCreator()); + service.assignPollToConnectedUser(poll.getTopiaId()); + + PollenUser pollenUser = poll.getCreator().getPollenUser(); + Assert.assertNotNull(pollenUser); + Assert.assertEquals("tony@pollen.fake", pollenUser.getEmail()); + + login("jean@pollen.fake", "fake"); + try { + service.assignPollToConnectedUser(poll.getTopiaId()); + Assert.fail("An error should be thrown as the poll is already assigned to a user"); + + } catch (PollenUnauthorizedException e) { + Assert.assertNotNull(pollenUser); + Assert.assertEquals("tony@pollen.fake", pollenUser.getEmail()); + } + + } + } -- To stop receiving notification emails like this one, please contact chorem.org SCM administrator <admin+scm@chorem.org>.