<?php
namespace App\Controller\Api;
use App\Model\Enum\UserRole;
use App\Security\Voter\BelongUserVoter;
use App\Traits\Autowired\Manager\TokenManagerTrait;
use GollumSF\RestBundle\Annotation\Serialize;
use GollumSF\RestBundle\Annotation\Unserialize;
use GollumSF\RestBundle\Annotation\Validate;
use GollumSF\RestDocBundle\Annotation\ApiDescribe;
use App\Controller\AbstractController;
use App\Entity\Token;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\IsGranted;
use Symfony\Component\HttpKernel\Exception\BadRequestHttpException;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;
/**
* @Route("/api/tokens")
* @ApiDescribe(Token::class)
*/
class TokenController extends AbstractController {
use TokenManagerTrait;
/**
* @Route("/login", methods="POST")
* @ApiDescribe(
* request={
* "body"={
* "properties"={
* "email": { "type": "string" },
* "password": { "type": "string" }
* }
* }
* }
* )
* @Serialize(groups={"token_get", "token_get_login"})
*/
public function login() {
if (!$this->getUser()) {
throw new BadRequestHttpException('Authentication Required');
}
$this->tokenManager->clearRequestTokenIfUnnamed();
return $this->tokenManager->create($this->getUser(), $this->getParameter('token_lifetime'));
}
/**
* @Route("/refresh", methods="PATCH")
* @IsGranted(UserRole::ROLE_USER)
* @Serialize(groups={"token_get", "token_get_login"})
*/
public function refresh() {
return $this->tokenManager->create($this->getUser(), $this->getParameter('token_lifetime'));
}
/**
* @Route("", methods="GET")
* @IsGranted(UserRole::ROLE_USER)
* @Serialize(groups="token_get")
* @ApiDescribe(summary="Return generated token of current user")
*/
public function list() {
return $this->tokenManager->apiFindNamedByUser($this->getUser());
}
/**
* @Route("", methods="POST")
* @IsGranted(UserRole::ROLE_USER)
* @Unserialize("token", groups="token_post", save=false)
* @Validate({ "token_post" })
* @Serialize(groups="user_get")
*
*/
public function post(Token $token) {
return $this->tokenManager->createFromUser($token, $this->getUser());
}
/**
* @Route("/{id}", methods="DELETE")
* @IsGranted(BelongUserVoter::BELONG, subject="token")
* @Serialize(groups="user_get")
*
*/
public function delete(Token $token) {
return $this->tokenManager->delete($token);
}
}