mirror of
https://github.com/alchemy-fr/Phraseanet.git
synced 2025-10-15 14:03:27 +00:00
Add cascade delete on ApiLog accountId.
Also add a postConnect listener to enable foreign keys in sqlite
This commit is contained in:
@@ -83,6 +83,9 @@ use Alchemy\Phrasea\Twig\JSUniqueID;
|
|||||||
use Alchemy\Phrasea\Twig\PhraseanetExtension;
|
use Alchemy\Phrasea\Twig\PhraseanetExtension;
|
||||||
use Alchemy\Phrasea\Utilities\CachedTranslator;
|
use Alchemy\Phrasea\Utilities\CachedTranslator;
|
||||||
use Dflydev\Silex\Provider\DoctrineOrm\DoctrineOrmServiceProvider;
|
use Dflydev\Silex\Provider\DoctrineOrm\DoctrineOrmServiceProvider;
|
||||||
|
use Doctrine\Common\EventManager;
|
||||||
|
use Doctrine\DBAL\Event\ConnectionEventArgs;
|
||||||
|
use Doctrine\DBAL\Events;
|
||||||
use Doctrine\ORM\Configuration;
|
use Doctrine\ORM\Configuration;
|
||||||
use FFMpeg\FFMpegServiceProvider;
|
use FFMpeg\FFMpegServiceProvider;
|
||||||
use Gedmo\DoctrineExtensions as GedmoExtension;
|
use Gedmo\DoctrineExtensions as GedmoExtension;
|
||||||
@@ -1012,13 +1015,28 @@ class Application extends SilexApplication
|
|||||||
|
|
||||||
$this['dbs.event_manager'] = $this->share($this->extend('dbs.event_manager', function ($eventManagers, $app) {
|
$this['dbs.event_manager'] = $this->share($this->extend('dbs.event_manager', function ($eventManagers, $app) {
|
||||||
foreach ($eventManagers->keys() as $name) {
|
foreach ($eventManagers->keys() as $name) {
|
||||||
$app['dbal.evm.register.listeners']($eventManagers[$name]);
|
/** @var EventManager $eventManager */
|
||||||
|
$eventManager = $eventManagers[$name];
|
||||||
|
$app['dbal.evm.register.listeners']($eventManager);
|
||||||
|
|
||||||
|
$eventManager->addEventListener(Events::postConnect, $this);
|
||||||
}
|
}
|
||||||
|
|
||||||
return $eventManagers;
|
return $eventManagers;
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param ConnectionEventArgs $args
|
||||||
|
* @throws \Doctrine\DBAL\DBALException
|
||||||
|
*/
|
||||||
|
public function postConnect(ConnectionEventArgs $args)
|
||||||
|
{
|
||||||
|
if ('sqlite' == $args->getDatabasePlatform()->getName()) {
|
||||||
|
$args->getConnection()->exec('PRAGMA foreign_keys = ON');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private function setupMediaAlchemyst()
|
private function setupMediaAlchemyst()
|
||||||
{
|
{
|
||||||
$this['media-alchemyst.configuration'] = $this->share(function (Application $app) {
|
$this['media-alchemyst.configuration'] = $this->share(function (Application $app) {
|
||||||
|
@@ -16,7 +16,7 @@ class Version
|
|||||||
/**
|
/**
|
||||||
* @var string
|
* @var string
|
||||||
*/
|
*/
|
||||||
private $number = '4.0.0-alpha.3';
|
private $number = '4.0.0-alpha.4';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var string
|
* @var string
|
||||||
|
@@ -28,7 +28,12 @@ class ApiLog
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @ORM\ManyToOne(targetEntity="ApiAccount")
|
* @ORM\ManyToOne(targetEntity="ApiAccount")
|
||||||
* @ORM\JoinColumn(name="account_id", referencedColumnName="id", nullable=false)
|
* @ORM\JoinColumn(
|
||||||
|
* name="account_id",
|
||||||
|
* referencedColumnName="id",
|
||||||
|
* nullable=false,
|
||||||
|
* onDelete="CASCADE"
|
||||||
|
* )
|
||||||
*
|
*
|
||||||
* @return ApiAccount
|
* @return ApiAccount
|
||||||
**/
|
**/
|
||||||
|
@@ -0,0 +1,36 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Alchemy\Phrasea\Setup\DoctrineMigrations;
|
||||||
|
|
||||||
|
use Doctrine\DBAL\Migrations\AbstractMigration;
|
||||||
|
use Doctrine\DBAL\Schema\Schema;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Auto-generated Migration: Please modify to your needs!
|
||||||
|
*/
|
||||||
|
class Version20151209101524 extends AbstractMigration
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* @param Schema $schema
|
||||||
|
*/
|
||||||
|
public function up(Schema $schema)
|
||||||
|
{
|
||||||
|
// this up() migration is auto-generated, please modify it to your needs
|
||||||
|
$this->abortIf($this->connection->getDatabasePlatform()->getName() != 'mysql', 'Migration can only be executed safely on \'mysql\'.');
|
||||||
|
|
||||||
|
$this->addSql('ALTER TABLE ApiLogs DROP FOREIGN KEY FK_91E90F309B6B5FBA');
|
||||||
|
$this->addSql('ALTER TABLE ApiLogs ADD CONSTRAINT FK_91E90F309B6B5FBA FOREIGN KEY (account_id) REFERENCES ApiAccounts (id) ON DELETE CASCADE');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @param Schema $schema
|
||||||
|
*/
|
||||||
|
public function down(Schema $schema)
|
||||||
|
{
|
||||||
|
// this down() migration is auto-generated, please modify it to your needs
|
||||||
|
$this->abortIf($this->connection->getDatabasePlatform()->getName() != 'mysql', 'Migration can only be executed safely on \'mysql\'.');
|
||||||
|
|
||||||
|
$this->addSql('ALTER TABLE ApiLogs DROP FOREIGN KEY FK_91E90F309B6B5FBA');
|
||||||
|
$this->addSql('ALTER TABLE ApiLogs ADD CONSTRAINT FK_91E90F309B6B5FBA FOREIGN KEY (account_id) REFERENCES ApiAccounts (id)');
|
||||||
|
}
|
||||||
|
}
|
64
lib/classes/patch/400alpha4a.php
Normal file
64
lib/classes/patch/400alpha4a.php
Normal file
@@ -0,0 +1,64 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This file is part of Phraseanet
|
||||||
|
*
|
||||||
|
* (c) 2005-2015 Alchemy
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
|
||||||
|
use Alchemy\Phrasea\Application;
|
||||||
|
use Alchemy\Phrasea\Core\Configuration\PropertyAccess;
|
||||||
|
|
||||||
|
class patch_400alpha4a implements patchInterface
|
||||||
|
{
|
||||||
|
/** @var string */
|
||||||
|
private $release = '4.0.0-alpha.4';
|
||||||
|
|
||||||
|
/** @var array */
|
||||||
|
private $concern = [base::APPLICATION_BOX];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function get_release()
|
||||||
|
{
|
||||||
|
return $this->release;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function getDoctrineMigrations()
|
||||||
|
{
|
||||||
|
return [
|
||||||
|
'20151209101524'
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function require_all_upgrades()
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function concern()
|
||||||
|
{
|
||||||
|
return $this->concern;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* {@inheritdoc}
|
||||||
|
*/
|
||||||
|
public function apply(base $databox, Application $app)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
98
tests/Alchemy/Tests/Phrasea/Functional/UserDeletionTest.php
Normal file
98
tests/Alchemy/Tests/Phrasea/Functional/UserDeletionTest.php
Normal file
@@ -0,0 +1,98 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* This file is part of Phraseanet
|
||||||
|
*
|
||||||
|
* (c) 2005-2015 Alchemy
|
||||||
|
*
|
||||||
|
* For the full copyright and license information, please view the LICENSE
|
||||||
|
* file that was distributed with this source code.
|
||||||
|
*/
|
||||||
|
namespace Alchemy\Tests\Phrasea\Functional;
|
||||||
|
use Alchemy\Phrasea\Model\Entities\ApiAccount;
|
||||||
|
use Alchemy\Phrasea\Model\Entities\ApiApplication;
|
||||||
|
use Alchemy\Phrasea\Model\Entities\User;
|
||||||
|
use Alchemy\Phrasea\Model\Manipulator\ApiAccountManipulator;
|
||||||
|
use Alchemy\Phrasea\Model\Manipulator\ApiApplicationManipulator;
|
||||||
|
use Alchemy\Phrasea\Model\Manipulator\ApiLogManipulator;
|
||||||
|
use Alchemy\Phrasea\Model\Manipulator\UserManipulator;
|
||||||
|
use Alchemy\Phrasea\Model\Repositories\ApiLogRepository;
|
||||||
|
use Symfony\Component\HttpFoundation\Request;
|
||||||
|
use Symfony\Component\HttpFoundation\Response;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @group functional
|
||||||
|
* @group authenticated
|
||||||
|
* @group web
|
||||||
|
*/
|
||||||
|
class UserDeletionTest extends \PhraseanetAuthenticatedWebTestCase
|
||||||
|
{
|
||||||
|
/** @var UserManipulator */
|
||||||
|
private $userManipulator;
|
||||||
|
/** @var User */
|
||||||
|
private $user;
|
||||||
|
/** @var ApiApplicationManipulator */
|
||||||
|
private $apiApplicationManipulator;
|
||||||
|
/** @var ApiApplication */
|
||||||
|
private $apiApplication;
|
||||||
|
|
||||||
|
public function setUp()
|
||||||
|
{
|
||||||
|
parent::setUp();
|
||||||
|
|
||||||
|
$app = $this->getApplication();
|
||||||
|
|
||||||
|
$this->userManipulator = $app['manipulator.user'];
|
||||||
|
|
||||||
|
$this->user = $this->userManipulator->createUser('login', "test", 'test@example.com');
|
||||||
|
|
||||||
|
$this->apiApplicationManipulator = $app['manipulator.api-application'];
|
||||||
|
|
||||||
|
$this->apiApplication = $this->apiApplicationManipulator->create(
|
||||||
|
'test-desktop',
|
||||||
|
ApiApplication::WEB_TYPE,
|
||||||
|
'',
|
||||||
|
'http://website.com/',
|
||||||
|
$this->user,
|
||||||
|
'http://callback.com/callback/'
|
||||||
|
);
|
||||||
|
$this->apiApplication->setGrantPassword(true);
|
||||||
|
$this->apiApplicationManipulator->update($this->apiApplication);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function testRemoveUserWhichLoggedViaOAuthDoesNotThrowException()
|
||||||
|
{
|
||||||
|
$app = $this->getApplication();
|
||||||
|
/** @var ApiLogManipulator $apiLogManipulator */
|
||||||
|
$apiLogManipulator = $app['manipulator.api-log'];
|
||||||
|
/** @var ApiLogRepository $apiLogRepository */
|
||||||
|
$apiLogRepository = $app['repo.api-logs'];
|
||||||
|
/** @var ApiAccountManipulator $apiAccountManipulator */
|
||||||
|
$apiAccountManipulator = $app['manipulator.api-account'];
|
||||||
|
|
||||||
|
$account = $apiAccountManipulator->create($this->apiApplication, $this->user);
|
||||||
|
$this->assertInstanceOf(ApiAccount::class, $account);
|
||||||
|
|
||||||
|
$apiLog = $apiLogManipulator->create($account, new Request(), new Response());
|
||||||
|
$apiLogId = $apiLog->getId();
|
||||||
|
|
||||||
|
$this->userManipulator->delete($this->user);
|
||||||
|
$this->assertTrue($this->user->isDeleted(), 'User was not properly deleted');
|
||||||
|
|
||||||
|
$apiLogRepository->clear();
|
||||||
|
$this->assertNull($apiLogRepository->find($apiLogId), 'Created api log should have been deleted');
|
||||||
|
$this->user = null;
|
||||||
|
$this->apiApplication = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function tearDown()
|
||||||
|
{
|
||||||
|
if ($this->apiApplication) {
|
||||||
|
$this->apiApplicationManipulator->delete($this->apiApplication);
|
||||||
|
}
|
||||||
|
if ($this->user) {
|
||||||
|
$this->userManipulator->delete($this->user);
|
||||||
|
}
|
||||||
|
|
||||||
|
parent::tearDown();
|
||||||
|
}
|
||||||
|
}
|
Reference in New Issue
Block a user