149 lines
4.5 KiB
PHP
149 lines
4.5 KiB
PHP
<?php
|
|
|
|
namespace App\Services\BundleCreator\Creators;
|
|
|
|
use App\Classes\Bundle;
|
|
use App\Exceptions\BundleAlreadyExists;
|
|
use App\Services\Wikidata\WikidataClient;
|
|
use App\Services\Wikidata\WikidataExtractor;
|
|
use Exception;
|
|
use Illuminate\Filesystem\FilesystemAdapter;
|
|
use Illuminate\Support\Str;
|
|
|
|
use function Laravel\Prompts\confirm;
|
|
use function Laravel\Prompts\select;
|
|
use function Laravel\Prompts\text;
|
|
|
|
class CriticBundleCreator extends BaseBundleCreator
|
|
{
|
|
private static string $section = 'critiques';
|
|
|
|
public function __construct(protected ?array $data, protected FilesystemAdapter $disk)
|
|
{
|
|
//
|
|
}
|
|
|
|
/**
|
|
* Create a bundle
|
|
*/
|
|
public function createBundle(): string
|
|
{
|
|
$entityId = $this->data['entity_id'];
|
|
|
|
if ($entityId === false) {
|
|
throw new Exception('Bundle creation cancelled');
|
|
}
|
|
|
|
$kind = $this->data['kind'];
|
|
$title = $this->data['title'];
|
|
$slug = Str::slug($title);
|
|
$date = now();
|
|
$path = sprintf('%s/%s/%s', static::$section, $kind, $slug);
|
|
$bundle = new Bundle($path, $this->disk);
|
|
|
|
if ($bundle->exists()) {
|
|
throw new BundleAlreadyExists(
|
|
sprintf('A bundle already exists in %s', $path)
|
|
);
|
|
}
|
|
|
|
$wikidata = app()->make(WikidataClient::class);
|
|
$extractor = app()->make(WikidataExtractor::class);
|
|
$completeEntity = $wikidata->getEntityData($entityId, true)['entities'][$entityId];
|
|
|
|
$extractor->extract($completeEntity, $entityId);
|
|
|
|
$bundle->metadata('wikidata/included')->setMany($extractor->included());
|
|
$bundle->metadata('wikidata/excluded')->setMany($extractor->excluded());
|
|
$bundle->metadata('wikidata/unused')->setMany($extractor->unused());
|
|
$bundle->metadata('wikidata/entity')->setMany($extractor->everythingElse());
|
|
|
|
$frenchTitle = $bundle->metadata('wikidata/entity')->get('labels.fr.value', null);
|
|
$originalTitle = $bundle->metadata('wikidata/entity')->get('labels.en.value', null);
|
|
|
|
if (!empty($originalTitle)) {
|
|
$bundle->metadata()->set('title', $originalTitle);
|
|
|
|
if (!empty($frenchTitle) && $frenchTitle !== $originalTitle) {
|
|
$bundle->metadata()->set('subTitle', $frenchTitle);
|
|
}
|
|
}
|
|
|
|
$bundle->metadata()->setMany([
|
|
'date' => $date->toIso8601String(),
|
|
]);
|
|
|
|
$bundle->markdown()->set('');
|
|
|
|
$bundle->save();
|
|
|
|
return $path;
|
|
}
|
|
|
|
/**
|
|
* Return a boolean value indicating if the creator can actually make the
|
|
* bundle using known data.
|
|
*/
|
|
public function canCreateBundle(): bool
|
|
{
|
|
return
|
|
!empty($this->data['kind'])
|
|
&& !empty($this->data['title'])
|
|
&& array_key_exists('entity_id', $this->data);
|
|
}
|
|
|
|
/**
|
|
* Return an array describing what kind of data the creator needs in
|
|
* addition to the one it already has
|
|
*/
|
|
public function formSpecs(): ?array
|
|
{
|
|
$specs = [];
|
|
|
|
if (empty($this->data['kind'])) {
|
|
$specs['kind'] = fn () => select('Media kind', $this->listKinds());
|
|
}
|
|
|
|
if (empty($this->data['title'])) {
|
|
$specs['title'] = fn () => text('Work title', '', '', true);
|
|
}
|
|
|
|
if (!empty($this->data['kind']) && !empty($this->data['title']) && empty($this->data['entity_id'])) {
|
|
$options = app()->make(WikidataClient::class)->searchEntityId($this->data['title']);
|
|
|
|
if (!empty($options)) {
|
|
$specs['entity_id'] = fn () => select('Confirm searched work', $options);
|
|
} else {
|
|
$specs['entity_id'] = fn () => confirm(
|
|
'No entityId was found in Wikidata for this work. Do you want to create the bundle anyway?'
|
|
);
|
|
}
|
|
}
|
|
|
|
return $specs;
|
|
}
|
|
|
|
private function listKinds()
|
|
{
|
|
$bundles = Bundle::findBundles($this->disk, static::$section);
|
|
$kinds = [];
|
|
|
|
foreach ($bundles as $bundle) {
|
|
$kinds[basename($bundle->getPath())] = $bundle->metadata()->get('title');
|
|
}
|
|
|
|
asort($kinds, SORT_NATURAL);
|
|
|
|
return $kinds;
|
|
}
|
|
|
|
/**
|
|
* Return a boolean value indicating if this creator in particular can
|
|
* create bundles for specified section
|
|
*/
|
|
public static function handles(string $section, ?array $data = []): bool
|
|
{
|
|
return $section === static::$section;
|
|
}
|
|
}
|