validate([ 'name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'lowercase', 'email', 'max:255', 'unique:'.User::class], 'password' => ['required', 'confirmed', Rules\Password::defaults()], 'is_trainer' => ['nullable', 'boolean'], 'age' => ['nullable', 'integer', 'min:5', 'max:120'], 'weight_kg' => ['nullable', 'numeric', 'min:20', 'max:400'], 'height_cm' => ['nullable', 'numeric', 'min:80', 'max:250'], 'fitness_level' => ['nullable', 'in:beginner,intermediate,advanced'], 'goal' => ['nullable', 'string', 'max:50'], 'health_notes' => ['nullable', 'string', 'max:65535'], 'available_equipment' => ['nullable', 'string', 'max:65535'], 'days_per_week' => ['nullable', 'integer', 'min:1', 'max:7'], 'minutes_per_session' => ['nullable', 'integer', 'min:5', 'max:600'], 'device_name' => ['required', 'string', 'max:255'], ]); $user = User::create([ 'name' => $data['name'], 'email' => $data['email'], 'password' => Hash::make($data['password']), 'is_trainer' => (bool) ($data['is_trainer'] ?? false), 'age' => $data['age'] ?? null, 'weight_kg' => $data['weight_kg'] ?? null, 'height_cm' => $data['height_cm'] ?? null, 'fitness_level' => $data['fitness_level'] ?? null, 'goal' => $data['goal'] ?? null, 'health_notes' => $data['health_notes'] ?? null, 'available_equipment' => $data['available_equipment'] ?? null, 'days_per_week' => $data['days_per_week'] ?? null, 'minutes_per_session' => $data['minutes_per_session'] ?? null, ]); event(new Registered($user)); $token = $user->createToken($data['device_name'])->plainTextToken; return response()->json([ 'user' => new UserResource($user), 'token' => $token, ], 201); } public function login(Request $request): JsonResponse { $data = $request->validate([ 'email' => ['required', 'email'], 'password' => ['required', 'string'], 'device_name' => ['required', 'string', 'max:255'], ]); $user = User::where('email', $data['email'])->first(); if (!$user || !Hash::check($data['password'], $user->password)) { throw ValidationException::withMessages([ 'email' => ['The provided credentials are incorrect.'], ]); } $token = $user->createToken($data['device_name'])->plainTextToken; return response()->json([ 'user' => new UserResource($user), 'token' => $token, ]); } public function logout(Request $request): JsonResponse { $request->user()->currentAccessToken()->delete(); return response()->json(['message' => 'Logged out']); } public function me(Request $request): JsonResponse { return response()->json(['user' => new UserResource($request->user())]); } }