1
0
cms11/app/Services/BundleCreators/Creators/CriticBundleCreator.php

105 lines
2.6 KiB
PHP
Raw Normal View History

2024-04-17 11:41:10 +02:00
<?php
namespace App\Services\BundleCreators\Creators;
2024-04-17 11:41:10 +02:00
2024-04-18 00:43:53 +02:00
use App\Classes\Bundle;
2024-04-19 11:21:33 +02:00
use App\Exceptions\BundleAlreadyExists;
2024-04-17 11:41:10 +02:00
use Illuminate\Filesystem\FilesystemAdapter;
2024-04-19 11:21:33 +02:00
use Illuminate\Support\Str;
2024-04-17 11:41:10 +02:00
use function Laravel\Prompts\select;
use function Laravel\Prompts\text;
class CriticBundleCreator extends BaseBundleCreator
{
2024-04-18 00:43:53 +02:00
private static string $section = 'critiques';
2024-04-17 11:41:10 +02:00
public function __construct(protected ?array $data, protected FilesystemAdapter $disk)
{
//
}
2024-04-19 11:21:33 +02:00
/**
* Create a bundle
*/
public function createBundle(): string
{
$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)
);
}
$bundle->metadata()->setMany([
'title' => $title,
'date' => $date->toIso8601String(),
2024-04-19 11:21:33 +02:00
]);
$bundle->markdown()->set('');
$bundle->save();
return $path;
}
2024-04-17 11:41:10 +02:00
/**
* 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']);
2024-04-17 11:41:10 +02:00
}
/**
* 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);
}
return $specs;
}
/**
* 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;
}
2024-04-17 11:41:10 +02:00
private function listKinds()
{
2024-04-18 00:43:53 +02:00
$bundles = Bundle::findBundles($this->disk, static::$section);
$kinds = [];
foreach ($bundles as $bundle) {
$kinds[basename($bundle->getPath())] = $bundle->metadata()->get('title');
}
asort($kinds, SORT_NATURAL);
2024-04-17 11:41:10 +02:00
return $kinds;
}
}