From 6831d8d1aebed12f666bfc81b09586884d024db7 Mon Sep 17 00:00:00 2001 From: Tykayn Date: Tue, 27 Apr 2021 10:41:21 +0200 Subject: [PATCH] add ip on stack of vote --- src/Controller/api/VoteController.php | 3 +- src/Entity/Poll.php | 774 ++++++++++++------------- src/Entity/StackOfVotes.php | 151 ++--- src/Traits/RandomTrait.php | 37 ++ src/Traits/TimeStampableTraitTrait.php | 9 + 5 files changed, 503 insertions(+), 471 deletions(-) diff --git a/src/Controller/api/VoteController.php b/src/Controller/api/VoteController.php index 58fe69a..a2b2aa9 100644 --- a/src/Controller/api/VoteController.php +++ b/src/Controller/api/VoteController.php @@ -67,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 ) { diff --git a/src/Entity/Poll.php b/src/Entity/Poll.php index 1f5d154..296384a 100755 --- a/src/Entity/Poll.php +++ b/src/Entity/Poll.php @@ -2,6 +2,7 @@ namespace App\Entity; +use App\Traits\RandomTrait; use DateTime; use DateTimeInterface; use Doctrine\Common\Collections\ArrayCollection; @@ -16,6 +17,9 @@ use RangeException; * @Serializer\ExclusionPolicy("all") */ class Poll { + + use RandomTrait; + /** * @ORM\Id() * @ORM\GeneratedValue() @@ -191,540 +195,504 @@ class Poll { private $maxChoicesLimit = 25; public function __construct() { - - $this->initiate(); - } + + $this->initiate(); + $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->generateAdminKey() ); - $this->setCreationDate( new DateTime() ); - $this->setExpiracyDate( $this->addDaysToDate( - new DateTime(), - $this->defaultExpiracyDaysFromNow - ) ); - $this->setAllowedAnswers( [ 'yes', 'maybe', 'no' ] ); - } + $this->votes = new ArrayCollection(); + $this->stacksOfVotes = new ArrayCollection(); + $this->choices = new ArrayCollection(); + $this->comments = new ArrayCollection(); + $this->setAdminKey( $this->generateRandomKey() ); + $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 - */ - 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 addDaysToDate( DateTime $date, int $days ) { - $st = strtotime( $date->getTimestamp() ); - - return new DateTime( $st ); - } 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; - } + $content = $this->display(); + $content[ 'owner' ] = $this->getOwner()->displayForAdmin(); + $content[ 'admin_key' ] = $this->getAdminKey(); + $content[ 'password_hash' ] = $this->getPassword(); + $content[ 'id' ] = $this->getId(); + + return $content; + } 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->getCreationDate()->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' => $displayedChoices, - 'choices_stats' => $computedAnswers[ 'answersWithStats' ], - 'stacks' => $displayedStackOfVotes, - 'comments' => $displayedComments, - ]; - } + + $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->getCreationDate()->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' => $displayedChoices, + 'choices_stats' => $computedAnswers[ 'answersWithStats' ], + 'stacks' => $displayedStackOfVotes, + 'comments' => $displayedComments, + ]; + } public function computeAnswers() { - // counts each number of answer for this choice - $computedArray = []; - $maxScore = 0; - - foreach ( $this->getStacksOfVotes() as $stack_of_vote ) { - foreach ( $stack_of_vote->getVotes() as $vote ) { - $answer = $vote->getValue(); - $choice_id = $vote->getChoice()->getId(); - $choice_url = $vote->getChoice()->getUrl(); - - if ( ! isset( $computedArray[ $choice_id ] ) ) { - $computedArray[ $choice_id ] = [ - 'id' => $choice_id, - 'url' => $choice_url, - 'name' => $vote->getChoice()->getName(), - 'score' => 0, - 'yes' => [ - 'count' => 0, - 'people' => [], - ], - 'maybe' => [ - 'count' => 0, - 'people' => [], - ], - 'no' => [ - 'count' => 0, - 'people' => [], - ], - ]; - } - $computedArray[ $choice_id ][ $answer ][ 'count' ] ++; - $computedArray[ $choice_id ][ $answer ][ 'people' ][] = $stack_of_vote->getOwner()->getPseudo(); - - if ( $answer == 'yes' ) { - $computedArray[ $choice_id ][ 'score' ] += 1; - } elseif ( $answer == 'maybe' ) { - $computedArray[ $choice_id ][ 'score' ] += 0.5; - } - // compare with max value - if ( $computedArray[ $choice_id ][ 'score' ] > $maxScore ) { - $maxScore = $computedArray[ $choice_id ][ 'score' ]; - } - } - } - $answersWithStats = []; - foreach ( $computedArray as $choice_stat ) { - $answersWithStats[] = $choice_stat; - } - - return [ - 'answers' => $computedArray, - 'answersWithStats' => $answersWithStats, - 'max_score' => $maxScore, - ]; - } + // counts each number of answer for this choice + $computedArray = []; + $maxScore = 0; + + foreach ( $this->getStacksOfVotes() as $stack_of_vote ) { + foreach ( $stack_of_vote->getVotes() as $vote ) { + $answer = $vote->getValue(); + $choice_id = $vote->getChoice()->getId(); + $choice_url = $vote->getChoice()->getUrl(); + + if ( ! isset( $computedArray[ $choice_id ] ) ) { + $computedArray[ $choice_id ] = [ + 'id' => $choice_id, + 'url' => $choice_url, + 'name' => $vote->getChoice()->getName(), + 'score' => 0, + 'yes' => [ + 'count' => 0, + 'people' => [], + ], + 'maybe' => [ + 'count' => 0, + 'people' => [], + ], + 'no' => [ + 'count' => 0, + 'people' => [], + ], + ]; + } + $computedArray[ $choice_id ][ $answer ][ 'count' ] ++; + $computedArray[ $choice_id ][ $answer ][ 'people' ][] = $stack_of_vote->getOwner()->getPseudo(); + + if ( $answer == 'yes' ) { + $computedArray[ $choice_id ][ 'score' ] += 1; + } elseif ( $answer == 'maybe' ) { + $computedArray[ $choice_id ][ 'score' ] += 0.5; + } + // compare with max value + if ( $computedArray[ $choice_id ][ 'score' ] > $maxScore ) { + $maxScore = $computedArray[ $choice_id ][ 'score' ]; + } + } + } + $answersWithStats = []; + foreach ( $computedArray as $choice_stat ) { + $answersWithStats[] = $choice_stat; + } + + return [ + 'answers' => $computedArray, + 'answersWithStats' => $answersWithStats, + 'max_score' => $maxScore, + ]; + } public function getStacksOfVotes() { - return $this->stacksOfVotes; - } + return $this->stacksOfVotes; + } public function setStacksOfVotes( ?StackOfVotes $stacksOfVotes ): self { - $this->stacksOfVotes = $stacksOfVotes; - - return $this; - } + $this->stacksOfVotes = $stacksOfVotes; + + return $this; + } /** * @return Collection|Choice[] */ public function getChoices(): Collection { - return $this->choices; - } + return $this->choices; + } /** * @return Collection|Comment[] */ public function getComments(): Collection { - return $this->comments; - } + return $this->comments; + } public function getTitle(): ?string { - return $this->title; - } + return $this->title; + } public function setTitle( string $title ): self { - $this->title = $title; - - return $this; - } + $this->title = $title; + + return $this; + } public function getDescription(): ?string { - return $this->description; - } + return $this->description; + } public function setDescription( string $description ): self { - $this->description = $description; - - return $this; - } + $this->description = $description; + + return $this; + } public function getCreationDate(): ?DateTimeInterface { - return $this->creationDate; - } + return $this->creationDate; + } public function setCreationDate( DateTimeInterface $creationDate ): self { - $this->creationDate = $creationDate; - - return $this; - } + $this->creationDate = $creationDate; + + return $this; + } public function getExpiracyDate(): ?DateTimeInterface { - return $this->expiracyDate; - } + return $this->expiracyDate; + } public function setExpiracyDate( DateTimeInterface $expiracyDate ): self { - $this->expiracyDate = $expiracyDate; - - return $this; - } + $this->expiracyDate = $expiracyDate; + + return $this; + } public function getVotesMax() { - return $this->votesMax; - } + return $this->votesMax; + } public function setVotesMax( $votesMax ): self { - $this->votesMax = $votesMax; - - return $this; - } + $this->votesMax = $votesMax; + + return $this; + } public function getChoicesMax() { - return $this->choicesMax; - } + return $this->choicesMax; + } public function setChoicesMax( $choicesMax ): self { - $this->choicesMax = $choicesMax; - - return $this; - } + $this->choicesMax = $choicesMax; + + return $this; + } public function getKind(): ?string { - return $this->kind; - } + return $this->kind; + } public function setKind( string $kind ): self { - $this->kind = $kind; - - return $this; - } + $this->kind = $kind; + + return $this; + } public function getAllowedAnswers(): ?array { - return $this->allowedAnswers; - } + return $this->allowedAnswers; + } public function setAllowedAnswers( array $allowedAnswers ): self { - $this->allowedAnswers = $allowedAnswers; - - return $this; - } + $this->allowedAnswers = $allowedAnswers; + + return $this; + } public function getVotesAllowed(): ?bool { - return $this->votesAllowed; - } + return $this->votesAllowed; + } public function setVotesAllowed( ?bool $votesAllowed ): self { - $this->votesAllowed = $votesAllowed; - - return $this; - } + $this->votesAllowed = $votesAllowed; + + return $this; + } public function getModificationPolicy(): ?string { - return $this->modificationPolicy; - } + return $this->modificationPolicy; + } public function setModificationPolicy( string $modificationPolicy ): self { - $this->modificationPolicy = $modificationPolicy; - - return $this; - } + $this->modificationPolicy = $modificationPolicy; + + return $this; + } public function getHideResults(): ?bool { - return $this->hideResults; - } + return $this->hideResults; + } public function setHideResults( bool $hideResults ): self { - $this->hideResults = $hideResults; - - return $this; - } + $this->hideResults = $hideResults; + + return $this; + } public function getShowResultEvenIfPasswords(): ?bool { - return $this->showResultEvenIfPasswords; - } + return $this->showResultEvenIfPasswords; + } public function setShowResultEvenIfPasswords( bool $showResultEvenIfPasswords ): self { - $this->showResultEvenIfPasswords = $showResultEvenIfPasswords; - - return $this; - } + $this->showResultEvenIfPasswords = $showResultEvenIfPasswords; + + return $this; + } public function getOwner(): ?Owner { - return $this->owner; - } + return $this->owner; + } public function setOwner( ?Owner $owner ): self { - $this->owner = $owner; - - return $this; - } + $this->owner = $owner; + + return $this; + } public function getPassword(): ?string { - return $this->password; - } + return $this->password; + } public function setPassword( string $password ): self { - $this->password = md5( $password ); - - return $this; - } + $this->password = md5( $password ); + + return $this; + } public function getAdminKey(): ?string { - return $this->adminKey; - } + return $this->adminKey; + } public function setAdminKey( string $adminKey ): self { - $this->adminKey = $adminKey; - - return $this; - } + $this->adminKey = $adminKey; + + return $this; + } public function getId(): ?int { - return $this->id; - } + 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; - } + + $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|Vote[] */ public function getVotes(): Collection { - return $this->votes; - } + return $this->votes; + } public function getCustomUrl(): ?string { - return $this->customUrl; - } + return $this->customUrl; + } public function setCustomUrl( string $customUrl ): self { - $this->customUrl = $customUrl; - - return $this; - } + $this->customUrl = $customUrl; + + return $this; + } public function getMailOnComment(): ?bool { - return $this->mailOnComment; - } + return $this->mailOnComment; + } public function setMailOnComment( bool $mailOnComment ): self { - $this->mailOnComment = $mailOnComment; - - return $this; - } + $this->mailOnComment = $mailOnComment; + + return $this; + } public function getMailOnVote(): ?bool { - return $this->mailOnVote; - } + return $this->mailOnVote; + } public function setMailOnVote( bool $mailOnVote ): self { - $this->mailOnVote = $mailOnVote; - - return $this; - } + $this->mailOnVote = $mailOnVote; + + return $this; + } public function addComment( Comment $comment ): self { - if ( ! $this->comments->contains( $comment ) ) { - $this->comments[] = $comment; - $comment->setPoll( $this ); - } - - return $this; - } + if ( ! $this->comments->contains( $comment ) ) { + $this->comments[] = $comment; + $comment->setPoll( $this ); + } + + return $this; + } public function removeComment( Comment $comment ): self { - if ( $this->comments->contains( $comment ) ) { - $this->comments->removeElement( $comment ); - // set the owning side to null (unless already changed) - if ( $comment->getPoll() === $this ) { - $comment->setPoll( null ); - } - } - - return $this; - } + if ( $this->comments->contains( $comment ) ) { + $this->comments->removeElement( $comment ); + // set the owning side to null (unless already changed) + if ( $comment->getPoll() === $this ) { + $comment->setPoll( null ); + } + } + + return $this; + } public function addStackOfVote( StackOfVotes $stackOfVote ): self { - if ( ! $this->stacksOfVotes->contains( $stackOfVote ) ) { - $this->stacksOfVotes[] = $stackOfVote; - $stackOfVote->setPoll( $this ); - } - - return $this; - } + if ( ! $this->stacksOfVotes->contains( $stackOfVote ) ) { + $this->stacksOfVotes[] = $stackOfVote; + $stackOfVote->setPoll( $this ); + } + + return $this; + } public function removeStackOfVote( StackOfVotes $stackOfVote ): self { - if ( $this->stacksOfVotes->contains( $stackOfVote ) ) { - $this->stacksOfVotes->removeElement( $stackOfVote ); - // set the owning side to null (unless already changed) - if ( $stackOfVote->getPoll() === $this ) { - $stackOfVote->setPoll( null ); - } - } - - return $this; - } + if ( $this->stacksOfVotes->contains( $stackOfVote ) ) { + $this->stacksOfVotes->removeElement( $stackOfVote ); + // set the owning side to null (unless already changed) + if ( $stackOfVote->getPoll() === $this ) { + $stackOfVote->setPoll( null ); + } + } + + return $this; + } public function addVote( Vote $vote ): self { - if ( ! $this->votes->contains( $vote ) ) { - $this->votes[] = $vote; - $vote->setPoll( $this ); - } - - return $this; - } + if ( ! $this->votes->contains( $vote ) ) { + $this->votes[] = $vote; + $vote->setPoll( $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->getPoll() === $this ) { - $vote->setPoll( null ); - } - } - - return $this; - } + if ( $this->votes->contains( $vote ) ) { + $this->votes->removeElement( $vote ); + // set the owning side to null (unless already changed) + if ( $vote->getPoll() === $this ) { + $vote->setPoll( null ); + } + } + + return $this; + } public function addTextChoiceArray( array $choiceTextArray ): self { - foreach ( $choiceTextArray as $text ) { - $newChoice = new Choice(); - $newChoice->setName( $text ); - $this->addChoice( $newChoice ); - } - - return $this; - } + foreach ( $choiceTextArray as $text ) { + $newChoice = new Choice(); + $newChoice->setName( $text ); + $this->addChoice( $newChoice ); + } + + 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; - } + 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 addStacksOfVote( StackOfVotes $stacksOfVote ): self { - if ( ! $this->stacksOfVotes->contains( $stacksOfVote ) ) { - $this->stacksOfVotes[] = $stacksOfVote; - $stacksOfVote->setPoll( $this ); - } - - return $this; - } + if ( ! $this->stacksOfVotes->contains( $stacksOfVote ) ) { + $this->stacksOfVotes[] = $stacksOfVote; + $stacksOfVote->setPoll( $this ); + } + + return $this; + } public function removeStacksOfVote( StackOfVotes $stacksOfVote ): self { - if ( $this->stacksOfVotes->contains( $stacksOfVote ) ) { - $this->stacksOfVotes->removeElement( $stacksOfVote ); - // set the owning side to null (unless already changed) - if ( $stacksOfVote->getPoll() === $this ) { - $stacksOfVote->setPoll( null ); - } - } - - return $this; - } + if ( $this->stacksOfVotes->contains( $stacksOfVote ) ) { + $this->stacksOfVotes->removeElement( $stacksOfVote ); + // set the owning side to null (unless already changed) + if ( $stacksOfVote->getPoll() === $this ) { + $stacksOfVote->setPoll( null ); + } + } + + return $this; + } public function removeChoice( Choice $choice ): self { - if ( $this->choices->contains( $choice ) ) { - $this->choices->removeElement( $choice ); - // set the owning side to null (unless already changed) - if ( $choice->getPoll() === $this ) { - $choice->setPoll( null ); - } - } - - return $this; - } + if ( $this->choices->contains( $choice ) ) { + $this->choices->removeElement( $choice ); + // set the owning side to null (unless already changed) + if ( $choice->getPoll() === $this ) { + $choice->setPoll( null ); + } + } + + return $this; + } public function getCommentsAllowed(): ?bool { - return $this->commentsAllowed; - } + return $this->commentsAllowed; + } public function setCommentsAllowed( ?bool $commentsAllowed ): self { - $this->commentsAllowed = $commentsAllowed; - - return $this; - } + $this->commentsAllowed = $commentsAllowed; + + return $this; + } } diff --git a/src/Entity/StackOfVotes.php b/src/Entity/StackOfVotes.php index cb5330b..48343eb 100755 --- a/src/Entity/StackOfVotes.php +++ b/src/Entity/StackOfVotes.php @@ -46,103 +46,120 @@ class StackOfVotes { */ private $owner; + /** + * @ORM\Column(type="string", length=255) + */ + private $ip; + public function __construct() { - $this->votes = new ArrayCollection(); - } + $this->votes = new ArrayCollection(); + } 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; - } + $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; + } /** * @return Collection|poll[] */ public function getVotes(): Collection { - return $this->votes; - } + return $this->votes; + } public function getPseudo(): ?string { - return $this->pseudo; - } + return $this->pseudo; + } public function setPseudo( ?string $pseudo ): self { - $this->pseudo = $pseudo; - - return $this; - } + $this->pseudo = $pseudo; + + return $this; + } /** * @ORM\PrePersist */ public function prePersist() { - $this->setPseudo( $this->getOwner()->getPseudo() ); - } + $this->setPseudo( $this->getOwner()->getPseudo() ); + } public function getOwner(): ?Owner { - return $this->owner; - } + return $this->owner; + } public function setOwner( ?Owner $owner ): self { - $this->owner = $owner; - - return $this; - } + $this->owner = $owner; + + return $this; + } public function getId(): ?int { - return $this->id; - } + return $this->id; + } public function addVote( Vote $vote ): self { - if ( ! $this->votes->contains( $vote ) ) { - $vote->setPoll( $this->getPoll() ); - - $this->votes[] = $vote; - $vote->setStacksOfVotes( $this ); - } - - return $this; - } + if ( ! $this->votes->contains( $vote ) ) { + $vote->setPoll( $this->getPoll() ); + + $this->votes[] = $vote; + $vote->setStacksOfVotes( $this ); + } + + 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; + + 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->getStacksOfVotes() === $this ) { - $vote->setStacksOfVotes( null ); - } - } + if ( $this->votes->contains( $vote ) ) { + $this->votes->removeElement( $vote ); + // set the owning side to null (unless already changed) + if ( $vote->getStacksOfVotes() === $this ) { + $vote->setStacksOfVotes( null ); + } + } + + return $this; + } - return $this; - } + public function getIp(): ?string + { + return $this->ip; + } + + public function setIp(string $ip): self + { + $this->ip = $ip; + + return $this; + } } diff --git a/src/Traits/RandomTrait.php b/src/Traits/RandomTrait.php index 6efe6fb..c8e1683 100755 --- a/src/Traits/RandomTrait.php +++ b/src/Traits/RandomTrait.php @@ -3,6 +3,43 @@ 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 ); + } } diff --git a/src/Traits/TimeStampableTraitTrait.php b/src/Traits/TimeStampableTraitTrait.php index 52e1cf2..ad46553 100755 --- a/src/Traits/TimeStampableTraitTrait.php +++ b/src/Traits/TimeStampableTraitTrait.php @@ -2,6 +2,7 @@ namespace App\Traits; +use DateTime; use DateTimeInterface; use Doctrine\ORM\Mapping as ORM; @@ -25,4 +26,12 @@ trait TimeStampableTrait { return $this->createdAt->format( 'c' ); } + + public function addDaysToDate( DateTime $date, int $days ) { + $st = strtotime( $date->getTimestamp() ); + + return new DateTime( $st ); + } + + }