feat: add filter media
This commit is contained in:
@@ -95,12 +95,22 @@ public function index(Request $request)
|
|||||||
->orWhere('user_id', auth()->id());
|
->orWhere('user_id', auth()->id());
|
||||||
});
|
});
|
||||||
|
|
||||||
/*
|
$this->applyMediaFilters($query, $request);
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| 1️⃣ Multi Category
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
|
$query->orderBy('created_at', 'desc');
|
||||||
|
|
||||||
|
// Optional cap: ?count=10 returns only the first 10 items.
|
||||||
|
if ($request->filled('count')) {
|
||||||
|
$query->limit(max(1, (int) $request->input('count')));
|
||||||
|
}
|
||||||
|
|
||||||
|
return response()->json($query->get());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Apply the category / subcategory / duration / tag / search filters shared by
|
||||||
|
// the media list (index) and the filters screen.
|
||||||
|
private function applyMediaFilters($query, Request $request)
|
||||||
|
{
|
||||||
if ($request->filled('categories')) {
|
if ($request->filled('categories')) {
|
||||||
$categories = explode(',', $request->categories);
|
$categories = explode(',', $request->categories);
|
||||||
$query->whereHas('categories', function ($q) use ($categories) {
|
$query->whereHas('categories', function ($q) use ($categories) {
|
||||||
@@ -115,77 +125,32 @@ public function index(Request $request)
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
// Duration ranges (duration stored in minutes).
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| 2️⃣ Multi Duration Ranges
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| duration stored in minutes (integer)
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ($request->filled('durations')) {
|
if ($request->filled('durations')) {
|
||||||
|
|
||||||
$ranges = explode(',', $request->durations);
|
$ranges = explode(',', $request->durations);
|
||||||
|
|
||||||
$query->where(function ($q) use ($ranges) {
|
$query->where(function ($q) use ($ranges) {
|
||||||
|
|
||||||
foreach ($ranges as $range) {
|
foreach ($ranges as $range) {
|
||||||
|
if ($range === '1-2') $q->orWhereBetween('duration', [1, 2]);
|
||||||
if ($range === '1-2') {
|
if ($range === '2-5') $q->orWhereBetween('duration', [3, 5]);
|
||||||
$q->orWhereBetween('duration', [1, 2]);
|
if ($range === '5-10') $q->orWhereBetween('duration', [6, 10]);
|
||||||
|
if ($range === '10-30') $q->orWhereBetween('duration', [10, 30]);
|
||||||
|
if ($range === '30-60') $q->orWhereBetween('duration', [30, 60]);
|
||||||
|
if ($range === '60-120') $q->orWhereBetween('duration', [60, 120]);
|
||||||
|
if ($range === 'other') $q->orWhere('duration', '>', 120);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($range === '2-5') {
|
|
||||||
$q->orWhereBetween('duration', [3, 5]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($range === '5-10') {
|
|
||||||
$q->orWhereBetween('duration', [6, 10]);
|
|
||||||
}
|
|
||||||
if ($range === '10-30') {
|
|
||||||
$q->orWhereBetween('duration', [10, 30]);
|
|
||||||
}
|
|
||||||
if ($range === '30-60') {
|
|
||||||
$q->orWhereBetween('duration', [30, 60]);
|
|
||||||
}
|
|
||||||
if ($range === '60-120') {
|
|
||||||
$q->orWhereBetween('duration', [60, 120]);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($range === 'other') {
|
|
||||||
$q->orWhere('duration', '>', 120);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| 3️⃣ Tags
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ($request->filled('tags')) {
|
if ($request->filled('tags')) {
|
||||||
$tags = explode(',', $request->tags);
|
$tags = explode(',', $request->tags);
|
||||||
|
|
||||||
$query->whereHas('tags', function ($q) use ($tags) {
|
$query->whereHas('tags', function ($q) use ($tags) {
|
||||||
$q->whereIn('name', $tags);
|
$q->whereIn('name', $tags);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
| 4️⃣ Search
|
|
||||||
|--------------------------------------------------------------------------
|
|
||||||
*/
|
|
||||||
|
|
||||||
if ($request->filled('search')) {
|
if ($request->filled('search')) {
|
||||||
|
|
||||||
$search = $request->search;
|
$search = $request->search;
|
||||||
|
|
||||||
$query->where(function ($q) use ($search) {
|
$query->where(function ($q) use ($search) {
|
||||||
|
|
||||||
$q->where('title', 'LIKE', "%$search%")
|
$q->where('title', 'LIKE', "%$search%")
|
||||||
->orWhere('caption', 'LIKE', "%$search%")
|
->orWhere('caption', 'LIKE', "%$search%")
|
||||||
->orWhereHas('categories', function ($c) use ($search) {
|
->orWhereHas('categories', function ($c) use ($search) {
|
||||||
@@ -197,18 +162,10 @@ public function index(Request $request)
|
|||||||
->orWhereHas('tags', function ($t) use ($search) {
|
->orWhereHas('tags', function ($t) use ($search) {
|
||||||
$t->where('name', 'LIKE', "%$search%");
|
$t->where('name', 'LIKE', "%$search%");
|
||||||
});
|
});
|
||||||
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
$query->orderBy('created_at', 'desc');
|
return $query;
|
||||||
|
|
||||||
// Optional cap: ?count=10 returns only the first 10 items.
|
|
||||||
if ($request->filled('count')) {
|
|
||||||
$query->limit(max(1, (int) $request->input('count')));
|
|
||||||
}
|
|
||||||
|
|
||||||
return response()->json($query->get());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// NEWEST media, paginated (?per_page=, ?page=). Same visibility scope as index.
|
// NEWEST media, paginated (?per_page=, ?page=). Same visibility scope as index.
|
||||||
@@ -369,10 +326,32 @@ public function filters(Request $request)
|
|||||||
->groupBy('duration_range')
|
->groupBy('duration_range')
|
||||||
->get();
|
->get();
|
||||||
|
|
||||||
|
/*
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
| 3️⃣ The media matching the chosen filters (so one call returns both the
|
||||||
|
| filter options and the result list the user asked for).
|
||||||
|
|--------------------------------------------------------------------------
|
||||||
|
*/
|
||||||
|
|
||||||
|
$mediaQuery = Media::with(['image', 'detailImage', 'categories', 'subCategories', 'myNote', 'tags'])
|
||||||
|
->where(function ($q) {
|
||||||
|
$q->where('visibility', 'public')
|
||||||
|
->orWhere('user_id', auth()->id());
|
||||||
|
});
|
||||||
|
|
||||||
|
$this->applyMediaFilters($mediaQuery, $request);
|
||||||
|
|
||||||
|
$mediaQuery->orderBy('created_at', 'desc');
|
||||||
|
|
||||||
|
if ($request->filled('count')) {
|
||||||
|
$mediaQuery->limit(max(1, (int) $request->input('count')));
|
||||||
|
}
|
||||||
|
|
||||||
return response()->json([
|
return response()->json([
|
||||||
'categories' => $categories,
|
'categories' => $categories,
|
||||||
'subcategories' => $subcategories,
|
'subcategories' => $subcategories,
|
||||||
'durations' => $durations,
|
'durations' => $durations,
|
||||||
|
'media' => $mediaQuery->get(),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user