mirror of
https://github.com/koel/koel
synced 2024-09-20 06:11:53 +00:00
feat: guess Model class automagically
This commit is contained in:
parent
5293bd9da0
commit
ef7d00e16a
11 changed files with 58 additions and 45 deletions
32
app/Http/Controllers/API/SearchController.php
Normal file
32
app/Http/Controllers/API/SearchController.php
Normal file
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Controllers\API;
|
||||
|
||||
use App\Repositories\AlbumRepository;
|
||||
use App\Repositories\ArtistRepository;
|
||||
use App\Repositories\PlaylistRepository;
|
||||
use App\Repositories\SongRepository;
|
||||
|
||||
class SearchController extends Controller
|
||||
{
|
||||
private $songRepository;
|
||||
private $albumRepository;
|
||||
private $artistRepository;
|
||||
private $playlistRepository;
|
||||
|
||||
public function __construct(
|
||||
SongRepository $songRepository,
|
||||
AlbumRepository $albumRepository,
|
||||
ArtistRepository $artistRepository,
|
||||
PlaylistRepository $playlistRepository
|
||||
) {
|
||||
$this->songRepository = $songRepository;
|
||||
$this->albumRepository = $albumRepository;
|
||||
$this->artistRepository = $artistRepository;
|
||||
$this->playlistRepository = $playlistRepository;
|
||||
}
|
||||
|
||||
public function index()
|
||||
{
|
||||
}
|
||||
}
|
|
@ -9,17 +9,19 @@ use Throwable;
|
|||
|
||||
abstract class AbstractRepository implements RepositoryInterface
|
||||
{
|
||||
/** @var string */
|
||||
private $modelClass;
|
||||
|
||||
/** @var Model */
|
||||
protected $model;
|
||||
|
||||
/** @var Guard */
|
||||
protected $auth;
|
||||
|
||||
abstract public function getModelClass(): string;
|
||||
|
||||
public function __construct()
|
||||
public function __construct(?string $modelClass = null)
|
||||
{
|
||||
$this->model = app($this->getModelClass());
|
||||
$this->modelClass = $modelClass ?: self::guessModelClass();
|
||||
$this->model = app($this->modelClass);
|
||||
|
||||
// This instantiation may fail during a console command if e.g. APP_KEY is empty,
|
||||
// rendering the whole installation failing.
|
||||
|
@ -29,6 +31,11 @@ abstract class AbstractRepository implements RepositoryInterface
|
|||
}
|
||||
}
|
||||
|
||||
private static function guessModelClass(): string
|
||||
{
|
||||
return preg_replace('/(.+)\\\\Repositories\\\\(.+)Repository$/m', '$1\Models\\\$2', static::class);
|
||||
}
|
||||
|
||||
public function getOneById($id): ?Model
|
||||
{
|
||||
return $this->model->find($id);
|
||||
|
|
|
@ -2,15 +2,12 @@
|
|||
|
||||
namespace App\Repositories;
|
||||
|
||||
use App\Models\Album;
|
||||
use App\Models\Song;
|
||||
use App\Repositories\Traits\Searchable;
|
||||
|
||||
class AlbumRepository extends AbstractRepository
|
||||
{
|
||||
public function getModelClass(): string
|
||||
{
|
||||
return Album::class;
|
||||
}
|
||||
use Searchable;
|
||||
|
||||
/** @return array<int> */
|
||||
public function getNonEmptyAlbumIds(): array
|
||||
|
|
|
@ -2,16 +2,10 @@
|
|||
|
||||
namespace App\Repositories;
|
||||
|
||||
use App\Models\Artist;
|
||||
use App\Models\Song;
|
||||
|
||||
class ArtistRepository extends AbstractRepository
|
||||
{
|
||||
public function getModelClass(): string
|
||||
{
|
||||
return Artist::class;
|
||||
}
|
||||
|
||||
/** @return array<int> */
|
||||
public function getNonEmptyArtistIds(): array
|
||||
{
|
||||
|
|
|
@ -12,11 +12,6 @@ class InteractionRepository extends AbstractRepository
|
|||
{
|
||||
use ByCurrentUser;
|
||||
|
||||
public function getModelClass(): string
|
||||
{
|
||||
return Interaction::class;
|
||||
}
|
||||
|
||||
/** @return Collection|array<Interaction> */
|
||||
public function getUserFavorites(User $user): Collection
|
||||
{
|
||||
|
|
|
@ -4,16 +4,13 @@ namespace App\Repositories;
|
|||
|
||||
use App\Models\Playlist;
|
||||
use App\Repositories\Traits\ByCurrentUser;
|
||||
use App\Repositories\Traits\Searchable;
|
||||
use Illuminate\Support\Collection;
|
||||
|
||||
class PlaylistRepository extends AbstractRepository
|
||||
{
|
||||
use ByCurrentUser;
|
||||
|
||||
public function getModelClass(): string
|
||||
{
|
||||
return Playlist::class;
|
||||
}
|
||||
use Searchable;
|
||||
|
||||
/** @return Collection|array<Playlist> */
|
||||
public function getAllByCurrentUser(): Collection
|
||||
|
|
|
@ -7,8 +7,6 @@ use Illuminate\Database\Eloquent\Model;
|
|||
|
||||
interface RepositoryInterface
|
||||
{
|
||||
public function getModelClass(): string;
|
||||
|
||||
public function getOneById($id): ?Model;
|
||||
|
||||
/** @return Collection|array<Model> */
|
||||
|
|
|
@ -2,15 +2,8 @@
|
|||
|
||||
namespace App\Repositories;
|
||||
|
||||
use App\Models\Setting;
|
||||
|
||||
class SettingRepository extends AbstractRepository
|
||||
{
|
||||
public function getModelClass(): string
|
||||
{
|
||||
return Setting::class;
|
||||
}
|
||||
|
||||
/** @return array<mixed> */
|
||||
public function getAllAsKeyValueArray(): array
|
||||
{
|
||||
|
|
|
@ -3,10 +3,13 @@
|
|||
namespace App\Repositories;
|
||||
|
||||
use App\Models\Song;
|
||||
use App\Repositories\Traits\Searchable;
|
||||
use App\Services\HelperService;
|
||||
|
||||
class SongRepository extends AbstractRepository
|
||||
{
|
||||
use Searchable;
|
||||
|
||||
private $helperService;
|
||||
|
||||
public function __construct(HelperService $helperService)
|
||||
|
@ -16,11 +19,6 @@ class SongRepository extends AbstractRepository
|
|||
$this->helperService = $helperService;
|
||||
}
|
||||
|
||||
public function getModelClass(): string
|
||||
{
|
||||
return Song::class;
|
||||
}
|
||||
|
||||
public function getOneByPath(string $path): ?Song
|
||||
{
|
||||
return $this->getOneById($this->helperService->getFileHash($path));
|
||||
|
|
8
app/Repositories/Traits/Searchable.php
Normal file
8
app/Repositories/Traits/Searchable.php
Normal file
|
@ -0,0 +1,8 @@
|
|||
<?php
|
||||
|
||||
namespace App\Repositories\Traits;
|
||||
|
||||
trait Searchable
|
||||
{
|
||||
|
||||
}
|
|
@ -2,12 +2,6 @@
|
|||
|
||||
namespace App\Repositories;
|
||||
|
||||
use App\Models\User;
|
||||
|
||||
class UserRepository extends AbstractRepository
|
||||
{
|
||||
public function getModelClass(): string
|
||||
{
|
||||
return User::class;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue