From fd28433dd8b586b331215e3e2b51d9cb277e1ea5 Mon Sep 17 00:00:00 2001 From: Tykayn Date: Thu, 10 Jun 2021 10:17:42 +0200 Subject: [PATCH] update of a vote stack returns a vote stack --- composer.json | 1 + composer.lock | 149 ++++++++++++++++++++++- src/Controller/api/v1/VoteController.php | 67 ++++++++-- src/Entity/Owner.php | 1 + src/Entity/StackOfVotes.php | 27 +--- symfony.lock | 6 + 6 files changed, 213 insertions(+), 38 deletions(-) diff --git a/composer.json b/composer.json index 20e1572..373f3b2 100644 --- a/composer.json +++ b/composer.json @@ -46,6 +46,7 @@ "doctrine/doctrine-migrations-bundle": "^3.1", "doctrine/orm": "^2.8", "friendsofsymfony/rest-bundle": "^3.0", + "gedmo/doctrine-extensions": "^3.0", "jms/serializer-bundle": "^3.9", "nelmio/cors-bundle": "^2.1", "sensio/framework-extra-bundle": "^6.1", diff --git a/composer.lock b/composer.lock index a053bd7..72a85d6 100644 --- a/composer.lock +++ b/composer.lock @@ -4,8 +4,57 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "104b8c116015bbc6f7f3efa3d0618a90", + "content-hash": "9f35ffaf799b2f21e80284cb4800a791", "packages": [ + { + "name": "behat/transliterator", + "version": "v1.3.0", + "source": { + "type": "git", + "url": "https://github.com/Behat/Transliterator.git", + "reference": "3c4ec1d77c3d05caa1f0bf8fb3aae4845005c7fc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Behat/Transliterator/zipball/3c4ec1d77c3d05caa1f0bf8fb3aae4845005c7fc", + "reference": "3c4ec1d77c3d05caa1f0bf8fb3aae4845005c7fc", + "shasum": "" + }, + "require": { + "php": ">=5.3.3" + }, + "require-dev": { + "chuyskywalker/rolling-curl": "^3.1", + "php-yaoi/php-yaoi": "^1.0", + "phpunit/phpunit": "^4.8.36|^6.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.2-dev" + } + }, + "autoload": { + "psr-4": { + "Behat\\Transliterator\\": "src/Behat/Transliterator" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "Artistic-1.0" + ], + "description": "String transliterator", + "keywords": [ + "i18n", + "slug", + "transliterator" + ], + "support": { + "issues": "https://github.com/Behat/Transliterator/issues", + "source": "https://github.com/Behat/Transliterator/tree/v1.3.0" + }, + "time": "2020-01-14T16:39:13+00:00" + }, { "name": "composer/package-versions-deprecated", "version": "1.11.99.1", @@ -1682,6 +1731,104 @@ }, "time": "2021-01-02T11:26:24+00:00" }, + { + "name": "gedmo/doctrine-extensions", + "version": "v3.0.5", + "source": { + "type": "git", + "url": "https://github.com/doctrine-extensions/DoctrineExtensions.git", + "reference": "f956c3c4d0c0ffdc5dd879288073772e439b6c1a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine-extensions/DoctrineExtensions/zipball/f956c3c4d0c0ffdc5dd879288073772e439b6c1a", + "reference": "f956c3c4d0c0ffdc5dd879288073772e439b6c1a", + "shasum": "" + }, + "require": { + "behat/transliterator": "~1.2", + "doctrine/annotations": "^1.2", + "doctrine/cache": "^1.0", + "doctrine/collections": "^1.0", + "doctrine/common": "^2.13 || ^3.0", + "doctrine/event-manager": "^1.0", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "doctrine/mongodb": "<1.3", + "doctrine/mongodb-odm": "<2.0", + "sebastian/comparator": "<2.0" + }, + "provide": { + "ext-mongo": "1.6.12" + }, + "require-dev": { + "alcaeus/mongo-php-adapter": "^1.1", + "doctrine/doctrine-bundle": "^2.3", + "doctrine/mongodb-odm": "^2.0", + "doctrine/orm": "^2.6.3", + "friendsofphp/php-cs-fixer": "^2.16", + "phpunit/phpunit": "^8.5", + "symfony/yaml": "^4.1" + }, + "suggest": { + "doctrine/mongodb-odm": "to use the extensions with the MongoDB ODM", + "doctrine/orm": "to use the extensions with the ORM" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "psr-4": { + "Gedmo\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gediminas Morkevicius", + "email": "gediminas.morkevicius@gmail.com" + }, + { + "name": "Gustavo Falco", + "email": "comfortablynumb84@gmail.com" + }, + { + "name": "David Buchmann", + "email": "david@liip.ch" + } + ], + "description": "Doctrine2 behavioral extensions", + "homepage": "http://gediminasm.org/", + "keywords": [ + "Blameable", + "behaviors", + "doctrine2", + "extensions", + "gedmo", + "loggable", + "nestedset", + "sluggable", + "sortable", + "timestampable", + "translatable", + "tree", + "uploadable" + ], + "support": { + "email": "gediminas.morkevicius@gmail.com", + "issues": "https://github.com/doctrine-extensions/DoctrineExtensions/issues", + "source": "https://github.com/doctrine-extensions/DoctrineExtensions/tree/v3.0.5", + "wiki": "https://github.com/Atlantic18/DoctrineExtensions/tree/main/doc" + }, + "time": "2021-04-23T09:16:01+00:00" + }, { "name": "jms/metadata", "version": "2.5.0", diff --git a/src/Controller/api/v1/VoteController.php b/src/Controller/api/v1/VoteController.php index fda3510..cd88b13 100644 --- a/src/Controller/api/v1/VoteController.php +++ b/src/Controller/api/v1/VoteController.php @@ -3,6 +3,7 @@ namespace App\Controller\api\v1; use App\Controller\EmailsController; +use App\Entity\Choice; use App\Entity\Comment; use App\Entity\Owner; use App\Entity\Poll; @@ -162,16 +163,17 @@ class VoteController extends EmailsController { $data = $request->getContent(); $data = json_decode( $data, true ); - if ( $whocanchangeanswers == 'everybody' ) { + $table_votes_by_choice_id = []; - $voteStack->patchVotes( $data[ 'votes' ] ); + if ( $whocanchangeanswers == 'everybody' ) { + $table_votes_by_choice_id = $this->patchVotes( $voteStack, $data[ 'votes' ] ); } else if ( $whocanchangeanswers == 'self' ) { // someone with the right token of this vote stack only can change this if ( ! $modifierToken || $voteStack->getOwner()->getModifierToken() !== $modifierToken ) { return $this->json( [ 'message' => 'your token does not allow you to modify this vote ' ], 403 ); } - $voteStack->patchVotes( $data[ 'votes' ] ); + $this->patchVotes( $voteStack, $data[ 'votes' ] ); // everything is ok, we can update all the votes of the vote stack } else if ( $whocanchangeanswers == 'nobody' ) { // only the poll admin with the poll modifier token can change this @@ -179,7 +181,7 @@ class VoteController extends EmailsController { return $this->json( [ 'message' => 'your token does not allow you to modify this vote ' ], 403 ); } - $voteStack->patchVotes( $data[ 'votes' ] ); + $this->patchVotes( $voteStack, $data[ 'votes' ] ); } @@ -191,13 +193,7 @@ class VoteController extends EmailsController { // save everything - $jsonResponse = [ - 'message' => 'ok', - 'whocanchangeanswers' => $whocanchangeanswers, - 'modifier_token' => $voteStack->getOwner()->getModifierToken(), - 'vote_stack' => $voteStack, - 'data' => $id, - ]; + $jsonResponse = $voteStack->displayForAdmin(); return $this->json( $jsonResponse, 200 ); @@ -205,6 +201,55 @@ class VoteController extends EmailsController { } + public function patchVotes( $stackOfVotes, $data ) { + $table_votes_by_choice_id = []; + $votes = $stackOfVotes->getVotes(); + $choices = $stackOfVotes->getPoll()->getChoices(); + $table_choices_by_id = []; + + $em = $this->getDoctrine()->getManager(); + + foreach ( $choices as $c ) { + $table_choices_by_id[ $c->getId() ] = $c; + } + foreach ( $votes as $stack_vote ) { + $table_votes_by_choice_id[ $stack_vote->getChoice()->getId() ] = $stack_vote; + } + foreach ( $data as $vote ) { + + $newValue = $vote[ 'value' ]; + $choice_id = $vote[ 'choice_id' ]; + // if the new value is null, remove the vote + if ( isset( $table_choices_by_id[ $choice_id ] ) ) { + if ( isset( $table_votes_by_choice_id[ $choice_id ] ) ) { + $voteFound = $table_votes_by_choice_id[ $choice_id ]; + if ( $newValue ) { + $voteFound->setValue( $newValue ); + $em->persist( $voteFound ); + } else { + $stackOfVotes->removeVote( $voteFound ); + $em->remove( $voteFound ); + } + } else if ( $newValue ) { + // create vote for this stack + $newVote = new Vote(); + $newVote->setChoice( $em->find( Choice::class, $choice_id ) ) + ->setValue( $newValue ); + $em->persist( $newVote ); + + $stackOfVotes->addVote( $newVote ); + } + } + + + } + $em->persist( $stackOfVotes ); + $em->flush(); + + return $table_votes_by_choice_id; + + } + /** * @Route( * path = "/{id}/token/{modifierToken}", diff --git a/src/Entity/Owner.php b/src/Entity/Owner.php index 79a5e9c..3c3355a 100755 --- a/src/Entity/Owner.php +++ b/src/Entity/Owner.php @@ -98,6 +98,7 @@ class Owner { public function displayForAdmin() { return [ 'pseudo' => $this->getPseudo(), + 'email' => $this->getEmail(), 'modifier_token' => $this->getModifierToken(), 'created_at' => $this->getCreatedAtAsString(), ]; diff --git a/src/Entity/StackOfVotes.php b/src/Entity/StackOfVotes.php index 4671d13..4547434 100755 --- a/src/Entity/StackOfVotes.php +++ b/src/Entity/StackOfVotes.php @@ -26,7 +26,7 @@ class StackOfVotes { */ public $pseudo; /** - * @ORM\OneToMany(targetEntity="App\Entity\Vote", mappedBy="stacksOfVotes", cascade={"persist","remove"}) + * @ORM\OneToMany(targetEntity="App\Entity\Vote", mappedBy="stacksOfVotes", orphanRemoval=true, cascade={"persist","remove"}) * @Serializer\Expose() */ public $votes; @@ -161,29 +161,4 @@ class StackOfVotes { return $this; } - /** - * only update the values of votes - * - * @param $votes - */ - public function patchVotes( $votes ) { - $table_votes_by_id = []; - $stackVotes = $this->getVotes(); - foreach ( $stackVotes as $stack_vote ) { - $table_votes_by_id[ $stack_vote->getId() ] = $stack_vote; - } - foreach ( $votes as $vote ) { - - $newValue = $vote[ 'value' ]; - $id = $vote[ 'id' ]; - // if the new value is null, remove the vote - if ( $newValue && isset( $table_votes_by_id[ $id ] ) ) { - - $table_votes_by_id[ $id ]->setValue( $newValue ); -// $this->addVote($table_votes_by_id[$id]); - } - - } - - } } diff --git a/symfony.lock b/symfony.lock index e7743c9..0d7f985 100644 --- a/symfony.lock +++ b/symfony.lock @@ -1,4 +1,7 @@ { + "behat/transliterator": { + "version": "v1.3.0" + }, "composer/package-versions-deprecated": { "version": "1.11.99.1" }, @@ -115,6 +118,9 @@ "config/packages/fos_rest.yaml" ] }, + "gedmo/doctrine-extensions": { + "version": "v3.0.5" + }, "jms/metadata": { "version": "2.5.0" },