113 lines
3.4 KiB
PHP
113 lines
3.4 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Http\Requests\Movie\CommentRequest;
|
|
use App\Models\Comment;
|
|
use App\Models\Genre;
|
|
use App\Models\MediaList;
|
|
use App\Models\Movie;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Auth;
|
|
|
|
class MovieController extends Controller
|
|
{
|
|
public function index(Request $request)
|
|
{
|
|
$query = Movie::query();
|
|
|
|
// Search by title
|
|
if ($request->filled('title')) {
|
|
$query->where('title', 'LIKE', '%' . $request->title . '%');
|
|
}
|
|
|
|
// Filter by genre
|
|
if ($request->filled('genre')) {
|
|
$query->whereHas('genres', function ($q) use ($request) {
|
|
$q->where('genre_id', $request->genre);
|
|
});
|
|
}
|
|
|
|
// Filter by actor
|
|
if ($request->filled('actor')) {
|
|
$query->whereHas('castList', function ($q) use ($request) {
|
|
$q->where('person_id', $request->actor);
|
|
});
|
|
}
|
|
|
|
// Filter by director
|
|
if ($request->filled('director')) {
|
|
$query->whereHas('director', function ($q) use ($request) {
|
|
$q->where('person_id', $request->director);
|
|
});
|
|
}
|
|
|
|
// Filter by rating
|
|
if ($request->filled('rating_min')) {
|
|
$query->where('vote_average', '>=', $request->rating_min);
|
|
}
|
|
if ($request->filled('rating_max')) {
|
|
$query->where('vote_average', '<=', $request->rating_max);
|
|
}
|
|
|
|
// Filter by release year
|
|
if ($request->filled('year_min')) {
|
|
$query->whereYear('release_date', '>=', $request->year_min);
|
|
}
|
|
if ($request->filled('year_max')) {
|
|
$query->whereYear('release_date', '<=', $request->year_max);
|
|
}
|
|
|
|
// Sorting
|
|
$sortBy = $request->get('sort_by', 'release_date');
|
|
$sortOrder = $request->get('sort_order', 'DESC');
|
|
|
|
$allowedSorts = ['title', 'release_date', 'vote_average', 'vote_count'];
|
|
if (in_array($sortBy, $allowedSorts)) {
|
|
$query->orderBy($sortBy, $sortOrder);
|
|
}
|
|
|
|
$movies = $query->paginate(60)->appends($request->except('page'));
|
|
|
|
// Get all genres for filter dropdowns
|
|
$genres = Genre::orderBy('name')->get();
|
|
|
|
return view('movie.index', compact('movies', 'genres'));
|
|
}
|
|
|
|
public function show(string $slug)
|
|
{
|
|
$movie = Movie::with('director', 'watchProviders')
|
|
->where('slug', $slug)
|
|
->firstOrFail();
|
|
|
|
$comments = Comment::where('entity_id', $movie->id)
|
|
->where('entity_type', Comment::TYPE_MOVIE)
|
|
->paginate(15);
|
|
|
|
$userLists = [];
|
|
if (Auth::check()) {
|
|
$userLists = MediaList::whereNotIn('name', MediaList::SPECIAL_LISTS)
|
|
->where('user_id', Auth::user()->id)
|
|
->get();
|
|
}
|
|
|
|
return view('movie.show', compact('movie', 'comments', 'userLists'));
|
|
}
|
|
|
|
public function storeComment(CommentRequest $request, string $movieSlug)
|
|
{
|
|
$movie = Movie::where('slug', $movieSlug)->firstOrFail();
|
|
|
|
Comment::create([
|
|
'entity_id' => $movie->id,
|
|
'entity_type' => Comment::TYPE_MOVIE,
|
|
'user_id' => auth()->user()->id,
|
|
'content' => $request->get('content'),
|
|
'published_at' => new \DateTime(),
|
|
]);
|
|
|
|
return redirect()->back()->with('success', 'Comment posted!');
|
|
}
|
|
}
|