Skip to content
This repository was archived by the owner on Aug 24, 2022. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@

namespace Badger\Bundle\GameBundle\Controller;

use Badger\Bundle\GameBundle\Entity\VotableItem;
use Badger\Bundle\GameBundle\Event\BadgeUnlockEvent;
use Badger\Bundle\GameBundle\GameEvents;
use Doctrine\DBAL\Exception\UniqueConstraintViolationException;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
Expand Down Expand Up @@ -66,6 +68,44 @@ public function rejectAction($id)
return $this->redirectToRoute('admin_claimed_badge_index');
}

/**
* Set the badge as votable.
*
* @param string $id
*
* @return RedirectResponse
*/
public function sendToTheCouncilAction($id)
{
$pendingCompletion = $this->get('badger.game.repository.badge_completion')
->findOneBy(['id' => $id, 'pending' => 1]);

if (null === $pendingCompletion) {
throw new NotFoundHttpException(sprintf('No pending BadgeCompletion entity with id %s', $id));
}

$votableItem = new VotableItem();
$votableItem->setBadgeCompletion($pendingCompletion);

try {
$this->get('badger.game.saver.votable_item')->save($votableItem);
} catch (UniqueConstraintViolationException $e) {
$this->addFlash('warning', sprintf(
'The badge "%s" is already submitted to vote',
$pendingCompletion->getBadge()->getTitle()
));

return $this->redirectToRoute('admin_claimed_badge_index');
}

$this->addFlash('notice', sprintf(
'Successfully send the badge "%s" to the people vote! #democracy',
$pendingCompletion->getBadge()->getTitle()
));

return $this->redirectToRoute('admin_claimed_badge_index');
}

/**
* Accept a badge completion.
*
Expand Down
124 changes: 124 additions & 0 deletions src/Badger/Bundle/GameBundle/Controller/VoteController.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,124 @@
<?php

namespace Badger\Bundle\GameBundle\Controller;

use Badger\Bundle\GameBundle\Entity\Vote;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\Routing\Annotation\Route;

/**
* @author Olivier Soulet <olivier.soulet@akeneo.com>
* @license http://opensource.org/licenses/MIT The MIT License (MIT)
*/
class VoteController extends Controller
{
/**
* @Route("/votable-badges", name="votable_badges")
*
* @return Response
*/
public function indexAction()
{
$votableItems = $this->get('badger.game.repository.votable_item')
->findBy(['pending' => 1]);

$votesResults = [];
foreach ($votableItems as $votableItem) {
$voteResult = 0;
$votes = $votableItem->getVotes();
foreach ($votes as $vote) {
$voteResult += (int) $vote->getVote();
}
$votesResults[$votableItem->getId()] = $voteResult;
}

return $this->render('@Game/pending-votes.html.twig', [
'votableItems' => $votableItems,
'votesResults' => $votesResults
]);
}

/**
* @Route("/pending-badge/upvote/{id}", name="badge_upvote")
*
* @return Response
*/
public function upvoteAction($id)
{
$votableItem = $this->get('badger.game.repository.votable_item')
->findOneBy(['id' => $id, 'pending' => 1]);

//TODO: to extract
$vote = $this->get('badger.game.repository.vote')->findOneBy(
[
'votableItem' => $votableItem,
'user' => $this->getUser()
]
);

if (null === $vote) {
$vote = new Vote();
$vote->setVotableItem($votableItem);
$vote->setUser($this->getUser());
}

if (1 === $vote->getVote()) {
$vote->setVote(0);
} else {
$vote->setVote(1);
}

$this->get('badger.game.saver.vote')->save($vote);

if (null === $votableItem) {
throw new NotFoundHttpException(sprintf('No pending votable entity with id %s', $id));
}

$this->addFlash('notice', sprintf(
'You successfully voted for "%s" to have the badge %s!',
$votableItem->getBadgeCompletion()->getUser()->getUsername(),
$votableItem->getBadgeCompletion()->getBadge()->getTitle()
));

return $this->redirectToRoute('votable_badges');
}

/**
* @Route("/pending-badge/downvote/{id}", name="badge_downvote")
*
* @return Response
*/
public function downvoteAction($id)
{
$votableItem = $this->get('badger.game.repository.votable_item')
->findOneBy(['id' => $id, 'pending' => 1]);

//TODO: to extract
$vote = $this->get('badger.game.repository.vote')->findOneBy(
[
'votableItem' => $votableItem,
'user' => $this->getUser()
]
);

if (null === $vote) {
$vote = new Vote();
$vote->setVotableItem($votableItem);
$vote->setUser($this->getUser());
}

if (-1 === $vote->getVote()) {
$vote->setVote(0);
} else {
$vote->setVote(-1);
}

$this->get('badger.game.saver.vote')->save($vote);

$this->addFlash('notice', 'You successfully voted ! "%s" to NOT have the badge %s!');

return $this->redirectToRoute('votable_badges');
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

namespace Badger\Bundle\GameBundle\Doctrine\Repository;

use Doctrine\ORM\EntityRepository;

/**
* Doctrine implementation of repository for VotableItem entities.
*
* @author Olivier Soulet <olivier.soulet@akeneo.com>
* @license http://opensource.org/licenses/MIT The MIT License (MIT)
*/
class VotableItemRepository extends EntityRepository
{
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
<?php

namespace Badger\Bundle\GameBundle\Doctrine\Repository;

use Doctrine\ORM\EntityRepository;

/**
* Doctrine implementation of repository for Vote entities.
*
* @author Olivier Soulet <olivier.soulet@akeneo.com>
* @license http://opensource.org/licenses/MIT The MIT License (MIT)
*/
class VoteRepository extends EntityRepository
{
}
83 changes: 83 additions & 0 deletions src/Badger/Bundle/GameBundle/Entity/VotableItem.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
<?php

namespace Badger\Bundle\GameBundle\Entity;

use Badger\Component\Game\Model\BadgeCompletionInterface;
use Doctrine\Common\Collections\ArrayCollection;

/**
* Contains the item to vote on.
*
* @author Olivier Soulet <olivier.soulet@akeneo.com>
* @license http://opensource.org/licenses/MIT The MIT License (MIT)
*/
class VotableItem
{
/** @var int */
private $id;

/** @var BadgeCompletionInterface */
private $badgeCompletion;

/** @var Bool */
private $pending = true;

/** @var ArrayCollection */
private $votes;

/**
* {@inheritdoc}
*/
public function getId()
{
return $this->id;
}

/**
* @return BadgeCompletionInterface
*/
public function getBadgeCompletion()
{
return $this->badgeCompletion;
}

/**
* @param BadgeCompletionInterface $badgeCompletion
*/
public function setBadgeCompletion($badgeCompletion)
{
$this->badgeCompletion = $badgeCompletion;
}

/**
* @return bool
*/
public function isPending()
{
return $this->pending;
}

/**
* @param bool $pending
*/
public function setPending($pending)
{
$this->pending = $pending;
}

/**
* @return ArrayCollection
*/
public function getVotes()
{
return $this->votes;
}

/**
* @param ArrayCollection $votes
*/
public function setVotes($votes)
{
$this->votes = $votes;
}
}
87 changes: 87 additions & 0 deletions src/Badger/Bundle/GameBundle/Entity/Vote.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
<?php

namespace Badger\Bundle\GameBundle\Entity;

use Badger\Component\Game\Model\BadgeCompletionInterface;
use Badger\Component\User\Model\UserInterface;

/**
* Vote
*
* @author Olivier Soulet <olivier.soulet@akeneo.com>
* @license http://opensource.org/licenses/MIT The MIT License (MIT)
*/
class Vote
{
/** @var int */
private $id;

/** @var UserInterface */
protected $user;

/** @var VotableItem */
protected $votableItem;

/**
* @return VotableItem
*/
public function getVotableItem()
{
return $this->votableItem;
}

/**
* @param VotableItem $votableItem
*/
public function setVotableItem($votableItem)
{
$this->votableItem = $votableItem;
}

/** @var int */
protected $vote;

public function __construct()
{
}

/**
* {@inheritdoc}
*/
public function getId()
{
return $this->id;
}

/**
* {@inheritdoc}
*/
public function getUser()
{
return $this->user;
}

/**
* {@inheritdoc}
*/
public function setUser($user)
{
$this->user = $user;
}

/**
* @return int
*/
public function getVote()
{
return $this->vote;
}

/**
* @param int $vote
*/
public function setVote($vote)
{
$this->vote = $vote;
}
}
2 changes: 1 addition & 1 deletion src/Badger/Bundle/GameBundle/Factory/TagFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
namespace Badger\Bundle\GameBundle\Factory;

use Badger\Bundle\GameBundle\Entity\Tag;
use Badger\Component\Tag\Factory\TagFactoryInterface;
use Badger\Component\Game\Factory\TagFactoryInterface;

/**
* @author Adrien Pétremann <hello@grena.fr>
Expand Down
Loading