168 lines
5.1 KiB
PHP
168 lines
5.1 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use App\Models\BreathingExercise;
|
|
use App\Models\BreathingTemplate;
|
|
use App\Models\UserBreathingSession;
|
|
class BreathingExerciseController extends Controller
|
|
{
|
|
|
|
public function createTemplate(Request $request)
|
|
{
|
|
$data = $request->validate([
|
|
'name' => 'required|string',
|
|
'inhale' => 'required|integer|min:0',
|
|
'exhale' => 'required|integer|min:0',
|
|
'breath_hold' => 'required|integer|min:0',
|
|
'duration' => 'sometimes|integer|min:0',
|
|
'description' => 'sometimes|string|nullable',
|
|
'image_id' => 'nullable|exists:images,id',
|
|
'source' => 'nullable|string'
|
|
]);
|
|
|
|
$template = BreathingTemplate::create([
|
|
'user_id' => auth()->id(),
|
|
'name' => $data['name'],
|
|
'inhale' => $data['inhale'],
|
|
'exhale' => $data['exhale'],
|
|
'breath_hold'=> $data['breath_hold'] ?? 0,
|
|
'duration'=> $data['duration'] ?? 60,
|
|
'description' => $data['description'] ?? null,
|
|
'image_id' => $data['image_id'] ?? null,
|
|
'source' => 'nullable|string'
|
|
]);
|
|
|
|
return response()->json(['message' => 'Template created', 'template' => $template->load('image')]);
|
|
}
|
|
|
|
public function updateTemplate(Request $request, $id)
|
|
{
|
|
$template = BreathingTemplate::where('id', $id)
|
|
->where('user_id', auth()->id())
|
|
->firstOrFail();
|
|
|
|
$data = $request->validate([
|
|
'name' => 'sometimes|required|string',
|
|
'inhale' => 'sometimes|required|integer|min:0',
|
|
'exhale' => 'sometimes|required|integer|min:0',
|
|
'breath_hold' => 'sometimes|integer|min:0',
|
|
'duration' => 'sometimes|integer|min:0',
|
|
'description' => 'sometimes|string|nullable',
|
|
'image_id' => 'nullable|exists:images,id',
|
|
'source' => 'nullable|string'
|
|
]);
|
|
|
|
$template->update($data);
|
|
|
|
return response()->json(['message' => 'Template updated', 'template' => $template->load('image')]);
|
|
}
|
|
public function deleteTemplate($id)
|
|
{
|
|
$template = BreathingTemplate::where('id', $id)
|
|
->where('user_id', auth()->id())
|
|
->firstOrFail();
|
|
|
|
$template->delete();
|
|
|
|
return response()->json(['message' => 'Template deleted']);
|
|
}
|
|
|
|
public function getTemplates()
|
|
{
|
|
$userId = auth()->id();
|
|
|
|
$templates = BreathingTemplate::whereNull('user_id')
|
|
->orWhere('user_id', $userId)
|
|
->with('image') // eager load image
|
|
->get()
|
|
->map(function ($template) {
|
|
if ($template->image) {
|
|
$template->image_url = asset('storage/' . $template->image->path);
|
|
} else {
|
|
$template->image_url = null;
|
|
}
|
|
return $template;
|
|
});
|
|
|
|
return response()->json($templates);
|
|
}
|
|
|
|
public function getUserTemplates()
|
|
{
|
|
$templates = BreathingTemplate::where('user_id', auth()->id())
|
|
->with('image') // eager load image
|
|
->get()
|
|
->map(function ($template) {
|
|
if ($template->image) {
|
|
$template->image_url = asset('storage/' . $template->image->path);
|
|
} else {
|
|
$template->image_url = null;
|
|
}
|
|
return $template;
|
|
});
|
|
|
|
return response()->json($templates);
|
|
}
|
|
|
|
// public function store(Request $request)
|
|
// {
|
|
// $data = $request->validate([
|
|
// 'subject' => 'required|string',
|
|
// 'duration' => 'required|integer',
|
|
// 'created_at' => 'nullable|date',
|
|
// ]);
|
|
|
|
// $user = auth()->user();
|
|
|
|
// $exercise = BreathingExercise::create([
|
|
// 'user_id' => $user->id,
|
|
// 'subject' => $data['subject'],
|
|
// 'duration' => $data['duration'],
|
|
// 'created_at' => $data['created_at'] ?? now(),
|
|
// ]);
|
|
|
|
// // Give XP (e.g., +10 per session)
|
|
// if ($data['created_at'] == null) {
|
|
// $user->increment('xp', 10);
|
|
// }
|
|
|
|
// return response()->json([
|
|
// 'message' => 'Exercise saved',
|
|
// 'exercise' => $exercise,
|
|
// 'xp' => $user->xp
|
|
// ]);
|
|
// }
|
|
|
|
public function completeSession(Request $request)
|
|
{
|
|
$data = $request->validate([
|
|
'template_id' => 'required|exists:breathing_templates,id',
|
|
'duration' => 'sometimes|integer|min:0'
|
|
]);
|
|
|
|
$session = UserBreathingSession::create([
|
|
'user_id' => auth()->id(),
|
|
'template_id' => $data['template_id'],
|
|
'duration' => $data['duration'] ?? $template->duration,
|
|
]);
|
|
|
|
// Increase XP (also credits the referrer's 10% share)
|
|
auth()->user()->awardXp(10);
|
|
|
|
return response()->json(['message' => 'Session completed', 'session' => $session]);
|
|
}
|
|
|
|
public function getSessions()
|
|
{
|
|
$user = auth()->user();
|
|
$templates = BreathingTemplate::where('user_id', $user->id)->get();
|
|
$sessions = UserBreathingSession::with('template')->where('user_id', $user->id)->get();
|
|
|
|
return response()->json($sessions);
|
|
}
|
|
|
|
|
|
}
|