Skip to content

Commit

Permalink
feat: add Directories API
Browse files Browse the repository at this point in the history
  • Loading branch information
ast21 committed Mar 30, 2023
1 parent 6d10ff4 commit 08de74d
Show file tree
Hide file tree
Showing 9 changed files with 135 additions and 12 deletions.
@@ -1,5 +1,7 @@
<?php

return [
'directories' => [],
'directories' => [
'enable_routes' => false,
],
];
Expand Up @@ -19,18 +19,19 @@ public function definition()
{
return [
'slug' => fake()->unique()->slug,
...$this->translatable()
...$this->translatable(),
];
}

public function translatable()
{
$locales = config('translatable.locales');

return collect($locales)
->mapWithKeys(fn($locale) => [
->mapWithKeys(fn ($locale) => [
$locale => [
'name' => fake()->realText(100),
]
],
])
->toArray();
}
Expand Down
10 changes: 2 additions & 8 deletions src/Containers/DirectorySection/Directory/Models/Directory.php
Expand Up @@ -23,21 +23,18 @@
* @property array $properties
* @property Carbon $created_at
* @property Carbon $updated_at
*
* @property string $name
*/
class Directory extends Model implements TranslatableContract
{
use HasFactory, SoftDeletes;
use AsSource, Attachable, Filterable;
use Translatable;

use NodeTrait, Sluggable {
Sluggable::replicate as replicateSluggable;
NodeTrait::replicate insteadof Sluggable;
}


public const NAME = 'Directory';

public const NAME_PLURAL = 'Directories';
Expand Down Expand Up @@ -117,12 +114,9 @@ public function scopeName(Builder $query, $search): Builder

/**
* Return needed Directory model
*
* @param string $slug
* @return Builder
*/
public static function initial(string $slug): Builder
public function initial(string $slug): Builder
{
return static::where('parent_id = (SELECT id FROM "directories" WHERE "slug" = ?)', [$slug]);
return $this->whereRaw('parent_id = (SELECT id FROM "directories" WHERE "slug" = ?)', [$slug]);
}
}
@@ -0,0 +1,25 @@
<?php

declare(strict_types=1);

namespace AdminKit\Core\Containers\DirectorySection\Directory\UI\API\Controllers;

use AdminKit\Core\Containers\DirectorySection\Directory\UI\API\Repositories\DirectoryInterface;

class DirectoryController
{
public function __construct(
public DirectoryInterface $repository,
) {
}

public function index()
{
return $this->repository->getListAll();
}

public function listBySlug(string $slug)
{
return $this->repository->getListBySlug($slug);
}
}
@@ -0,0 +1,22 @@
<?php

declare(strict_types=1);

namespace AdminKit\Core\Containers\DirectorySection\Directory\UI\API\DTO;

use Spatie\LaravelData\Attributes\DataCollectionOf;
use Spatie\LaravelData\Attributes\MapInputName;
use Spatie\LaravelData\Data;
use Spatie\LaravelData\DataCollection;

class DirectoryDTO extends Data
{
public function __construct(
public int $id,
public string $slug,
public string $name,
#[DataCollectionOf(RecordDTO::class), MapInputName('children')]
public DataCollection $records,
) {
}
}
16 changes: 16 additions & 0 deletions src/Containers/DirectorySection/Directory/UI/API/DTO/RecordDTO.php
@@ -0,0 +1,16 @@
<?php

declare(strict_types=1);

namespace AdminKit\Core\Containers\DirectorySection\Directory\UI\API\DTO;

use Spatie\LaravelData\Data;

class RecordDTO extends Data
{
public function __construct(
public int $id,
public string $name,
) {
}
}
@@ -0,0 +1,15 @@
<?php

declare(strict_types=1);

namespace AdminKit\Core\Containers\DirectorySection\Directory\UI\API\Repositories;

use AdminKit\Core\Repositories\RepositoryInterface;
use Spatie\LaravelData\DataCollection;

interface DirectoryInterface extends RepositoryInterface
{
public function getListAll(): DataCollection;

public function getListBySlug($slug): DataCollection;
}
@@ -0,0 +1,39 @@
<?php

declare(strict_types=1);

namespace AdminKit\Core\Containers\DirectorySection\Directory\UI\API\Repositories;

use AdminKit\Core\Containers\DirectorySection\Directory\Models\Directory;
use AdminKit\Core\Containers\DirectorySection\Directory\UI\API\DTO\DirectoryDTO;
use AdminKit\Core\Containers\DirectorySection\Directory\UI\API\DTO\RecordDTO;
use AdminKit\Core\Repositories\AbstractRepository;
use Spatie\LaravelData\DataCollection;

class DirectoryRepository extends AbstractRepository implements DirectoryInterface
{
public function model(): string
{
return Directory::class;
}

public function getListAll(): DataCollection
{
$directories = $this->model

Check failure on line 22 in src/Containers/DirectorySection/Directory/UI/API/Repositories/DirectoryRepository.php

View workflow job for this annotation

GitHub Actions / phpstan

Call to an undefined method Illuminate\Database\Eloquent\Model::defaultOrder().
->defaultOrder()
->get()
->toTree();

return DirectoryDTO::collection($directories);
}

public function getListBySlug($slug): DataCollection
{
$directories = $this->model

Check failure on line 32 in src/Containers/DirectorySection/Directory/UI/API/Repositories/DirectoryRepository.php

View workflow job for this annotation

GitHub Actions / phpstan

Call to an undefined method Illuminate\Database\Eloquent\Model::initial().
->initial($slug)
->defaultOrder()
->get();

return RecordDTO::collection($directories);
}
}
@@ -0,0 +1,9 @@
<?php

use AdminKit\Core\Containers\DirectorySection\Directory\UI\API\Controllers\DirectoryController;
use Illuminate\Support\Facades\Route;

if (config('admin-kit.directories.enable_routes')) {
Route::get('/directories', [DirectoryController::class, 'index']);
Route::get('/directories/{slug}', [DirectoryController::class, 'listBySlug']);
}

0 comments on commit 08de74d

Please sign in to comment.