Completed
Push — main ( 431d09...27fe00 )
by
unknown
26s queued 23s
created

UpdateMetadataCommand::execute()   B

Complexity

Conditions 6
Paths 22

Size

Total Lines 40
Code Lines 30

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
cc 6
eloc 30
c 2
b 0
f 0
nc 22
nop 2
dl 0
loc 40
rs 8.8177
1
<?php
2
declare(strict_types=1);
3
4
/**
5
 * BEdita Brevia plugin
6
 *
7
 * Copyright 2024 Atlas Srl
8
 */
9
namespace Brevia\BEdita\Command;
10
11
use Brevia\BEdita\Client\BreviaClient;
12
use Cake\Command\Command;
13
use Cake\Console\Arguments;
14
use Cake\Console\ConsoleIo;
15
use Cake\Console\ConsoleOptionParser;
16
use Cake\Log\LogTrait;
17
use Cake\Utility\Hash;
18
use Exception;
19
20
/**
21
 * Update metadata in collection contents
22
 *
23
 * @property \BEdita\Core\Model\Table\ObjectsTable $Collections
24
 */
25
class UpdateMetadataCommand extends Command
26
{
27
    use LogTrait;
28
29
    /**
30
     * Brevia API client
31
     *
32
     * @var \Brevia\BEdita\Client\BreviaClient
33
     */
34
    protected BreviaClient $client;
35
36
    /**
37
     * @inheritDoc
38
     */
39
    public $defaultTable = 'Collections';
40
41
    /**
42
     * @inheritDoc
43
     */
44
    protected function buildOptionParser(ConsoleOptionParser $parser): ConsoleOptionParser
45
    {
46
        return $parser->addOption('collection', [
47
                'help' => 'Collection to update (use the unique collection name)',
48
                'short' => 'c',
49
                'required' => true,
50
            ]);
51
    }
52
53
    /**
54
     * @inheritDoc
55
     */
56
    public function initialize(): void
57
    {
58
        $this->client = new BreviaClient();
59
    }
60
61
    /**
62
     * @inheritDoc
63
     */
64
    public function execute(Arguments $args, ConsoleIo $io)
65
    {
66
        $name = $args->getOption('collection');
67
        $response = $this->client->get('/collections', compact('name'));
68
        $collectionId = Hash::get($response->getJson(), '0.cmetadata.id');
69
        if (empty($collectionId)) {
70
            $io->abort(sprintf('Collection not found: %s', $name));
71
        }
72
        $collectionUuid = Hash::get($response->getJson(), '0.uuid');
73
        $collection = $this->Collections->get($collectionId, ['contain' => ['HasDocuments']]);
74
        $io->out('Start reindexing collection contents...');
75
        $documents = (array)$collection->get('has_documents');
76
        foreach ($documents as $doc) {
77
            if ($doc->get('type') !== 'files') {
78
                continue;
79
            }
80
            $this->log(sprintf('Updating [%s] "%s" - id: %s', $doc->get('type'), $doc->get('title'), $doc->id), 'info');
81
            try {
82
                $doc = $doc->getTable()->get($doc->id);
83
                $path = sprintf('/index/%s/%s', $collectionUuid, $doc->id);
84
                $response = $this->client->get($path);
85
                $metadata = (array)Hash::get((array)$response->getJson(), '0.cmetadata');
86
                if (!empty($metadata['url'])) {
87
                    continue;
88
                }
89
                $metadata['url'] = $doc->get('media_url');
90
                $this->client->post('/index/metadata', [
91
                    'collection_id' => $collectionUuid,
92
                    'document_id' => (string)$doc->id,
93
                    'metadata' => $metadata,
94
                ]);
95
            } catch (Exception $e) {
96
                $this->log(sprintf('Error updating [%s] "%s" - id: %s', $doc->get('type'), $doc->get('title'), $doc->id), 'error');
97
                $this->log($e->getMessage(), 'error');
98
            }
99
        }
100
101
        $io->out('Done');
102
103
        return null;
104
    }
105
}
106