Added relation between API Client and User

Fix #2062
This commit is contained in:
Nicolas Lœuillet 2016-10-24 21:56:28 +02:00
parent 8e58be9fb6
commit 23406ca3f1
No known key found for this signature in database
GPG key ID: BDC1EFB5CA0145F2
4 changed files with 95 additions and 3 deletions

View file

@ -0,0 +1,47 @@
<?php
namespace Application\Migrations;
use Doctrine\DBAL\Migrations\AbstractMigration;
use Doctrine\DBAL\Schema\Schema;
use Symfony\Component\DependencyInjection\ContainerAwareInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
/**
* Auto-generated Migration: Please modify to your needs!
*/
class Version20161024212538 extends AbstractMigration implements ContainerAwareInterface
{
/**
* @var ContainerInterface
*/
private $container;
public function setContainer(ContainerInterface $container = null)
{
$this->container = $container;
}
private function getTable($tableName)
{
return $this->container->getParameter('database_table_prefix') . $tableName;
}
/**
* @param Schema $schema
*/
public function up(Schema $schema)
{
$this->skipIf($this->connection->getDatabasePlatform()->getName() == 'sqlite', 'Migration can only be executed safely on \'mysql\' or \'postgresql\'.');
$this->addSql('ALTER TABLE '.$this->getTable('oauth2_clients').' ADD CONSTRAINT FK_clients_user_clients FOREIGN KEY (user_id) REFERENCES '.$this->getTable('user').' (id) ON DELETE CASCADE');
}
/**
* @param Schema $schema
*/
public function down(Schema $schema)
{
}
}

View file

@ -19,7 +19,7 @@ class DeveloperController extends Controller
*/
public function indexAction()
{
$clients = $this->getDoctrine()->getRepository('WallabagApiBundle:Client')->findAll();
$clients = $this->getDoctrine()->getRepository('WallabagApiBundle:Client')->findByUser($this->getUser()->getId());
return $this->render('@WallabagCore/themes/common/Developer/index.html.twig', [
'clients' => $clients,
@ -38,7 +38,7 @@ class DeveloperController extends Controller
public function createClientAction(Request $request)
{
$em = $this->getDoctrine()->getManager();
$client = new Client();
$client = new Client($this->getUser());
$clientForm = $this->createForm(ClientType::class, $client);
$clientForm->handleRequest($request);
@ -75,6 +75,10 @@ class DeveloperController extends Controller
*/
public function deleteClientAction(Client $client)
{
if (null === $this->getUser() || $client->getUser()->getId() != $this->getUser()->getId()) {
throw $this->createAccessDeniedException('You can not access this client.');
}
$em = $this->getDoctrine()->getManager();
$em->remove($client);
$em->flush();

View file

@ -4,6 +4,7 @@ namespace Wallabag\ApiBundle\Entity;
use Doctrine\ORM\Mapping as ORM;
use FOS\OAuthServerBundle\Entity\Client as BaseClient;
use Wallabag\UserBundle\Entity\User;
/**
* @ORM\Table("oauth2_clients")
@ -35,9 +36,15 @@ class Client extends BaseClient
*/
protected $accessTokens;
public function __construct()
/**
* @ORM\ManyToOne(targetEntity="Wallabag\UserBundle\Entity\User", inversedBy="clients")
*/
private $user;
public function __construct(User $user)
{
parent::__construct();
$this->user = $user;
}
/**
@ -63,4 +70,12 @@ class Client extends BaseClient
return $this;
}
/**
* @return User
*/
public function getUser()
{
return $this->user;
}
}

View file

@ -11,6 +11,7 @@ use JMS\Serializer\Annotation\ExclusionPolicy;
use JMS\Serializer\Annotation\Expose;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Security\Core\User\UserInterface;
use Wallabag\ApiBundle\Entity\Client;
use Wallabag\CoreBundle\Entity\Config;
use Wallabag\CoreBundle\Entity\Entry;
@ -84,6 +85,11 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf
*/
private $trusted;
/**
* @ORM\OneToMany(targetEntity="Wallabag\ApiBundle\Entity\Client", mappedBy="user", cascade={"remove"})
*/
protected $clients;
public function __construct()
{
parent::__construct();
@ -240,4 +246,24 @@ class User extends BaseUser implements TwoFactorInterface, TrustedComputerInterf
return false;
}
/**
* @param Client $client
*
* @return User
*/
public function addClient(Client $client)
{
$this->clients[] = $client;
return $this;
}
/**
* @return ArrayCollection<Entry>
*/
public function getClients()
{
return $this->clients;
}
}