This commit is contained in:
2026-08-10 19:18:25 +03:00
parent a9923f72ce
commit 7c501d1e9f
35 changed files with 2185 additions and 78 deletions
@@ -0,0 +1,80 @@
<?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),
]);
}
}