loads of progress

This commit is contained in:
2025-10-04 19:40:13 +03:00
parent 76cfd9fee6
commit 07148700a5
14 changed files with 443 additions and 28 deletions
@@ -0,0 +1,40 @@
<?php
namespace App\Http\Controllers;
use App\Models\Exercise;
use App\Models\ExerciseAlias;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class ExerciseAliasController extends Controller
{
public function store(Request $request, Exercise $exercise): RedirectResponse
{
// Auth is enforced at the route level. Extra guard below for safety.
if (!Auth::check()) {
abort(403);
}
$data = $request->validate([
'name' => ['nullable', 'string', 'max:255'],
]);
$name = trim((string) ($data['name'] ?? ''));
$userId = Auth::id();
if ($name === '') {
// Clear alias
ExerciseAlias::where('user_id', $userId)->where('exercise_id', $exercise->id)->delete();
return back()->with('status', __('app.exercises.rename_cleared'));
}
ExerciseAlias::updateOrCreate(
['user_id' => $userId, 'exercise_id' => $exercise->id],
['name' => $name]
);
return back()->with('status', __('app.exercises.renamed_success'));
}
}
+7 -3
View File
@@ -7,6 +7,7 @@ use App\Models\Equipment;
use App\Models\Exercise;
use App\Models\Muscle;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class ExerciseController extends Controller
{
@@ -20,7 +21,8 @@ class ExerciseController extends Controller
if ($perPage < 6 || $perPage > 60) { $perPage = 12; }
$query = Exercise::query()
->with(['bodyParts:id,name,slug', 'targetMuscles:id,name,slug', 'secondaryMuscles:id,name,slug', 'equipments:id,name,slug'])
->with(['bodyParts:id,name,slug', 'targetMuscles:id,name,slug', 'secondaryMuscles:id,name,slug', 'equipments:id,name,slug']
+ (Auth::check() ? ['aliases' => function($rel){ $rel->where('user_id', Auth::id()); }] : []))
->when($q !== '', function ($qBuilder) use ($q) {
$qBuilder->where(function ($sub) use ($q) {
$sub->where('name', 'like', "%{$q}%")
@@ -68,7 +70,8 @@ class ExerciseController extends Controller
public function show(Exercise $exercise)
{
$exercise->load(['bodyParts:id,name,slug', 'targetMuscles:id,name,slug', 'secondaryMuscles:id,name,slug', 'equipments:id,name,slug']);
$exercise->load(['bodyParts:id,name,slug', 'targetMuscles:id,name,slug', 'secondaryMuscles:id,name,slug', 'equipments:id,name,slug']
+ (Auth::check() ? ['aliases' => function($rel){ $rel->where('user_id', Auth::id()); }] : []));
// Find similar exercises by shared target muscles, body parts, or equipment
$targetIds = $exercise->targetMuscles->pluck('id')->all();
@@ -76,7 +79,8 @@ class ExerciseController extends Controller
$equipmentIds = $exercise->equipments->pluck('id')->all();
$similarQuery = Exercise::query()
->with(['bodyParts:id,name,slug', 'targetMuscles:id,name,slug', 'equipments:id,name,slug'])
->with(['bodyParts:id,name,slug', 'targetMuscles:id,name,slug', 'equipments:id,name,slug']
+ (Auth::check() ? ['aliases' => function($rel){ $rel->where('user_id', Auth::id()); }] : []))
->where('id', '!=', $exercise->id)
->where(function ($q) use ($targetIds, $bodyPartIds, $equipmentIds) {
if (!empty($targetIds)) {
+22
View File
@@ -3,6 +3,7 @@
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Auth;
class Exercise extends Model
{
@@ -44,4 +45,25 @@ class Exercise extends Model
{
return $this->belongsToMany(User::class, 'exercise_favorites')->withTimestamps();
}
public function aliases()
{
return $this->hasMany(ExerciseAlias::class);
}
public function getDisplayNameAttribute(): string
{
$name = (string) $this->attributes['name'] ?? '';
$userId = Auth::id();
if (!$userId) {
return $name;
}
// Use already loaded relation if present to avoid querying N+1
if ($this->relationLoaded('aliases')) {
$alias = $this->aliases->firstWhere('user_id', $userId);
return $alias?->name ?: $name;
}
$alias = $this->aliases()->where('user_id', $userId)->first();
return $alias?->name ?: $name;
}
}
+28
View File
@@ -0,0 +1,28 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
class ExerciseAlias extends Model
{
use HasFactory;
protected $fillable = [
'user_id',
'exercise_id',
'name',
];
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
public function exercise(): BelongsTo
{
return $this->belongsTo(Exercise::class);
}
}