Compare commits

...

8 Commits

Author SHA1 Message Date
Tykayn 6626241ce8 make unique custom url for polls 2021-04-21 11:47:06 +02:00
Tykayn 2d2607d30b get protected pass route works 2021-04-21 11:44:06 +02:00
Tykayn 1570a1cf0f add dependency on fixtures 2021-04-21 11:30:22 +02:00
Tykayn 108cc473e4 advance on fixtures 2021-04-21 11:22:50 +02:00
Tykayn b6ca330826 advance on fixtures 2021-04-21 11:22:01 +02:00
Tykayn 8bc01198b8 globals twig support and website 2021-04-21 11:04:54 +02:00
tykayn edfb65c56e add global vars for twig 2021-04-21 11:02:56 +02:00
tykayn aab2d74b19 Revert "add graphql bundle"
rearrange controllers for api and no api

This reverts commit 8fbd5462
2021-04-21 11:02:24 +02:00
23 changed files with 1925 additions and 282 deletions

View File

@ -70,6 +70,7 @@
}
},
"require-dev": {
"doctrine/doctrine-fixtures-bundle": "^3.4",
"symfony/maker-bundle": "^1.30"
}
}

160
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "8c0122c4e542f317501dd66ea0f62a40",
"content-hash": "6ae23da7ab3d4ef4c0b8661a284d73c4",
"packages": [
{
"name": "composer/package-versions-deprecated",
@ -6374,6 +6374,164 @@
}
],
"packages-dev": [
{
"name": "doctrine/data-fixtures",
"version": "1.5.0",
"source": {
"type": "git",
"url": "https://github.com/doctrine/data-fixtures.git",
"reference": "51d3d4880d28951fff42a635a2389f8c63baddc5"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/data-fixtures/zipball/51d3d4880d28951fff42a635a2389f8c63baddc5",
"reference": "51d3d4880d28951fff42a635a2389f8c63baddc5",
"shasum": ""
},
"require": {
"doctrine/common": "^2.13|^3.0",
"doctrine/persistence": "^1.3.3|^2.0",
"php": "^7.2 || ^8.0"
},
"conflict": {
"doctrine/phpcr-odm": "<1.3.0"
},
"require-dev": {
"doctrine/coding-standard": "^8.2",
"doctrine/dbal": "^2.5.4",
"doctrine/mongodb-odm": "^1.3.0 || ^2.0.0",
"doctrine/orm": "^2.7.0",
"ext-sqlite3": "*",
"phpunit/phpunit": "^8.0"
},
"suggest": {
"alcaeus/mongo-php-adapter": "For using MongoDB ODM 1.3 with PHP 7 (deprecated)",
"doctrine/mongodb-odm": "For loading MongoDB ODM fixtures",
"doctrine/orm": "For loading ORM fixtures",
"doctrine/phpcr-odm": "For loading PHPCR ODM fixtures"
},
"type": "library",
"autoload": {
"psr-4": {
"Doctrine\\Common\\DataFixtures\\": "lib/Doctrine/Common/DataFixtures"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Jonathan Wage",
"email": "jonwage@gmail.com"
}
],
"description": "Data Fixtures for all Doctrine Object Managers",
"homepage": "http://www.doctrine-project.org",
"keywords": [
"database"
],
"support": {
"issues": "https://github.com/doctrine/data-fixtures/issues",
"source": "https://github.com/doctrine/data-fixtures/tree/1.5.0"
},
"funding": [
{
"url": "https://www.doctrine-project.org/sponsorship.html",
"type": "custom"
},
{
"url": "https://www.patreon.com/phpdoctrine",
"type": "patreon"
},
{
"url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdata-fixtures",
"type": "tidelift"
}
],
"time": "2021-01-23T10:20:43+00:00"
},
{
"name": "doctrine/doctrine-fixtures-bundle",
"version": "3.4.0",
"source": {
"type": "git",
"url": "https://github.com/doctrine/DoctrineFixturesBundle.git",
"reference": "870189619a7770f468ffb0b80925302e065a3b34"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/doctrine/DoctrineFixturesBundle/zipball/870189619a7770f468ffb0b80925302e065a3b34",
"reference": "870189619a7770f468ffb0b80925302e065a3b34",
"shasum": ""
},
"require": {
"doctrine/data-fixtures": "^1.3",
"doctrine/doctrine-bundle": "^1.11|^2.0",
"doctrine/orm": "^2.6.0",
"doctrine/persistence": "^1.3.7|^2.0",
"php": "^7.1 || ^8.0",
"symfony/config": "^3.4|^4.3|^5.0",
"symfony/console": "^3.4|^4.3|^5.0",
"symfony/dependency-injection": "^3.4|^4.3|^5.0",
"symfony/doctrine-bridge": "^3.4|^4.1|^5.0",
"symfony/http-kernel": "^3.4|^4.3|^5.0"
},
"require-dev": {
"doctrine/coding-standard": "^6.0",
"phpunit/phpunit": "^7.4 || ^8.0 || ^9.2",
"symfony/phpunit-bridge": "^4.1|^5.0"
},
"type": "symfony-bundle",
"autoload": {
"psr-4": {
"Doctrine\\Bundle\\FixturesBundle\\": ""
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Fabien Potencier",
"email": "fabien@symfony.com"
},
{
"name": "Doctrine Project",
"homepage": "http://www.doctrine-project.org"
},
{
"name": "Symfony Community",
"homepage": "http://symfony.com/contributors"
}
],
"description": "Symfony DoctrineFixturesBundle",
"homepage": "http://www.doctrine-project.org",
"keywords": [
"Fixture",
"persistence"
],
"support": {
"issues": "https://github.com/doctrine/DoctrineFixturesBundle/issues",
"source": "https://github.com/doctrine/DoctrineFixturesBundle/tree/3.4.0"
},
"funding": [
{
"url": "https://www.doctrine-project.org/sponsorship.html",
"type": "custom"
},
{
"url": "https://www.patreon.com/phpdoctrine",
"type": "patreon"
},
{
"url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdoctrine-fixtures-bundle",
"type": "tidelift"
}
],
"time": "2020-11-14T09:36:49+00:00"
},
{
"name": "nikic/php-parser",
"version": "v4.10.4",

View File

@ -10,4 +10,5 @@ return [
Symfony\Bundle\TwigBundle\TwigBundle::class => ['all' => true],
Symfony\Bundle\MakerBundle\MakerBundle::class => ['dev' => true],
Sensio\Bundle\FrameworkExtraBundle\SensioFrameworkExtraBundle::class => ['all' => true],
Doctrine\Bundle\FixturesBundle\DoctrineFixturesBundle::class => ['dev' => true, 'test' => true],
];

View File

@ -1,2 +1,8 @@
twig:
default_path: '%kernel.project_dir%/templates'
globals:
BASE_URL: '%env(BASE_URL)%'
APP_ENV: '%env(APP_ENV)%'
WEBSITE_NAME: '%env(WEBSITE_NAME)%'
WEBSITE_LOGO: '%env(WEBSITE_LOGO)%'
SUPPORT_EMAIL: '%env(SUPPORT_EMAIL)%'

View File

@ -8,6 +8,8 @@ parameters:
OLD_DATABASE_USER: '%env(OLD_DATABASE_USER)%'
OLD_DATABASE_PASS: '%env(OLD_DATABASE_PASS)%'
UNIQ_INSTALL_KEY: '%env(UNIQ_INSTALL_KEY)%'
WEBSITE_NAME: '%env(WEBSITE_NAME)%'
WEBSITE_LOGO: '%env(WEBSITE_LOGO)%'
services:
# default configuration for services in *this* file
_defaults:

View File

@ -0,0 +1,80 @@
<?xml version="1.0" encoding="UTF-8"?>
<Diagram>
<ID>DATABASE</ID>
<OriginalElement>2c3996c6-29d5-4c17-9504-1606d308e53c.SCHEMA:framadate_api</OriginalElement>
<nodes>
<node x="0.0" y="1296.0">2c3996c6-29d5-4c17-9504-1606d308e53c.TABLE:framadate_api.stack_of_votes</node>
<node x="307.25" y="0.0">2c3996c6-29d5-4c17-9504-1606d308e53c.TABLE:framadate_api.owner</node>
<node x="615.25" y="1256.0">2c3996c6-29d5-4c17-9504-1606d308e53c.TABLE:framadate_api.comment</node>
<node x="251.140625" y="347.0">2c3996c6-29d5-4c17-9504-1606d308e53c.TABLE:framadate_api.poll</node>
<node x="250.90625" y="1605.0">2c3996c6-29d5-4c17-9504-1606d308e53c.TABLE:framadate_api.vote</node>
<node x="297.0" y="1276.0">2c3996c6-29d5-4c17-9504-1606d308e53c.TABLE:framadate_api.choice</node>
</nodes>
<notes />
<edges>
<edge source="2c3996c6-29d5-4c17-9504-1606d308e53c.TABLE:framadate_api.comment" target="2c3996c6-29d5-4c17-9504-1606d308e53c.TABLE:framadate_api.owner" relationship="REFERENCES">
<point x="70.5" y="-148.5" />
<point x="826.75" y="322.0" />
<point x="507.75" y="322.0" />
<point x="0.0" y="148.5" />
</edge>
<edge source="2c3996c6-29d5-4c17-9504-1606d308e53c.TABLE:framadate_api.comment" target="2c3996c6-29d5-4c17-9504-1606d308e53c.TABLE:framadate_api.poll" relationship="REFERENCES">
<point x="-70.5" y="-148.5" />
<point x="685.75" y="1230.0" />
<point x="509.140625" y="1230.0" />
<point x="0.0" y="428.5" />
</edge>
<edge source="2c3996c6-29d5-4c17-9504-1606d308e53c.TABLE:framadate_api.vote" target="2c3996c6-29d5-4c17-9504-1606d308e53c.TABLE:framadate_api.choice" relationship="REFERENCES">
<point x="0.0" y="-148.5" />
<point x="409.40625" y="1579.0" />
<point x="434.0" y="1579.0" />
<point x="0.0" y="128.5" />
</edge>
<edge source="2c3996c6-29d5-4c17-9504-1606d308e53c.TABLE:framadate_api.stack_of_votes" target="2c3996c6-29d5-4c17-9504-1606d308e53c.TABLE:framadate_api.owner" relationship="REFERENCES">
<point x="-69.25" y="-108.5" />
<point x="69.25" y="322.0" />
<point x="507.75" y="322.0" />
<point x="0.0" y="148.5" />
</edge>
<edge source="2c3996c6-29d5-4c17-9504-1606d308e53c.TABLE:framadate_api.stack_of_votes" target="2c3996c6-29d5-4c17-9504-1606d308e53c.TABLE:framadate_api.poll" relationship="REFERENCES">
<point x="69.25" y="-108.5" />
<point x="207.75" y="1230.0" />
<point x="509.140625" y="1230.0" />
<point x="0.0" y="428.5" />
</edge>
<edge source="2c3996c6-29d5-4c17-9504-1606d308e53c.TABLE:framadate_api.vote" target="2c3996c6-29d5-4c17-9504-1606d308e53c.TABLE:framadate_api.stack_of_votes" relationship="REFERENCES">
<point x="-105.66666666666669" y="-148.5" />
<point x="303.7395833333333" y="1579.0" />
<point x="138.5" y="1579.0" />
<point x="0.0" y="108.5" />
</edge>
<edge source="2c3996c6-29d5-4c17-9504-1606d308e53c.TABLE:framadate_api.poll" target="2c3996c6-29d5-4c17-9504-1606d308e53c.TABLE:framadate_api.owner" relationship="REFERENCES">
<point x="0.0" y="-428.5" />
<point x="509.140625" y="322.0" />
<point x="507.75" y="322.0" />
<point x="0.0" y="148.5" />
</edge>
<edge source="2c3996c6-29d5-4c17-9504-1606d308e53c.TABLE:framadate_api.vote" target="2c3996c6-29d5-4c17-9504-1606d308e53c.TABLE:framadate_api.poll" relationship="REFERENCES">
<point x="105.66666666666663" y="-148.5" />
<point x="515.0729166666666" y="1579.0" />
<point x="581.5" y="1579.0" />
<point x="581.5" y="1230.0" />
<point x="509.140625" y="1230.0" />
<point x="0.0" y="428.5" />
</edge>
<edge source="2c3996c6-29d5-4c17-9504-1606d308e53c.TABLE:framadate_api.choice" target="2c3996c6-29d5-4c17-9504-1606d308e53c.TABLE:framadate_api.poll" relationship="REFERENCES">
<point x="0.0" y="-128.5" />
<point x="434.0" y="1230.0" />
<point x="509.140625" y="1230.0" />
<point x="0.0" y="428.5" />
</edge>
</edges>
<settings layout="Hierarchic" zoom="0.3090530697190427" showDependencies="false" x="449.0" y="951.0" />
<SelectedNodes />
<Categories>
<Category>Columns</Category>
<Category>Key columns</Category>
<Category>Virtual foreign keys</Category>
</Categories>
</Diagram>

BIN
doc/framadate_api.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 192 KiB

1346
doc/framadate_api.svg Normal file

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 147 KiB

View File

@ -11,7 +11,7 @@ use FOS\RestBundle\Controller\Annotations\Route;
* @package App\Controller
* @Route("/admin",name="admin_homepage")
*/
class AdminController extends FramadateController {
class AdminController extends EmailsController {
/**
* @Get(path ="/",
* name = "_get_default")

View File

@ -17,7 +17,7 @@ use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
* @package App\Controller
* @Route("/",name="home_")
*/
class DefaultController extends FramadateController {
class DefaultController extends EmailsController {
/**
* @Get(path ="/",
@ -27,7 +27,7 @@ class DefaultController extends FramadateController {
$polls = $this->getDoctrine()->getRepository( Poll::class )->findAll();
return $this->render( 'pages/home.html.twig',[ ]);
return $this->render( 'pages/home.html.twig', [] );
}

View File

@ -11,10 +11,10 @@ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
/**
* sending emails controller
*
* Class FramadateController
* Class EmailsController
* @package App\Controller
*/
class FramadateController extends AbstractController {
class EmailsController extends AbstractController {
private $mail_service;
@ -86,7 +86,7 @@ class FramadateController extends AbstractController {
$config = [
'owner' => $owner,
'title' => 'Framadate | Mes sondages',
'title' => $this->getParameter( 'WEBSITE_NAME' ) . ' | Mes sondages',
'email_template' => 'emails/owner-list.html.twig',
];
$this->sendMailWithVars( $config );

View File

@ -21,7 +21,7 @@ use App\Entity\Poll;
* @package App\Controller
* @Route("/migration-from-v1",name="admin_homepage")
*/
class MigrationController extends FramadateController {
class MigrationController extends EmailsController {
/**
* @Get(path ="/{unique_key}",
* name = "_migrate_from_v1")

View File

@ -14,7 +14,7 @@ use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
* @package App\Controller
* @Route("/user",name="user_homepage")
*/
class OwnerController extends FramadateController {
class OwnerController extends EmailsController {
/**
* @Get(path ="/",
* name = "get_default")

View File

@ -29,7 +29,8 @@ class PollController extends AbstractController
}
return $this->render('poll/index.html.twig', [
'count' => count($polls),
'polls' => $titles,
'titles' => $titles,
'polls' => $polls,
]);
}

View File

@ -1,7 +1,8 @@
<?php
namespace App\Controller;
namespace App\Controller\api;
use App\Controller\EmailsController;
use App\Entity\Comment;
use App\Entity\Owner;
use App\Entity\Poll;
@ -21,7 +22,7 @@ use Symfony\Component\HttpFoundation\Response;
* @package App\Controller
* @Route("/api/v1",name="api_")
*/
class CommentController extends FramadateController {
class CommentController extends EmailsController {
/**
* @Get(
@ -32,18 +33,18 @@ class CommentController extends FramadateController {
*/
public
function getPollCommentsAction(
SerializerInterface $serializer,
Poll $poll
SerializerInterface $serializer,
Poll $poll
) {
$jsonResponse = $serializer->serialize([
'message' => 'here are your comments of the poll',
'data' => $poll->getComments()], 'json');
$jsonResponse = $serializer->serialize([
'message' => 'here are your comments of the poll',
'data' => $poll->getComments()], 'json');
$response = new Response($jsonResponse);
$response->headers->set('Content-Type', 'application/json');
$response->setStatusCode(200);
$response = new Response($jsonResponse);
$response->headers->set('Content-Type', 'application/json');
$response->setStatusCode(200);
return $response;
return $response;
}
@ -80,8 +81,8 @@ class CommentController extends FramadateController {
if ( ! $foundOwner ) {
$foundOwner = new Owner();
$foundOwner->setPseudo( $data[ 'email' ] )
->setEmail( $data[ 'email' ] )
->setModifierToken( uniqid( '', true ) );
->setEmail( $data[ 'email' ] )
->setModifierToken( uniqid( '', true ) );
}
// anti flood
$seconds_limit_lastpost = 5;
@ -117,8 +118,8 @@ class CommentController extends FramadateController {
}
}
$comment->setOwner( $foundOwner )
->setCreatedAt( new DateTime() )
->setPoll( $poll );
->setCreatedAt( new DateTime() )
->setPoll( $poll );
$foundOwner->addComment( $comment );
$em = $this->getDoctrine()->getManager();

View File

@ -2,7 +2,7 @@
namespace App\Controller\api;
use App\Controller\FramadateController;
use App\Controller\EmailsController;
use App\Entity\Choice;
use App\Entity\Owner;
use App\Entity\Poll;
@ -27,15 +27,15 @@ use FOS\RestBundle\Controller\Annotations\Route;
* @package App\Controller
* @Route("/api/v1/poll",name="api_")
*/
class PollController extends FramadateController {
class PollController extends EmailsController {
/**
* @Get(
* path = "/",
* name = "get_all_polls"
* )
*/
public function getAllPollsAction(PollRepository $pollRepository): Response {
$data = $pollRepository->findAll();
public function getAllPollsAction( PollRepository $pollRepository ): Response {
$data = $pollRepository->findAll();
$polls = $data;
@ -76,9 +76,8 @@ class PollController extends FramadateController {
/**
* get a poll config by its custom URL, we do not want polls to be reachable by their numeric id
* @Get(
* path = "/{id}",
* name = "get_poll",
* requirements = {"id"="\w+"}
* path = "/{customUrl}",
* name = "get_poll"
* )
*
* @param SerializerInterface $serializer
@ -88,14 +87,14 @@ class PollController extends FramadateController {
*/
public function getPollConfig(
SerializerInterface $serializer,
$id,
$customUrl,
Request $request
): Response {
$repository = $this->getDoctrine()->getRepository( Poll::class );
$poll = $repository->findOneByCustomUrl( $id );
$poll = $repository->findOneByCustomUrl( $customUrl );
if ( ! $poll ) {
return $this->notFoundPoll($id);
return $this->notFoundPoll( $customUrl );
}
$comments = $poll->getComments();
@ -134,9 +133,8 @@ class PollController extends FramadateController {
/**
* get a poll config by its custom URL, we do not want polls to be reachable by their numeric id
* @Get(
* path = "/{id}/pass/{md5}",
* path = "/{customUrl}/pass/{md5}",
* name = "get_protected_poll",
* requirements = {"id"="\w+"}
* )
*
* @param SerializerInterface $serializer
@ -144,12 +142,12 @@ class PollController extends FramadateController {
*
* @return JsonResponse|Response
*/
function getProtectedPoll($id,$md5, SerializerInterface $serializer){
function getProtectedPoll($customUrl,$md5, SerializerInterface $serializer){
$repository = $this->getDoctrine()->getRepository( Poll::class );
$poll = $repository->findOneByCustomUrl( $id );
$poll = $repository->findOneByCustomUrl( $customUrl );
if ( ! $poll ) {
return $this->notFoundPoll($id);
return $this->notFoundPoll($customUrl);
}
if ( $poll->getPassword() === $md5 ) {
@ -180,7 +178,7 @@ class PollController extends FramadateController {
/**
* @Put(
* path = "/{id}/{token}",
* path = "/{customUrl}/{token}",
* name = "update_poll",
* requirements = {"content"="\w+", "poll_id"="\d+"}
* )
@ -363,7 +361,7 @@ class PollController extends FramadateController {
/**
* @Delete(
* path = "/{id}",
* path = "/{customUrl}",
* name = "poll_delete",
* requirements = {"accessToken"="\w+", "poll_id"="\d+"}
* )
@ -397,13 +395,13 @@ class PollController extends FramadateController {
/**
* Checks if a slug is already taken by a poll
* @Get(
* path = "/slug/{slug}",
* path = "/slug/{customUrl}",
* name = "check_slug_is_unique",
* )
*/
public function checkSlugIsUniqueAction( string $slug ) {
public function checkSlugIsUniqueAction( string $customUrl ) {
$emPoll = $this->getDoctrine()->getRepository( Poll::class );
$found = $emPoll->findOneByCustomUrl( $slug );
$found = $emPoll->findOneByCustomUrl( $customUrl );
$elaborated_message_version = false;
if ( $found ) {
@ -416,7 +414,7 @@ class PollController extends FramadateController {
return $this->json( [
'message' => ' NO, this slug is already taken on this Framadate instance ',
'data' => [
'slug' => $slug,
'slug' => $customUrl,
],
],
204 );
@ -429,7 +427,7 @@ class PollController extends FramadateController {
return $this->json( [
'message' => ' yes this slug is available on this Framadate instance ',
'data' => [
'slug' => $slug,
'slug' => $customUrl,
],
],
404 );

View File

@ -1,7 +1,8 @@
<?php
namespace App\Controller;
namespace App\Controller\api;
use App\Controller\EmailsController;
use App\Entity\Choice;
use App\Entity\Owner;
use App\Entity\Poll;
@ -21,25 +22,25 @@ use Symfony\Component\HttpFoundation\Response;
* @package App\Controller
* @Route("/api/v1",name="api_")
*/
class VoteController extends FramadateController {
class VoteController extends EmailsController {
/**
* add a vote stack on a poll
* @Post(
* path = "/poll/{id}/answer",
* name = "new_vote_stack",
* requirements = {"content"="\w+", "poll_id"="\d+"}
* )
* @param SerializerInterface $serializer
* @param Poll $poll
* @param Request $request
*
* @return JsonResponse|Response
*/
/**
* add a vote stack on a poll
* @Post(
* path = "/poll/{id}/answer",
* name = "new_vote_stack",
* requirements = {"content"="\w+", "poll_id"="\d+"}
* )
* @param SerializerInterface $serializer
* @param Poll $poll
* @param Request $request
*
* @return JsonResponse|Response
*/
public function newVoteStackAction(
SerializerInterface $serializer,
Poll $poll,
Request $request
SerializerInterface $serializer,
Poll $poll,
Request $request
) {
if ( ! $poll ) {
return $this->json( [ 'message' => 'poll not found' ], 404 );
@ -95,8 +96,8 @@ class VoteController extends FramadateController {
404 );
}
$vote->setPoll( $poll )
->setChoice( $foundChoice )
->setValue( $voteInfo[ 'value' ] );
->setChoice( $foundChoice )
->setValue( $voteInfo[ 'value' ] );
$vote->setPoll( $poll );
$stack->addVote( $vote );
$poll->addVote( $vote );
@ -113,7 +114,7 @@ class VoteController extends FramadateController {
if ( $existingOwner ) {
$precision = ' from an existing owner : ' . $foundOwner->getEmail();
}
$stacks = $poll->getStacksOfVotes();
$stacks = $poll->getStacksOfVotes();
if($poll->getMailOnVote()){
$this->sendVoteNotificationAction($stack->getOwner(), $stack);
@ -121,36 +122,36 @@ class VoteController extends FramadateController {
$returnedVoteStack = $stack;
$jsonResponse = $serializer->serialize($returnedVoteStack, 'json');
$jsonResponse = $serializer->serialize($returnedVoteStack, 'json');
$response = new Response($jsonResponse);
$response->headers->set('Content-Type', 'application/json');
$response->setStatusCode(200);
$response = new Response($jsonResponse);
$response->headers->set('Content-Type', 'application/json');
$response->setStatusCode(200);
return $response;
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
*/
/**
* 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
SerializerInterface $serializer,
StackOfVotes $id,
$modifierToken,
Request $request
) {
$voteStack = $id;
if ( ! $voteStack ) {
@ -170,17 +171,17 @@ class VoteController extends FramadateController {
// save evrything
$jsonResponse = $serializer->serialize([
'message' => 'ok',
'modifier_token' => $voteStack->getOwner()->getModifierToken(),
'vote_stack' => $voteStack,
], 'json');
$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);
$response = new Response($jsonResponse);
$response->headers->set('Content-Type', 'application/json');
$response->setStatusCode(200);
return $response;
return $response;
}

View File

@ -3,7 +3,8 @@
namespace App\DataFixtures;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\Persistence\ObjectManager;
class AppFixtures extends Fixture
{

View File

@ -10,9 +10,11 @@ use App\Entity\StackOfVotes;
use App\Entity\Vote;
use DateTime;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\Persistence\ObjectManager;
class AppPollFixtures extends Fixture {
public const POLL_FIXTURE_ONE = 'citron-poll-fixture';
public function load( ObjectManager $manager ) {
/**
@ -35,41 +37,44 @@ class AppPollFixtures extends Fixture {
$manager->flush();
$poll = new Poll();
$poll->setTitle( 'citron ou orange' )
$pollCitronOrange = new Poll();
$pollCitronOrange->setTitle( 'citron ou orange' )
->setCustomUrl('citron')
->setDescription( 'votre sorbert préféré' )
->setAdminKey( uniqid() )
->setModificationPolicy( 'nobody' )
->setPassword('le pass woute woute');
$poll->setMailOnVote( true );
$poll->setOwner( $owner );
$owner->addPoll( $poll );
$this->addReference(self::POLL_FIXTURE_ONE, $pollCitronOrange);
$pollCitronOrange->setMailOnVote( true );
$pollCitronOrange->setOwner( $owner );
$owner->addPoll( $pollCitronOrange );
$choiceA = new Choice();
$choiceA->setName( 'citron' );
$choiceB = new Choice();
$choiceB->setName( 'orange' );
$poll
$pollCitronOrange
->addChoice( $choiceA )
->addChoice( $choiceB );
$manager->persist( $poll );
$manager->persist( $pollCitronOrange );
$stack1 = new StackOfVotes();
$stack1
->setPoll( $poll )
->setPoll( $pollCitronOrange )
->setOwner( $voter );
$voteA = new Vote();
$voteA
->setPoll( $poll )
->setPoll( $pollCitronOrange )
->setStacksOfVotes( $stack1 )
->setValue( "yes" )
->setChoice( $choiceA );
$voteB = new Vote();
$voteB
->setPoll( $poll )
->setPoll( $pollCitronOrange )
->setStacksOfVotes( $stack1 )
->setValue( "yes" )
->setChoice( $choiceB );
@ -81,12 +86,12 @@ class AppPollFixtures extends Fixture {
$stack2 = new StackOfVotes();
$stack2->setPseudo( 'Jean indécis' );
$stack2
->setPoll( $poll )
->setPoll( $pollCitronOrange )
->setOwner( $voter );
$voteA = new Vote();
$voteA
->setPoll( $poll )
->setPoll( $pollCitronOrange )
->setStacksOfVotes( $stack2 )
->setValue( "maybe" )
->setChoice( $choiceA );
@ -94,35 +99,37 @@ class AppPollFixtures extends Fixture {
$manager->persist( $stack2 );
$poll = new Poll();
$pollCitronOrange = new Poll();
$ownerComment = new Comment();
$ownerComment
->setText( "trop bien ce sondage wohooo! signé l'auteur." )
->setPseudo('un gens qui commente')
->setOwner( $owner );
$poll->addComment( $ownerComment );
$pollCitronOrange->addComment( $ownerComment );
$someoneComment = new Comment();
$someoneComment
->setText( "comme l'auteur se la raconte. PFFFF!" )
->setPseudo('un gens qui commente')
->setOwner( $commenterMan );
$poll->addComment( $someoneComment );
$pollCitronOrange->addComment( $someoneComment );
$poll->setTitle( 'démo sondage de texte avec deux commentaires' )
$pollCitronOrange->setTitle( 'démo sondage de texte avec deux commentaires' )
->setCustomUrl('demo')
->setDescription( 'description du sondage 2' );
$poll->setAdminKey( uniqid() );
$poll->setModificationPolicy( 'self' );
$poll->setMailOnComment( true );
$pollCitronOrange->setAdminKey( uniqid() );
$pollCitronOrange->setModificationPolicy( 'self' );
$pollCitronOrange->setMailOnComment( true );
$poll->addTextChoiceArray( [ 'un truc', 'deux trucs' ] );
$poll->setOwner( $owner );
$owner->addPoll( $poll );
$pollCitronOrange->addTextChoiceArray( [ 'un truc', 'deux trucs' ] );
$pollCitronOrange->setOwner( $owner );
$owner->addPoll( $pollCitronOrange );
$manager->persist( $poll );
$manager->persist( $pollCitronOrange );
$manager->persist( $someoneComment );
$manager->persist( $ownerComment );
@ -130,16 +137,16 @@ class AppPollFixtures extends Fixture {
// voting test with 2 people
// poll with date type
$poll = new Poll();
$pollCitronOrange = new Poll();
$choice = new Choice();
$firstDate = new DateTime();
$choice->setName( $firstDate->format( 'Y-m-d H:i:s' ) );
$choice2 = new Choice();
$choice3 = new Choice();
$choice2->setName( $poll->addDaysToDate( $firstDate, 1 )->format( 'Y-m-d H:i:s' ) );
$choice3->setName( $poll->addDaysToDate( $firstDate, 2 )->format( 'Y-m-d H:i:s' ) );
$choice2->setName( $pollCitronOrange->addDaysToDate( $firstDate, 1 )->format( 'Y-m-d H:i:s' ) );
$choice3->setName( $pollCitronOrange->addDaysToDate( $firstDate, 2 )->format( 'Y-m-d H:i:s' ) );
$poll->setTitle( "c'est pour aujourdhui ou pour demain" )
$pollCitronOrange->setTitle( "c'est pour aujourdhui ou pour demain" )
->setCustomUrl('aujourdhui-ou-demain')
->setDescription( 'Vous avez le choix dans la date' )
->setKind( 'date' )
@ -148,11 +155,11 @@ class AppPollFixtures extends Fixture {
->addChoice( $choice2 )
->addChoice( $choice3 )
->setModificationPolicy( 'self' );
$manager->persist( $poll );
$manager->persist( $pollCitronOrange );
// poll with cartoon choices
$poll = new Poll();
$poll->setTitle( 'dessin animé préféré' )
$pollCitronOrange = new Poll();
$pollCitronOrange->setTitle( 'dessin animé préféré' )
->setCustomUrl('dessin-anime')
->setDescription( 'choisissez votre animé préféré' )
->setOwner( $owner )
@ -169,61 +176,63 @@ class AppPollFixtures extends Fixture {
$someoneComment = new Comment();
$someoneComment
->setPseudo('un gens qui commente')
->setText( "allez boumbo!" )
->setOwner( $commenterMan );
$poll->addComment( $someoneComment );
$pollCitronOrange->addComment( $someoneComment );
$someoneComment2 = new Comment();
$someoneComment2
->setPseudo('un gens qui commente')
->setText( "je suis pour la team rocket de digimon" )
->setOwner( $owner );
$poll->addComment( $someoneComment2 );
$pollCitronOrange->addComment( $someoneComment2 );
$manager->persist( $poll );
$manager->persist( $pollCitronOrange );
$stack = new StackOfVotes();
$stack->setPseudo( 'Wulfila' );
$stack
->setPoll( $poll )
->setPoll( $pollCitronOrange )
->setOwner( $voter );
$vote = new Vote();
$vote
->setPoll( $poll )
->setPoll( $pollCitronOrange )
->setStacksOfVotes( $stack )
->setValue( "yes" )
->setChoice( $poll->getChoices()[ 2 ] );
->setChoice( $pollCitronOrange->getChoices()[ 2 ] );
$vote = new Vote();
$vote
->setPoll( $poll )
->setPoll( $pollCitronOrange )
->setStacksOfVotes( $stack )
->setValue( "maybe" )
->setChoice( $poll->getChoices()[ 1 ] );
->setChoice( $pollCitronOrange->getChoices()[ 1 ] );
$manager->persist( $stack );
$stack = new StackOfVotes();
$stack->setPseudo( 'Tykayn' );
$stack
->setPoll( $poll )
->setPoll( $pollCitronOrange )
->setOwner( $voter );
$vote = new Vote();
$vote
->setPoll( $poll )
->setPoll( $pollCitronOrange )
->setStacksOfVotes( $stack )
->setValue( "yes" )
->setChoice( $poll->getChoices()[ 1 ] );
->setChoice( $pollCitronOrange->getChoices()[ 1 ] );
$vote = new Vote();
$vote
->setPoll( $poll )
->setPoll( $pollCitronOrange )
->setStacksOfVotes( $stack )
->setValue( "yes" )
->setChoice( $poll->getChoices()[ 2 ] );
->setChoice( $pollCitronOrange->getChoices()[ 2 ] );
$vote = new Vote();
$vote
->setPoll( $poll )
->setPoll( $pollCitronOrange )
->setStacksOfVotes( $stack )
->setValue( "no" )
->setChoice( $poll->getChoices()[ 2 ] );
->setChoice( $pollCitronOrange->getChoices()[ 2 ] );
$manager->persist( $stack );

View File

@ -6,9 +6,16 @@ use App\Entity\Comment;
use App\Entity\Owner;
use App\Entity\Poll;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\Common\DataFixtures\DependentFixtureInterface;
use Doctrine\Persistence\ObjectManager;
class CommentFixtures extends Fixture implements DependentFixtureInterface {
public function getDependencies() {
return [
AppPollFixtures::class,
];
}
class CommentFixtures extends Fixture {
public function load( ObjectManager $manager ) {
$emPoll = $manager->getRepository( Poll::class );
@ -20,9 +27,10 @@ class CommentFixtures extends Fixture {
->setPseudo( 'Wulfila' );
// comment on "citron ou orange"
$pollCitronOrange = $emPoll->find( 1 );
$pollCitronOrange = $this->getReference( AppPollFixtures::POLL_FIXTURE_ONE );
$comment = new Comment();
$comment->setOwner( $commenterMan )
->setPseudo( 'the indécis people' )
->setText( 'quelle indécision wololo! finalement citron. heu non orange. AAAAh!' );
$pollCitronOrange->addComment( $comment );
$manager->persist( $comment );
@ -31,46 +39,51 @@ class CommentFixtures extends Fixture {
$manager->flush();
// comment on "démo sondage de texte avec deux commentaires"
$poll = $emPoll->find( 2 );
$comment = new Comment();
$comment->setOwner( $commenterMan2 )
->setText( 'il est écrit Squalala.' );
$pollCitronOrange->addComment( $comment );
$manager->persist( $comment );
$manager->persist( $poll );
$manager->persist( $commenterMan2 );
$manager->flush();
// $poll = $emPoll->find( 2 );
// $comment = new Comment();
// $comment->setOwner( $commenterMan2 )
// ->setPseudo( 'The Hayroule king' )
// ->setText( 'il est écrit Squalala.' );
// $pollCitronOrange->addComment( $comment );
// $manager->persist( $comment );
// $manager->persist( $poll );
// $manager->persist( $commenterMan2 );
// $manager->flush();
//
// $comment = new Comment();
// $comment->setOwner( $commenterMan )
// ->setPseudo( 'The Hayroule king' )
// ->setText( "Zelda. Orange." );
// $pollCitronOrange->addComment( $comment );
// $manager->persist( $comment );
// $manager->persist( $poll );
// $manager->persist( $commenterMan );
// $manager->flush();
//
//
// // comment on "c'est pour aujourdhui ou pour demain"
// $poll = $emPoll->find( 3 );
// $comment = new Comment();
// $comment->setOwner( $commenterMan )
// ->setPseudo( 'The Hayroule king' )
// ->setText( "va pour demain" );
// $pollCitronOrange->addComment( $comment );
// $manager->persist( $comment );
// $manager->persist( $poll );
// $manager->persist( $commenterMan );
// $manager->flush();
//
// // comment on "dessin animé préféré"
// $poll = $emPoll->find( 4 );
// $comment = new Comment();
// $comment->setOwner( $commenterMan2 )
// ->setPseudo( 'The Hayroule king' )
// ->setText( "Ceci est un commentaire de fixture créé avec le CipherBliss poweur." );
// $pollCitronOrange->addComment( $comment );
// $manager->persist( $comment );
// $manager->persist( $poll );
// $manager->persist( $commenterMan2 );
$comment = new Comment();
$comment->setOwner( $commenterMan )
->setText( "Zelda. Orange." );
$pollCitronOrange->addComment( $comment );
$manager->persist( $comment );
$manager->persist( $poll );
$manager->persist( $commenterMan );
$manager->flush();
// comment on "c'est pour aujourdhui ou pour demain"
$poll = $emPoll->find( 3 );
$comment = new Comment();
$comment->setOwner( $commenterMan )
->setText( "va pour demain" );
$pollCitronOrange->addComment( $comment );
$manager->persist( $comment );
$manager->persist( $poll );
$manager->persist( $commenterMan );
$manager->flush();
// comment on "dessin animé préféré"
$poll = $emPoll->find( 4 );
$comment = new Comment();
$comment->setOwner( $commenterMan2 )
->setText( "Ceci est un commentaire de fixture créé avec le CipherBliss poweur." );
$pollCitronOrange->addComment( $comment );
$manager->persist( $comment );
$manager->persist( $poll );
$manager->persist( $commenterMan2 );
$manager->flush();
}
}

View File

@ -7,11 +7,18 @@ use App\Entity\Poll;
use App\Entity\StackOfVotes;
use App\Entity\Vote;
use Doctrine\Bundle\FixturesBundle\Fixture;
use Doctrine\Common\Persistence\ObjectManager;
use Doctrine\Common\DataFixtures\DependentFixtureInterface;
use Doctrine\Persistence\ObjectManager;
class VotesStacksFixtures extends Fixture implements DependentFixtureInterface {
public function getDependencies()
{
return [
AppPollFixtures::class,
];
}
class VotesStacksFixtures extends Fixture {
public function load( ObjectManager $manager ) {
$emPoll = $manager->getRepository( Poll::class );
$people1 = new Owner();
$people1->setEmail( 'tktest_nikolas_edison@tktest.com' )
@ -24,124 +31,127 @@ class VotesStacksFixtures extends Fixture {
->setPseudo( 'Billie Jean' );
// "citron ou orange"
$poll = $emPoll->find( 1 );
// add vote stacks on "citron ou orange"
$pollCitronOrange = $this->getReference(AppPollFixtures::POLL_FIXTURE_ONE);
$stack1 = new StackOfVotes();
$stack1
->setPoll( $poll )
->setPoll( $pollCitronOrange )
->setOwner( $people1 );
$voteA = new Vote();
$voteA
->setPoll( $poll )
->setPoll( $pollCitronOrange )
->setStacksOfVotes( $stack1 )
->setValue( "yes" )
->setChoice( $poll->getChoices()[ 0 ] );
->setChoice( $pollCitronOrange->getChoices()[ 0 ] );
$voteB = new Vote();
$voteB
->setPoll( $poll )
->setPoll( $pollCitronOrange )
->setStacksOfVotes( $stack1 )
->setValue( "maybe" )
->setChoice( $poll->getChoices()[ 1 ] );
$poll->addStackOfVote( $stack1 );
$manager->persist( $poll );
->setChoice( $pollCitronOrange->getChoices()[ 1 ] );
$pollCitronOrange->addStackOfVote( $stack1 );
$manager->persist( $pollCitronOrange );
$manager->persist( $people1 );
$manager->persist( $stack1 );
$stack2 = new StackOfVotes();
$stack2
->setPoll( $poll )
->setPoll( $pollCitronOrange )
->setOwner( $people2 );
$voteA = new Vote();
$voteA
->setPoll( $poll )
->setPoll( $pollCitronOrange )
->setStacksOfVotes( $stack2 )
->setValue( "no" )
->setChoice( $poll->getChoices()[ 0 ] );
->setChoice( $pollCitronOrange->getChoices()[ 0 ] );
$voteB = new Vote();
$voteB
->setPoll( $poll )
->setPoll( $pollCitronOrange )
->setStacksOfVotes( $stack2 )
->setValue( "yes" )
->setChoice( $poll->getChoices()[ 1 ] );
$poll->addStackOfVote( $stack2 );
$manager->persist( $poll );
->setChoice( $pollCitronOrange->getChoices()[ 1 ] );
$pollCitronOrange->addStackOfVote( $stack2 );
$manager->persist( $pollCitronOrange );
$manager->persist( $stack2 );
$manager->persist( $people2 );
// $stack1 = new StackOfVotes();
// $stack1
// ->setPoll( $pollCitronOrange )
// ->setOwner( $people1 );
// $voteA = new Vote();
// $voteA
// ->setPoll( $pollCitronOrange )
// ->setStacksOfVotes( $stack1 )
// ->setValue( "maybe" )
// ->setChoice( $pollCitronOrange->getChoices()[ 2 ] );
// $voteB = new Vote();
// $voteB
// ->setPoll( $pollCitronOrange )
// ->setStacksOfVotes( $stack1 )
// ->setValue( "maybe" )
// ->setChoice( $pollCitronOrange->getChoices()[ 4 ] );
// $pollCitronOrange->addStackOfVote( $stack1 );
// $manager->persist( $pollCitronOrange );
// $manager->persist( $people1 );
// $manager->persist( $stack1 );
//
//
// $stack2 = new StackOfVotes();
// $stack2
// ->setPoll( $pollCitronOrange )
// ->setOwner( $people2 );
// $voteA = new Vote();
// $voteA
// ->setPoll( $pollCitronOrange )
// ->setStacksOfVotes( $stack2 )
// ->setValue( "maybe" )
// ->setChoice( $pollCitronOrange->getChoices()[ 3 ] );
// $voteB = new Vote();
// $voteB
// ->setPoll( $pollCitronOrange )
// ->setStacksOfVotes( $stack2 )
// ->setValue( "yes" )
// ->setChoice( $pollCitronOrange->getChoices()[ 5 ] );
// $pollCitronOrange->addStackOfVote( $stack2 );
// $manager->persist( $pollCitronOrange );
// $manager->persist( $people2 );
// $manager->persist( $stack2 );
//
//
// $stack3 = new StackOfVotes();
// $stack3
// ->setPoll( $pollCitronOrange )
// ->setOwner( $people3 );
// $voteA = new Vote();
// $voteA
// ->setPoll( $pollCitronOrange )
// ->setStacksOfVotes( $stack3 )
// ->setValue( "yes" )
// ->setChoice( $pollCitronOrange->getChoices()[ 1 ] );
// $voteB = new Vote();
// $voteB
// ->setPoll( $pollCitronOrange )
// ->setStacksOfVotes( $stack3 )
// ->setValue( "yes" )
// ->setChoice( $pollCitronOrange->getChoices()[ 3 ] );
// $pollCitronOrange->addStackOfVote( $stack3 );
// $manager->persist( $pollCitronOrange );
// $manager->persist( $people3 );
// $manager->persist( $stack3 );
// comment on "démo sondage de texte avec deux commentaires"
$poll = $emPoll->find( 2 );
// comment on "c'est pour aujourdhui ou pour demain"
$poll = $emPoll->find( 3 );
// comment on "dessin animé préféré"
$poll = $emPoll->find( 4 );
$stack1 = new StackOfVotes();
$stack1
->setPoll( $poll )
->setOwner( $people1 );
$voteA = new Vote();
$voteA
->setPoll( $poll )
->setStacksOfVotes( $stack1 )
->setValue( "maybe" )
->setChoice( $poll->getChoices()[ 2 ] );
$voteB = new Vote();
$voteB
->setPoll( $poll )
->setStacksOfVotes( $stack1 )
->setValue( "maybe" )
->setChoice( $poll->getChoices()[ 4 ] );
$poll->addStackOfVote( $stack1 );
$manager->persist( $poll );
$manager->persist( $people1 );
$manager->persist( $stack1 );
$stack2 = new StackOfVotes();
$stack2
->setPoll( $poll )
->setOwner( $people2 );
$voteA = new Vote();
$voteA
->setPoll( $poll )
->setStacksOfVotes( $stack2 )
->setValue( "maybe" )
->setChoice( $poll->getChoices()[ 3 ] );
$voteB = new Vote();
$voteB
->setPoll( $poll )
->setStacksOfVotes( $stack2 )
->setValue( "yes" )
->setChoice( $poll->getChoices()[ 5 ] );
$poll->addStackOfVote( $stack2 );
$manager->persist( $poll );
$manager->persist( $people2 );
$manager->persist( $stack2 );
$stack3 = new StackOfVotes();
$stack3
->setPoll( $poll )
->setOwner( $people3 );
$voteA = new Vote();
$voteA
->setPoll( $poll )
->setStacksOfVotes( $stack3 )
->setValue( "yes" )
->setChoice( $poll->getChoices()[ 1 ] );
$voteB = new Vote();
$voteB
->setPoll( $poll )
->setStacksOfVotes( $stack3 )
->setValue( "yes" )
->setChoice( $poll->getChoices()[ 3 ] );
$poll->addStackOfVote( $stack3 );
$manager->persist( $poll );
$manager->persist( $people3 );
$manager->persist( $stack3 );
// $poll = $emPoll->find( 2 );
//
//
// // comment on "c'est pour aujourdhui ou pour demain"
// $poll = $emPoll->find( 3 );
//
//
// // comment on "dessin animé préféré"
// $poll = $emPoll->find( 4 );
$manager->flush();
}

View File

@ -29,7 +29,7 @@ class Poll {
*/
public $title;
/**
* @ORM\Column(type="string", length=255, nullable=true)
* @ORM\Column(type="string", length=255, nullable=false, unique=true)
* @Serializer\Expose()
* @Serializer\Type("string")
*/

View File

@ -23,6 +23,9 @@
"doctrine/common": {
"version": "3.1.2"
},
"doctrine/data-fixtures": {
"version": "1.5.0"
},
"doctrine/dbal": {
"version": "2.13.0"
},
@ -45,6 +48,18 @@
"src/Repository/.gitignore"
]
},
"doctrine/doctrine-fixtures-bundle": {
"version": "3.0",
"recipe": {
"repo": "github.com/symfony/recipes",
"branch": "master",
"version": "3.0",
"ref": "e5b542d4ef47d8a003c91beb35650c76907f7e53"
},
"files": [
"src/DataFixtures/AppFixtures.php"
]
},
"doctrine/doctrine-migrations-bundle": {
"version": "3.1",
"recipe": {