mirror of
https://framagit.org/tykayn/date-poll-api
synced 2023-08-25 08:23:11 +02:00
Compare commits
12 Commits
1d72bfe684
...
747ebb9d2f
Author | SHA1 | Date | |
---|---|---|---|
|
747ebb9d2f | ||
f4ce7056cd | |||
4bf2625908 | |||
94c02be927 | |||
ecdbf3fb33 | |||
8c2ad610a5 | |||
665cf6d173 | |||
6831d8d1ae | |||
eaee01838d | |||
7f7265c851 | |||
56c8b0a5c4 | |||
30c99568dd |
@ -83,14 +83,14 @@ class AdminController extends EmailsController {
|
||||
// TODO
|
||||
// fetch old polls and store their properties in new poll objects
|
||||
|
||||
$foundPolls = [];
|
||||
$foundPolls = [];
|
||||
$database_name = 'symfony';
|
||||
|
||||
$em = $this->getDoctrine()->getManager();
|
||||
$emPoll = $this->getDoctrine()->getRepository( Poll::class );
|
||||
|
||||
return $this->json( [
|
||||
'message' => 'migration done for: ' . count( $foundPolls ). ' - this feature is not ready to work YET.',
|
||||
'message' => 'migration done for: ' . count( $foundPolls ) . ' - this feature is not ready to work YET.',
|
||||
'data' => [
|
||||
'count' => count( $foundPolls ),
|
||||
],
|
||||
|
@ -2,14 +2,9 @@
|
||||
|
||||
namespace App\Controller;
|
||||
|
||||
use App\Entity\Owner;
|
||||
use App\Entity\Poll;
|
||||
use App\Repository\PollRepository;
|
||||
use App\Service\MailService;
|
||||
use FOS\RestBundle\Controller\Annotations\Get;
|
||||
use FOS\RestBundle\Controller\Annotations\Route;
|
||||
use JMS\Serializer\Type\Exception\Exception;
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
|
||||
|
||||
/**
|
||||
|
@ -5,8 +5,10 @@ namespace App\Controller;
|
||||
use App\Entity\Owner;
|
||||
use App\Entity\Poll;
|
||||
use JMS\Serializer\Type\Exception\Exception;
|
||||
use Swift_Mailer;
|
||||
use Swift_Message;
|
||||
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
|
||||
|
||||
/**
|
||||
* sending emails controller
|
||||
@ -18,16 +20,37 @@ class EmailsController extends AbstractController {
|
||||
|
||||
private $mail_service;
|
||||
|
||||
public function __construct( \Swift_Mailer $mailer ) {
|
||||
public function __construct( Swift_Mailer $mailer ) {
|
||||
$this->mail_service = $mailer;
|
||||
}
|
||||
|
||||
/**
|
||||
* send created polls to an owner
|
||||
*
|
||||
* @param Owner $owner
|
||||
*
|
||||
* @return int|void
|
||||
* @throws Exception
|
||||
* @throws TransportExceptionInterface
|
||||
*/
|
||||
public function sendOwnerPollsAction( Owner $owner ) {
|
||||
|
||||
$config = [
|
||||
'owner' => $owner,
|
||||
'title' => $this->getParameter( 'WEBSITE_NAME' ) . ' | Mes sondages',
|
||||
'email_template' => 'emails/owner-list.html.twig',
|
||||
];
|
||||
$this->sendMailWithVars( $config );
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* generic way to send email with html template
|
||||
*
|
||||
* @param $config
|
||||
*
|
||||
* @throws \Symfony\Component\Mailer\Exception\TransportExceptionInterface
|
||||
* @throws TransportExceptionInterface
|
||||
*/
|
||||
public function sendMailWithVars( $config ) {
|
||||
|
||||
@ -57,7 +80,7 @@ class EmailsController extends AbstractController {
|
||||
$config[ 'email_template' ],
|
||||
$config
|
||||
);
|
||||
$message = ( new Swift_Message( $config[ 'title' ] ) )
|
||||
$message = ( new Swift_Message( $config[ 'title' ] ) )
|
||||
->setContentType( "text/html" )
|
||||
->setCharset( 'UTF-8' )
|
||||
->setFrom( [ 'ne-pas-repondre@framadate-api.cipherbliss.com' ] )
|
||||
@ -72,33 +95,11 @@ class EmailsController extends AbstractController {
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* send created polls to an owner
|
||||
*
|
||||
* @param Owner $owner
|
||||
*
|
||||
* @return int|void
|
||||
* @throws Exception
|
||||
* @throws \Symfony\Component\Mailer\Exception\TransportExceptionInterface
|
||||
*/
|
||||
public function sendOwnerPollsAction( Owner $owner ) {
|
||||
|
||||
$config = [
|
||||
'owner' => $owner,
|
||||
'title' => $this->getParameter( 'WEBSITE_NAME' ) . ' | Mes sondages',
|
||||
'email_template' => 'emails/owner-list.html.twig',
|
||||
];
|
||||
$this->sendMailWithVars( $config );
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Owner $foundOwner
|
||||
* @param Poll|null $poll
|
||||
*
|
||||
* @throws \Symfony\Component\Mailer\Exception\TransportExceptionInterface
|
||||
* @throws TransportExceptionInterface
|
||||
*/
|
||||
public function sendCreationMailAction( Owner $foundOwner, Poll $poll = null ) {
|
||||
|
||||
@ -120,14 +121,14 @@ class EmailsController extends AbstractController {
|
||||
* @param $comment
|
||||
*
|
||||
* @return int
|
||||
* @throws \Symfony\Component\Mailer\Exception\TransportExceptionInterface
|
||||
* @throws TransportExceptionInterface
|
||||
*/
|
||||
public function sendCommentNotificationAction( Owner $owner, $comment ) {
|
||||
|
||||
$config = [
|
||||
'owner' => $owner,
|
||||
'comment' => $comment,
|
||||
'poll' => $comment->getPoll(),
|
||||
'comment' => $comment,
|
||||
'poll' => $comment->getPoll(),
|
||||
'title' => 'Framadate | Commentaire de "' . $owner->getPseudo() . '" - sondage ' . $comment->getPoll()->getTitle(),
|
||||
'email_template' => 'emails/comment-notification.html.twig',
|
||||
];
|
||||
@ -141,14 +142,14 @@ class EmailsController extends AbstractController {
|
||||
* @param $stackOfVotes
|
||||
*
|
||||
* @return int
|
||||
* @throws \Symfony\Component\Mailer\Exception\TransportExceptionInterface
|
||||
* @throws TransportExceptionInterface
|
||||
*/
|
||||
public function sendVoteNotificationAction( Owner $owner, $stackOfVotes ) {
|
||||
|
||||
$config = [
|
||||
'owner' => $owner,
|
||||
'comment' => $stackOfVotes,
|
||||
'poll' => $stackOfVotes->getPoll(),
|
||||
'comment' => $stackOfVotes,
|
||||
'poll' => $stackOfVotes->getPoll(),
|
||||
'title' => 'Framadate | Vote de "' . $owner->getPseudo() . '" - sondage ' . $stackOfVotes->getPoll()->getTitle(),
|
||||
'email_template' => 'emails/vote-notification.html.twig',
|
||||
];
|
||||
|
@ -1,20 +1,19 @@
|
||||
<?php
|
||||
|
||||
namespace App\Controller;
|
||||
|
||||
//use FOS\RestBundle\Controller\Annotations\Get;
|
||||
//use FOS\RestBundle\Controller\Annotations\Route;
|
||||
use App\Entity\Choice;
|
||||
use App\Entity\Comment;
|
||||
use App\Entity\StackOfVotes;
|
||||
use App\Entity\Vote;
|
||||
use App\Repository\PollRepository;
|
||||
use App\Service\MailService;
|
||||
use FOS\RestBundle\Controller\Annotations\Get;
|
||||
use FOS\RestBundle\Controller\Annotations\Route;
|
||||
use JMS\Serializer\Type\Exception\Exception;
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
use App\Entity\Owner;
|
||||
use App\Entity\Poll;
|
||||
use App\Entity\StackOfVotes;
|
||||
use App\Entity\Vote;
|
||||
use FOS\RestBundle\Controller\Annotations\Get;
|
||||
use FOS\RestBundle\Controller\Annotations\Route;
|
||||
use PDO;
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
|
||||
/**
|
||||
* Class DefaultController
|
||||
@ -34,40 +33,40 @@ class MigrationController extends EmailsController {
|
||||
return new JsonResponse( [
|
||||
'error' => 'NOPE! veuillez vérifier votre fichier .env',
|
||||
] );
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
// fetch old Database
|
||||
|
||||
$debug = '';
|
||||
|
||||
$em = $this->getDoctrine()->getManager();
|
||||
$em = $this->getDoctrine()->getManager();
|
||||
$pollsBySlug = [];
|
||||
|
||||
|
||||
$pdo_options[ \PDO::ATTR_ERRMODE ] = \PDO::ERRMODE_EXCEPTION;
|
||||
$bdd = new \PDO( 'mysql:host=localhost;dbname=' . $this->getParameter( 'OLD_DATABASE_NAME' ),
|
||||
$pdo_options[ PDO::ATTR_ERRMODE ] = PDO::ERRMODE_EXCEPTION;
|
||||
$bdd = new PDO( 'mysql:host=localhost;dbname=' . $this->getParameter( 'OLD_DATABASE_NAME' ),
|
||||
$this->getParameter( 'OLD_DATABASE_USER' ),
|
||||
$this->getParameter( 'OLD_DATABASE_PASS' ),
|
||||
$pdo_options );
|
||||
$res_polls = $bdd->query( 'SELECT * FROM fd_poll' );
|
||||
while ( $d = $res_polls->fetch( \PDO::FETCH_OBJ ) ) {
|
||||
$res_polls = $bdd->query( 'SELECT * FROM fd_poll' );
|
||||
while ( $d = $res_polls->fetch( PDO::FETCH_OBJ ) ) {
|
||||
|
||||
$debug .= " <br> ajout de sondage : ".$d->title .' - '. $d->id ;
|
||||
$debug .= " <br> ajout de sondage : " . $d->title . ' - ' . $d->id;
|
||||
|
||||
|
||||
$newPoll = new Poll();
|
||||
$owner = new Owner();
|
||||
$newPoll = new Poll();
|
||||
$owner = new Owner();
|
||||
|
||||
$owner->setEmail( $d->admin_mail )
|
||||
->setPseudo( $d->admin_name )
|
||||
->addPoll($newPoll);
|
||||
->addPoll( $newPoll );
|
||||
|
||||
$newPoll
|
||||
->setOwner( $owner )
|
||||
->setCustomURL( $d->id )
|
||||
->setKind( $d->id === 'D' ? 'date' : 'text' )
|
||||
->setHideResults( ! $d->results_publicly_visible )
|
||||
->setHideResults( ! $d->results_publicly_visible )
|
||||
->setAdminKey( $d->admin_id )
|
||||
->setTitle( $d->title )
|
||||
->setVotesAllowed( $d->receiveNewVotes )
|
||||
@ -75,7 +74,7 @@ class MigrationController extends EmailsController {
|
||||
->setChoicesMax( $d->ValueMax )
|
||||
->setPassword( $d->password_hash )
|
||||
->setDescription( $d->description )
|
||||
->setCreationDate( date_create( $d->creation_date ) );
|
||||
->setCreatedAt( date_create( $d->creation_date ) );
|
||||
|
||||
$pollsBySlug[ $d->id ] = $newPoll;
|
||||
|
||||
@ -84,105 +83,102 @@ class MigrationController extends EmailsController {
|
||||
$em->persist( $newPoll );
|
||||
}
|
||||
// get choices, slots and link them with poll by their slug
|
||||
$res_slots = $bdd->query( 'SELECT * FROM fd_slot' );
|
||||
$res_slots = $bdd->query( 'SELECT * FROM fd_slot' );
|
||||
$pollChoicesOrderedBySlug = [];
|
||||
$choicesCreated = [];
|
||||
$choicesCreated = [];
|
||||
|
||||
while ( $d = $res_slots->fetch( \PDO::FETCH_OBJ ) ) {
|
||||
while ( $d = $res_slots->fetch( PDO::FETCH_OBJ ) ) {
|
||||
|
||||
$debug .= " <br> ajout de slot, converti en choix de réponse : ".$d->poll_id. ' : '. $d->moments;
|
||||
$debug .= " <br> ajout de slot, converti en choix de réponse : " . $d->poll_id . ' : ' . $d->moments;
|
||||
|
||||
$pollSlug = $d->poll_id;
|
||||
$poll = $pollsBySlug[$pollSlug];
|
||||
$poll = $pollsBySlug[ $pollSlug ];
|
||||
|
||||
$moments = explode(',' , $d->moments);
|
||||
$moments = explode( ',', $d->moments );
|
||||
foreach ( $moments as $moment ) {
|
||||
$newChoice = new Choice();
|
||||
$newChoice
|
||||
->setPoll($poll)
|
||||
->setDateTime(date_create( strtotime( $d->title)))
|
||||
->setName($moment);
|
||||
$newChoice = new Choice();
|
||||
$newChoice
|
||||
->setPoll( $poll )
|
||||
->setDateTime( date_create( strtotime( $d->title ) ) )
|
||||
->setName( $moment );
|
||||
|
||||
$pollChoicesOrderedBySlug[$pollSlug][] = $newChoice;
|
||||
$poll->addChoice($newChoice);
|
||||
$pollChoicesOrderedBySlug[ $pollSlug ][] = $newChoice;
|
||||
$poll->addChoice( $newChoice );
|
||||
|
||||
$em->persist( $newChoice );
|
||||
$em->persist( $newPoll );
|
||||
$em->persist( $newChoice );
|
||||
$em->persist( $newPoll );
|
||||
$choicesCreated[] = $newChoice;
|
||||
}
|
||||
}
|
||||
|
||||
// get votes
|
||||
$stacksOfVote = [];
|
||||
$res_votes = $bdd->query( 'SELECT * FROM fd_vote' );
|
||||
while ( $d = $res_votes->fetch( \PDO::FETCH_OBJ ) ) {
|
||||
$res_votes = $bdd->query( 'SELECT * FROM fd_vote' );
|
||||
while ( $d = $res_votes->fetch( PDO::FETCH_OBJ ) ) {
|
||||
|
||||
$debug .= " <br> ajout de stack de vote : ".$d->name;
|
||||
$debug .= " <br> ajout de stack de vote : " . $d->name;
|
||||
$pollSlug = $d->poll_id;
|
||||
$poll = $pollsBySlug[ $pollSlug ];
|
||||
|
||||
$newStack = new StackOfVotes();
|
||||
$newOwner = new Owner();
|
||||
$newOwner
|
||||
->setPseudo($d->name)
|
||||
->setEmail('the_anonymous_email_from_@_migration_offramadate.org')
|
||||
->setModifierToken($d->uniqId)
|
||||
;
|
||||
->setPseudo( $d->name )
|
||||
->setEmail( 'the_anonymous_email_from_@_migration_offramadate.org' )
|
||||
->setModifierToken( $d->uniqId );
|
||||
|
||||
$newStack->setPoll($poll)
|
||||
->setOwner($newOwner)
|
||||
->setPseudo($d->name)
|
||||
;
|
||||
$newStack->setPoll( $poll )
|
||||
->setOwner( $newOwner )
|
||||
->setPseudo( $d->name );
|
||||
|
||||
// each choice answer is encoded in a value :
|
||||
|
||||
$voteCodes = str_split($d->choices);
|
||||
$voteCodes = str_split( $d->choices );
|
||||
// get choices of the poll and answer accordingly
|
||||
|
||||
$ii=0;
|
||||
$ii = 0;
|
||||
foreach ( $voteCodes as $vote_code ) {
|
||||
if($vote_code !== ' '){
|
||||
$choice = $pollChoicesOrderedBySlug[$pollSlug][$ii];
|
||||
if ( $vote_code !== ' ' ) {
|
||||
$choice = $pollChoicesOrderedBySlug[ $pollSlug ][ $ii ];
|
||||
|
||||
$newVote = new Vote();
|
||||
|
||||
$newVote
|
||||
->setChoice($choice)
|
||||
->setStacksOfVotes($newStack)
|
||||
->setPoll($poll)
|
||||
->setValue( $this->mapAnswerNumberToWord($vote_code))
|
||||
;
|
||||
$newStack->addVote($newVote);
|
||||
->setChoice( $choice )
|
||||
->setStacksOfVotes( $newStack )
|
||||
->setPoll( $poll )
|
||||
->setValue( $this->mapAnswerNumberToWord( $vote_code ) );
|
||||
$newStack->addVote( $newVote );
|
||||
|
||||
$em->persist( $newVote );
|
||||
$votes[] = $newVote;
|
||||
}
|
||||
$ii++;
|
||||
$ii ++;
|
||||
}
|
||||
|
||||
|
||||
$poll->addStackOfVote($newStack);
|
||||
$poll->addStackOfVote( $newStack );
|
||||
$em->persist( $newStack );
|
||||
$stacksOfVote[] = $newStack;
|
||||
|
||||
}
|
||||
|
||||
$comments = [];
|
||||
$res_comments = $bdd->query( 'SELECT * FROM fd_comment' );
|
||||
while ( $d = $res_comments->fetch( \PDO::FETCH_OBJ ) ) {
|
||||
$comments = [];
|
||||
$res_comments = $bdd->query( 'SELECT * FROM fd_comment' );
|
||||
while ( $d = $res_comments->fetch( PDO::FETCH_OBJ ) ) {
|
||||
|
||||
$debug .= " <br> ajout de commentaire : ".$d->name. ' '. $d->comment;
|
||||
$debug .= " <br> ajout de commentaire : " . $d->name . ' ' . $d->comment;
|
||||
|
||||
$pollSlug = $d->poll_id;
|
||||
$poll = $pollsBySlug[ $pollSlug ];
|
||||
$pollSlug = $d->poll_id;
|
||||
$poll = $pollsBySlug[ $pollSlug ];
|
||||
$newComment = new Comment();
|
||||
$poll->addComment($newComment);
|
||||
$poll->addComment( $newComment );
|
||||
|
||||
$newComment->setPoll($poll)
|
||||
->setCreatedAt( date_create($d->date))
|
||||
->setText( $d->comment)
|
||||
$newComment->setPoll( $poll )
|
||||
->setCreatedAt( date_create( $d->date ) )
|
||||
->setText( $d->comment )
|
||||
// TODO update entities
|
||||
->setPseudo( $d->name);
|
||||
->setPseudo( $d->name );
|
||||
$em->persist( $newComment );
|
||||
$comments[] = $newComment;
|
||||
|
||||
@ -194,41 +190,45 @@ class MigrationController extends EmailsController {
|
||||
// failure notice
|
||||
$debug .= " <br> <br> ça c'est fait. ";
|
||||
|
||||
return $this->render('pages/migration.html.twig' , [
|
||||
"message" => "welcome to the framadate migration endpoint, it has yet to be done",
|
||||
"debug" => $debug,
|
||||
"OLD_DATABASE_NAME" => $this->getParameter( 'OLD_DATABASE_NAME' ),
|
||||
"OLD_DATABASE_USER" => $this->getParameter( 'OLD_DATABASE_USER' ),
|
||||
"counters" =>[
|
||||
'polls' => count($pollsBySlug),
|
||||
'comments' => count($comments),
|
||||
'choices' => count($choicesCreated),
|
||||
'stacks_of_votes' => count($stacksOfVote),
|
||||
'votes' => count($votes),
|
||||
]
|
||||
]);
|
||||
return $this->render( 'pages/migration.html.twig',
|
||||
[
|
||||
"message" => "welcome to the framadate migration endpoint, it has yet to be done",
|
||||
"debug" => $debug,
|
||||
"OLD_DATABASE_NAME" => $this->getParameter( 'OLD_DATABASE_NAME' ),
|
||||
"OLD_DATABASE_USER" => $this->getParameter( 'OLD_DATABASE_USER' ),
|
||||
"counters" => [
|
||||
'polls' => count( $pollsBySlug ),
|
||||
'comments' => count( $comments ),
|
||||
'choices' => count( $choicesCreated ),
|
||||
'stacks_of_votes' => count( $stacksOfVote ),
|
||||
'votes' => count( $votes ),
|
||||
],
|
||||
] );
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $numberToConvert
|
||||
* conversion of answer:
|
||||
* space character : no answer, 0 : no , 1 : maybe , 2 : yes
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function mapAnswerNumberToWord($numberToConvert){
|
||||
public function mapAnswerNumberToWord( $numberToConvert ) {
|
||||
$word = '';
|
||||
switch ($numberToConvert){
|
||||
switch ( $numberToConvert ) {
|
||||
case 0:
|
||||
$word = 'no';
|
||||
break;
|
||||
case 1:
|
||||
case 1:
|
||||
$word = 'maybe';
|
||||
break;
|
||||
case 2:
|
||||
case 2:
|
||||
$word = 'yes';
|
||||
break;
|
||||
default:
|
||||
$word = 'no';
|
||||
}
|
||||
|
||||
return $word;
|
||||
}
|
||||
|
||||
|
@ -9,104 +9,103 @@ use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Symfony\Component\Routing\Annotation\Route;
|
||||
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
|
||||
|
||||
/**
|
||||
* @Route("/poll")
|
||||
*/
|
||||
class PollController extends AbstractController
|
||||
{
|
||||
/**
|
||||
* @Route("/", name="poll_index", methods={"GET"})
|
||||
*/
|
||||
public function index(PollRepository $pollRepository): Response
|
||||
{
|
||||
class PollController extends AbstractController {
|
||||
/**
|
||||
* @Route("/", name="poll_index", methods={"GET"})
|
||||
*/
|
||||
public function index( PollRepository $pollRepository ): Response {
|
||||
|
||||
$polls = $pollRepository->findAll();
|
||||
$titles=[];
|
||||
foreach ( $polls as $poll ) {
|
||||
$titles[] = $poll->getTitle();
|
||||
}
|
||||
return $this->render('poll/index.html.twig', [
|
||||
'count' => count($polls),
|
||||
'titles' => $titles,
|
||||
'polls' => $polls,
|
||||
]);
|
||||
}
|
||||
$polls = $pollRepository->findAll();
|
||||
$titles = [];
|
||||
foreach ( $polls as $poll ) {
|
||||
$titles[] = $poll->getTitle();
|
||||
}
|
||||
|
||||
/**
|
||||
* @Route("/new", name="poll_new", methods={"GET","POST"})
|
||||
*/
|
||||
public function new(Request $request): Response
|
||||
{
|
||||
$poll = new Poll();
|
||||
$form = $this->createForm(PollType::class, $poll);
|
||||
$form->handleRequest($request);
|
||||
return $this->render( 'poll/index.html.twig',
|
||||
[
|
||||
'count' => count( $polls ),
|
||||
'titles' => $titles,
|
||||
'polls' => $polls,
|
||||
] );
|
||||
}
|
||||
|
||||
if ($form->isSubmitted() && $form->isValid()) {
|
||||
$entityManager = $this->getDoctrine()->getManager();
|
||||
$entityManager->persist($poll);
|
||||
$entityManager->flush();
|
||||
/**
|
||||
* @Route("/new", name="poll_new", methods={"GET","POST"})
|
||||
*/
|
||||
public function new( Request $request ): Response {
|
||||
$poll = new Poll();
|
||||
$form = $this->createForm( PollType::class, $poll );
|
||||
$form->handleRequest( $request );
|
||||
|
||||
return $this->redirectToRoute('poll_index');
|
||||
}
|
||||
if ( $form->isSubmitted() && $form->isValid() ) {
|
||||
$entityManager = $this->getDoctrine()->getManager();
|
||||
$entityManager->persist( $poll );
|
||||
$entityManager->flush();
|
||||
|
||||
return $this->render('poll/new.html.twig', [
|
||||
'poll' => $poll,
|
||||
'form' => $form->createView(),
|
||||
]);
|
||||
}
|
||||
return $this->redirectToRoute( 'poll_index' );
|
||||
}
|
||||
|
||||
/**
|
||||
* on cherche un sondage par son url personnalisée
|
||||
* @Route("/{id}", name="poll_show", methods={"GET"})
|
||||
*/
|
||||
public function show($id): Response
|
||||
{
|
||||
$repository = $this->getDoctrine()->getRepository(Poll::class);
|
||||
$foundPoll = $repository->findOneByCustomUrl($id);
|
||||
if(!$foundPoll){
|
||||
return $this->json([
|
||||
'message' => $id.' : not found'
|
||||
], 404);
|
||||
}
|
||||
return $this->render( 'poll/new.html.twig',
|
||||
[
|
||||
'poll' => $poll,
|
||||
'form' => $form->createView(),
|
||||
] );
|
||||
}
|
||||
|
||||
return $this->render('poll/show.html.twig', [
|
||||
'poll' => $foundPoll,
|
||||
]);
|
||||
}
|
||||
/**
|
||||
* on cherche un sondage par son url personnalisée
|
||||
* @Route("/{id}", name="poll_show", methods={"GET"})
|
||||
*/
|
||||
public function show( $id ): Response {
|
||||
$repository = $this->getDoctrine()->getRepository( Poll::class );
|
||||
$foundPoll = $repository->findOneByCustomUrl( $id );
|
||||
if ( ! $foundPoll ) {
|
||||
return $this->json( [
|
||||
'message' => $id . ' : not found',
|
||||
],
|
||||
404 );
|
||||
}
|
||||
|
||||
/**
|
||||
* @Route("/{id}/edit", name="poll_edit", methods={"GET","POST"})
|
||||
*/
|
||||
public function edit(Request $request, Poll $poll): Response
|
||||
{
|
||||
$form = $this->createForm(PollType::class, $poll);
|
||||
$form->handleRequest($request);
|
||||
return $this->render( 'poll/show.html.twig',
|
||||
[
|
||||
'poll' => $foundPoll,
|
||||
] );
|
||||
}
|
||||
|
||||
if ($form->isSubmitted() && $form->isValid()) {
|
||||
$this->getDoctrine()->getManager()->flush();
|
||||
/**
|
||||
* @Route("/{id}/edit", name="poll_edit", methods={"GET","POST"})
|
||||
*/
|
||||
public function edit( Request $request, Poll $poll ): Response {
|
||||
$form = $this->createForm( PollType::class, $poll );
|
||||
$form->handleRequest( $request );
|
||||
|
||||
return $this->redirectToRoute('poll_index');
|
||||
}
|
||||
if ( $form->isSubmitted() && $form->isValid() ) {
|
||||
$this->getDoctrine()->getManager()->flush();
|
||||
|
||||
return $this->render('poll/edit.html.twig', [
|
||||
'poll' => $poll,
|
||||
'form' => $form->createView(),
|
||||
]);
|
||||
}
|
||||
return $this->redirectToRoute( 'poll_index' );
|
||||
}
|
||||
|
||||
/**
|
||||
* @Route("/{id}", name="poll_delete", methods={"DELETE"})
|
||||
*/
|
||||
public function delete(Request $request, Poll $poll): Response
|
||||
{
|
||||
if ($this->isCsrfTokenValid('delete'.$poll->getId(), $request->request->get('_token'))) {
|
||||
$entityManager = $this->getDoctrine()->getManager();
|
||||
$entityManager->remove($poll);
|
||||
$entityManager->flush();
|
||||
}
|
||||
return $this->render( 'poll/edit.html.twig',
|
||||
[
|
||||
'poll' => $poll,
|
||||
'form' => $form->createView(),
|
||||
] );
|
||||
}
|
||||
|
||||
return $this->redirectToRoute('poll_index');
|
||||
}
|
||||
/**
|
||||
* @Route("/{id}", name="poll_delete", methods={"DELETE"})
|
||||
*/
|
||||
public function delete( Request $request, Poll $poll ): Response {
|
||||
if ( $this->isCsrfTokenValid( 'delete' . $poll->getId(), $request->request->get( '_token' ) ) ) {
|
||||
$entityManager = $this->getDoctrine()->getManager();
|
||||
$entityManager->remove( $poll );
|
||||
$entityManager->flush();
|
||||
}
|
||||
|
||||
return $this->redirectToRoute( 'poll_index' );
|
||||
}
|
||||
}
|
||||
|
@ -36,13 +36,15 @@ class CommentController extends EmailsController {
|
||||
SerializerInterface $serializer,
|
||||
Poll $poll
|
||||
) {
|
||||
$jsonResponse = $serializer->serialize([
|
||||
$jsonResponse = $serializer->serialize( [
|
||||
'message' => 'here are your comments of the poll',
|
||||
'data' => $poll->getComments()], 'json');
|
||||
'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;
|
||||
|
||||
@ -72,8 +74,8 @@ class CommentController extends EmailsController {
|
||||
$em = $this->getDoctrine()->getRepository( Owner::class );
|
||||
|
||||
$data = json_decode( $data, true );
|
||||
if(!isset($data['email'])) {
|
||||
return $this->json(["message" => "Incorrect JSON in request"], 400);
|
||||
if ( ! isset( $data[ 'email' ] ) ) {
|
||||
return $this->json( [ "message" => "Incorrect JSON in request" ], 400 );
|
||||
}
|
||||
|
||||
$foundOwner = $em->findOneByEmail( $data[ 'email' ] );
|
||||
@ -81,8 +83,8 @@ class CommentController extends EmailsController {
|
||||
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;
|
||||
@ -118,8 +120,8 @@ class CommentController extends EmailsController {
|
||||
}
|
||||
}
|
||||
$comment->setOwner( $foundOwner )
|
||||
->setCreatedAt( new DateTime() )
|
||||
->setPoll( $poll );
|
||||
->setCreatedAt( new DateTime() )
|
||||
->setPoll( $poll );
|
||||
$foundOwner->addComment( $comment );
|
||||
|
||||
$em = $this->getDoctrine()->getManager();
|
||||
@ -127,8 +129,8 @@ class CommentController extends EmailsController {
|
||||
$em->persist( $comment );
|
||||
$em->flush();
|
||||
|
||||
if($poll->getMailOnComment()){
|
||||
$this->sendCommentNotificationAction($foundOwner, $comment);
|
||||
if ( $poll->getMailOnComment() ) {
|
||||
$this->sendCommentNotificationAction( $foundOwner, $comment );
|
||||
}
|
||||
|
||||
|
||||
|
@ -7,6 +7,11 @@ use App\Entity\Choice;
|
||||
use App\Entity\Owner;
|
||||
use App\Entity\Poll;
|
||||
use App\Repository\PollRepository;
|
||||
use FOS\RestBundle\Controller\Annotations\Delete;
|
||||
use FOS\RestBundle\Controller\Annotations\Get;
|
||||
use FOS\RestBundle\Controller\Annotations\Post;
|
||||
use FOS\RestBundle\Controller\Annotations\Put;
|
||||
use FOS\RestBundle\Controller\Annotations\Route;
|
||||
use JMS\Serializer\Exception\RuntimeException;
|
||||
use JMS\Serializer\SerializerBuilder;
|
||||
use JMS\Serializer\SerializerInterface;
|
||||
@ -14,13 +19,6 @@ use Swift_Mailer;
|
||||
use Symfony\Component\HttpFoundation\JsonResponse;
|
||||
use Symfony\Component\HttpFoundation\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
|
||||
|
||||
use FOS\RestBundle\Controller\Annotations\Get;
|
||||
use FOS\RestBundle\Controller\Annotations\Put;
|
||||
use FOS\RestBundle\Controller\Annotations\Delete;
|
||||
use FOS\RestBundle\Controller\Annotations\Post;
|
||||
use FOS\RestBundle\Controller\Annotations\Route;
|
||||
|
||||
/**
|
||||
* Class DefaultController
|
||||
@ -63,19 +61,6 @@ class PollController extends EmailsController {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $id
|
||||
* message when the poll is not found
|
||||
*
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function notFoundPoll( $id ): Response {
|
||||
return $this->json( [
|
||||
'message' => $id . ' : poll not found',
|
||||
],
|
||||
404 );
|
||||
}
|
||||
|
||||
/**
|
||||
* get a poll config by its custom URL, we do not want polls to be reachable by their numeric id
|
||||
* @Get(
|
||||
@ -103,30 +88,9 @@ class PollController extends EmailsController {
|
||||
$comments = $poll->getComments();
|
||||
$stacks = $poll->getStacksOfVotes();
|
||||
|
||||
$displayedComments = [];
|
||||
foreach ( $comments as $comment ) {
|
||||
$displayedComments[] = $comment->display();
|
||||
}
|
||||
$displayedStackOfVotes = [];
|
||||
foreach ( $stacks as $stack ) {
|
||||
$displayedStackOfVotes[] = $stack->display();
|
||||
}
|
||||
$displayedChoices = [];
|
||||
foreach ( $poll->getChoices() as $choice
|
||||
) {
|
||||
$displayedChoices[] = $choice->display();
|
||||
}
|
||||
|
||||
$pass = $poll->getPassword();
|
||||
|
||||
$returnedPoll = [
|
||||
'message' => 'your poll config for ' . $poll->getTitle(),
|
||||
|
||||
'poll' => $poll->display(),
|
||||
// TODO do not render sub objects of owner, it returns too many thing
|
||||
'stacks' => $displayedStackOfVotes,
|
||||
'choices' => $displayedChoices,
|
||||
'comments' => $displayedComments,
|
||||
];
|
||||
|
||||
/**
|
||||
* password protected content
|
||||
@ -140,13 +104,24 @@ class PollController extends EmailsController {
|
||||
|
||||
} else {
|
||||
// free access to poll
|
||||
// return $this->returnPollData( $poll, $serializer );
|
||||
return $this->json( $returnedPoll );
|
||||
// return $this->json($poll);
|
||||
return $this->json( $poll->display() );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $id
|
||||
* message when the poll is not found
|
||||
*
|
||||
* @return JsonResponse
|
||||
*/
|
||||
public function notFoundPoll( $id ): Response {
|
||||
return $this->json( [
|
||||
'message' => $id . ' : poll not found',
|
||||
],
|
||||
404 );
|
||||
}
|
||||
|
||||
/**
|
||||
* get a poll config by its custom URL, we do not want polls to be reachable by their numeric id
|
||||
* @Get(
|
||||
@ -167,9 +142,9 @@ class PollController extends EmailsController {
|
||||
return $this->notFoundPoll( $customUrl );
|
||||
}
|
||||
|
||||
if ( $poll->getPassword() === $md5 ) {
|
||||
if ( md5( $poll->getPassword() ) === $md5 ) {
|
||||
// good matching pass
|
||||
return $this->returnPollData( $poll, $serializer );
|
||||
return $this->json( $poll->display() );
|
||||
} else {
|
||||
// wrong pass
|
||||
return $this->json( [
|
||||
@ -218,10 +193,8 @@ class PollController extends EmailsController {
|
||||
$em->persist( $poll );
|
||||
$em->flush();
|
||||
|
||||
return $this->json( [
|
||||
'message' => 'you updated the poll ' . $poll->getTitle(),
|
||||
"poll" => $poll,
|
||||
],
|
||||
return $this->json( $poll->displayForAdmin()
|
||||
,
|
||||
200 );
|
||||
}
|
||||
|
||||
@ -303,7 +276,6 @@ class PollController extends EmailsController {
|
||||
$newChoice = new Choice();
|
||||
$newChoice
|
||||
->setPoll( $newpoll )
|
||||
// ->setUrl( $c[ 'url' ] )
|
||||
->setName( $c[ 'literal' ] );
|
||||
$em->persist( $newChoice );
|
||||
// TODO add also choices for each time range in a day
|
||||
@ -330,11 +302,9 @@ class PollController extends EmailsController {
|
||||
$this->sendCreationMailAction( $foundOwner, $newpoll );
|
||||
|
||||
return $this->json( [
|
||||
'message' => 'you created a poll ' . $precision,
|
||||
'poll' => $newpoll,
|
||||
'password_protected' => is_string( $newpoll->getPassword() ),
|
||||
'admin_key' => $newpoll->getAdminKey(),
|
||||
'owner_modifier_token' => $foundOwner->getModifierToken(),
|
||||
'message' => 'you created a poll ' . $precision,
|
||||
'poll' => $newpoll->displayForAdmin,
|
||||
'password_protected' => is_string( $newpoll->getPassword() ),
|
||||
|
||||
],
|
||||
201 );
|
||||
|
@ -31,6 +31,7 @@ class VoteController extends EmailsController {
|
||||
* name = "new_vote_stack",
|
||||
* requirements = {"content"="\w+", "poll_id"="\d+"}
|
||||
* )
|
||||
*
|
||||
* @param SerializerInterface $serializer
|
||||
* @param Poll $poll
|
||||
* @param Request $request
|
||||
@ -66,10 +67,11 @@ class VoteController extends EmailsController {
|
||||
}
|
||||
// TODO anti flood
|
||||
$foundOwner
|
||||
->setModifierToken( $poll->generateAdminKey() );
|
||||
->setModifierToken( $poll->generateRandomKey() );
|
||||
$stack = new StackOfVotes();
|
||||
$stack
|
||||
->setOwner( $foundOwner )
|
||||
->setIp( $_SERVER[ 'REMOTE_ADDR' ] )
|
||||
->setPseudo( $data[ 'pseudo' ] )
|
||||
->setPoll( $poll );
|
||||
foreach ( $data[ 'votes' ] as $voteInfo ) {
|
||||
@ -96,8 +98,8 @@ class VoteController extends EmailsController {
|
||||
404 );
|
||||
}
|
||||
$vote->setPoll( $poll )
|
||||
->setChoice( $foundChoice )
|
||||
->setValue( $voteInfo[ 'value' ] );
|
||||
->setChoice( $foundChoice )
|
||||
->setValue( $voteInfo[ 'value' ] );
|
||||
$vote->setPoll( $poll );
|
||||
$stack->addVote( $vote );
|
||||
$poll->addVote( $vote );
|
||||
@ -116,17 +118,17 @@ class VoteController extends EmailsController {
|
||||
}
|
||||
$stacks = $poll->getStacksOfVotes();
|
||||
|
||||
if($poll->getMailOnVote()){
|
||||
$this->sendVoteNotificationAction($stack->getOwner(), $stack);
|
||||
if ( $poll->getMailOnVote() ) {
|
||||
$this->sendVoteNotificationAction( $stack->getOwner(), $stack );
|
||||
}
|
||||
|
||||
$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;
|
||||
|
||||
@ -139,6 +141,7 @@ class VoteController extends EmailsController {
|
||||
* name = "update_vote_stack",
|
||||
* requirements = { "id"="\d+"}
|
||||
* )
|
||||
*
|
||||
* @param SerializerInterface $serializer
|
||||
* @param StackOfVotes $id
|
||||
* @param $modifierToken
|
||||
@ -171,15 +174,16 @@ class VoteController extends EmailsController {
|
||||
// save evrything
|
||||
|
||||
|
||||
$jsonResponse = $serializer->serialize([
|
||||
$jsonResponse = $serializer->serialize( [
|
||||
'message' => 'ok',
|
||||
'modifier_token' => $voteStack->getOwner()->getModifierToken(),
|
||||
'vote_stack' => $voteStack,
|
||||
], 'json');
|
||||
],
|
||||
'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;
|
||||
|
||||
@ -207,11 +211,13 @@ class VoteController extends EmailsController {
|
||||
|
||||
return $this->json( [
|
||||
'message' => 'boom! les ' . $length . ' votes du sondage ont été supprimés',
|
||||
],200 );
|
||||
],
|
||||
200 );
|
||||
} else {
|
||||
return $this->json( [
|
||||
'message' => 'le token d\'autorisation est invalide, vous ne pouvez pas modifier ce sondage'
|
||||
],403 );
|
||||
'message' => 'le token d\'autorisation est invalide, vous ne pouvez pas modifier ce sondage',
|
||||
],
|
||||
403 );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -6,13 +6,11 @@ use Doctrine\Bundle\FixturesBundle\Fixture;
|
||||
use Doctrine\Persistence\ObjectManager;
|
||||
|
||||
|
||||
class AppFixtures extends Fixture
|
||||
{
|
||||
public function load(ObjectManager $manager)
|
||||
{
|
||||
// $product = new Product();
|
||||
// $manager->persist($product);
|
||||
class AppFixtures extends Fixture {
|
||||
public function load( ObjectManager $manager ) {
|
||||
// $product = new Product();
|
||||
// $manager->persist($product);
|
||||
|
||||
$manager->flush();
|
||||
}
|
||||
$manager->flush();
|
||||
}
|
||||
}
|
||||
|
@ -42,12 +42,12 @@ class AppPollFixtures extends Fixture {
|
||||
|
||||
$pollCitronOrange = new Poll();
|
||||
$pollCitronOrange->setTitle( 'citron ou orange' )
|
||||
->setCustomUrl('citron')
|
||||
->setDescription( 'votre sorbert préféré' )
|
||||
->setModificationPolicy( 'nobody' )
|
||||
->setPassword('le pass woute woute');
|
||||
->setCustomUrl( 'citron' )
|
||||
->setDescription( 'votre sorbert préféré' )
|
||||
->setModificationPolicy( 'nobody' )
|
||||
->setPassword( 'le pass woute woute' );
|
||||
|
||||
$this->addReference(self::POLL_FIXTURE_ONE, $pollCitronOrange);
|
||||
$this->addReference( self::POLL_FIXTURE_ONE, $pollCitronOrange );
|
||||
|
||||
$pollCitronOrange->setMailOnVote( true );
|
||||
$pollCitronOrange->setOwner( $owner );
|
||||
@ -106,21 +106,21 @@ class AppPollFixtures extends Fixture {
|
||||
$ownerComment = new Comment();
|
||||
$ownerComment
|
||||
->setText( "trop bien ce sondage wohooo! signé l'auteur." )
|
||||
->setPseudo('un gens qui commente')
|
||||
->setPseudo( 'un gens qui commente' )
|
||||
->setOwner( $owner );
|
||||
$pollCitronOrange->addComment( $ownerComment );
|
||||
|
||||
$someoneComment = new Comment();
|
||||
$someoneComment
|
||||
->setText( "comme l'auteur se la raconte. PFFFF!" )
|
||||
->setPseudo('un gens qui commente')
|
||||
->setPseudo( 'un gens qui commente' )
|
||||
->setOwner( $commenterMan );
|
||||
$pollCitronOrange->addComment( $someoneComment );
|
||||
|
||||
|
||||
$pollCitronOrange->setTitle( 'démo sondage de texte avec deux commentaires' )
|
||||
->setCustomUrl('demo')
|
||||
->setDescription( 'description du sondage 2' );
|
||||
->setCustomUrl( 'demo' )
|
||||
->setDescription( 'description du sondage 2' );
|
||||
|
||||
$pollCitronOrange->setModificationPolicy( 'self' );
|
||||
$pollCitronOrange->setMailOnComment( true );
|
||||
@ -138,9 +138,9 @@ class AppPollFixtures extends Fixture {
|
||||
// voting test with 2 people
|
||||
|
||||
// poll with date type
|
||||
$pollCitronOrange = new Poll();
|
||||
$choice = new Choice();
|
||||
$firstDate = new DateTime();
|
||||
$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();
|
||||
@ -148,42 +148,42 @@ class AppPollFixtures extends Fixture {
|
||||
$choice3->setName( $pollCitronOrange->addDaysToDate( $firstDate, 2 )->format( 'Y-m-d H:i:s' ) );
|
||||
|
||||
$pollCitronOrange->setTitle( "c'est pour aujourdhui ou pour demain" )
|
||||
->setCustomUrl('aujourdhui-ou-demain')
|
||||
->setDescription( 'Vous avez le choix dans la date' )
|
||||
->setKind( 'date' )
|
||||
->setOwner( $owner )
|
||||
->addChoice( $choice )
|
||||
->addChoice( $choice2 )
|
||||
->addChoice( $choice3 )
|
||||
->setModificationPolicy( 'everybody' );
|
||||
->setCustomUrl( 'aujourdhui-ou-demain' )
|
||||
->setDescription( 'Vous avez le choix dans la date' )
|
||||
->setKind( 'date' )
|
||||
->setOwner( $owner )
|
||||
->addChoice( $choice )
|
||||
->addChoice( $choice2 )
|
||||
->addChoice( $choice3 )
|
||||
->setModificationPolicy( 'everybody' );
|
||||
$manager->persist( $pollCitronOrange );
|
||||
|
||||
// poll with cartoon choices
|
||||
$pollCartoons = new Poll();
|
||||
$pollCartoons->setTitle( 'dessin animé préféré' )
|
||||
->setCustomUrl('dessin-anime')
|
||||
->setDescription( 'choisissez votre animé préféré' )
|
||||
->setOwner( $owner )
|
||||
->setModificationPolicy( 'nobody' )
|
||||
->addTextChoiceArray( [
|
||||
"Vic le viking",
|
||||
"Boumbo petite automobile",
|
||||
"Les mystérieuses cités d'or",
|
||||
"Les mondes engloutis",
|
||||
"Foot 2 rue",
|
||||
"Le chat, la vache, et l'océan",
|
||||
"Digimon",
|
||||
] );
|
||||
->setCustomUrl( 'dessin-anime' )
|
||||
->setDescription( 'choisissez votre animé préféré' )
|
||||
->setOwner( $owner )
|
||||
->setModificationPolicy( 'nobody' )
|
||||
->addTextChoiceArray( [
|
||||
"Vic le viking",
|
||||
"Boumbo petite automobile",
|
||||
"Les mystérieuses cités d'or",
|
||||
"Les mondes engloutis",
|
||||
"Foot 2 rue",
|
||||
"Le chat, la vache, et l'océan",
|
||||
"Digimon",
|
||||
] );
|
||||
|
||||
$someoneComment = new Comment();
|
||||
$someoneComment
|
||||
->setPseudo('un gens qui commente')
|
||||
->setPseudo( 'un gens qui commente' )
|
||||
->setText( "allez boumbo!" )
|
||||
->setOwner( $commenterMan );
|
||||
$pollCartoons->addComment( $someoneComment );
|
||||
$someoneComment2 = new Comment();
|
||||
$someoneComment2
|
||||
->setPseudo('un gens qui commente')
|
||||
->setPseudo( 'un gens qui commente' )
|
||||
->setText( "je suis pour la team rocket de digimon" )
|
||||
->setOwner( $owner );
|
||||
$pollCartoons->addComment( $someoneComment2 );
|
||||
@ -195,7 +195,7 @@ class AppPollFixtures extends Fixture {
|
||||
$stack
|
||||
->setPoll( $pollCartoons )
|
||||
->setOwner( $voter );
|
||||
$pollCartoons->addStackOfVote($stack);
|
||||
$pollCartoons->addStackOfVote( $stack );
|
||||
|
||||
$vote = new Vote();
|
||||
$vote
|
||||
@ -203,7 +203,7 @@ class AppPollFixtures extends Fixture {
|
||||
->setStacksOfVotes( $stack )
|
||||
->setValue( "yes" )
|
||||
->setChoice( $pollCartoons->getChoices()[ 2 ] );
|
||||
$pollCartoons->addVote($vote);
|
||||
$pollCartoons->addVote( $vote );
|
||||
|
||||
$vote = new Vote();
|
||||
$vote
|
||||
@ -211,7 +211,7 @@ class AppPollFixtures extends Fixture {
|
||||
->setStacksOfVotes( $stack )
|
||||
->setValue( "maybe" )
|
||||
->setChoice( $pollCartoons->getChoices()[ 1 ] );
|
||||
$pollCartoons->addVote($vote);
|
||||
$pollCartoons->addVote( $vote );
|
||||
|
||||
$manager->persist( $stack );
|
||||
|
||||
@ -227,7 +227,7 @@ class AppPollFixtures extends Fixture {
|
||||
->setStacksOfVotes( $stack )
|
||||
->setValue( "yes" )
|
||||
->setChoice( $pollCartoons->getChoices()[ 1 ] );
|
||||
$pollCartoons->addVote($vote);
|
||||
$pollCartoons->addVote( $vote );
|
||||
|
||||
$vote = new Vote();
|
||||
$vote
|
||||
@ -235,7 +235,7 @@ class AppPollFixtures extends Fixture {
|
||||
->setStacksOfVotes( $stack )
|
||||
->setValue( "yes" )
|
||||
->setChoice( $pollCartoons->getChoices()[ 2 ] );
|
||||
$pollCartoons->addVote($vote);
|
||||
$pollCartoons->addVote( $vote );
|
||||
|
||||
$vote = new Vote();
|
||||
$vote
|
||||
@ -243,7 +243,7 @@ class AppPollFixtures extends Fixture {
|
||||
->setStacksOfVotes( $stack )
|
||||
->setValue( "no" )
|
||||
->setChoice( $pollCartoons->getChoices()[ 2 ] );
|
||||
$pollCartoons->addVote($vote);
|
||||
$pollCartoons->addVote( $vote );
|
||||
|
||||
$manager->persist( $pollCartoons );
|
||||
$manager->persist( $stack );
|
||||
|
@ -3,16 +3,14 @@
|
||||
namespace App\DataFixtures;
|
||||
|
||||
use App\Entity\Owner;
|
||||
use App\Entity\Poll;
|
||||
use App\Entity\StackOfVotes;
|
||||
use App\Entity\Vote;
|
||||
use Doctrine\Bundle\FixturesBundle\Fixture;
|
||||
use Doctrine\Common\DataFixtures\DependentFixtureInterface;
|
||||
use Doctrine\Persistence\ObjectManager;
|
||||
|
||||
class VotesStacksFixtures extends Fixture implements DependentFixtureInterface {
|
||||
public function getDependencies()
|
||||
{
|
||||
class VotesStacksFixtures extends Fixture implements DependentFixtureInterface {
|
||||
public function getDependencies() {
|
||||
return [
|
||||
AppPollFixtures::class,
|
||||
];
|
||||
@ -32,8 +30,8 @@ class VotesStacksFixtures extends Fixture implements DependentFixtureInterface
|
||||
|
||||
// "citron ou orange"
|
||||
// add vote stacks on "citron ou orange"
|
||||
$pollCitronOrange = $this->getReference(AppPollFixtures::POLL_FIXTURE_ONE);
|
||||
$stack1 = new StackOfVotes();
|
||||
$pollCitronOrange = $this->getReference( AppPollFixtures::POLL_FIXTURE_ONE );
|
||||
$stack1 = new StackOfVotes();
|
||||
$stack1
|
||||
->setPoll( $pollCitronOrange )
|
||||
->setOwner( $people1 );
|
||||
|
@ -1,145 +1,151 @@
|
||||
<?php
|
||||
|
||||
namespace App\Entity;
|
||||
namespace App\Entity;
|
||||
|
||||
use DateTime;
|
||||
use DateTimeInterface;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use JMS\Serializer\Annotation as Serializer;
|
||||
use App\Traits\TimeStampableTrait;
|
||||
use DateTime;
|
||||
use DateTimeInterface;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use JMS\Serializer\Annotation as Serializer;
|
||||
|
||||
/**
|
||||
* one poll choice, could be a text or a date
|
||||
* @ORM\Entity(repositoryClass="App\Repository\ChoiceRepository")
|
||||
* @Serializer\ExclusionPolicy("all")
|
||||
*/
|
||||
class Choice {
|
||||
|
||||
use TimeStampableTrait;
|
||||
|
||||
/**
|
||||
* one poll choice, could be a text or a date
|
||||
* @ORM\Entity(repositoryClass="App\Repository\ChoiceRepository")
|
||||
* @Serializer\ExclusionPolicy("all")
|
||||
* @ORM\Id()
|
||||
* @ORM\GeneratedValue()
|
||||
* @ORM\Column(type="integer")
|
||||
* @Serializer\Expose()
|
||||
*/
|
||||
class Choice {
|
||||
/**
|
||||
* @ORM\Id()
|
||||
* @ORM\GeneratedValue()
|
||||
* @ORM\Column(type="integer")
|
||||
* @Serializer\Expose()
|
||||
*/
|
||||
public $id;
|
||||
public $id;
|
||||
|
||||
/**
|
||||
* @ORM\Column(type="string", length=255, nullable=true)
|
||||
* @Serializer\Type("string")
|
||||
* @Serializer\Expose()
|
||||
*/
|
||||
public $name;
|
||||
/**
|
||||
* @ORM\Column(type="string", length=1024, nullable=true)
|
||||
* @Serializer\Type("string")
|
||||
* @Serializer\Expose()
|
||||
*/
|
||||
public $url;
|
||||
|
||||
/**
|
||||
* @ORM\Column(type="datetime", nullable=true)
|
||||
* @Serializer\Type("datetime")
|
||||
*/
|
||||
public $dateTime;
|
||||
/**
|
||||
* @ORM\OneToMany(targetEntity="App\Entity\Vote", mappedBy="choice", cascade={"persist"})
|
||||
* @Serializer\Type("App\Entity\Vote")
|
||||
*/
|
||||
public $votes;
|
||||
/**
|
||||
* @ORM\ManyToOne(targetEntity="App\Entity\Poll", inversedBy="choices", cascade={"persist"})
|
||||
* @Serializer\Type("App\Entity\Poll")
|
||||
*/
|
||||
private $poll;
|
||||
|
||||
public function __construct( $optionalName = null ) {
|
||||
$this->poll = new ArrayCollection();
|
||||
$this->votes = new ArrayCollection();
|
||||
$this->setDateTime( new DateTime() );
|
||||
if ( $optionalName ) {
|
||||
$this->setName( $optionalName );
|
||||
}
|
||||
}
|
||||
/**
|
||||
* @ORM\Column(type="string", length=255, nullable=true)
|
||||
* @Serializer\Type("string")
|
||||
* @Serializer\Expose()
|
||||
*/
|
||||
public $name;
|
||||
/**
|
||||
* @ORM\Column(type="string", length=1024, nullable=true)
|
||||
* @Serializer\Type("string")
|
||||
* @Serializer\Expose()
|
||||
*/
|
||||
public $url;
|
||||
|
||||
|
||||
public function display() {
|
||||
return [
|
||||
'id' => $this->getId(),
|
||||
'date' => $this->getDateTime(),
|
||||
'name' => $this->getName(),
|
||||
'url' => $this->getUrl(),
|
||||
];
|
||||
}
|
||||
/**
|
||||
* @ORM\OneToMany(targetEntity="App\Entity\Vote", mappedBy="choice", cascade={"persist"})
|
||||
* @Serializer\Type("App\Entity\Vote")
|
||||
*/
|
||||
public $votes;
|
||||
/**
|
||||
* @ORM\ManyToOne(targetEntity="App\Entity\Poll", inversedBy="choices", cascade={"persist"})
|
||||
* @Serializer\Type("App\Entity\Poll")
|
||||
*/
|
||||
private $poll;
|
||||
|
||||
public function getId(): ?int {
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
public function getDateTime(): ?DateTimeInterface {
|
||||
return $this->dateTime;
|
||||
}
|
||||
|
||||
public function setDateTime( ?DateTimeInterface $dateTime ): self {
|
||||
$this->dateTime = $dateTime;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getName(): ?string {
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
public function setName( ?string $name ): self {
|
||||
$this->name = $name;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getPoll(): ?Poll {
|
||||
return $this->poll;
|
||||
}
|
||||
|
||||
public function setPoll( ?Poll $poll ): self {
|
||||
$this->poll = $poll;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Collection|Vote[]
|
||||
*/
|
||||
public function getVotes(): Collection {
|
||||
return $this->votes;
|
||||
}
|
||||
|
||||
public function addVote( Vote $vote ): self {
|
||||
if ( ! $this->votes->contains( $vote ) ) {
|
||||
$this->votes[] = $vote;
|
||||
$vote->setChoice( $this );
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function removeVote( Vote $vote ): self {
|
||||
if ( $this->votes->contains( $vote ) ) {
|
||||
$this->votes->removeElement( $vote );
|
||||
// set the owning side to null (unless already changed)
|
||||
if ( $vote->getChoice() === $this ) {
|
||||
$vote->setChoice( null );
|
||||
}
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getUrl(): ?string {
|
||||
return $this->url;
|
||||
}
|
||||
|
||||
public function setUrl( ?string $url ): self {
|
||||
$this->url = $url;
|
||||
|
||||
return $this;
|
||||
public function __construct( $optionalName = null ) {
|
||||
$this->setCreatedAt( new DateTime() );
|
||||
$this->poll = new ArrayCollection();
|
||||
$this->votes = new ArrayCollection();
|
||||
$this->setDateTime( new DateTime() );
|
||||
if ( $optionalName ) {
|
||||
$this->setName( $optionalName );
|
||||
}
|
||||
}
|
||||
|
||||
public function setDateTime( ?DateTimeInterface $dateTime ): self {
|
||||
$this->dateTime = $dateTime;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function display( $kind = 'text' ) {
|
||||
$fields = [
|
||||
'id' => $this->getId(),
|
||||
'created_at' => $this->getCreatedAtAsString(),
|
||||
'name' => $this->getName(),
|
||||
'url' => $this->getUrl(),
|
||||
];
|
||||
if ( $kind === 'date' ) {
|
||||
$date = new DateTime( $this->getName() );
|
||||
$fields[ 'name' ] = $date->format( 'c' );
|
||||
}
|
||||
|
||||
return $fields;
|
||||
}
|
||||
|
||||
public function getId(): ?int {
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
public function getName(): ?string {
|
||||
return $this->name;
|
||||
}
|
||||
|
||||
public function setName( ?string $name ): self {
|
||||
$this->name = $name;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getUrl(): ?string {
|
||||
return $this->url;
|
||||
}
|
||||
|
||||
public function setUrl( ?string $url ): self {
|
||||
$this->url = $url;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getDateTime(): ?DateTimeInterface {
|
||||
return $this->dateTime;
|
||||
}
|
||||
|
||||
public function getPoll(): ?Poll {
|
||||
return $this->poll;
|
||||
}
|
||||
|
||||
public function setPoll( ?Poll $poll ): self {
|
||||
$this->poll = $poll;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Collection|Vote[]
|
||||
*/
|
||||
public function getVotes(): Collection {
|
||||
return $this->votes;
|
||||
}
|
||||
|
||||
public function addVote( Vote $vote ): self {
|
||||
if ( ! $this->votes->contains( $vote ) ) {
|
||||
$this->votes[] = $vote;
|
||||
$vote->setChoice( $this );
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function removeVote( Vote $vote ): self {
|
||||
if ( $this->votes->contains( $vote ) ) {
|
||||
$this->votes->removeElement( $vote );
|
||||
// set the owning side to null (unless already changed)
|
||||
if ( $vote->getChoice() === $this ) {
|
||||
$vote->setChoice( null );
|
||||
}
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
@ -2,6 +2,8 @@
|
||||
|
||||
namespace App\Entity;
|
||||
|
||||
use App\Traits\TimeStampableTrait;
|
||||
use DateTime;
|
||||
use DateTimeInterface;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use JMS\Serializer\Annotation as Serializer;
|
||||
@ -11,6 +13,9 @@ use JMS\Serializer\Annotation as Serializer;
|
||||
* @Serializer\ExclusionPolicy("all")
|
||||
*/
|
||||
class Comment {
|
||||
|
||||
use TimeStampableTrait;
|
||||
|
||||
/**
|
||||
* @ORM\Id()
|
||||
* @ORM\GeneratedValue()
|
||||
@ -39,84 +44,75 @@ class Comment {
|
||||
*/
|
||||
private $text;
|
||||
|
||||
/**
|
||||
* @ORM\Column(type="datetime")
|
||||
* @Serializer\Type("datetime")
|
||||
* @Serializer\Expose()
|
||||
*/
|
||||
private $createdAt;
|
||||
|
||||
/**
|
||||
* @ORM\ManyToOne(targetEntity="App\Entity\Poll", inversedBy="comments")
|
||||
*/
|
||||
private $poll;
|
||||
|
||||
function display() {
|
||||
return [
|
||||
'id' => $this->getId(),
|
||||
'text' => $this->getText(),
|
||||
'pseudo' => $this->getOwner()->getPseudo(),
|
||||
'date' => $this->getCreatedAt(),
|
||||
];
|
||||
}
|
||||
|
||||
function __construct() {
|
||||
$this->setCreatedAt( new \DateTime() );
|
||||
}
|
||||
|
||||
public function getId(): ?int {
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
public function getOwner(): ?Owner {
|
||||
return $this->owner;
|
||||
}
|
||||
|
||||
public function setOwner( ?Owner $owner ): self {
|
||||
$this->owner = $owner;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getText(): ?string {
|
||||
return $this->text;
|
||||
}
|
||||
|
||||
public function setText( string $text ): self {
|
||||
$this->text = $text;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getCreatedAt(): ?DateTimeInterface {
|
||||
return $this->createdAt;
|
||||
}
|
||||
$this->setCreatedAt( new DateTime() );
|
||||
}
|
||||
|
||||
public function setCreatedAt( DateTimeInterface $createdAt ): self {
|
||||
$this->createdAt = $createdAt;
|
||||
|
||||
return $this;
|
||||
}
|
||||
$this->createdAt = $createdAt;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getCreatedAt(): ?DateTimeInterface {
|
||||
return $this->createdAt;
|
||||
}
|
||||
|
||||
function display() {
|
||||
return [
|
||||
'id' => $this->getId(),
|
||||
'text' => $this->getText(),
|
||||
'pseudo' => $this->getOwner()->getPseudo(),
|
||||
'created_at' => $this->getCreatedAtAsString(),
|
||||
];
|
||||
}
|
||||
|
||||
public function getId(): ?int {
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
public function getText(): ?string {
|
||||
return $this->text;
|
||||
}
|
||||
|
||||
public function setText( string $text ): self {
|
||||
$this->text = $text;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getOwner(): ?Owner {
|
||||
return $this->owner;
|
||||
}
|
||||
|
||||
public function setOwner( ?Owner $owner ): self {
|
||||
$this->owner = $owner;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getPoll(): ?Poll {
|
||||
return $this->poll;
|
||||
}
|
||||
return $this->poll;
|
||||
}
|
||||
|
||||
public function setPoll( ?Poll $poll ): self {
|
||||
$this->poll = $poll;
|
||||
|
||||
return $this;
|
||||
}
|
||||
$this->poll = $poll;
|
||||
|
||||
public function getPseudo(): ?string
|
||||
{
|
||||
return $this->pseudo;
|
||||
}
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setPseudo(string $pseudo): self
|
||||
{
|
||||
$this->pseudo = $pseudo;
|
||||
public function getPseudo(): ?string {
|
||||
return $this->pseudo;
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
public function setPseudo( string $pseudo ): self {
|
||||
$this->pseudo = $pseudo;
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
@ -2,6 +2,9 @@
|
||||
|
||||
namespace App\Entity;
|
||||
|
||||
use App\Traits\TimeStampableTrait;
|
||||
use DateTime;
|
||||
use DateTimeInterface;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
@ -11,24 +14,26 @@ use JMS\Serializer\Annotation as Serializer;
|
||||
* @ORM\Entity(repositoryClass="App\Repository\OwnerRepository")
|
||||
*/
|
||||
class Owner {
|
||||
use TimeStampableTrait;
|
||||
|
||||
/**
|
||||
* @ORM\Column(type="string", length=255)
|
||||
* @Serializer\Type("string")
|
||||
* @Serializer\Expose()
|
||||
*/
|
||||
public $pseudo;
|
||||
/**
|
||||
* @ORM\Id()
|
||||
* @ORM\GeneratedValue()
|
||||
* @ORM\Column(type="integer")
|
||||
*/
|
||||
private $id;
|
||||
/**
|
||||
* @ORM\Column(type="string", length=255)
|
||||
* @Serializer\Type("string")
|
||||
* @Serializer\Expose()
|
||||
*/
|
||||
public $email;
|
||||
/**
|
||||
* @ORM\Id()
|
||||
* @ORM\GeneratedValue()
|
||||
* @ORM\Column(type="integer")
|
||||
*/
|
||||
private $id;
|
||||
/**
|
||||
* @ORM\OneToMany(targetEntity="App\Entity\Poll", mappedBy="owner",cascade={"persist","remove"},orphanRemoval=true)
|
||||
* @Serializer\Type("App\Entity\Poll")
|
||||
@ -49,10 +54,7 @@ class Owner {
|
||||
* @ORM\Column(type="string", length=255)
|
||||
*/
|
||||
private $modifierToken;
|
||||
/**
|
||||
* @ORM\Column(type="datetime" , options={"default"="CURRENT_TIMESTAMP"})
|
||||
*/
|
||||
private $createdAt;
|
||||
|
||||
/**
|
||||
* @ORM\Column(type="datetime" , options={"default"="CURRENT_TIMESTAMP"},nullable=true)
|
||||
*/
|
||||
@ -62,10 +64,54 @@ class Owner {
|
||||
$this->polls = new ArrayCollection();
|
||||
$this->comments = new ArrayCollection();
|
||||
$this->stackOfVotes = new ArrayCollection();
|
||||
$this->setCreatedAt( new \DateTime() );
|
||||
$this->setCreatedAt( new DateTime() );
|
||||
$this->setModifierToken( uniqid() );
|
||||
$this->setCreatedAt( new DateTime() );
|
||||
}
|
||||
|
||||
public function setCreatedAt( DateTimeInterface $createdAt ): self {
|
||||
$this->createdAt = $createdAt;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getCreatedAt(): ?DateTimeInterface {
|
||||
return $this->createdAt;
|
||||
}
|
||||
|
||||
public function display() {
|
||||
return [
|
||||
'pseudo' => $this->getPseudo(),
|
||||
];
|
||||
}
|
||||
|
||||
public function getPseudo(): ?string {
|
||||
return $this->pseudo;
|
||||
}
|
||||
|
||||
public function setPseudo( string $pseudo ): self {
|
||||
$this->pseudo = $pseudo;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function displayForAdmin() {
|
||||
return [
|
||||
'pseudo' => $this->getPseudo(),
|
||||
'modifier_token' => $this->getModifierToken(),
|
||||
'created_at' => $this->getCreatedAtAsString(),
|
||||
];
|
||||
}
|
||||
|
||||
public function getModifierToken(): ?string {
|
||||
return $this->modifierToken;
|
||||
}
|
||||
|
||||
public function setModifierToken( string $modifierToken ): self {
|
||||
$this->modifierToken = $modifierToken;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getId(): ?int {
|
||||
return $this->id;
|
||||
@ -81,16 +127,6 @@ class Owner {
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getPseudo(): ?string {
|
||||
return $this->pseudo;
|
||||
}
|
||||
|
||||
public function setPseudo( string $pseudo ): self {
|
||||
$this->pseudo = $pseudo;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Collection|Poll[]
|
||||
*/
|
||||
@ -175,16 +211,6 @@ class Owner {
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getModifierToken(): ?string {
|
||||
return $this->modifierToken;
|
||||
}
|
||||
|
||||
public function setModifierToken( string $modifierToken ): self {
|
||||
$this->modifierToken = $modifierToken;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function addComment( Comment $comment ): self {
|
||||
if ( ! $this->comments->contains( $comment ) ) {
|
||||
$this->comments[] = $comment;
|
||||
@ -206,16 +232,6 @@ class Owner {
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getCreatedAt(): ?\DateTimeInterface {
|
||||
return $this->createdAt;
|
||||
}
|
||||
|
||||
public function setCreatedAt( \DateTimeInterface $createdAt ): self {
|
||||
$this->createdAt = $createdAt;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getRequestedPollsDate() {
|
||||
return $this->requestedPollsDate;
|
||||
}
|
||||
|
@ -2,17 +2,26 @@
|
||||
|
||||
namespace App\Entity;
|
||||
|
||||
use DateTimeInterface;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use JMS\Serializer\Annotation as Serializer;
|
||||
use App\Traits\RandomTrait;
|
||||
use App\Traits\TimeStampableTrait;
|
||||
use DateTime;
|
||||
use DateTimeInterface;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use ErrorException;
|
||||
use JMS\Serializer\Annotation as Serializer;
|
||||
|
||||
/**
|
||||
* @ORM\Entity(repositoryClass="App\Repository\PollRepository")
|
||||
* @Serializer\ExclusionPolicy("all")
|
||||
*/
|
||||
class Poll {
|
||||
|
||||
use RandomTrait;
|
||||
|
||||
use TimeStampableTrait;
|
||||
|
||||
/**
|
||||
* @ORM\Id()
|
||||
* @ORM\GeneratedValue()
|
||||
@ -40,11 +49,7 @@ class Poll {
|
||||
* @Serializer\Type("string")
|
||||
*/
|
||||
public $description;
|
||||
/**
|
||||
* @ORM\Column(type="datetime" , options={"default"="CURRENT_TIMESTAMP"})
|
||||
* @Serializer\Expose()
|
||||
*/
|
||||
public $creationDate;
|
||||
|
||||
/**
|
||||
* @ORM\Column(type="datetime")
|
||||
* @Serializer\Expose()
|
||||
@ -97,7 +102,7 @@ class Poll {
|
||||
* @Serializer\Type("smallint")
|
||||
* @Serializer\Expose()
|
||||
*/
|
||||
public $choicesMax = -1;
|
||||
public $choicesMax = - 1;
|
||||
|
||||
/**
|
||||
* people can add comments
|
||||
@ -168,6 +173,12 @@ class Poll {
|
||||
* @Serializer\Type("ArrayCollection<App\Entity\Comment>")
|
||||
*/
|
||||
public $comments;
|
||||
/**
|
||||
* number of days from now for default expiracy date
|
||||
* @var int
|
||||
* @Serializer\Expose()
|
||||
*/
|
||||
public $defaultExpiracyDaysFromNow = 60;
|
||||
/**
|
||||
* vote restricted by a password in md5 format
|
||||
* @ORM\Column(type="string", length=255, nullable=true)
|
||||
@ -179,43 +190,129 @@ class Poll {
|
||||
* @Serializer\Type("string")
|
||||
*/
|
||||
private $adminKey;
|
||||
|
||||
/**
|
||||
* number of days from now for default expiracy date
|
||||
* @var int
|
||||
* @Serializer\Expose()
|
||||
*/
|
||||
public $defaultExpiracyDaysFromNow = 60;
|
||||
private $maxChoicesLimit = 25;
|
||||
|
||||
public function __construct() {
|
||||
|
||||
$this->initiate();
|
||||
$this->setCreatedAt( new DateTime() );
|
||||
$this->votes = new ArrayCollection();
|
||||
$this->stacksOfVotes = new ArrayCollection();
|
||||
$this->choices = new ArrayCollection();
|
||||
$this->comments = new ArrayCollection();
|
||||
}
|
||||
|
||||
private function initiate() {
|
||||
$this->votes = new ArrayCollection();
|
||||
$this->stacksOfVotes = new ArrayCollection();
|
||||
$this->choices = new ArrayCollection();
|
||||
$this->comments = new ArrayCollection();
|
||||
$this->setAdminKey( $this->generateRandomKey() );
|
||||
$this->setCreatedAt( new DateTime() );
|
||||
$this->setExpiracyDate( $this->addDaysToDate(
|
||||
new DateTime(),
|
||||
$this->defaultExpiracyDaysFromNow
|
||||
) );
|
||||
$this->setAllowedAnswers( [ 'yes', 'maybe', 'no' ] );
|
||||
}
|
||||
|
||||
public function setCreatedAt( DateTimeInterface $createdAt ): self {
|
||||
$this->createdAt = $createdAt;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function displayForAdmin() {
|
||||
$content = $this->display();
|
||||
$content[ 'owner' ] = $this->getOwner()->displayForAdmin();
|
||||
$content[ 'admin_key' ] = $this->getAdminKey();
|
||||
$content[ 'password_hash' ] = $this->getPassword();
|
||||
$content[ 'id' ] = $this->getId();
|
||||
|
||||
return $content;
|
||||
}
|
||||
|
||||
// counts each number of answer for this choice
|
||||
|
||||
public function display() {
|
||||
|
||||
$computedAnswers = $this->computeAnswers();
|
||||
$displayedStackOfVotes = [];
|
||||
foreach ( $this->getStacksOfVotes() as $stack ) {
|
||||
$displayedStackOfVotes[] = $stack->display();
|
||||
}
|
||||
$displayedChoices = [];
|
||||
foreach ( $this->getChoices() as $choice ) {
|
||||
$displayedChoices[] = $choice->display();
|
||||
}
|
||||
$displayedComments = [];
|
||||
foreach ( $this->getComments() as $comment ) {
|
||||
$displayedComments[] = $comment->display();
|
||||
}
|
||||
|
||||
|
||||
return [
|
||||
'title' => $this->getTitle(),
|
||||
'description' => $this->getDescription(),
|
||||
'created_at' => $this->getCreatedAt()->format( 'c' ),
|
||||
'expiracy_date' => $this->getExpiracyDate()->format( 'c' ),
|
||||
'votes_max' => $this->getVotesMax(),
|
||||
'choices_max' => $this->getChoicesMax(),
|
||||
'kind' => $this->getKind(),
|
||||
'allowed_answers' => $this->getAllowedAnswers(),
|
||||
'votes_allowed' => $this->getVotesAllowed(),
|
||||
'modification_policy' => $this->getModificationPolicy(),
|
||||
'hide_results' => $this->getHideResults(),
|
||||
'show_results_even_if_password' => $this->getShowResultEvenIfPasswords(),
|
||||
'owner' => [
|
||||
'pseudo' => $this->getOwner()->getPseudo(),
|
||||
]
|
||||
,
|
||||
'password_protected' => $this->getPassword() ? 'yes' : 'no',
|
||||
'max_score' => $computedAnswers[ 'max_score' ],
|
||||
'choices' => $computedAnswers[ 'answers' ],
|
||||
'stacks' => $displayedStackOfVotes,
|
||||
'comments' => $displayedComments,
|
||||
];
|
||||
}
|
||||
|
||||
public function computeAnswers() {
|
||||
// counts each number of answer for this choice
|
||||
$computedArray = [];
|
||||
$maxScore = 0;
|
||||
|
||||
$scoreInfos = [
|
||||
'score' => 0,
|
||||
'yes' => [
|
||||
'count' => 0,
|
||||
'people' => [],
|
||||
],
|
||||
'maybe' => [
|
||||
'count' => 0,
|
||||
'people' => [],
|
||||
],
|
||||
'no' => [
|
||||
'count' => 0,
|
||||
'people' => [],
|
||||
],
|
||||
];
|
||||
|
||||
// first, prefill all choices
|
||||
foreach ( $this->getChoices() as $choice ) {
|
||||
$computedArray[ $choice->getId() ] = array_merge( $scoreInfos, $choice->display( $this->getKind() ) );
|
||||
}
|
||||
// then, compute stack of votes scores on each choice
|
||||
foreach ( $this->getStacksOfVotes() as $stack_of_vote ) {
|
||||
foreach ( $stack_of_vote->getVotes() as $vote ) {
|
||||
$answer = $vote->getValue();
|
||||
$choice_id = $vote->getChoice()->getId();
|
||||
$answer = $vote->getValue();
|
||||
$choice_id = $vote->getChoice()->getId();
|
||||
$choice_url = $vote->getChoice()->getUrl();
|
||||
|
||||
if ( ! isset( $computedArray[ $choice_id ] ) ) {
|
||||
$computedArray[ $choice_id ] = [
|
||||
'choice_id' => $choice_id,
|
||||
'choice_text' => $vote->getChoice()->getName(),
|
||||
'id' => $vote->getId(),
|
||||
'score' => 0,
|
||||
'yes' => [
|
||||
'count' => 0,
|
||||
'people' => [],
|
||||
],
|
||||
'maybe' => [
|
||||
'count' => 0,
|
||||
'people' => [],
|
||||
],
|
||||
'no' => [
|
||||
'count' => 0,
|
||||
'people' => [],
|
||||
],
|
||||
'id' => $choice_id,
|
||||
'url' => $choice_url,
|
||||
'name' => $vote->getChoice()->getName(),
|
||||
|
||||
];
|
||||
}
|
||||
$computedArray[ $choice_id ][ $answer ][ 'count' ] ++;
|
||||
@ -232,106 +329,49 @@ class Poll {
|
||||
}
|
||||
}
|
||||
}
|
||||
$answersWithStats = [];
|
||||
foreach ( $computedArray as $choice_stat ) {
|
||||
$answersWithStats[] = $choice_stat;
|
||||
}
|
||||
|
||||
return [
|
||||
'counts' => $computedArray,
|
||||
'maxScore' => $maxScore,
|
||||
'answers' => $answersWithStats,
|
||||
'max_score' => $maxScore,
|
||||
];
|
||||
}
|
||||
|
||||
public function display() {
|
||||
return [
|
||||
'config' => $this,
|
||||
'password_protected' => $this->getPassword() ? 'yes' : 'no',
|
||||
'answers' => $this->computeAnswers(),
|
||||
];
|
||||
}
|
||||
|
||||
public function __construct() {
|
||||
|
||||
$this->initiate();
|
||||
}
|
||||
|
||||
|
||||
private function initiate() {
|
||||
$this->votes = new ArrayCollection();
|
||||
$this->stacksOfVotes = new ArrayCollection();
|
||||
$this->choices = new ArrayCollection();
|
||||
$this->comments = new ArrayCollection();
|
||||
$this->setAdminKey( $this->generateAdminKey() );
|
||||
$this->setCreationDate( new \DateTime() );
|
||||
$this->setExpiracyDate( $this->addDaysToDate(
|
||||
new \DateTime(),
|
||||
$this->defaultExpiracyDaysFromNow
|
||||
) );
|
||||
$this->setAllowedAnswers( [ 'yes', 'maybe', 'no' ] );
|
||||
}
|
||||
|
||||
|
||||
public function generateAdminKey() {
|
||||
$rand = random_int( PHP_INT_MIN, PHP_INT_MAX );
|
||||
|
||||
return str_shuffle( md5( $rand ) . $rand . $this->random_str() );
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a random string, using a cryptographically secure
|
||||
* pseudorandom number generator (random_int)
|
||||
*
|
||||
* This function uses type hints now (PHP 7+ only), but it was originally
|
||||
* written for PHP 5 as well.
|
||||
*
|
||||
* For PHP 7, random_int is a PHP core function
|
||||
* For PHP 5.x, depends on https://github.com/paragonie/random_compat
|
||||
*
|
||||
* @param int $length How many characters do we want?
|
||||
* @param string $keyspace A string of all possible characters
|
||||
* to select from
|
||||
*
|
||||
* @return string
|
||||
* @return Collection|Choice[]
|
||||
*/
|
||||
public function random_str(
|
||||
int $length = 64,
|
||||
string $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
||||
): string {
|
||||
if ( $length < 1 ) {
|
||||
throw new \RangeException( "Length must be a positive integer" );
|
||||
}
|
||||
$pieces = [];
|
||||
$max = mb_strlen( $keyspace, '8bit' ) - 1;
|
||||
for ( $i = 0 ; $i < $length ; ++ $i ) {
|
||||
$pieces [] = $keyspace[ random_int( 0, $max ) ];
|
||||
}
|
||||
|
||||
return implode( '', $pieces );
|
||||
public function getChoices(): Collection {
|
||||
return $this->choices;
|
||||
}
|
||||
|
||||
public function findChoiceById( int $id ) {
|
||||
|
||||
$choices = $this->getChoices();
|
||||
$counter = 0;
|
||||
// there must be something cleaner than this in Doctrine ArrayCollection
|
||||
foreach ( $choices as $choice ) {
|
||||
$counter ++;
|
||||
if ( $counter > $this->maxChoicesLimit ) {
|
||||
throw new \ErrorException( "max number of choices reached for this poll" );
|
||||
}
|
||||
if ( $choice && $choice->getId() == $id ) {
|
||||
return $choice;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return null;
|
||||
public function getKind(): ?string {
|
||||
return $this->kind;
|
||||
}
|
||||
|
||||
public function addDaysToDate( \DateTime $date, int $days ) {
|
||||
$st = strtotime( $date->getTimestamp() );
|
||||
public function setKind( string $kind ): self {
|
||||
$this->kind = $kind;
|
||||
|
||||
return new \DateTime( $st );
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getId(): ?int {
|
||||
return $this->id;
|
||||
public function getStacksOfVotes() {
|
||||
return $this->stacksOfVotes;
|
||||
}
|
||||
|
||||
public function setStacksOfVotes( ?StackOfVotes $stacksOfVotes ): self {
|
||||
$this->stacksOfVotes = $stacksOfVotes;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Collection|Comment[]
|
||||
*/
|
||||
public function getComments(): Collection {
|
||||
return $this->comments;
|
||||
}
|
||||
|
||||
public function getTitle(): ?string {
|
||||
@ -344,50 +384,6 @@ class Poll {
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getCreationDate(): ?DateTimeInterface {
|
||||
return $this->creationDate;
|
||||
}
|
||||
|
||||
public function setCreationDate( DateTimeInterface $creationDate ): self {
|
||||
$this->creationDate = $creationDate;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function setExpiracyDate( DateTimeInterface $expiracyDate ): self {
|
||||
$this->expiracyDate = $expiracyDate;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getOwner(): ?Owner {
|
||||
return $this->owner;
|
||||
}
|
||||
|
||||
public function setOwner( ?Owner $owner ): self {
|
||||
$this->owner = $owner;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Collection|Vote[]
|
||||
*/
|
||||
public function getVotes(): Collection {
|
||||
return $this->votes;
|
||||
}
|
||||
|
||||
|
||||
public function getAdminKey(): ?string {
|
||||
return $this->adminKey;
|
||||
}
|
||||
|
||||
public function setAdminKey( string $adminKey ): self {
|
||||
$this->adminKey = $adminKey;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getDescription(): ?string {
|
||||
return $this->description;
|
||||
}
|
||||
@ -398,32 +394,56 @@ class Poll {
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getKind(): ?string {
|
||||
return $this->kind;
|
||||
public function getCreatedAt(): ?DateTimeInterface {
|
||||
return $this->createdAt;
|
||||
}
|
||||
|
||||
public function setKind( string $kind ): self {
|
||||
$this->kind = $kind;
|
||||
public function getExpiracyDate(): ?DateTimeInterface {
|
||||
return $this->expiracyDate;
|
||||
}
|
||||
|
||||
public function setExpiracyDate( DateTimeInterface $expiracyDate ): self {
|
||||
$this->expiracyDate = $expiracyDate;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getCustomUrl(): ?string {
|
||||
return $this->customUrl;
|
||||
public function getVotesMax() {
|
||||
return $this->votesMax;
|
||||
}
|
||||
|
||||
public function setCustomUrl( string $customUrl ): self {
|
||||
$this->customUrl = $customUrl;
|
||||
public function setVotesMax( $votesMax ): self {
|
||||
$this->votesMax = $votesMax;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getPassword(): ?string {
|
||||
return $this->password;
|
||||
public function getChoicesMax() {
|
||||
return $this->choicesMax;
|
||||
}
|
||||
|
||||
public function setPassword( string $password ): self {
|
||||
$this->password = md5( $password );
|
||||
public function setChoicesMax( $choicesMax ): self {
|
||||
$this->choicesMax = $choicesMax;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getAllowedAnswers(): ?array {
|
||||
return $this->allowedAnswers;
|
||||
}
|
||||
|
||||
public function setAllowedAnswers( array $allowedAnswers ): self {
|
||||
$this->allowedAnswers = $allowedAnswers;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getVotesAllowed(): ?bool {
|
||||
return $this->votesAllowed;
|
||||
}
|
||||
|
||||
public function setVotesAllowed( ?bool $votesAllowed ): self {
|
||||
$this->votesAllowed = $votesAllowed;
|
||||
|
||||
return $this;
|
||||
}
|
||||
@ -438,26 +458,6 @@ class Poll {
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getMailOnComment(): ?bool {
|
||||
return $this->mailOnComment;
|
||||
}
|
||||
|
||||
public function setMailOnComment( bool $mailOnComment ): self {
|
||||
$this->mailOnComment = $mailOnComment;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getMailOnVote(): ?bool {
|
||||
return $this->mailOnVote;
|
||||
}
|
||||
|
||||
public function setMailOnVote( bool $mailOnVote ): self {
|
||||
$this->mailOnVote = $mailOnVote;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getHideResults(): ?bool {
|
||||
return $this->hideResults;
|
||||
}
|
||||
@ -478,12 +478,94 @@ class Poll {
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getOwner(): ?Owner {
|
||||
return $this->owner;
|
||||
}
|
||||
|
||||
public function setOwner( ?Owner $owner ): self {
|
||||
$this->owner = $owner;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getPassword(): ?string {
|
||||
return $this->password;
|
||||
}
|
||||
|
||||
public function setPassword( string $password ): self {
|
||||
$this->password = md5( $password );
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getAdminKey(): ?string {
|
||||
return $this->adminKey;
|
||||
}
|
||||
|
||||
public function setAdminKey( string $adminKey ): self {
|
||||
$this->adminKey = $adminKey;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getId(): ?int {
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
public function findChoiceById( int $id ) {
|
||||
|
||||
$choices = $this->getChoices();
|
||||
$counter = 0;
|
||||
// there must be something cleaner than this in Doctrine ArrayCollection
|
||||
foreach ( $choices as $choice ) {
|
||||
$counter ++;
|
||||
if ( $counter > $this->maxChoicesLimit ) {
|
||||
throw new ErrorException( "max number of choices reached for this poll" );
|
||||
}
|
||||
if ( $choice && $choice->getId() == $id ) {
|
||||
return $choice;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Collection|Comment[]
|
||||
* @return Collection|Vote[]
|
||||
*/
|
||||
public function getComments(): Collection {
|
||||
return $this->comments;
|
||||
public function getVotes(): Collection {
|
||||
return $this->votes;
|
||||
}
|
||||
|
||||
public function getCustomUrl(): ?string {
|
||||
return $this->customUrl;
|
||||
}
|
||||
|
||||
public function setCustomUrl( string $customUrl ): self {
|
||||
$this->customUrl = $customUrl;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getMailOnComment(): ?bool {
|
||||
return $this->mailOnComment;
|
||||
}
|
||||
|
||||
public function setMailOnComment( bool $mailOnComment ): self {
|
||||
$this->mailOnComment = $mailOnComment;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getMailOnVote(): ?bool {
|
||||
return $this->mailOnVote;
|
||||
}
|
||||
|
||||
public function setMailOnVote( bool $mailOnVote ): self {
|
||||
$this->mailOnVote = $mailOnVote;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function addComment( Comment $comment ): self {
|
||||
@ -507,17 +589,6 @@ class Poll {
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getStacksOfVotes() {
|
||||
return $this->stacksOfVotes;
|
||||
}
|
||||
|
||||
public function setStacksOfVotes( ?StackOfVotes $stacksOfVotes ): self {
|
||||
$this->stacksOfVotes = $stacksOfVotes;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
|
||||
public function addStackOfVote( StackOfVotes $stackOfVote ): self {
|
||||
if ( ! $this->stacksOfVotes->contains( $stackOfVote ) ) {
|
||||
$this->stacksOfVotes[] = $stackOfVote;
|
||||
@ -539,10 +610,6 @@ class Poll {
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getExpiracyDate(): ?\DateTimeInterface {
|
||||
return $this->expiracyDate;
|
||||
}
|
||||
|
||||
public function addVote( Vote $vote ): self {
|
||||
if ( ! $this->votes->contains( $vote ) ) {
|
||||
$this->votes[] = $vote;
|
||||
@ -564,13 +631,6 @@ class Poll {
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Collection|Choice[]
|
||||
*/
|
||||
public function getChoices(): Collection {
|
||||
return $this->choices;
|
||||
}
|
||||
|
||||
public function addTextChoiceArray( array $choiceTextArray ): self {
|
||||
foreach ( $choiceTextArray as $text ) {
|
||||
$newChoice = new Choice();
|
||||
@ -581,13 +641,17 @@ class Poll {
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function addChoice( Choice $choice ): self {
|
||||
if ( ! is_null( $this->choices ) ) {
|
||||
if ( ! $this->choices->contains( $choice ) ) {
|
||||
$this->choices[] = $choice;
|
||||
$choice->setPoll( $this );
|
||||
}
|
||||
} else {
|
||||
$this->choices[] = $choice;
|
||||
$choice->setPoll( $this );
|
||||
}
|
||||
|
||||
public function getAllowedAnswers(): ?array {
|
||||
return $this->allowedAnswers;
|
||||
}
|
||||
|
||||
public function setAllowedAnswers( array $allowedAnswers ): self {
|
||||
$this->allowedAnswers = $allowedAnswers;
|
||||
|
||||
return $this;
|
||||
}
|
||||
@ -613,21 +677,6 @@ class Poll {
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function addChoice( Choice $choice ): self {
|
||||
if ( ! is_null( $this->choices ) ) {
|
||||
if ( ! $this->choices->contains( $choice ) ) {
|
||||
$this->choices[] = $choice;
|
||||
$choice->setPoll( $this );
|
||||
}
|
||||
} else {
|
||||
$this->choices[] = $choice;
|
||||
$choice->setPoll( $this );
|
||||
}
|
||||
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function removeChoice( Choice $choice ): self {
|
||||
if ( $this->choices->contains( $choice ) ) {
|
||||
$this->choices->removeElement( $choice );
|
||||
@ -640,36 +689,6 @@ class Poll {
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getVotesAllowed(): ?bool {
|
||||
return $this->votesAllowed;
|
||||
}
|
||||
|
||||
public function setVotesAllowed( ?bool $votesAllowed ): self {
|
||||
$this->votesAllowed = $votesAllowed;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getVotesMax() {
|
||||
return $this->votesMax;
|
||||
}
|
||||
|
||||
public function setVotesMax( $votesMax ): self {
|
||||
$this->votesMax = $votesMax;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getChoicesMax() {
|
||||
return $this->choicesMax;
|
||||
}
|
||||
|
||||
public function setChoicesMax( $choicesMax ): self {
|
||||
$this->choicesMax = $choicesMax;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getCommentsAllowed(): ?bool {
|
||||
return $this->commentsAllowed;
|
||||
}
|
||||
|
@ -2,6 +2,8 @@
|
||||
|
||||
namespace App\Entity;
|
||||
|
||||
use App\Traits\TimeStampableTrait;
|
||||
use DateTime;
|
||||
use Doctrine\Common\Collections\ArrayCollection;
|
||||
use Doctrine\Common\Collections\Collection;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
@ -14,12 +16,9 @@ use JMS\Serializer\Annotation as Serializer;
|
||||
* @Serializer\ExclusionPolicy("all")
|
||||
*/
|
||||
class StackOfVotes {
|
||||
/**
|
||||
* @ORM\Id()
|
||||
* @ORM\GeneratedValue()
|
||||
* @ORM\Column(type="integer")
|
||||
*/
|
||||
private $id;
|
||||
|
||||
use TimeStampableTrait;
|
||||
|
||||
/**
|
||||
* @ORM\Column(type="string", length=255)
|
||||
* @Serializer\Type("string")
|
||||
@ -31,6 +30,12 @@ class StackOfVotes {
|
||||
* @Serializer\Expose()
|
||||
*/
|
||||
public $votes;
|
||||
/**
|
||||
* @ORM\Id()
|
||||
* @ORM\GeneratedValue()
|
||||
* @ORM\Column(type="integer")
|
||||
*/
|
||||
private $id;
|
||||
/**
|
||||
* @ORM\ManyToOne(targetEntity="App\Entity\Poll", inversedBy="stacksOfVotes", cascade={"persist"})
|
||||
*/
|
||||
@ -42,46 +47,39 @@ class StackOfVotes {
|
||||
*/
|
||||
private $owner;
|
||||
|
||||
|
||||
public function display() {
|
||||
$tab = [
|
||||
'id' => $this->getId(),
|
||||
// 'modifier_token' => $this->getOwner()->getModifierToken(),
|
||||
'pseudo' => '',
|
||||
'creation_date' => '',
|
||||
'votes' => [],
|
||||
];
|
||||
// prefill votes with all choices ids
|
||||
foreach ( $this->getPoll()->getChoices() as $choice ) {
|
||||
$tab[ 'votes' ][ $choice->getId() ] = [
|
||||
'choice_id' => $choice->getId(),
|
||||
'name' => $choice->getName(),
|
||||
];
|
||||
}
|
||||
|
||||
foreach ( $this->getVotes() as $vote ) {
|
||||
// $tab[ 'votes' ][ $vote->getChoice()->getId() ] = $vote->display();
|
||||
$tab[ 'votes' ][ $vote->getChoice()->getId() ][ 'stack_id' ] = $this->getId();
|
||||
$tab[ 'pseudo' ] = $this->getPseudo();
|
||||
$tab[ 'creation_date' ] = $vote->getCreationDate();
|
||||
}
|
||||
|
||||
return $tab;
|
||||
}
|
||||
|
||||
/**
|
||||
* @ORM\PrePersist
|
||||
* @ORM\Column(type="string", length=255, nullable=true)
|
||||
*/
|
||||
public function prePersist() {
|
||||
$this->setPseudo( $this->getOwner()->getPseudo() );
|
||||
}
|
||||
private $ip;
|
||||
|
||||
public function __construct() {
|
||||
$this->setCreatedAt( new DateTime() );
|
||||
$this->votes = new ArrayCollection();
|
||||
}
|
||||
|
||||
public function getId(): ?int {
|
||||
return $this->id;
|
||||
public function display() {
|
||||
$votes = $this->getVotes();
|
||||
|
||||
$tab = [
|
||||
// 'id' => $this->getId(),
|
||||
// 'modifier_token' => $this->getOwner()->getModifierToken(),
|
||||
'pseudo' => $this->getPseudo(),
|
||||
'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 ) {
|
||||
$tab[ 'votes' ][ $vote->getChoice()->getId() ] = $vote->display();
|
||||
}
|
||||
|
||||
return $tab;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -91,6 +89,37 @@ class StackOfVotes {
|
||||
return $this->votes;
|
||||
}
|
||||
|
||||
public function getPseudo(): ?string {
|
||||
return $this->pseudo;
|
||||
}
|
||||
|
||||
public function setPseudo( ?string $pseudo ): self {
|
||||
$this->pseudo = $pseudo;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
/**
|
||||
* @ORM\PrePersist
|
||||
*/
|
||||
public function prePersist() {
|
||||
$this->setPseudo( $this->getOwner()->getPseudo() );
|
||||
}
|
||||
|
||||
public function getOwner(): ?Owner {
|
||||
return $this->owner;
|
||||
}
|
||||
|
||||
public function setOwner( ?Owner $owner ): self {
|
||||
$this->owner = $owner;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getId(): ?int {
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
public function addVote( Vote $vote ): self {
|
||||
if ( ! $this->votes->contains( $vote ) ) {
|
||||
$vote->setPoll( $this->getPoll() );
|
||||
@ -102,6 +131,16 @@ class StackOfVotes {
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getPoll(): ?Poll {
|
||||
return $this->poll;
|
||||
}
|
||||
|
||||
public function setPoll( ?Poll $poll ): self {
|
||||
$this->poll = $poll;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function removeVote( Vote $vote ): self {
|
||||
if ( $this->votes->contains( $vote ) ) {
|
||||
$this->votes->removeElement( $vote );
|
||||
@ -114,32 +153,12 @@ class StackOfVotes {
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getPseudo(): ?string {
|
||||
return $this->pseudo;
|
||||
public function getIp(): ?string {
|
||||
return $this->ip;
|
||||
}
|
||||
|
||||
public function setPseudo( ?string $pseudo ): self {
|
||||
$this->pseudo = $pseudo;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getOwner(): ?Owner {
|
||||
return $this->owner;
|
||||
}
|
||||
|
||||
public function setOwner( ?Owner $owner ): self {
|
||||
$this->owner = $owner;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getPoll(): ?Poll {
|
||||
return $this->poll;
|
||||
}
|
||||
|
||||
public function setPoll( ?Poll $poll ): self {
|
||||
$this->poll = $poll;
|
||||
public function setIp( string $ip ): self {
|
||||
$this->ip = $ip;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
@ -1,124 +1,130 @@
|
||||
<?php
|
||||
|
||||
namespace App\Entity;
|
||||
namespace App\Entity;
|
||||
|
||||
use DateTimeInterface;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use JMS\Serializer\Annotation as Serializer;
|
||||
use App\Traits\TimeStampableTrait;
|
||||
use DateTime;
|
||||
use DateTimeInterface;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
use JMS\Serializer\Annotation as Serializer;
|
||||
|
||||
/**
|
||||
* @ORM\Entity(repositoryClass="App\Repository\VoteRepository")
|
||||
* @Serializer\ExclusionPolicy("all")
|
||||
*/
|
||||
class Vote {
|
||||
|
||||
use TimeStampableTrait;
|
||||
|
||||
/**
|
||||
* @ORM\Entity(repositoryClass="App\Repository\VoteRepository")
|
||||
* @Serializer\ExclusionPolicy("all")
|
||||
* for a text kind of choice: could be "yes" "no" "maybe" and empty.
|
||||
* for a date kind, the choice linked is equivalent to the value selected
|
||||
* @ORM\Column(type="string", length=255, nullable=true)
|
||||
* @Serializer\Type("string")
|
||||
* @Serializer\Expose()
|
||||
*/
|
||||
class Vote {
|
||||
/**
|
||||
* for a text kind of choice: could be "yes" "no" "maybe" and empty.
|
||||
* for a date kind, the choice linked is equivalent to the value selected
|
||||
* @ORM\Column(type="string", length=255, nullable=true)
|
||||
* @Serializer\Type("string")
|
||||
* @Serializer\Expose()
|
||||
*/
|
||||
public $value;
|
||||
/**
|
||||
* @ORM\Column(type="datetime" , options={"default"="CURRENT_TIMESTAMP"})
|
||||
* @Serializer\Type("datetime")
|
||||
* @Serializer\Expose()
|
||||
*/
|
||||
public $creationDate;
|
||||
/**
|
||||
* @ORM\ManyToOne(targetEntity="App\Entity\Choice", inversedBy="votes", cascade={"persist"})
|
||||
* @ORM\JoinColumn(nullable=false)
|
||||
* @Serializer\Type("App\Entity\choice")
|
||||
* @Serializer\Expose()
|
||||
*/
|
||||
public $choice;
|
||||
/**
|
||||
* @ORM\Id()
|
||||
* @ORM\GeneratedValue()
|
||||
* @ORM\Column(type="integer")
|
||||
* @Serializer\Type("integer")
|
||||
* @Serializer\Expose()
|
||||
*/
|
||||
private $id;
|
||||
/**
|
||||
* @ORM\ManyToOne(targetEntity="App\Entity\Poll", inversedBy="votes", cascade={"persist"})
|
||||
* @ORM\JoinColumn(nullable=false)
|
||||
*/
|
||||
private $poll;
|
||||
/**
|
||||
* @ORM\ManyToOne(targetEntity="App\Entity\StackOfVotes", inversedBy="votes", cascade={"persist"})
|
||||
* @ORM\JoinColumn(nullable=false)
|
||||
* @Serializer\Type("App\Entity\StackOfVotes")
|
||||
*/
|
||||
private $stacksOfVotes;
|
||||
public $value;
|
||||
|
||||
/**
|
||||
* @ORM\ManyToOne(targetEntity="App\Entity\Choice", inversedBy="votes", cascade={"persist"})
|
||||
* @ORM\JoinColumn(nullable=false)
|
||||
* @Serializer\Type("App\Entity\choice")
|
||||
* @Serializer\Expose()
|
||||
*/
|
||||
public $choice;
|
||||
/**
|
||||
* @ORM\Id()
|
||||
* @ORM\GeneratedValue()
|
||||
* @ORM\Column(type="integer")
|
||||
* @Serializer\Type("integer")
|
||||
* @Serializer\Expose()
|
||||
*/
|
||||
private $id;
|
||||
/**
|
||||
* @ORM\ManyToOne(targetEntity="App\Entity\Poll", inversedBy="votes", cascade={"persist"})
|
||||
* @ORM\JoinColumn(nullable=false)
|
||||
*/
|
||||
private $poll;
|
||||
/**
|
||||
* @ORM\ManyToOne(targetEntity="App\Entity\StackOfVotes", inversedBy="votes", cascade={"persist"})
|
||||
* @ORM\JoinColumn(nullable=false)
|
||||
* @Serializer\Type("App\Entity\StackOfVotes")
|
||||
*/
|
||||
private $stacksOfVotes;
|
||||
|
||||
public function __construct() {
|
||||
$this->setCreatedAt( new DateTime() );
|
||||
}
|
||||
|
||||
public function display() {
|
||||
$value = $this->getValue();
|
||||
if ( ! $value ) {
|
||||
return null;
|
||||
} else {
|
||||
|
||||
public function display() {
|
||||
return [
|
||||
'id' => $this->getId(),
|
||||
'value' => $this->getValue(),
|
||||
'choice_id' => $this->getChoice()->getId(),
|
||||
'text' => $this->getChoice()->getName(),
|
||||
'id' => $this->getId(),
|
||||
'value' => $this->getValue(),
|
||||
'choice_id' => $this->getChoice()->getId(),
|
||||
'text' => $this->getChoice()->getName(),
|
||||
];
|
||||
}
|
||||
|
||||
public function __construct() {
|
||||
$this->setCreationDate( new \DateTime() );
|
||||
}
|
||||
|
||||
public function getId(): ?int {
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
public function getPoll(): ?Poll {
|
||||
return $this->poll;
|
||||
}
|
||||
|
||||
public function setPoll( ?Poll $poll ): self {
|
||||
$this->poll = $poll;
|
||||
if ( $poll ) {
|
||||
$poll->addVote( $this );
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getChoice(): ?Choice {
|
||||
return $this->choice;
|
||||
}
|
||||
|
||||
public function setChoice( ?Choice $choice ): self {
|
||||
$this->choice = $choice;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getValue(): ?string {
|
||||
return $this->value;
|
||||
}
|
||||
|
||||
public function setValue( ?string $value ): self {
|
||||
$this->value = $value;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getCreationDate(): ?DateTimeInterface {
|
||||
return $this->creationDate;
|
||||
}
|
||||
|
||||
public function setCreationDate( DateTimeInterface $creationDate ): self {
|
||||
$this->creationDate = $creationDate;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getStacksOfVotes(): ?StackOfVotes {
|
||||
return $this->stacksOfVotes;
|
||||
}
|
||||
|
||||
public function setStacksOfVotes( ?StackOfVotes $stacksOfVotes ): self {
|
||||
$this->stacksOfVotes = $stacksOfVotes;
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
||||
public function getValue(): ?string {
|
||||
return $this->value;
|
||||
}
|
||||
|
||||
public function setValue( ?string $value ): self {
|
||||
$this->value = $value;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getId(): ?int {
|
||||
return $this->id;
|
||||
}
|
||||
|
||||
public function getChoice(): ?Choice {
|
||||
return $this->choice;
|
||||
}
|
||||
|
||||
public function setChoice( ?Choice $choice ): self {
|
||||
$this->choice = $choice;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getPoll(): ?Poll {
|
||||
return $this->poll;
|
||||
}
|
||||
|
||||
public function setPoll( ?Poll $poll ): self {
|
||||
$this->poll = $poll;
|
||||
if ( $poll ) {
|
||||
$poll->addVote( $this );
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getCreationDate(): ?DateTimeInterface {
|
||||
return $this->creationDate;
|
||||
}
|
||||
|
||||
public function setCreationDate( DateTimeInterface $creationDate ): self {
|
||||
$this->creationDate = $creationDate;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getStacksOfVotes(): ?StackOfVotes {
|
||||
return $this->stacksOfVotes;
|
||||
}
|
||||
|
||||
public function setStacksOfVotes( ?StackOfVotes $stacksOfVotes ): self {
|
||||
$this->stacksOfVotes = $stacksOfVotes;
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
||||
|
@ -1,12 +0,0 @@
|
||||
<?php
|
||||
|
||||
namespace App\Traits;
|
||||
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
|
||||
trait Timed {
|
||||
/**
|
||||
* @ORM\Column(type="datetime" , options={"default"="CURRENT_TIMESTAMP"})
|
||||
*/
|
||||
private $createdAt;
|
||||
}
|
@ -7,33 +7,29 @@ use Symfony\Component\Form\AbstractType;
|
||||
use Symfony\Component\Form\FormBuilderInterface;
|
||||
use Symfony\Component\OptionsResolver\OptionsResolver;
|
||||
|
||||
class PollType extends AbstractType
|
||||
{
|
||||
public function buildForm(FormBuilderInterface $builder, array $options)
|
||||
{
|
||||
$builder
|
||||
->add('title')
|
||||
->add('customUrl')
|
||||
->add('description')
|
||||
->add('creationDate')
|
||||
->add('expiracyDate')
|
||||
->add('kind')
|
||||
->add('allowedAnswers')
|
||||
->add('modificationPolicy')
|
||||
->add('mailOnComment')
|
||||
->add('mailOnVote')
|
||||
->add('hideResults')
|
||||
->add('showResultEvenIfPasswords')
|
||||
->add('password')
|
||||
->add('adminKey')
|
||||
->add('owner')
|
||||
;
|
||||
}
|
||||
class PollType extends AbstractType {
|
||||
public function buildForm( FormBuilderInterface $builder, array $options ) {
|
||||
$builder
|
||||
->add( 'title' )
|
||||
->add( 'customUrl' )
|
||||
->add( 'description' )
|
||||
->add( 'createdAt' )
|
||||
->add( 'expiracyDate' )
|
||||
->add( 'kind' )
|
||||
->add( 'allowedAnswers' )
|
||||
->add( 'modificationPolicy' )
|
||||
->add( 'mailOnComment' )
|
||||
->add( 'mailOnVote' )
|
||||
->add( 'hideResults' )
|
||||
->add( 'showResultEvenIfPasswords' )
|
||||
->add( 'password' )
|
||||
->add( 'adminKey' )
|
||||
->add( 'owner' );
|
||||
}
|
||||
|
||||
public function configureOptions(OptionsResolver $resolver)
|
||||
{
|
||||
$resolver->setDefaults([
|
||||
'data_class' => Poll::class,
|
||||
]);
|
||||
}
|
||||
public function configureOptions( OptionsResolver $resolver ) {
|
||||
$resolver->setDefaults( [
|
||||
'data_class' => Poll::class,
|
||||
] );
|
||||
}
|
||||
}
|
||||
|
@ -6,33 +6,31 @@ use Symfony\Bundle\FrameworkBundle\Kernel\MicroKernelTrait;
|
||||
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
|
||||
use Symfony\Component\HttpKernel\Kernel as BaseKernel;
|
||||
use Symfony\Component\Routing\Loader\Configurator\RoutingConfigurator;
|
||||
use function dirname;
|
||||
|
||||
class Kernel extends BaseKernel
|
||||
{
|
||||
use MicroKernelTrait;
|
||||
class Kernel extends BaseKernel {
|
||||
use MicroKernelTrait;
|
||||
|
||||
protected function configureContainer(ContainerConfigurator $container): void
|
||||
{
|
||||
$container->import('../config/{packages}/*.yaml');
|
||||
$container->import('../config/{packages}/'.$this->environment.'/*.yaml');
|
||||
protected function configureContainer( ContainerConfigurator $container ): void {
|
||||
$container->import( '../config/{packages}/*.yaml' );
|
||||
$container->import( '../config/{packages}/' . $this->environment . '/*.yaml' );
|
||||
|
||||
if (is_file(\dirname(__DIR__).'/config/services.yaml')) {
|
||||
$container->import('../config/services.yaml');
|
||||
$container->import('../config/{services}_'.$this->environment.'.yaml');
|
||||
} elseif (is_file($path = \dirname(__DIR__).'/config/services.php')) {
|
||||
(require $path)($container->withPath($path), $this);
|
||||
}
|
||||
}
|
||||
if ( is_file( dirname( __DIR__ ) . '/config/services.yaml' ) ) {
|
||||
$container->import( '../config/services.yaml' );
|
||||
$container->import( '../config/{services}_' . $this->environment . '.yaml' );
|
||||
} elseif ( is_file( $path = dirname( __DIR__ ) . '/config/services.php' ) ) {
|
||||
( require $path )( $container->withPath( $path ), $this );
|
||||
}
|
||||
}
|
||||
|
||||
protected function configureRoutes(RoutingConfigurator $routes): void
|
||||
{
|
||||
$routes->import('../config/{routes}/'.$this->environment.'/*.yaml');
|
||||
$routes->import('../config/{routes}/*.yaml');
|
||||
protected function configureRoutes( RoutingConfigurator $routes ): void {
|
||||
$routes->import( '../config/{routes}/' . $this->environment . '/*.yaml' );
|
||||
$routes->import( '../config/{routes}/*.yaml' );
|
||||
|
||||
if (is_file(\dirname(__DIR__).'/config/routes.yaml')) {
|
||||
$routes->import('../config/routes.yaml');
|
||||
} elseif (is_file($path = \dirname(__DIR__).'/config/routes.php')) {
|
||||
(require $path)($routes->withPath($path), $this);
|
||||
}
|
||||
}
|
||||
if ( is_file( dirname( __DIR__ ) . '/config/routes.yaml' ) ) {
|
||||
$routes->import( '../config/routes.yaml' );
|
||||
} elseif ( is_file( $path = dirname( __DIR__ ) . '/config/routes.php' ) ) {
|
||||
( require $path )( $routes->withPath( $path ), $this );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -7,44 +7,42 @@ use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
|
||||
use Doctrine\Common\Persistence\ManagerRegistry;
|
||||
|
||||
/**
|
||||
* @method Choice|null find($id, $lockMode = null, $lockVersion = null)
|
||||
* @method Choice|null findOneBy(array $criteria, array $orderBy = null)
|
||||
* @method Choice|null find( $id, $lockMode = null, $lockVersion = null )
|
||||
* @method Choice|null findOneBy( array $criteria, array $orderBy = null )
|
||||
* @method Choice[] findAll()
|
||||
* @method Choice[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
|
||||
* @method Choice[] findBy( array $criteria, array $orderBy = null, $limit = null, $offset = null )
|
||||
*/
|
||||
class ChoiceRepository extends ServiceEntityRepository
|
||||
{
|
||||
public function __construct(ManagerRegistry $registry)
|
||||
{
|
||||
parent::__construct($registry, Choice::class);
|
||||
}
|
||||
class ChoiceRepository extends ServiceEntityRepository {
|
||||
public function __construct( ManagerRegistry $registry ) {
|
||||
parent::__construct( $registry, Choice::class );
|
||||
}
|
||||
|
||||
// /**
|
||||
// * @return Choice[] Returns an array of Choice objects
|
||||
// */
|
||||
/*
|
||||
public function findByExampleField($value)
|
||||
{
|
||||
return $this->createQueryBuilder('c')
|
||||
->andWhere('c.exampleField = :val')
|
||||
->setParameter('val', $value)
|
||||
->orderBy('c.id', 'ASC')
|
||||
->setMaxResults(10)
|
||||
->getQuery()
|
||||
->getResult()
|
||||
;
|
||||
}
|
||||
*/
|
||||
// /**
|
||||
// * @return Choice[] Returns an array of Choice objects
|
||||
// */
|
||||
/*
|
||||
public function findByExampleField($value)
|
||||
{
|
||||
return $this->createQueryBuilder('c')
|
||||
->andWhere('c.exampleField = :val')
|
||||
->setParameter('val', $value)
|
||||
->orderBy('c.id', 'ASC')
|
||||
->setMaxResults(10)
|
||||
->getQuery()
|
||||
->getResult()
|
||||
;
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
public function findOneBySomeField($value): ?Choice
|
||||
{
|
||||
return $this->createQueryBuilder('c')
|
||||
->andWhere('c.exampleField = :val')
|
||||
->setParameter('val', $value)
|
||||
->getQuery()
|
||||
->getOneOrNullResult()
|
||||
;
|
||||
}
|
||||
*/
|
||||
/*
|
||||
public function findOneBySomeField($value): ?Choice
|
||||
{
|
||||
return $this->createQueryBuilder('c')
|
||||
->andWhere('c.exampleField = :val')
|
||||
->setParameter('val', $value)
|
||||
->getQuery()
|
||||
->getOneOrNullResult()
|
||||
;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
@ -7,44 +7,42 @@ use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
|
||||
use Doctrine\Common\Persistence\ManagerRegistry;
|
||||
|
||||
/**
|
||||
* @method Comment|null find($id, $lockMode = null, $lockVersion = null)
|
||||
* @method Comment|null findOneBy(array $criteria, array $orderBy = null)
|
||||
* @method Comment|null find( $id, $lockMode = null, $lockVersion = null )
|
||||
* @method Comment|null findOneBy( array $criteria, array $orderBy = null )
|
||||
* @method Comment[] findAll()
|
||||
* @method Comment[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
|
||||
* @method Comment[] findBy( array $criteria, array $orderBy = null, $limit = null, $offset = null )
|
||||
*/
|
||||
class CommentRepository extends ServiceEntityRepository
|
||||
{
|
||||
public function __construct(ManagerRegistry $registry)
|
||||
{
|
||||
parent::__construct($registry, Comment::class);
|
||||
}
|
||||
class CommentRepository extends ServiceEntityRepository {
|
||||
public function __construct( ManagerRegistry $registry ) {
|
||||
parent::__construct( $registry, Comment::class );
|
||||
}
|
||||
|
||||
// /**
|
||||
// * @return Comment[] Returns an array of Comment objects
|
||||
// */
|
||||
/*
|
||||
public function findByExampleField($value)
|
||||
{
|
||||
return $this->createQueryBuilder('c')
|
||||
->andWhere('c.exampleField = :val')
|
||||
->setParameter('val', $value)
|
||||
->orderBy('c.id', 'ASC')
|
||||
->setMaxResults(10)
|
||||
->getQuery()
|
||||
->getResult()
|
||||
;
|
||||
}
|
||||
*/
|
||||
// /**
|
||||
// * @return Comment[] Returns an array of Comment objects
|
||||
// */
|
||||
/*
|
||||
public function findByExampleField($value)
|
||||
{
|
||||
return $this->createQueryBuilder('c')
|
||||
->andWhere('c.exampleField = :val')
|
||||
->setParameter('val', $value)
|
||||
->orderBy('c.id', 'ASC')
|
||||
->setMaxResults(10)
|
||||
->getQuery()
|
||||
->getResult()
|
||||
;
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
public function findOneBySomeField($value): ?Comment
|
||||
{
|
||||
return $this->createQueryBuilder('c')
|
||||
->andWhere('c.exampleField = :val')
|
||||
->setParameter('val', $value)
|
||||
->getQuery()
|
||||
->getOneOrNullResult()
|
||||
;
|
||||
}
|
||||
*/
|
||||
/*
|
||||
public function findOneBySomeField($value): ?Comment
|
||||
{
|
||||
return $this->createQueryBuilder('c')
|
||||
->andWhere('c.exampleField = :val')
|
||||
->setParameter('val', $value)
|
||||
->getQuery()
|
||||
->getOneOrNullResult()
|
||||
;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
@ -7,44 +7,42 @@ use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
|
||||
use Doctrine\Common\Persistence\ManagerRegistry;
|
||||
|
||||
/**
|
||||
* @method Owner|null find($id, $lockMode = null, $lockVersion = null)
|
||||
* @method Owner|null findOneBy(array $criteria, array $orderBy = null)
|
||||
* @method Owner|null find( $id, $lockMode = null, $lockVersion = null )
|
||||
* @method Owner|null findOneBy( array $criteria, array $orderBy = null )
|
||||
* @method Owner[] findAll()
|
||||
* @method Owner[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
|
||||
* @method Owner[] findBy( array $criteria, array $orderBy = null, $limit = null, $offset = null )
|
||||
*/
|
||||
class OwnerRepository extends ServiceEntityRepository
|
||||
{
|
||||
public function __construct(ManagerRegistry $registry)
|
||||
{
|
||||
parent::__construct($registry, Owner::class);
|
||||
}
|
||||
class OwnerRepository extends ServiceEntityRepository {
|
||||
public function __construct( ManagerRegistry $registry ) {
|
||||
parent::__construct( $registry, Owner::class );
|
||||
}
|
||||
|
||||
// /**
|
||||
// * @return Owner[] Returns an array of Owner objects
|
||||
// */
|
||||
/*
|
||||
public function findByExampleField($value)
|
||||
{
|
||||
return $this->createQueryBuilder('o')
|
||||
->andWhere('o.exampleField = :val')
|
||||
->setParameter('val', $value)
|
||||
->orderBy('o.id', 'ASC')
|
||||
->setMaxResults(10)
|
||||
->getQuery()
|
||||
->getResult()
|
||||
;
|
||||
}
|
||||
*/
|
||||
// /**
|
||||
// * @return Owner[] Returns an array of Owner objects
|
||||
// */
|
||||
/*
|
||||
public function findByExampleField($value)
|
||||
{
|
||||
return $this->createQueryBuilder('o')
|
||||
->andWhere('o.exampleField = :val')
|
||||
->setParameter('val', $value)
|
||||
->orderBy('o.id', 'ASC')
|
||||
->setMaxResults(10)
|
||||
->getQuery()
|
||||
->getResult()
|
||||
;
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
public function findOneBySomeField($value): ?Owner
|
||||
{
|
||||
return $this->createQueryBuilder('o')
|
||||
->andWhere('o.exampleField = :val')
|
||||
->setParameter('val', $value)
|
||||
->getQuery()
|
||||
->getOneOrNullResult()
|
||||
;
|
||||
}
|
||||
*/
|
||||
/*
|
||||
public function findOneBySomeField($value): ?Owner
|
||||
{
|
||||
return $this->createQueryBuilder('o')
|
||||
->andWhere('o.exampleField = :val')
|
||||
->setParameter('val', $value)
|
||||
->getQuery()
|
||||
->getOneOrNullResult()
|
||||
;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
@ -5,48 +5,46 @@ namespace App\Repository;
|
||||
use App\Entity\Poll;
|
||||
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
|
||||
use Doctrine\Persistence\ManagerRegistry;
|
||||
use MongoDB\Driver\Manager;
|
||||
|
||||
/**
|
||||
* @method Poll|null find($id, $lockMode = null, $lockVersion = null)
|
||||
* @method Poll|null findOneBy(array $criteria, array $orderBy = null)
|
||||
* @method Poll|null find( $id, $lockMode = null, $lockVersion = null )
|
||||
* @method Poll|null findOneBy( array $criteria, array $orderBy = null )
|
||||
* @method Poll[] findAll()
|
||||
* @method Poll[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
|
||||
* @method Poll[] findBy( array $criteria, array $orderBy = null, $limit = null, $offset = null )
|
||||
*/
|
||||
class PollRepository extends ServiceEntityRepository
|
||||
{
|
||||
public function __construct(ManagerRegistry
|
||||
$registry)
|
||||
{
|
||||
parent::__construct($registry, Poll::class);
|
||||
}
|
||||
class PollRepository extends ServiceEntityRepository {
|
||||
public function __construct(
|
||||
ManagerRegistry $registry
|
||||
) {
|
||||
parent::__construct( $registry, Poll::class );
|
||||
}
|
||||
|
||||
// /**
|
||||
// * @return Poll[] Returns an array of Poll objects
|
||||
// */
|
||||
/*
|
||||
public function findByExampleField($value)
|
||||
{
|
||||
return $this->createQueryBuilder('p')
|
||||
->andWhere('p.exampleField = :val')
|
||||
->setParameter('val', $value)
|
||||
->orderBy('p.id', 'ASC')
|
||||
->setMaxResults(10)
|
||||
->getQuery()
|
||||
->getResult()
|
||||
;
|
||||
}
|
||||
*/
|
||||
// /**
|
||||
// * @return Poll[] Returns an array of Poll objects
|
||||
// */
|
||||
/*
|
||||
public function findByExampleField($value)
|
||||
{
|
||||
return $this->createQueryBuilder('p')
|
||||
->andWhere('p.exampleField = :val')
|
||||
->setParameter('val', $value)
|
||||
->orderBy('p.id', 'ASC')
|
||||
->setMaxResults(10)
|
||||
->getQuery()
|
||||
->getResult()
|
||||
;
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
public function findOneBySomeField($value): ?Poll
|
||||
{
|
||||
return $this->createQueryBuilder('p')
|
||||
->andWhere('p.exampleField = :val')
|
||||
->setParameter('val', $value)
|
||||
->getQuery()
|
||||
->getOneOrNullResult()
|
||||
;
|
||||
}
|
||||
*/
|
||||
/*
|
||||
public function findOneBySomeField($value): ?Poll
|
||||
{
|
||||
return $this->createQueryBuilder('p')
|
||||
->andWhere('p.exampleField = :val')
|
||||
->setParameter('val', $value)
|
||||
->getQuery()
|
||||
->getOneOrNullResult()
|
||||
;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
@ -7,44 +7,42 @@ use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
|
||||
use Doctrine\Common\Persistence\ManagerRegistry;
|
||||
|
||||
/**
|
||||
* @method StackOfVotes|null find($id, $lockMode = null, $lockVersion = null)
|
||||
* @method StackOfVotes|null findOneBy(array $criteria, array $orderBy = null)
|
||||
* @method StackOfVotes|null find( $id, $lockMode = null, $lockVersion = null )
|
||||
* @method StackOfVotes|null findOneBy( array $criteria, array $orderBy = null )
|
||||
* @method StackOfVotes[] findAll()
|
||||
* @method StackOfVotes[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
|
||||
* @method StackOfVotes[] findBy( array $criteria, array $orderBy = null, $limit = null, $offset = null )
|
||||
*/
|
||||
class StackOfVotesRepository extends ServiceEntityRepository
|
||||
{
|
||||
public function __construct(ManagerRegistry $registry)
|
||||
{
|
||||
parent::__construct($registry, StackOfVotes::class);
|
||||
}
|
||||
class StackOfVotesRepository extends ServiceEntityRepository {
|
||||
public function __construct( ManagerRegistry $registry ) {
|
||||
parent::__construct( $registry, StackOfVotes::class );
|
||||
}
|
||||
|
||||
// /**
|
||||
// * @return StackOfVotes[] Returns an array of StackOfVotes objects
|
||||
// */
|
||||
/*
|
||||
public function findByExampleField($value)
|
||||
{
|
||||
return $this->createQueryBuilder('s')
|
||||
->andWhere('s.exampleField = :val')
|
||||
->setParameter('val', $value)
|
||||
->orderBy('s.id', 'ASC')
|
||||
->setMaxResults(10)
|
||||
->getQuery()
|
||||
->getResult()
|
||||
;
|
||||
}
|
||||
*/
|
||||
// /**
|
||||
// * @return StackOfVotes[] Returns an array of StackOfVotes objects
|
||||
// */
|
||||
/*
|
||||
public function findByExampleField($value)
|
||||
{
|
||||
return $this->createQueryBuilder('s')
|
||||
->andWhere('s.exampleField = :val')
|
||||
->setParameter('val', $value)
|
||||
->orderBy('s.id', 'ASC')
|
||||
->setMaxResults(10)
|
||||
->getQuery()
|
||||
->getResult()
|
||||
;
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
public function findOneBySomeField($value): ?StackOfVotes
|
||||
{
|
||||
return $this->createQueryBuilder('s')
|
||||
->andWhere('s.exampleField = :val')
|
||||
->setParameter('val', $value)
|
||||
->getQuery()
|
||||
->getOneOrNullResult()
|
||||
;
|
||||
}
|
||||
*/
|
||||
/*
|
||||
public function findOneBySomeField($value): ?StackOfVotes
|
||||
{
|
||||
return $this->createQueryBuilder('s')
|
||||
->andWhere('s.exampleField = :val')
|
||||
->setParameter('val', $value)
|
||||
->getQuery()
|
||||
->getOneOrNullResult()
|
||||
;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
@ -7,44 +7,42 @@ use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
|
||||
use Doctrine\Common\Persistence\ManagerRegistry;
|
||||
|
||||
/**
|
||||
* @method Vote|null find($id, $lockMode = null, $lockVersion = null)
|
||||
* @method Vote|null findOneBy(array $criteria, array $orderBy = null)
|
||||
* @method Vote|null find( $id, $lockMode = null, $lockVersion = null )
|
||||
* @method Vote|null findOneBy( array $criteria, array $orderBy = null )
|
||||
* @method Vote[] findAll()
|
||||
* @method Vote[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
|
||||
* @method Vote[] findBy( array $criteria, array $orderBy = null, $limit = null, $offset = null )
|
||||
*/
|
||||
class VoteRepository extends ServiceEntityRepository
|
||||
{
|
||||
public function __construct(ManagerRegistry $registry)
|
||||
{
|
||||
parent::__construct($registry, Vote::class);
|
||||
}
|
||||
class VoteRepository extends ServiceEntityRepository {
|
||||
public function __construct( ManagerRegistry $registry ) {
|
||||
parent::__construct( $registry, Vote::class );
|
||||
}
|
||||
|
||||
// /**
|
||||
// * @return Vote[] Returns an array of Vote objects
|
||||
// */
|
||||
/*
|
||||
public function findByExampleField($value)
|
||||
{
|
||||
return $this->createQueryBuilder('v')
|
||||
->andWhere('v.exampleField = :val')
|
||||
->setParameter('val', $value)
|
||||
->orderBy('v.id', 'ASC')
|
||||
->setMaxResults(10)
|
||||
->getQuery()
|
||||
->getResult()
|
||||
;
|
||||
}
|
||||
*/
|
||||
// /**
|
||||
// * @return Vote[] Returns an array of Vote objects
|
||||
// */
|
||||
/*
|
||||
public function findByExampleField($value)
|
||||
{
|
||||
return $this->createQueryBuilder('v')
|
||||
->andWhere('v.exampleField = :val')
|
||||
->setParameter('val', $value)
|
||||
->orderBy('v.id', 'ASC')
|
||||
->setMaxResults(10)
|
||||
->getQuery()
|
||||
->getResult()
|
||||
;
|
||||
}
|
||||
*/
|
||||
|
||||
/*
|
||||
public function findOneBySomeField($value): ?Vote
|
||||
{
|
||||
return $this->createQueryBuilder('v')
|
||||
->andWhere('v.exampleField = :val')
|
||||
->setParameter('val', $value)
|
||||
->getQuery()
|
||||
->getOneOrNullResult()
|
||||
;
|
||||
}
|
||||
*/
|
||||
/*
|
||||
public function findOneBySomeField($value): ?Vote
|
||||
{
|
||||
return $this->createQueryBuilder('v')
|
||||
->andWhere('v.exampleField = :val')
|
||||
->setParameter('val', $value)
|
||||
->getQuery()
|
||||
->getOneOrNullResult()
|
||||
;
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
@ -12,6 +12,7 @@ use Exception;
|
||||
use Swift_Mailer;
|
||||
use Swift_Message;
|
||||
use Swift_SmtpTransport;
|
||||
use Symfony\Component\Mailer\Exception\TransportExceptionInterface;
|
||||
|
||||
class MailService {
|
||||
|
||||
@ -49,7 +50,7 @@ class MailService {
|
||||
* @param Owner $foundOwner
|
||||
* @param Poll|null $poll
|
||||
*
|
||||
* @throws \Symfony\Component\Mailer\Exception\TransportExceptionInterface
|
||||
* @throws TransportExceptionInterface
|
||||
*/
|
||||
public function sendCreationMailAction( Owner $foundOwner, Poll $poll = null ) {
|
||||
|
||||
@ -66,74 +67,12 @@ class MailService {
|
||||
return $this->sendMailWithVars( $config );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* anti spam , limit to every minute TODO
|
||||
*
|
||||
* @param Owner $owner
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function antispamCheck( Owner $owner ) {
|
||||
|
||||
// $lastSend = $admin_user->getRequestedPollsDate();
|
||||
// $now = new \DateTime();
|
||||
|
||||
// if ( date_diff( $lastSend, $now ) < 60 ) {
|
||||
// // too soon!
|
||||
// die( 'too soon!' );
|
||||
// }
|
||||
// $admin_user->setRequestedPollsDate( $now );
|
||||
// $em->persist( $admin_user );
|
||||
// $em->flush();
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* send created polls to an owner
|
||||
*
|
||||
* @param Owner $owner
|
||||
*
|
||||
* @return int|void
|
||||
* @throws Exception
|
||||
* @throws \Symfony\Component\Mailer\Exception\TransportExceptionInterface
|
||||
*/
|
||||
public function sendOwnerPollsAction( Owner $owner ) {
|
||||
|
||||
$config = [
|
||||
'owner' => $owner,
|
||||
'title' => 'Framadate | Mes sondages',
|
||||
'email_template' => 'emails/owner-list.html.twig',
|
||||
];
|
||||
$this->sendMailWithVars( $config );
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* @param Comment $comment
|
||||
*
|
||||
* @throws \Symfony\Component\Mailer\Exception\TransportExceptionInterface
|
||||
*/
|
||||
public function sendCommentNotification( Comment $comment ) {
|
||||
|
||||
$config = [
|
||||
'comment' => $comment,
|
||||
'owner' => $comment->getOwner(),
|
||||
'title' => 'Framadate | commentaire de ' . $comment->getOwner()->getPseudo() . ' _ sondage ' . $comment->getPoll()->getTitle(),
|
||||
'email_template' => 'emails/comment-notification.html.twig',
|
||||
];
|
||||
|
||||
$this->sendMailWithVars( $config );
|
||||
}
|
||||
|
||||
/**
|
||||
* generic way to send email with html template
|
||||
*
|
||||
* @param $config
|
||||
*
|
||||
* @throws \Symfony\Component\Mailer\Exception\TransportExceptionInterface
|
||||
* @throws TransportExceptionInterface
|
||||
*/
|
||||
public function sendMailWithVars( $config ) {
|
||||
|
||||
@ -209,4 +148,64 @@ class MailService {
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* anti spam , limit to every minute TODO
|
||||
*
|
||||
* @param Owner $owner
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function antispamCheck( Owner $owner ) {
|
||||
|
||||
// $lastSend = $admin_user->getRequestedPollsDate();
|
||||
// $now = new \DateTime();
|
||||
|
||||
// if ( date_diff( $lastSend, $now ) < 60 ) {
|
||||
// // too soon!
|
||||
// die( 'too soon!' );
|
||||
// }
|
||||
// $admin_user->setRequestedPollsDate( $now );
|
||||
// $em->persist( $admin_user );
|
||||
// $em->flush();
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* send created polls to an owner
|
||||
*
|
||||
* @param Owner $owner
|
||||
*
|
||||
* @return int|void
|
||||
* @throws Exception
|
||||
* @throws TransportExceptionInterface
|
||||
*/
|
||||
public function sendOwnerPollsAction( Owner $owner ) {
|
||||
|
||||
$config = [
|
||||
'owner' => $owner,
|
||||
'title' => 'Framadate | Mes sondages',
|
||||
'email_template' => 'emails/owner-list.html.twig',
|
||||
];
|
||||
$this->sendMailWithVars( $config );
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param Comment $comment
|
||||
*
|
||||
* @throws TransportExceptionInterface
|
||||
*/
|
||||
public function sendCommentNotification( Comment $comment ) {
|
||||
|
||||
$config = [
|
||||
'comment' => $comment,
|
||||
'owner' => $comment->getOwner(),
|
||||
'title' => 'Framadate | commentaire de ' . $comment->getOwner()->getPseudo() . ' _ sondage ' . $comment->getPoll()->getTitle(),
|
||||
'email_template' => 'emails/comment-notification.html.twig',
|
||||
];
|
||||
|
||||
$this->sendMailWithVars( $config );
|
||||
}
|
||||
}
|
||||
|
45
src/Traits/RandomTrait.php
Executable file
45
src/Traits/RandomTrait.php
Executable file
@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
namespace App\Traits;
|
||||
|
||||
trait RandomTrait {
|
||||
public function generateRandomKey() {
|
||||
$rand = random_int( PHP_INT_MIN, PHP_INT_MAX );
|
||||
|
||||
return str_shuffle( md5( $rand ) . $rand . $this->random_str() );
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a random string, using a cryptographically secure
|
||||
* pseudorandom number generator (random_int)
|
||||
*
|
||||
* This function uses type hints now (PHP 7+ only), but it was originally
|
||||
* written for PHP 5 as well.
|
||||
*
|
||||
* For PHP 7, random_int is a PHP core function
|
||||
* For PHP 5.x, depends on https://github.com/paragonie/random_compat
|
||||
*
|
||||
* @param int $length How many characters do we want?
|
||||
* @param string $keyspace A string of all possible characters
|
||||
* to select from
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function random_str(
|
||||
int $length = 64,
|
||||
string $keyspace = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
|
||||
): string {
|
||||
if ( $length < 1 ) {
|
||||
throw new RangeException( "Length must be a positive integer" );
|
||||
}
|
||||
$pieces = [];
|
||||
$max = mb_strlen( $keyspace, '8bit' ) - 1;
|
||||
for ( $i = 0 ; $i < $length ; ++ $i ) {
|
||||
$pieces [] = $keyspace[ random_int( 0, $max ) ];
|
||||
}
|
||||
|
||||
return implode( '', $pieces );
|
||||
}
|
||||
|
||||
|
||||
}
|
37
src/Traits/TimeStampableTraitTrait.php
Executable file
37
src/Traits/TimeStampableTraitTrait.php
Executable file
@ -0,0 +1,37 @@
|
||||
<?php
|
||||
|
||||
namespace App\Traits;
|
||||
|
||||
use DateInterval;
|
||||
use DateTime;
|
||||
use DateTimeInterface;
|
||||
use Doctrine\ORM\Mapping as ORM;
|
||||
|
||||
trait TimeStampableTrait {
|
||||
/**
|
||||
* @ORM\Column(type="datetime" , options={"default"="CURRENT_TIMESTAMP"})
|
||||
*/
|
||||
private $createdAt;
|
||||
|
||||
public function getCreatedAt(): ?DateTimeInterface {
|
||||
return $this->createdAt;
|
||||
}
|
||||
|
||||
public function setCreatedAt( DateTimeInterface $createdAt ): self {
|
||||
$this->createdAt = $createdAt;
|
||||
|
||||
return $this;
|
||||
}
|
||||
|
||||
public function getCreatedAtAsString(): string {
|
||||
return $this->createdAt->format( 'c' );
|
||||
}
|
||||
|
||||
|
||||
public function addDaysToDate( DateTime $date, int $days ) {
|
||||
|
||||
return $date->add( new DateInterval( 'P' . $days . 'D' ) );
|
||||
}
|
||||
|
||||
|
||||
}
|
@ -85,6 +85,8 @@ fi
|
||||
|
||||
git config --global diff.submodule log
|
||||
git submodule update
|
||||
git submodule foreach git reset --hard && git checkout master && git pull
|
||||
|
||||
cecho g "######################"
|
||||
cecho g " check dependencies of the frontend with yarn "
|
||||
cecho g "######################"
|
||||
@ -137,6 +139,9 @@ mv polyfills-es5* es5-polyfills.js
|
||||
mv polyfills* other-polyfills.js
|
||||
mv scripts* scripts.js
|
||||
mv styles* styles.css
|
||||
|
||||
chown www-data:www-data . -R
|
||||
|
||||
cecho b " finished at ------- $(date) ------- "
|
||||
cecho g "##################################################################"
|
||||
cecho g " "
|
||||
|
Loading…
Reference in New Issue
Block a user