<?php
namespace App\Manager;
use App\Entity\Token;
use App\Entity\User;
use App\Traits\Autowired\Manager\UserManagerTrait;
use App\Traits\Autowired\Vendor\RequestStackTrait;
use App\Traits\Autowired\Vendor\TokenStorageTrait;
use Doctrine\ORM\QueryBuilder;
use GollumSF\RestBundle\Model\ApiList;
use Symfony\Component\HttpFoundation\Request;
class TokenManager extends AbstractEntityManager {
use UserManagerTrait;
use TokenStorageTrait;
use RequestStackTrait;
private $alreadyClear = false;
/**
* @return ?Token
*/
public function find($id) {
$this->clearOldUnnamedToken();
return parent::find($id);
}
public function create(User $user, int $lifetime = null): ?Token {
$this->clearOldUnnamedToken();
return $this->update(new Token(
$user,
$this->userManager->getAllRightFromUser($user),
$lifetime
));
}
public function createFromUser(Token $token, User $user): Token {
return $this->update(new Token(
$user,
array_intersect($token->getRights(), $this->userManager->getAllRightFromUser($user)),
$token->getLifetime(),
$token->getName()
));
}
public function getTokenIdIdFromRequest(Request $request): string {
$tokenId = $request->query->get('token', '');
if ($tokenId === '') {
$authorization = $request->headers->get('authorization');
if (strpos($authorization, 'BEARER ') === 0) {
$tokenId = substr($authorization, strlen('BEARER '));
}
}
return $tokenId;
}
public function clearRequestTokenIfUnnamed(): void {
$tokenId = $this->getTokenIdIdFromRequest($this->requestStack->getMasterRequest());
if ($tokenId) {
$token = $this->find($tokenId);
if ($token && !$token->getName()) {
$this->delete($token);
}
}
}
public function clearUnnamedTokenFromUser(User $user): void {
$this->getRepository()->clearUnnamedTokenFromUser($user);
}
public function clearOldUnnamedToken(): void {
if (!$this->alreadyClear) {
$this->alreadyClear = true;
$this->getRepository()->clearOldUnnamedToken();
}
}
public function apiFindNamedByUser(User $user): ApiList {
return parent::apiFindBy(function (QueryBuilder $queryBuilder) use ($user) {
$queryBuilder
->andWhere('t.user = :user')
->andWhere('t.name IS NOT NULL')
->setParameter('user', $user)
;
});
}
}