summaryrefslogtreecommitdiff
path: root/app/Http/Controllers/CinemaController.php
diff options
context:
space:
mode:
authorDeveloper2026-06-27 02:47:40 +0200
committerDeveloper2026-06-27 02:47:40 +0200
commit34ee983becfa088d0c39c4f0d9b35f038b351a78 (patch)
tree25737516a97c596b8b88d2da8dfb0ded5a76a1b6 /app/Http/Controllers/CinemaController.php
downloadcurious-34ee983becfa088d0c39c4f0d9b35f038b351a78.tar.gz
feat: add cinema module for browsing movies from hncrawler DB
- Add 'cinema' database connection (hncrawler DB) to config/database.php - Create CinemaController with cinema(), show(), search() methods - Add /cinema, /cinema/movie/{imdb_id}, /cinema/search routes - Create cinema.blade.php (grid listing with posters, ratings, pagination) - Create cinema-show.blade.php (detail page with cast, genres, synopsis) - Add Cinema link to navbar - Update page title logic for cinema routes
Diffstat (limited to 'app/Http/Controllers/CinemaController.php')
-rw-r--r--app/Http/Controllers/CinemaController.php114
1 files changed, 114 insertions, 0 deletions
diff --git a/app/Http/Controllers/CinemaController.php b/app/Http/Controllers/CinemaController.php
new file mode 100644
index 0000000..c1cb215
--- /dev/null
+++ b/app/Http/Controllers/CinemaController.php
@@ -0,0 +1,114 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use Illuminate\Support\Facades\DB;
+use Illuminate\Http\Request;
+
+class CinemaController extends Controller
+{
+ public function cinema()
+ {
+ $movies = DB::connection('cinema')
+ ->table('imdb')
+ ->select(
+ 'imdb.id',
+ 'imdb.imdb_id',
+ 'imdb.primary_title',
+ 'imdb.original_title',
+ 'imdb.start_year',
+ 'imdb.average_rating',
+ 'imdb.num_votes',
+ 'imdb.synopsis',
+ 'imdb.poster_url',
+ 'imdb.title_type',
+ 'imdb.runtime_minutes',
+ 'imdb.has_people'
+ )
+ ->orderBy('imdb.average_rating', 'desc')
+ ->orderBy('imdb.num_votes', 'desc')
+ ->whereNotNull('imdb.primary_title')
+ ->where('imdb.title_type', 'movie')
+ ->simplePaginate(12);
+
+ $total = DB::connection('cinema')
+ ->table('imdb')
+ ->whereNotNull('primary_title')
+ ->where('title_type', 'movie')
+ ->count();
+
+ return view('cinema', ['movies' => $movies, 'count' => $total]);
+ }
+
+ public function show($id)
+ {
+ $movie = DB::connection('cinema')
+ ->table('imdb')
+ ->where('imdb.imdb_id', $id)
+ ->first();
+
+ if (! $movie) {
+ abort(404);
+ }
+
+ $genres = DB::connection('cinema')
+ ->table('imdb_genre')
+ ->join('genre', 'genre.id', '=', 'imdb_genre.genre_id')
+ ->where('imdb_genre.imdb_id', $movie->id)
+ ->pluck('genre.name');
+
+ $casts = DB::connection('cinema')
+ ->table('who')
+ ->join('people', 'people.id', '=', 'who.people_id')
+ ->join('profession', 'profession.id', '=', 'who.profession_id')
+ ->where('who.imdb_id', $movie->id)
+ ->select('people.name', 'profession.name as profession')
+ ->get();
+
+ $actors = $casts->where('profession', 'actor')->take(8);
+ $directors = $casts->where('profession', 'director');
+ $screenwriters = $casts->where('profession', 'screenwriter')->take(3);
+
+ return view('cinema_show', [
+ 'movie' => $movie,
+ 'genres' => $genres,
+ 'actors' => $actors,
+ 'directors' => $directors,
+ 'screenwriters' => $screenwriters,
+ ]);
+ }
+
+ public function search(Request $request)
+ {
+ $query = $request->input('q', '');
+
+ $movies = DB::connection('cinema')
+ ->table('imdb')
+ ->select(
+ 'imdb.id',
+ 'imdb.imdb_id',
+ 'imdb.primary_title',
+ 'imdb.original_title',
+ 'imdb.start_year',
+ 'imdb.average_rating',
+ 'imdb.num_votes',
+ 'imdb.synopsis',
+ 'imdb.poster_url',
+ 'imdb.title_type',
+ 'imdb.runtime_minutes'
+ )
+ ->whereNotNull('imdb.primary_title')
+ ->where('imdb.title_type', 'movie')
+ ->where(function ($q) use ($query) {
+ $q->where('imdb.primary_title', 'like', '%' . $query . '%')
+ ->orWhere('imdb.original_title', 'like', '%' . $query . '%')
+ ->orWhere('imdb.synopsis', 'like', '%' . $query . '%');
+ })
+ ->orderBy('imdb.average_rating', 'desc')
+ ->simplePaginate(12);
+
+ $total = $movies->total();
+
+ return view('cinema', ['movies' => $movies, 'count' => $total, 'search_query' => $query]);
+ }
+}