Files
Phraseanet/lib/classes/appbox.php
2015-07-08 13:46:17 +02:00

305 lines
9.2 KiB
PHP

<?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\AccessRestriction;
use Alchemy\Phrasea\Core\Connection\ConnectionSettings;
use Alchemy\Phrasea\Core\Version\AppboxVersionRepository;
use Alchemy\Phrasea\Databox\DataboxRepositoryInterface;
use Doctrine\ORM\Tools\SchemaTool;
use MediaAlchemyst\Alchemyst;
use MediaAlchemyst\Specification\Image as ImageSpecification;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\File\File as SymfoFile;
use Symfony\Component\Finder\Finder;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use vierbergenlars\SemVer\version;
class appbox extends base
{
/**
* constant defining the app type
*/
const BASE_TYPE = self::APPLICATION_BOX;
const CACHE_LIST_BASES = 'list_bases';
const CACHE_SBAS_IDS = 'sbas_ids';
/**
* @var int
*/
protected $id;
/**
* @var \databox[]
*/
protected $databoxes;
public function __construct(Application $app)
{
$connectionConfig = $app['conf']->get(['main', 'database']);
$connection = $app['db.provider']($connectionConfig);
$connectionSettings = new ConnectionSettings(
$connectionConfig['host'],
$connectionConfig['port'],
$connectionConfig['dbname'],
$connectionConfig['user'],
$connectionConfig['password']
);
$versionRepository = new AppboxVersionRepository($connection);
parent::__construct($app, $connection, $connectionSettings, $versionRepository);
}
public function write_collection_pic(Alchemyst $alchemyst, Filesystem $filesystem, collection $collection, SymfoFile $pathfile = null, $pic_type)
{
$manager = new \Alchemy\Phrasea\Core\Thumbnail\CollectionThumbnailManager(
$this->app,
$alchemyst,
$filesystem,
$this->app['root.path']
);
$manager->setThumbnail($collection, $pic_type, $pathfile);
return $this;
}
public function write_databox_pic(Alchemyst $alchemyst, Filesystem $filesystem, databox $databox, SymfoFile $pathfile = null, $pic_type)
{
$manager = new \Alchemy\Phrasea\Core\Thumbnail\DataboxThumbnailManager(
$this->app,
$alchemyst,
$filesystem,
$this->app['root.path']
);
$manager->setThumbnail($databox, $pic_type, $pathfile);
return $this;
}
/**
*
* @param collection $collection
* @param <type> $ordre
* @return appbox
*/
public function set_collection_order(collection $collection, $ordre)
{
$sqlupd = "UPDATE bas SET ord = :ordre WHERE base_id = :base_id";
$stmt = $this->get_connection()->prepare($sqlupd);
$stmt->execute([':ordre' => $ordre, ':base_id' => $collection->get_base_id()]);
$stmt->closeCursor();
$collection->get_databox()->delete_data_from_cache(\databox::CACHE_COLLECTIONS);
return $this;
}
/**
* @param databox $databox
* @param bool $boolean
* @return appbox
*/
public function set_databox_indexable(databox $databox, $boolean)
{
$boolean = !!$boolean;
$sql = 'UPDATE sbas SET indexable = :indexable WHERE sbas_id = :sbas_id';
$stmt = $this->get_connection()->prepare($sql);
$stmt->execute([
':indexable' => ($boolean ? '1' : '0'),
':sbas_id' => $databox->get_sbas_id()
]);
$stmt->closeCursor();
return $this;
}
/**
* @param databox $databox
* @return bool
*/
public function is_databox_indexable(databox $databox)
{
$sql = 'SELECT indexable FROM sbas WHERE sbas_id = :sbas_id';
$stmt = $this->get_connection()->prepare($sql);
$stmt->execute([':sbas_id' => $databox->get_sbas_id()]);
$row = $stmt->fetch(PDO::FETCH_ASSOC);
$stmt->closeCursor();
$indexable = $row ? $row['indexable'] : null;
return (Boolean) $indexable;
}
/**
* @return string
*/
public function get_base_type()
{
return self::BASE_TYPE;
}
public function forceUpgrade(Setup_Upgrade $upgrader, Application $app)
{
$from_version = $this->get_version();
$app['phraseanet.cache-service']->flushAll();
// Executes stuff before applying patches
$app['phraseanet.pre-schema-upgrader']->apply($app);
$finder = new Finder();
$in = [];
$path = $app['cache.path'];
$in[] = $path.'/minify/';
$in[] = $path.'/twig/';
$in[] = $path.'/translations/';
$in[] = $path.'/profiler/';
$in[] = $path.'/doctrine/';
$in[] = $path.'/serializer/';
$finder->in(array_filter($in, function($path) {
return is_dir($path);
}))
->depth(0)
->ignoreVCS(true)
->ignoreDotFiles(true);
$app['filesystem']->remove($finder);
foreach ([
'config/custom_files/' => 'www/custom/',
'config/minilogos/' => 'www/custom/minilogos/',
'config/stamp/' => 'www/custom/stamp/',
'config/status/' => 'www/custom/status/',
'config/wm/' => 'www/custom/wm/',
] as $source => $target) {
$app['filesystem']->mirror($this->app['root.path'] . '/' . $source, $this->app['root.path'] . '/' . $target, null, array('override' => true));
}
// do not apply patches
// just update old database schema
// it is need before applying patches
$advices = $this->upgradeDB(false, $app);
foreach ($this->get_databoxes() as $s) {
$advices = array_merge($advices, $s->upgradeDB(false, $app));
}
// then apply patches
$advices = $this->upgradeDB(true, $app);
foreach ($this->get_databoxes() as $s) {
$advices = array_merge($advices, $s->upgradeDB(true, $app));
}
$this->post_upgrade($app);
$app['phraseanet.cache-service']->flushAll();
if ($app['orm.em']->getConnection()->getDatabasePlatform()->supportsAlterTable()) {
$tool = new SchemaTool($app['orm.em']);
$metas = $app['orm.em']->getMetadataFactory()->getAllMetadata();
$tool->updateSchema($metas, true);
}
if (version::lt($from_version, '3.1')) {
$upgrader->addRecommendation($app->trans('Your install requires data migration, please execute the following command'), 'bin/setup system:upgrade-datas --from=3.1');
} elseif (version::lt($from_version, '3.5')) {
$upgrader->addRecommendation($app->trans('Your install requires data migration, please execute the following command'), 'bin/setup system:upgrade-datas --from=3.5');
}
if (version::lt($from_version, '3.7')) {
$upgrader->addRecommendation($app->trans('Your install might need to re-read technical datas'), 'bin/console records:rescan-technical-datas');
$upgrader->addRecommendation($app->trans('Your install might need to build some sub-definitions'), 'bin/console records:build-missing-subdefs');
}
return $advices;
}
protected function post_upgrade(Application $app)
{
$this->apply_patches($this->get_version(), $app['phraseanet.version']->getNumber(), true, $app);
$this->setVersion($app['phraseanet.version']);
foreach ($this->get_databoxes() as $databox) {
$databox->apply_patches($databox->get_version(), $app['phraseanet.version']->getNumber(), true, $app);
$databox->setVersion($app['phraseanet.version']);
}
return $this;
}
/**
* @return databox[]
*/
public function get_databoxes()
{
if (!$this->databoxes) {
$this->databoxes = $this->getAccessRestriction()
->filterAvailableDataboxes($this->getDataboxRepository()->findAll());
}
return $this->databoxes;
}
public function get_databox($sbas_id)
{
$databoxes = $this->get_databoxes();
if (!isset($databoxes[$sbas_id]) && !array_key_exists($sbas_id, $databoxes)) {
throw new NotFoundHttpException('Databox `' . $sbas_id . '` not found');
}
return $databoxes[$sbas_id];
}
/**
* @param string $option
* @return string
*/
public function get_cache_key($option = null)
{
return 'appbox_' . ($option ? $option . '_' : '');
}
public function delete_data_from_cache($option = null)
{
if ($option === appbox::CACHE_LIST_BASES) {
$this->databoxes = null;
}
parent::delete_data_from_cache($option);
}
/**
* @return AccessRestriction
*/
private function getAccessRestriction()
{
return $this->app['conf.restrictions'];
}
/**
* @return DataboxRepositoryInterface
*/
private function getDataboxRepository()
{
return $this->app['repo.databoxes'];
}
}