From a9bf56776462caff4aba9af1ae8f9934523ad503 Mon Sep 17 00:00:00 2001 From: AmirmahdiNourkazemi Date: Mon, 15 Jun 2026 14:27:13 +0330 Subject: [PATCH] feat: add new api for search media --- app/Http/Controllers/MediaController.php | 36 ++++++++++++------------ routes/api.php | 1 + 2 files changed, 19 insertions(+), 18 deletions(-) diff --git a/app/Http/Controllers/MediaController.php b/app/Http/Controllers/MediaController.php index ad73db8..aa22ee7 100644 --- a/app/Http/Controllers/MediaController.php +++ b/app/Http/Controllers/MediaController.php @@ -326,33 +326,33 @@ public function filters(Request $request) ->groupBy('duration_range') ->get(); - /* - |-------------------------------------------------------------------------- - | 3️⃣ The media matching the chosen filters (so one call returns both the - | filter options and the result list the user asked for). - |-------------------------------------------------------------------------- - */ + return response()->json([ + 'categories' => $categories, + 'subcategories' => $subcategories, + 'durations' => $durations, + ]); +} - $mediaQuery = Media::with(['image', 'detailImage', 'categories', 'subCategories', 'myNote', 'tags']) +// SEARCH/filter results — paginated. Accepts the same filters as /media +// (categories, subcategories, durations, tags, search) plus ?page= & ?per_page=. +public function search(Request $request) +{ + $query = Media::with(['image', 'detailImage', 'categories', 'subCategories', 'myNote', 'tags']) ->where(function ($q) { $q->where('visibility', 'public') ->orWhere('user_id', auth()->id()); }); - $this->applyMediaFilters($mediaQuery, $request); + $this->applyMediaFilters($query, $request); - $mediaQuery->orderBy('created_at', 'desc'); + $perPage = (int) $request->input('per_page', 20); + $perPage = max(1, min($perPage, 100)); - if ($request->filled('count')) { - $mediaQuery->limit(max(1, (int) $request->input('count'))); - } + $results = $query->orderBy('created_at', 'desc') + ->paginate($perPage) + ->withQueryString(); - return response()->json([ - 'categories' => $categories, - 'subcategories' => $subcategories, - 'durations' => $durations, - 'media' => $mediaQuery->get(), - ]); + return response()->json($results); } public function show($id) diff --git a/routes/api.php b/routes/api.php index 318b858..1314dae 100644 --- a/routes/api.php +++ b/routes/api.php @@ -228,6 +228,7 @@ ///media Route::get('/media/filters', [MediaController::class, 'filters']); + Route::get('/media/search', [MediaController::class, 'search']); Route::get('/media/popular', [MediaController::class, 'popular']); Route::get('/media/newest', [MediaController::class, 'newest']); Route::get('/media/recently-played', [MediaController::class, 'recentlyPlayed']);