Added basic Rebrickable service
This commit is contained in:
parent
fd9fdc51f1
commit
214caa263b
29
app/Providers/RebrickableServiceProvider.php
Normal file
29
app/Providers/RebrickableServiceProvider.php
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Providers;
|
||||||
|
|
||||||
|
use App\Services\Rebrickable\RebrickableClient;
|
||||||
|
use Illuminate\Support\ServiceProvider;
|
||||||
|
|
||||||
|
class RebrickableServiceProvider extends ServiceProvider
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* Register services.
|
||||||
|
*/
|
||||||
|
public function register(): void
|
||||||
|
{
|
||||||
|
$this->app->singleton(RebrickableClient::class, function ($app) {
|
||||||
|
$config = $app['config']->get('services.rebrickable');
|
||||||
|
|
||||||
|
return new RebrickableClient($config);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Bootstrap services.
|
||||||
|
*/
|
||||||
|
public function boot(): void
|
||||||
|
{
|
||||||
|
//
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,25 +2,68 @@
|
||||||
|
|
||||||
namespace App\Services\BundleCreator\Creators\CollectibleCreators;
|
namespace App\Services\BundleCreator\Creators\CollectibleCreators;
|
||||||
|
|
||||||
|
use App\Classes\Bundle;
|
||||||
|
use App\Exceptions\BundleAlreadyExists;
|
||||||
use App\Services\BundleCreator\Creators\BaseBundleCreator;
|
use App\Services\BundleCreator\Creators\BaseBundleCreator;
|
||||||
|
use App\Services\Rebrickable\RebrickableClient;
|
||||||
use Illuminate\Filesystem\FilesystemAdapter;
|
use Illuminate\Filesystem\FilesystemAdapter;
|
||||||
|
use Illuminate\Support\Str;
|
||||||
|
|
||||||
|
use function Laravel\Prompts\select;
|
||||||
use function Laravel\Prompts\text;
|
use function Laravel\Prompts\text;
|
||||||
|
|
||||||
class LegoBundleCreator extends BaseBundleCreator
|
class LegoBundleCreator extends BaseBundleCreator
|
||||||
{
|
{
|
||||||
|
private static string $section = 'collections';
|
||||||
|
|
||||||
|
private static string $brand = 'lego';
|
||||||
|
|
||||||
public function __construct(protected ?array $data, protected FilesystemAdapter $disk)
|
public function __construct(protected ?array $data, protected FilesystemAdapter $disk)
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a bundle
|
||||||
|
*/
|
||||||
|
public function createBundle(): string
|
||||||
|
{
|
||||||
|
$rebrickable = app()->make(RebrickableClient::class);
|
||||||
|
$setData = $rebrickable->getSet($this->data['rebrickable_id']);
|
||||||
|
$theme = $rebrickable->getTheme($setData['theme_id']);
|
||||||
|
$themeSlug = Str::slug($theme['name']);
|
||||||
|
$path = sprintf('%s/%s/%s/%s', static::$section, static::$brand, $themeSlug, $this->data['product_id']);
|
||||||
|
|
||||||
|
$bundle = new Bundle($path, $this->disk);
|
||||||
|
|
||||||
|
if ($bundle->exists()) {
|
||||||
|
throw new BundleAlreadyExists(
|
||||||
|
sprintf('A bundle already exists in %s', $path)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
$bundle->markdown()->set('');
|
||||||
|
$bundle->metadata()->setMany([
|
||||||
|
'title' => $setData['name'],
|
||||||
|
'date' => now()->toIso8601String(),
|
||||||
|
]);
|
||||||
|
$bundle->metadata('metadata')->set('details.Identifiant', $this->data['product_id']);
|
||||||
|
$bundle->metadata('rebrickable')->setMany([
|
||||||
|
'set' => $setData,
|
||||||
|
]);
|
||||||
|
|
||||||
|
$bundle->save();
|
||||||
|
|
||||||
|
return $path;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return a boolean value indicating if the creator can actually make the
|
* Return a boolean value indicating if the creator can actually make the
|
||||||
* bundle using known data.
|
* bundle using known data.
|
||||||
*/
|
*/
|
||||||
public function canCreateBundle(): bool
|
public function canCreateBundle(): bool
|
||||||
{
|
{
|
||||||
return !empty($this->data['productId']);
|
return !empty($this->data['product_id']) && !empty($this->data['rebrickable_id']);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -31,8 +74,15 @@ public function formSpecs(): ?array
|
||||||
{
|
{
|
||||||
$specs = [];
|
$specs = [];
|
||||||
|
|
||||||
if (empty($this->data['productId'])) {
|
if (empty($this->data['product_id'])) {
|
||||||
$specs['productId'] = fn () => text('Product ID', '', '', true);
|
$specs['product_id'] = fn () => text('Product ID', '', '', true);
|
||||||
|
} else {
|
||||||
|
if (empty($this->data['rebrickable_id'])) {
|
||||||
|
$specs['rebrickable_id'] = fn () => select(
|
||||||
|
'Rebrickable Set ID',
|
||||||
|
app()->make(RebrickableClient::class)->searchSet($this->data['product_id'])
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return $specs;
|
return $specs;
|
||||||
|
@ -44,6 +94,6 @@ public function formSpecs(): ?array
|
||||||
*/
|
*/
|
||||||
public static function handles(string $section, ?array $data = []): bool
|
public static function handles(string $section, ?array $data = []): bool
|
||||||
{
|
{
|
||||||
return $section === 'collections' && !empty($data['brand']) && $data['brand'] === 'lego';
|
return $section === static::$section && !empty($data['brand']) && $data['brand'] === static::$brand;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
58
app/Services/Rebrickable/RebrickableClient.php
Normal file
58
app/Services/Rebrickable/RebrickableClient.php
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Services\Rebrickable;
|
||||||
|
|
||||||
|
use Illuminate\Support\Facades\Http;
|
||||||
|
|
||||||
|
class RebrickableClient
|
||||||
|
{
|
||||||
|
public function __construct(protected array $config)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Search for LEGO set Id, which will return a rebrickable set num
|
||||||
|
*/
|
||||||
|
public function searchSet(string $setId)
|
||||||
|
{
|
||||||
|
$response = $this->get(sprintf('sets/?search=%s', $setId));
|
||||||
|
$options = [];
|
||||||
|
|
||||||
|
foreach ($response['results'] as $result) {
|
||||||
|
$options[$result['set_num']] = $result['name'];
|
||||||
|
}
|
||||||
|
|
||||||
|
return $options;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a specific set from its rebrickable ID
|
||||||
|
*/
|
||||||
|
public function getSet(string $setId)
|
||||||
|
{
|
||||||
|
$response = $this->get(sprintf('sets/%s/', $setId));
|
||||||
|
|
||||||
|
return $response;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get a specific theme from its rebrickable ID
|
||||||
|
*/
|
||||||
|
public function getTheme(string $themeId)
|
||||||
|
{
|
||||||
|
$response = $this->get(sprintf('themes/%s/', $themeId));
|
||||||
|
|
||||||
|
return $response;
|
||||||
|
}
|
||||||
|
|
||||||
|
private function get(string $url)
|
||||||
|
{
|
||||||
|
$key = $this->config['key'];
|
||||||
|
$baseUrl = $this->config['baseUrl'];
|
||||||
|
|
||||||
|
return Http::throw()
|
||||||
|
->withHeader('Authorization', sprintf('key %s', $key))
|
||||||
|
->get(sprintf('%s/%s', $baseUrl, $url))->json();
|
||||||
|
}
|
||||||
|
}
|
|
@ -3,4 +3,5 @@
|
||||||
return [
|
return [
|
||||||
App\Providers\AppServiceProvider::class,
|
App\Providers\AppServiceProvider::class,
|
||||||
App\Providers\BundleCreatorServiceProvider::class,
|
App\Providers\BundleCreatorServiceProvider::class,
|
||||||
|
App\Providers\RebrickableServiceProvider::class,
|
||||||
];
|
];
|
||||||
|
|
|
@ -14,6 +14,11 @@
|
||||||
|
|
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
'rebrickable' => [
|
||||||
|
'baseUrl' => 'https://rebrickable.com/api/v3/lego',
|
||||||
|
'key' => env('REBRICKABLE_API_KEY'),
|
||||||
|
],
|
||||||
|
|
||||||
'postmark' => [
|
'postmark' => [
|
||||||
'token' => env('POSTMARK_TOKEN'),
|
'token' => env('POSTMARK_TOKEN'),
|
||||||
],
|
],
|
||||||
|
|
Loading…
Reference in New Issue
Block a user