81 lines
2.8 KiB
PHP
81 lines
2.8 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers\Api;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Resources\YogaPoseResource;
|
|
use App\Models\YogaCategory;
|
|
use App\Models\YogaPose;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
|
|
class YogaPoseController extends Controller
|
|
{
|
|
public function index(Request $request): JsonResponse
|
|
{
|
|
$q = trim((string) $request->query('q', ''));
|
|
$category = (int) $request->query('category', 0);
|
|
$benefit = trim((string) $request->query('benefit', ''));
|
|
$perPage = (int) $request->query('per_page', 12);
|
|
if ($perPage < 6 || $perPage > 60) { $perPage = 12; }
|
|
|
|
$query = YogaPose::query()->with('category')
|
|
->when($q !== '', function ($qb) use ($q) {
|
|
$qb->where(function ($sub) use ($q) {
|
|
$sub->where('english_name', 'like', "%{$q}%")
|
|
->orWhere('sanskrit_name', 'like', "%{$q}%")
|
|
->orWhere('sanskrit_name_adapted', 'like', "%{$q}%");
|
|
});
|
|
})
|
|
->when($category > 0, fn ($qb) => $qb->where('category_id', $category))
|
|
->when($benefit !== '', fn ($qb) => $qb->where('benefits', 'like', "%{$benefit}%"))
|
|
->orderBy('english_name');
|
|
|
|
$poses = $query->paginate($perPage)->withQueryString();
|
|
|
|
return response()->json([
|
|
'data' => YogaPoseResource::collection($poses->items()),
|
|
'meta' => [
|
|
'current_page' => $poses->currentPage(),
|
|
'last_page' => $poses->lastPage(),
|
|
'per_page' => $poses->perPage(),
|
|
'total' => $poses->total(),
|
|
],
|
|
'categories' => YogaCategory::orderBy('name')->get(['id', 'name']),
|
|
]);
|
|
}
|
|
|
|
public function show(YogaPose $pose): JsonResponse
|
|
{
|
|
$pose->load('category');
|
|
|
|
$benefits = (string) $pose->benefits;
|
|
$tokens = collect(preg_split('/[^\p{L}]+/u', mb_strtolower($benefits)))
|
|
->filter(fn ($t) => $t !== null && $t !== '' && mb_strlen($t) >= 4)
|
|
->unique()
|
|
->take(8)
|
|
->values()
|
|
->all();
|
|
|
|
$similarPoses = YogaPose::query()
|
|
->with('category')
|
|
->where('id', '!=', $pose->id)
|
|
->where(function ($q) use ($pose, $tokens) {
|
|
if ($pose->category_id) {
|
|
$q->orWhere('category_id', $pose->category_id);
|
|
}
|
|
foreach ($tokens as $tk) {
|
|
$q->orWhere('benefits', 'like', "%{$tk}%");
|
|
}
|
|
})
|
|
->orderBy('english_name')
|
|
->limit(9)
|
|
->get();
|
|
|
|
return response()->json([
|
|
'pose' => new YogaPoseResource($pose),
|
|
'similar_poses' => YogaPoseResource::collection($similarPoses),
|
|
]);
|
|
}
|
|
}
|