PIMS/app/Modules/Movies/Providers/MoviesServiceProvider.php

96 lines
4.7 KiB
PHP
Raw Permalink Normal View History

2025-12-07 03:49:26 +00:00
<?php
namespace App\Modules\Movies\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Route;
use App\Modules\Movies\Services\Contracts\MovieProvider;
use App\Modules\Movies\Services\Omdb\OmdbMovieProvider;
use App\Modules\Movies\Services\Tmdb\TmdbMovieProvider;
2025-12-07 03:49:26 +00:00
use App\Modules\Movies\Services\Contracts\ListMoviesServiceInterface;
use App\Modules\Movies\Services\Contracts\ShowMovieServiceInterface;
use App\Modules\Movies\Services\Contracts\UpsertMovieServiceInterface;
use App\Modules\Movies\Services\Contracts\CheckMovieExistsServiceInterface;
use App\Modules\Movies\Services\Contracts\{GetActorWithMoviesServiceInterface, GetDirectorWithMoviesServiceInterface, GetStudioWithMoviesServiceInterface, GetGenreWithMoviesServiceInterface};
use App\Modules\Movies\Services\Contracts\{UpdateMovieServiceInterface, DeleteMovieServiceInterface};
use App\Modules\Movies\Services\Browse\ListMoviesService;
use App\Modules\Movies\Services\Browse\ShowMovieService;
use App\Modules\Movies\Services\UpsertMovieFromProvider;
use App\Modules\Movies\Services\CheckMovieExistsService;
use App\Modules\Movies\Services\Browse\Entities\{GetActorWithMoviesService, GetDirectorWithMoviesService, GetStudioWithMoviesService, GetGenreWithMoviesService};
use App\Modules\Movies\Services\{UpdateMovieService, DeleteMovieService};
class MoviesServiceProvider extends ServiceProvider
{
public function register(): void
{
// Bind movie provider based on config
$this->app->bind(MovieProvider::class, function () {
$provider = config('movies.provider', 'tmdb');
2025-12-07 03:49:26 +00:00
return match ($provider) {
'tmdb' => new TmdbMovieProvider(),
2025-12-07 03:49:26 +00:00
'omdb' => new OmdbMovieProvider(),
default => new TmdbMovieProvider(),
2025-12-07 03:49:26 +00:00
};
});
// Bind service interfaces to implementations
$this->app->bind(ListMoviesServiceInterface::class, ListMoviesService::class);
$this->app->bind(ShowMovieServiceInterface::class, ShowMovieService::class);
$this->app->bind(UpsertMovieServiceInterface::class, UpsertMovieFromProvider::class);
$this->app->bind(CheckMovieExistsServiceInterface::class, CheckMovieExistsService::class);
// Entity services
$this->app->bind(GetActorWithMoviesServiceInterface::class, GetActorWithMoviesService::class);
$this->app->bind(GetDirectorWithMoviesServiceInterface::class, GetDirectorWithMoviesService::class);
$this->app->bind(GetStudioWithMoviesServiceInterface::class, GetStudioWithMoviesService::class);
$this->app->bind(GetGenreWithMoviesServiceInterface::class, GetGenreWithMoviesService::class);
// Admin management services
$this->app->bind(UpdateMovieServiceInterface::class, UpdateMovieService::class);
$this->app->bind(DeleteMovieServiceInterface::class, DeleteMovieService::class);
}
public function boot(): void
{
// Module routes
Route::middleware(['web', 'auth', 'verified'])
->prefix('admin/movies')
->as('admin.movies.')
->group(__DIR__ . '/../routes/admin.php');
// Public API (JSON) routes
Route::middleware(['web'])
->prefix('api/movies')
->as('api.movies.')
->group(__DIR__ . '/../routes/api.php');
// Entity API routes (actors/directors/studios/genres)
Route::middleware(['web'])
->prefix('api')
->as('api.movies.entities.')
->group(function () {
Route::prefix('actors')->as('actors.')->group(__DIR__ . '/../routes/api_actors.php');
Route::prefix('directors')->as('directors.')->group(__DIR__ . '/../routes/api_directors.php');
Route::prefix('studios')->as('studios.')->group(__DIR__ . '/../routes/api_studios.php');
Route::prefix('genres')->as('genres.')->group(__DIR__ . '/../routes/api_genres.php');
});
// Public Inertia pages
Route::middleware(['web'])
->prefix('movies')
->as('movies.')
->group(__DIR__ . '/../routes/pages.php');
// Entity Inertia pages
Route::middleware(['web'])
->as('entities.pages.')
->group(function () {
Route::prefix('actors')->as('actors.')->group(__DIR__ . '/../routes/pages_actors.php');
Route::prefix('directors')->as('directors.')->group(__DIR__ . '/../routes/pages_directors.php');
Route::prefix('studios')->as('studios.')->group(__DIR__ . '/../routes/pages_studios.php');
Route::prefix('genres')->as('genres.')->group(__DIR__ . '/../routes/pages_genres.php');
});
}
}