From 80abd003ae4deb6f5fc09fd042a383377614d566 Mon Sep 17 00:00:00 2001 From: Tykayn Date: Thu, 29 Apr 2021 11:41:36 +0200 Subject: [PATCH] save new stack and return updated poll --- composer.json | 151 ++++----- config/packages/framework.yaml | 1 + config/packages/nelmio_cors.yaml | 3 +- public/index.php | 2 +- src/Controller/api/VoteController.php | 429 +++++++++++--------------- src/Entity/Poll.php | 13 + src/Entity/StackOfVotes.php | 10 +- 7 files changed, 279 insertions(+), 330 deletions(-) diff --git a/composer.json b/composer.json index 320da9e..bec7081 100644 --- a/composer.json +++ b/composer.json @@ -1,78 +1,81 @@ { - "type": "project", - "license": "proprietary", - "minimum-stability": "dev", - "prefer-stable": true, - "require": { - "php": ">=7.2.5", - "ext-ctype": "*", - "ext-iconv": "*", - "composer/package-versions-deprecated": "1.11.99.1", - "doctrine/annotations": "^1.12", - "doctrine/doctrine-bundle": "^2.3", - "doctrine/doctrine-migrations-bundle": "^3.1", - "doctrine/orm": "^2.8", - "friendsofsymfony/rest-bundle": "^3.0", - "jms/serializer-bundle": "^3.9", - "nelmio/cors-bundle": "^2.1", - "sensio/framework-extra-bundle": "^6.1", - "symfony/asset": "5.2.*", - "symfony/console": "5.2.*", - "symfony/dotenv": "5.2.*", - "symfony/flex": "^1.3.1", - "symfony/form": "5.2.*", - "symfony/framework-bundle": "5.2.*", - "symfony/proxy-manager-bridge": "5.2.*", - "symfony/swiftmailer-bundle": "^3.5", - "symfony/twig-bundle": "5.2.*", - "symfony/yaml": "5.2.*" + "type": "project", + "license": "aGPLv3", + "minimum-stability": "dev", + "description": "Une API pour framadate funky", + "name": "datepollapi", + "prefer-stable": true, + "require": { + "php": ">=7.2.5", + "ext-ctype": "*", + "ext-iconv": "*", + "composer/package-versions-deprecated": "1.11.99.1", + "doctrine/annotations": "^1.12", + "doctrine/doctrine-bundle": "^2.3", + "doctrine/doctrine-migrations-bundle": "^3.1", + "doctrine/orm": "^2.8", + "friendsofsymfony/rest-bundle": "^3.0", + "jms/serializer-bundle": "^3.9", + "nelmio/cors-bundle": "^2.1", + "sensio/framework-extra-bundle": "^6.1", + "symfony/asset": "5.2.*", + "symfony/console": "5.2.*", + "symfony/dotenv": "5.2.*", + "symfony/flex": "^1.3.1", + "symfony/form": "5.2.*", + "symfony/framework-bundle": "5.2.*", + "symfony/proxy-manager-bridge": "5.2.*", + "symfony/swiftmailer-bundle": "^3.5", + "symfony/twig-bundle": "5.2.*", + "symfony/yaml": "5.2.*", + "ext-json": "*" + }, + "config": { + "optimize-autoloader": true, + "preferred-install": { + "*": "dist" }, - "config": { - "optimize-autoloader": true, - "preferred-install": { - "*": "dist" - }, - "sort-packages": true - }, - "autoload": { - "psr-4": { - "App\\": "src/" - } - }, - "autoload-dev": { - "psr-4": { - "App\\Tests\\": "tests/" - } - }, - "replace": { - "symfony/polyfill-ctype": "*", - "symfony/polyfill-iconv": "*", - "symfony/polyfill-php72": "*" - }, - "scripts": { - "auto-scripts": { - "cache:clear": "symfony-cmd", - "assets:install %PUBLIC_DIR%": "symfony-cmd" - }, - "post-install-cmd": [ - "@auto-scripts" - ], - "post-update-cmd": [ - "@auto-scripts" - ] - }, - "conflict": { - "symfony/symfony": "*" - }, - "extra": { - "symfony": { - "allow-contrib": false, - "require": "5.2.*" - } - }, - "require-dev": { - "doctrine/doctrine-fixtures-bundle": "^3.4", - "symfony/debug-bundle": "5.2.*", - "symfony/maker-bundle": "^1.30" + "sort-packages": true + }, + "autoload": { + "psr-4": { + "App\\": "src/" } + }, + "autoload-dev": { + "psr-4": { + "App\\Tests\\": "tests/" + } + }, + "replace": { + "symfony/polyfill-ctype": "*", + "symfony/polyfill-iconv": "*", + "symfony/polyfill-php72": "*" + }, + "scripts": { + "auto-scripts": { + "cache:clear": "symfony-cmd", + "assets:install %PUBLIC_DIR%": "symfony-cmd" + }, + "post-install-cmd": [ + "@auto-scripts" + ], + "post-update-cmd": [ + "@auto-scripts" + ] + }, + "conflict": { + "symfony/symfony": "*" + }, + "extra": { + "symfony": { + "allow-contrib": false, + "require": "5.2.*" + } + }, + "require-dev": { + "doctrine/doctrine-fixtures-bundle": "^3.4", + "symfony/debug-bundle": "5.2.*", + "symfony/maker-bundle": "^1.30" + } } diff --git a/config/packages/framework.yaml b/config/packages/framework.yaml index cad7f78..383f420 100644 --- a/config/packages/framework.yaml +++ b/config/packages/framework.yaml @@ -1,5 +1,6 @@ # see https://symfony.com/doc/current/reference/configuration/framework.html framework: + trusted_hosts: ['localhost:4200', 'localhost'] secret: '%env(APP_SECRET)%' #csrf_protection: true #http_method_override: true diff --git a/config/packages/nelmio_cors.yaml b/config/packages/nelmio_cors.yaml index a3b27b5..b725425 100644 --- a/config/packages/nelmio_cors.yaml +++ b/config/packages/nelmio_cors.yaml @@ -3,8 +3,9 @@ nelmio_cors: origin_regex: true allow_origin: [ '*' ] allow_methods: [ 'GET', 'OPTIONS', 'POST', 'PUT', 'PATCH', 'DELETE' ] - allow_headers: [ 'Accept','Authorization','Cache-Control','Content-Type','DNT','If-Modified-Since','Keep-Alive','Origin','User-Agent','X-Requested-With' ] + allow_headers: [ '*' ] expose_headers: [ 'Authorization' ] + allow_credentials: true max_age: 3600 paths: '^/': ~ diff --git a/public/index.php b/public/index.php index 1eb8fbb..3a97ee1 100644 --- a/public/index.php +++ b/public/index.php @@ -5,7 +5,7 @@ use Symfony\Component\ErrorHandler\Debug; use Symfony\Component\HttpFoundation\Request; - header( 'Access-Control-Allow-Origin: *' ); +// header( 'Access-Control-Allow-Origin: *' ); // header( "Access-Control-Allow-Headers: X-API-KEY, Origin, X-Requested-With, Content-Type, Accept, Access-Control-Request-Method" ); // header( "Access-Control-Allow-Methods: GET, POST, OPTIONS, PUT, DELETE" ); header( "Allow: GET, POST, OPTIONS, PUT, DELETE" ); diff --git a/src/Controller/api/VoteController.php b/src/Controller/api/VoteController.php index 664ccf4..4cc1be6 100644 --- a/src/Controller/api/VoteController.php +++ b/src/Controller/api/VoteController.php @@ -1,269 +1,208 @@ getDoctrine()->getManager(); - $emPol = $em->getRepository( Poll::class ); - $poll = $emPol->findOneByCustomUrl( $custom_url ); + $em = $this->getDoctrine()->getManager(); + $emPol = $em->getRepository( Poll::class ); + $poll = $emPol->findOneByCustomUrl( $custom_url ); - if ( ! $poll ) { - return $this->json( [ 'message' => 'poll "' . $custom_url . '" not found' ], 404 ); + if ( ! $poll ) { + return $this->json( [ 'message' => 'poll "' . $custom_url . '" not found' ], 404 ); + } + + $data = $request->getContent(); + $data = json_decode( $data, true ); + +// var_dump($data); +// die(); + + $owner = new Owner(); + $owner + ->addPoll( $poll ) + + ; + $newStack = new StackOfVotes(); + $newStack + ->setPoll($poll) + ->setIp( $_SERVER[ 'REMOTE_ADDR' ] ) + ->setPseudo( $data[ "pseudo" ] ) + ->setOwner( $owner ); + $owner + ->setPseudo($data['owner'][ "pseudo" ]) + ->setPseudo($data['owner'][ "email" ]) + ->addStackOfVote($newStack); + + // TODO manage new comment + $emChoice = $choice_repository; + + foreach ( $data[ 'votes' ] as $vote ) { + if(!$vote[ 'value' ]){ + continue; + } + $newVote = new Vote(); + $newVote->setPoll( $poll ); + + $newStack->addVote( $newVote ); + $choiceFound = $emChoice->find( $vote[ 'choice_id' ] ); + if ( $choiceFound ) { + + $choiceFound->addVote( $newVote ); + $newVote->setStacksOfVotes( $newStack ) + ->setChoice( $choiceFound ) + ->setValue( $vote[ 'value' ] ); + $em->persist( $choiceFound ); + } else { + throw new NotFoundHttpException( 'no choice of id' . $vote[ 'choice_id' ] ); } - $data = $request->getContent(); - $data = json_decode( $data, true ); -// $data = $data['data']; + $poll->addVote( $newVote ); + $em->persist( $newVote ); + } + $newStack + ->setPoll( $poll ); + $em->persist( $newStack ); + $em->persist( $poll ); + $em->flush(); - $owner = new Owner(); - $owner->addPoll($poll); - $newStack = new StackOfVotes(); - $newStack - ->setPseudo( $data[ 'pseudo' ] ) - ->setOwner($owner ); + if ( $poll->getMailOnVote() ) { + $this->sendVoteNotificationAction( $newStack->getOwner(), $newStack ); + } - // TODO manage new comment - $emChoice = $choice_repository; + return $this->json( [ + 'poll' => $poll->display(), + ] ); - foreach ( $data[ 'votes' ] as $vote ) { - $newVote = new Vote(); - $newVote->setPoll($poll); - $newStack->addVote( $newVote ); - $choiceFound = $emChoice->find( $vote[ 'choice_id' ] ); - if ( $choiceFound ) { + } - $choiceFound->addVote( $newVote ); - $newVote->setStacksOfVotes( $newStack ) - ->setChoice( $choiceFound ) - ->setValue( $vote[ 'value' ] ); - $em->persist( $choiceFound ); - } else { - throw new NotFoundHttpException( 'no choice of id' . $vote[ 'choice_id' ] ); - } + /** + * update vote stack + * @Patch( + * path = "/vote-stack/{id}/token/{modifierToken}", + * name = "update_vote_stack", + * requirements = { "id"="\d+"} + * ) + * + * @param SerializerInterface $serializer + * @param StackOfVotes $id + * @param $modifierToken + * @param Request $request + * + * @return JsonResponse|Response + */ + public + function updateVoteStackAction( + SerializerInterface $serializer, + StackOfVotes $id, + $modifierToken, + Request $request + ) { + $voteStack = $id; + if ( ! $voteStack ) { + return $this->json( [ 'message' => 'vote stack not found' ], 404 ); + } + $poll = $voteStack->getPoll(); - $poll->addVote($newVote); - $em->persist( $newVote ); - } - $newStack - ->setPoll( $poll ); - $em->persist( $newStack ); - $em->persist( $poll ); + // if only self users are allowed to modify a vote, check it + if ( ! $modifierToken || $voteStack->getOwner()->getModifierToken() !== $modifierToken ) { + return $this->json( [ 'message' => 'your token does not allow you to modify this vote ' ], + 403 ); + } + // everything is ok, we can update all the votes of the vote stack + //TODO + // match votes and choices + // update answers + // save evrything + + + $jsonResponse = $serializer->serialize( [ + 'message' => 'ok', + 'modifier_token' => $voteStack->getOwner()->getModifierToken(), + 'vote_stack' => $voteStack, + ], + 'json' ); + + $response = new Response( $jsonResponse ); + $response->headers->set( 'Content-Type', 'application/json' ); + $response->setStatusCode( 200 ); + + return $response; + + + } + + /** + * @Delete( + * path = "/poll/{id}/votes/{accessToken}", + * name = "poll_votes_delete", + * requirements = {"accessToken"="\w+", "poll_id"="\d+"} + * ) + * @return JsonResponse + */ + public + function deletePollVotesAction( + Poll $poll, + $accessToken + ) { + if ( $accessToken == $poll->getAdminKey() ) { + $em = $this->getDoctrine()->getManager(); + $length = count( $poll->getVotes() ); + $em->remove( $poll->getVotes() ); $em->flush(); - return $this->json( [ - 'data' => $data, - ] ); -// $emOwner = $em->getRepository( Owner::class ); -// $emChoice = $em->getRepository( Choice::class ); -// $existingOwner = false; -// $foundOwner = $emOwner->findOneByEmail( trim( $data[ 'email' ] ) ); - // manage existing or new Owner -// if ( ! $foundOwner ) { -// $foundOwner = new Owner(); -// $foundOwner -// ->setEmail( $data[ 'email' ] ) -// ->setPseudo( $data[ 'pseudo' ] ); -// } else { -// $existingOwner = true; -// } - // TODO anti flood -// $foundOwner -// ->setModifierToken( $poll->generateRandomKey() ); -// $stack = new StackOfVotes(); -// $stack -// ->setOwner( $foundOwner ) -// ->setIp( $_SERVER[ 'REMOTE_ADDR' ] ) -// ->setPseudo( $data[ 'pseudo' ] ) -// ->setPoll( $custom_url ); -// foreach ( $data[ 'votes' ] as $voteInfo ) { -// -// if ( ! isset( $voteInfo[ 'value' ] ) ) { -// continue; -// } -// $allowedValuesToAnswer = [ 'yes', 'maybe', 'no' ]; -// -// if ( ! in_array( $voteInfo[ 'value' ], $allowedValuesToAnswer ) ) { -// return $this->json( [ -// 'message' => 'answer ' . $voteInfo[ 'value' ] . ' is not allowed. should be yes, maybe, or no.', -// 'vote_stack' => $stack, -// ], -// 404 ); -// } -// $vote = new Vote(); -// $foundChoice = $emChoice->find( $voteInfo[ 'choice_id' ] ); -// if ( ! $foundChoice ) { -// return $this->json( [ -// 'message' => 'choice ' . $voteInfo[ 'choice_id' ] . ' was not found', -// 'vote_stack' => $stack, -// ], -// 404 ); -// } -// $vote->setPoll( $poll ) -// ->setChoice( $foundChoice ) -// ->setValue( $voteInfo[ 'value' ] ); -// $vote->setPoll( $poll ); -// $stack->addVote( $vote ); -// $poll->addVote( $vote ); -// $em->persist( $vote ); -// $em->persist( $foundChoice ); -// } -// -// // find poll from choices -// $poll->addStackOfVote( $stack ); -// $em->persist( $stack ); -// $em->persist( $poll ); -// $em->flush(); -// $precision = ''; -// if ( $existingOwner ) { -// $precision = ' from an existing owner : ' . $foundOwner->getEmail(); -// } -// -// if ( $poll->getMailOnVote() ) { -// $this->sendVoteNotificationAction( $stack->getOwner(), $stack ); -// } -// -// $returnedVoteStack = $stack; -// -// $jsonResponse = $serializer->serialize( $returnedVoteStack, 'json' ); -// -// $response = new Response( $jsonResponse ); -// $response->headers->set( 'Content-Type', 'application/json' ); -// $response->setStatusCode( 200 ); -// -// return $response; - - } - - /** - * update vote stack - * @Patch( - * path = "/vote-stack/{id}/token/{modifierToken}", - * name = "update_vote_stack", - * requirements = { "id"="\d+"} - * ) - * - * @param SerializerInterface $serializer - * @param StackOfVotes $id - * @param $modifierToken - * @param Request $request - * - * @return JsonResponse|Response - */ - public - function updateVoteStackAction( - SerializerInterface $serializer, - StackOfVotes $id, - $modifierToken, - Request $request - ) { - $voteStack = $id; - if ( ! $voteStack ) { - return $this->json( [ 'message' => 'vote stack not found' ], 404 ); - } - $poll = $voteStack->getPoll(); - - // if only self users are allowed to modify a vote, check it - if ( ! $modifierToken || $voteStack->getOwner()->getModifierToken() !== $modifierToken ) { - return $this->json( [ 'message' => 'your token does not allow you to modify this vote ' ], - 403 ); - } - // everything is ok, we can update all the votes of the vote stack - //TODO - // match votes and choices - // update answers - // save evrything - - - $jsonResponse = $serializer->serialize( [ - 'message' => 'ok', - 'modifier_token' => $voteStack->getOwner()->getModifierToken(), - 'vote_stack' => $voteStack, + 'message' => 'boom! les ' . $length . ' votes du sondage ont été supprimés', ], - 'json' ); - - $response = new Response( $jsonResponse ); - $response->headers->set( 'Content-Type', 'application/json' ); - $response->setStatusCode( 200 ); - - return $response; - - - } - - /** - * @Delete( - * path = "/poll/{id}/votes/{accessToken}", - * name = "poll_votes_delete", - * requirements = {"accessToken"="\w+", "poll_id"="\d+"} - * ) - * @return JsonResponse - */ - public - function deletePollVotesAction( - Poll $poll, - $accessToken - ) { - if ( $accessToken == $poll->getAdminKey() ) { - $em = $this->getDoctrine()->getManager(); - $length = count( $poll->getVotes() ); - $em->remove( $poll->getVotes() ); - $em->flush(); - - return $this->json( [ - 'message' => 'boom! les ' . $length . ' votes du sondage ont été supprimés', - ], - 200 ); - } else { - return $this->json( [ - 'message' => 'le token d\'autorisation est invalide, vous ne pouvez pas modifier ce sondage', - ], - 403 ); - } + 200 ); + } else { + return $this->json( [ + 'message' => 'le token d\'autorisation est invalide, vous ne pouvez pas modifier ce sondage', + ], + 403 ); } } +} diff --git a/src/Entity/Poll.php b/src/Entity/Poll.php index 596c06a..2bb8582 100755 --- a/src/Entity/Poll.php +++ b/src/Entity/Poll.php @@ -316,6 +316,19 @@ 'id' => $choice_id, 'url' => $choice_url, 'name' => $vote->getChoice()->getName(), + 'score' => 0, + 'yes' => [ + 'count' => 0, + 'people' => [], + ], + 'maybe' => [ + 'count' => 0, + 'people' => [], + ], + 'no' => [ + 'count' => 0, + 'people' => [], + ], ]; } diff --git a/src/Entity/StackOfVotes.php b/src/Entity/StackOfVotes.php index c169942..4c5fa00 100755 --- a/src/Entity/StackOfVotes.php +++ b/src/Entity/StackOfVotes.php @@ -67,15 +67,7 @@ class StackOfVotes { 'created_at' => $this->getCreatedAtAsString(), 'votes' => [], ]; - // prefill votes with all choices ids - // foreach ( $this->getPoll()->getChoices() as $choice ) { - // $tab[ 'votes' ][ $choice->getId() ] = [ - // 'choice_id' => $choice->getId(), - // 'value' => null, - // ]; - // } - - foreach ( $votes as $vote ) { + foreach ( $this->getVotes() as $vote ) { $tab[ 'votes' ][ $vote->getChoice()->getId() ] = $vote->display(); }