validate([ 'first_name' => ['required', 'string', 'max:255'], 'last_name' => ['required', 'string', 'max:255'], 'email' => ['required', 'string', 'email', 'max:255', 'unique:users,email'], 'phone' => ['required', 'string', 'max:25'], 'password' => ['required', 'string', 'min:8'], 'device_name' => ['nullable', 'string', 'max:255'], ]); $user = User::create([ 'first_name' => $validated['first_name'], 'last_name' => $validated['last_name'], 'email' => strtolower($validated['email']), 'phone' => $validated['phone'], 'password' => $validated['password'], ]); return response()->json([ 'message' => 'User registered successfully.', 'token' => $user->createToken($validated['device_name'] ?? 'react-app')->plainTextToken, 'token_type' => 'Bearer', 'user' => $user, ], 201); } public function login(Request $request): JsonResponse { $validated = $request->validate([ 'email' => ['required', 'string', 'email'], 'password' => ['required', 'string'], 'device_name' => ['nullable', 'string', 'max:255'], ]); $user = User::query()->where('email', strtolower($validated['email']))->first(); if ($user === null || ! Hash::check($validated['password'], $user->password)) { throw ValidationException::withMessages([ 'email' => ['Los datos no coinciden con nuestros registros.'], ]); } return response()->json([ 'message' => 'Login successful.', 'token' => $user->createToken($validated['device_name'] ?? 'react-app')->plainTextToken, 'token_type' => 'Bearer', 'user' => $user, ]); } public function logout(Request $request): JsonResponse { $request->user()->currentAccessToken()?->delete(); return response()->json([ 'message' => 'Logout successful.', ]); } }