diff --git a/lib/Alchemy/Phrasea/Command/Report/AbstractReportCommand.php b/lib/Alchemy/Phrasea/Command/Report/AbstractReportCommand.php index 94955009f9..af7486430d 100644 --- a/lib/Alchemy/Phrasea/Command/Report/AbstractReportCommand.php +++ b/lib/Alchemy/Phrasea/Command/Report/AbstractReportCommand.php @@ -37,7 +37,7 @@ abstract class AbstractReportCommand extends Command ->addOption('email', null, InputOption::VALUE_REQUIRED | InputOption::VALUE_IS_ARRAY ,'emails to send the report') ->addOption('dmin', null, InputOption::VALUE_REQUIRED, 'minimum date yyyy-mm-dd') ->addOption('dmax', null, InputOption::VALUE_REQUIRED, 'maximum date yyyy-mm-dd, until today if not set') - ->addOption('range', null, InputOption::VALUE_REQUIRED, "period range until now eg: '10 days', '2 weeks', '6 months', ' 1 year'") + ->addOption('range', null, InputOption::VALUE_REQUIRED, "period range until now eg: '10 days', '2 weeks', '6 months', '2 years'") ; } diff --git a/lib/Alchemy/Phrasea/Command/Report/DataboxContentCommand.php b/lib/Alchemy/Phrasea/Command/Report/DataboxContentCommand.php index f55bd5eee3..ebd65f52a9 100644 --- a/lib/Alchemy/Phrasea/Command/Report/DataboxContentCommand.php +++ b/lib/Alchemy/Phrasea/Command/Report/DataboxContentCommand.php @@ -17,9 +17,12 @@ class DataboxContentCommand extends AbstractReportCommand ->setDescription('BETA - Get all databox records') ->addOption('collection_id', 'c', InputOption::VALUE_REQUIRED| InputOption::VALUE_IS_ARRAY, 'Distant collection ID in the databox, get all available collection if not defined') ->addOption('field', 'f', InputOption::VALUE_REQUIRED| InputOption::VALUE_IS_ARRAY, 'The field name to include in the report, get all available report field if not defined') + ->addOption('permalink', 'p', InputOption::VALUE_REQUIRED, 'the subdefinition name to retrieve permalink if exist') ->setHelp( "eg: bin/report databox:content --databox_id 2 --email 'admin@alchemy.fr' --dmin '2022-12-01' --dmax '2023-01-01' \n" + . "\ \ date filter on the updated_on (moddate of table record)" + ); } @@ -63,6 +66,7 @@ class DataboxContentCommand extends AbstractReportCommand ] )) ->setCollIds($collIds) + ->setPermalink($input->getOption('permalink')) ; } } diff --git a/lib/Alchemy/Phrasea/Command/Report/DownloadsCommand.php b/lib/Alchemy/Phrasea/Command/Report/DownloadsCommand.php index 97234991e1..377dd7c6aa 100644 --- a/lib/Alchemy/Phrasea/Command/Report/DownloadsCommand.php +++ b/lib/Alchemy/Phrasea/Command/Report/DownloadsCommand.php @@ -2,7 +2,6 @@ namespace Alchemy\Phrasea\Command\Report; -use Alchemy\Phrasea\Report\Report; use Alchemy\Phrasea\Report\ReportDownloads; use Symfony\Component\Console\Input\InputInterface; use Symfony\Component\Console\Input\InputOption; @@ -20,6 +19,7 @@ class DownloadsCommand extends AbstractReportCommand ->setDescription('BETA - Get all downloads report') ->addOption('type', null, InputOption::VALUE_REQUIRED, 'type of report downloads, if not defined or empty it is for all downloads') ->addOption('collection_id', 'c', InputOption::VALUE_REQUIRED| InputOption::VALUE_IS_ARRAY, 'Distant collection ID in the databox, get all available collection if not defined') + ->addOption('permalink', 'p', InputOption::VALUE_REQUIRED, 'the subdefinition name to retrieve permalink if exist, available only for type record and for all downloads type ""') ->setHelp( "eg: bin/report downloads:all --databox_id 2 --email 'admin@alchemy.fr' --dmin '2022-12-01' --dmax '2023-01-01' --type 'user' \n" @@ -37,6 +37,7 @@ class DownloadsCommand extends AbstractReportCommand { $type = $input->getOption('type'); $collectionIds = $input->getOption('collection_id'); + $permalink = $input->getOption('permalink'); if (!empty($type) && !in_array($type, self::TYPES)) { $output->writeln("wrong '--type' option (--help for available value)"); @@ -44,6 +45,12 @@ class DownloadsCommand extends AbstractReportCommand return 1; } + if (!empty($permalink) && $type == 'user') { + $output->writeln("--permalink is not used with type=user "); + + return 1; + } + $databox = $this->findDbOr404($this->sbasId); $collIds = []; @@ -71,6 +78,7 @@ class DownloadsCommand extends AbstractReportCommand )) ->setAppKey($this->container['conf']->get(['main', 'key'])) ->setCollIds($collIds) + ->setPermalink($permalink) ; } } diff --git a/lib/Alchemy/Phrasea/Report/ReportDownloads.php b/lib/Alchemy/Phrasea/Report/ReportDownloads.php index 7362632b90..88a616930e 100644 --- a/lib/Alchemy/Phrasea/Report/ReportDownloads.php +++ b/lib/Alchemy/Phrasea/Report/ReportDownloads.php @@ -22,6 +22,7 @@ class ReportDownloads extends Report private $acl; private $collIds = null; + private $permalink = null; /* those vars will be set once by computeVars() */ private $name = null; @@ -33,6 +34,11 @@ class ReportDownloads extends Report public function getColumnTitles() { $this->computeVars(); + // only for group downloads all and download by record + if (($this->parms['group'] === null || $this->parms['group'] == 'record') && !empty($this->permalink)) { + $this->columnTitles[] = 'permalink_' . $this->permalink; + } + return $this->columnTitles; } @@ -69,11 +75,30 @@ class ReportDownloads extends Report return $this; } + public function setPermalink($permalink) + { + $this->permalink = $permalink; + + return $this; + } + public function getAllRows($callback) { $this->computeVars(); $stmt = $this->databox->get_connection()->executeQuery($this->sql, []); while (($row = $stmt->fetch())) { + // only for group downloads all and download by record + if (($this->parms['group'] === null || $this->parms['group'] == 'record') && !empty($this->permalink)) { + try { + $record = $this->databox->get_record($row['record_id']); + $permalinkUrl = $record->get_subdef($this->permalink)->get_permalink()->get_url()->__toString(); + } catch (\Exception $e) { + // the record or subdef is not found + $permalinkUrl = ''; + } + $row['permalink_' . $this->permalink] = $permalinkUrl; + } + $callback($row); } $stmt->closeCursor(); diff --git a/lib/Alchemy/Phrasea/Report/ReportRecords.php b/lib/Alchemy/Phrasea/Report/ReportRecords.php index e65c52ac38..5fe8f080f0 100644 --- a/lib/Alchemy/Phrasea/Report/ReportRecords.php +++ b/lib/Alchemy/Phrasea/Report/ReportRecords.php @@ -23,11 +23,16 @@ class ReportRecords extends Report private $sqlColSelect = null; private $columnTitles = null; private $keyName = null; + private $permalink = null; public function getColumnTitles() { $this->computeVars(); + if (!empty($this->permalink)) { + $this->columnTitles[] = 'permalink_' . $this->permalink; + } + return $this->columnTitles; } @@ -57,6 +62,13 @@ class ReportRecords extends Report return $this; } + public function setPermalink($permalink) + { + $this->permalink = $permalink; + + return $this; + } + public function getAllRows($callback) { $this->computeVars(); @@ -71,7 +83,7 @@ class ReportRecords extends Report $stmt->closeCursor(); if($row && !is_null($row['from']) && !is_null($row['to'])) { - $sql = "SELECT r.record_id, c.asciiname, r.moddate AS updated_on, r.credate AS created_on, r.mime, r.type, r.originalname,\n" + $sql = "SELECT r.record_id, c.asciiname, r.credate AS created_on, r.moddate AS updated_on, r.mime, r.type, r.originalname, r.status, r.sha256, r.uuid,\n" . $this->sqlColSelect . "\n" . "FROM (`record` AS `r` LEFT JOIN `coll` AS `c` USING(`coll_id`)) LEFT JOIN `metadatas` AS `m` USING(`record_id`)\n" . "WHERE " . $this->sqlWhere . "\n" @@ -82,6 +94,21 @@ class ReportRecords extends Report $rows = $stmt->fetchAll(); $stmt->closeCursor(); foreach($rows as $row) { + if (!empty($this->permalink)) { + try { + $record = $this->databox->get_record($row['record_id']); + $permalinkUrl = $record->get_subdef($this->permalink)->get_permalink()->get_url()->__toString(); + } catch (\Exception $e) { + // the record or subdef is not found + $permalinkUrl = ''; + } catch (\Throwable $e) { + // there is no permalink created ??? + $permalinkUrl = ''; + } + + $row['permalink_' . $this->permalink] = $permalinkUrl; + } + $callback($row); $lastRid = $row['record_id']; } @@ -101,7 +128,7 @@ class ReportRecords extends Report // pivot-like query on metadata fields $this->sqlColSelect = []; - $this->columnTitles = ['record_id', 'collection', 'updated_on', 'created_on', 'mime', 'type', 'originalname']; + $this->columnTitles = ['record_id', 'collection', 'created_on', 'updated_on', 'mime', 'type', 'originalname', 'status', 'sha256', 'uuid']; foreach($this->getDatabox()->get_meta_structure() as $field) { // skip the fields that can't be reported if(!$field->is_report() || (isset($this->acl) && $field->isBusiness() && !$this->acl->can_see_business_fields($this->getDatabox()))) {