mirror of
https://github.com/alchemy-fr/Phraseanet.git
synced 2025-10-10 19:43:16 +00:00
140 lines
5.5 KiB
PHP
140 lines
5.5 KiB
PHP
<?php
|
|
|
|
/*
|
|
* This file is part of Phraseanet
|
|
*
|
|
* (c) 2005-2013 Alchemy
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
namespace Alchemy\Phrasea\Command;
|
|
|
|
use Alchemy\Phrasea\Command\Command;
|
|
use Alchemy\Phrasea\Border\File;
|
|
use Alchemy\Phrasea\Border\Manager;
|
|
use Alchemy\Phrasea\Model\Entities\LazaretFile;
|
|
use Alchemy\Phrasea\Model\Entities\LazaretSession;
|
|
use Symfony\Component\Console\Input\InputArgument;
|
|
use Symfony\Component\Console\Input\InputOption;
|
|
use Symfony\Component\Console\Input\InputInterface;
|
|
use Symfony\Component\Console\Output\OutputInterface;
|
|
|
|
/**
|
|
* Create a record command
|
|
*
|
|
* @license http://opensource.org/licenses/gpl-3.0 GPLv3
|
|
* @link www.phraseanet.com
|
|
*/
|
|
class RecordAdd extends Command
|
|
{
|
|
/**
|
|
* Constructor
|
|
*/
|
|
public function __construct($name = null)
|
|
{
|
|
parent::__construct($name);
|
|
|
|
$this->setDescription('Adds a record to Phraseanet')
|
|
->setHelp('')
|
|
->addArgument('base_id', InputArgument::REQUIRED, 'The target collection id', null)
|
|
->addArgument('file', InputArgument::REQUIRED, 'The file to archive', null)
|
|
->addOption('force', 'f', InputOption::VALUE_OPTIONAL, 'Force a behavior (record|quarantine)', 'record')
|
|
->addOption('yes', 'y', InputOption::VALUE_NONE, 'Answer yes to all questions')
|
|
->addOption('in-place', 'i', InputOption::VALUE_NONE, 'Set this flag to archive record in place. When record is added, it is copied to a temporary folder and file has some metadatas written. If you choose to archive in place, please be warned that the file will be updated (UUID will be written in it)');
|
|
|
|
return $this;
|
|
}
|
|
|
|
protected function doExecute(InputInterface $input, OutputInterface $output)
|
|
{
|
|
try {
|
|
$collection = \collection::get_from_base_id($this->container, $input->getArgument('base_id'));
|
|
} catch (\Exception $e) {
|
|
throw new \InvalidArgumentException(sprintf('Collection %s is invalid', $input->getArgument('base_id')));
|
|
}
|
|
|
|
$file = $input->getArgument('file');
|
|
|
|
if (false === $this->container['filesystem']->exists($file)) {
|
|
throw new \InvalidArgumentException(sprintf('File %s does not exists', $file));
|
|
}
|
|
|
|
$media = $this->container['mediavorus']->guess($file);
|
|
|
|
$dialog = $this->getHelperSet()->get('dialog');
|
|
|
|
if (!$input->getOption('yes')) {
|
|
do {
|
|
$continue = strtolower($dialog->ask($output, sprintf("Will add record <info>%s</info> (%s) on collection <info>%s</info>\n<question>Continue ? (y/N)</question>", $file, $media->getType(), $collection->get_label($this->container['locale.I18n'])), 'N'));
|
|
} while ( ! in_array($continue, array('y', 'n')));
|
|
|
|
if (strtolower($continue) !== 'y') {
|
|
$output->writeln('Aborted !');
|
|
|
|
return;
|
|
}
|
|
}
|
|
|
|
$tempfile = $originalName = null;
|
|
|
|
if ($input->getOption('in-place') !== '1') {
|
|
$originalName = pathinfo($file, PATHINFO_BASENAME);
|
|
$tempfile = $this->container['temporary-filesystem']->createTemporaryFile('add_record', null, pathinfo($file, PATHINFO_EXTENSION));
|
|
$this->container['monolog']->addInfo(sprintf('copy file from `%s` to temporary `%s`', $file, $tempfile));
|
|
$this->container['filesystem']->copy($file, $tempfile, true);
|
|
$file = $tempfile;
|
|
$media = $this->container['mediavorus']->guess($file);
|
|
}
|
|
|
|
$file = new File($this->container, $media, $collection, $originalName);
|
|
$session = new LazaretSession();
|
|
$this->container['EM']->persist($session);
|
|
|
|
$forceBehavior = null;
|
|
|
|
if ($input->getOption('force')) {
|
|
switch ($input->getOption('force')) {
|
|
default:
|
|
$this->container['temporary-filesystem']->clean('add_record');
|
|
throw new \InvalidArgumentException(sprintf('`%s` is not a valid force option', $input->getOption('force')));
|
|
break;
|
|
case 'record':
|
|
$forceBehavior = Manager::FORCE_RECORD;
|
|
break;
|
|
case 'quarantine':
|
|
$forceBehavior = Manager::FORCE_LAZARET;
|
|
break;
|
|
}
|
|
}
|
|
|
|
$elementCreated = null;
|
|
$callback = function ($element, $visa, $code) use (&$elementCreated) {
|
|
$elementCreated = $element;
|
|
};
|
|
|
|
$this->container['border-manager']->process($session, $file, $callback, $forceBehavior);
|
|
|
|
if ($elementCreated instanceof \record_adapter) {
|
|
$output->writeln(
|
|
sprintf(
|
|
"Record id <info>%d</info> on collection `%s` (databox `%s`) has been created", $elementCreated->get_record_id(), $elementCreated->get_collection()->get_label($this->container['locale.I18n']), $elementCreated->get_databox()->get_label($this->container['locale.I18n'])
|
|
)
|
|
);
|
|
$this->container['phraseanet.SE']->addRecord($elementCreated);
|
|
} elseif ($elementCreated instanceof LazaretFile) {
|
|
$output->writeln(
|
|
sprintf("Quarantine item id <info>%d</info> has been created", $elementCreated->getId())
|
|
);
|
|
}
|
|
|
|
if ($tempfile) {
|
|
$this->container['monolog']->addInfo(sprintf('Remove temporary file `%s`', $tempfile));
|
|
$this->container['temporary-filesystem']->clean('add_record');
|
|
}
|
|
|
|
return;
|
|
}
|
|
}
|