create([ 'name' => $request->name, 'email' => $request->email, 'password' => Hash::make($request->password), ]); $user->sendEmailVerificationNotification(); $token = $user->createToken('auth-token')->plainTextToken; return $this->created([ 'user' => new UserResource($user), 'token' => $token, ], 'User registered successfully. Please check your email to verify your account.'); } public function login(LoginRequest $request): JsonResponse { $user = User::query()->where('email', $request->email)->first(); if (! $user || ! Hash::check($request->password, $user->password)) { return $this->unauthorized('Invalid credentials'); } $token = $user->createToken('auth-token')->plainTextToken; return $this->success([ 'user' => new UserResource($user), 'token' => $token, ], 'Login successful'); } public function logout(Request $request): JsonResponse { /** @var User $user */ $user = $request->user(); $user->currentAccessToken()->delete(); return $this->success(message: 'Logged out successfully'); } public function me(Request $request): JsonResponse { return $this->success(new UserResource($request->user())); } public function verifyEmail(VerifyEmailRequest $request): JsonResponse { /** @var User $user */ $user = $request->user(); if ($user->hasVerifiedEmail()) { return $this->success(message: 'Email already verified'); } if ($user->markEmailAsVerified()) { event(new Verified($user)); } return $this->success(message: 'Email verified successfully'); } public function resendVerificationEmail(ResendVerificationRequest $request): JsonResponse { $user = User::query()->where('email', $request->email)->first(); if (! $user) { return $this->notFound('User not found'); } if ($user->hasVerifiedEmail()) { return $this->error('Email already verified', 400); } $user->sendEmailVerificationNotification(); return $this->success(message: 'Verification email sent successfully'); } public function forgotPassword(ForgotPasswordRequest $request): JsonResponse { $status = Password::sendResetLink( $request->only('email') ); if ($status === Password::RESET_LINK_SENT) { return $this->success(message: 'Password reset link sent to your email'); } return $this->error('Unable to send reset link', 500); } public function resetPassword(ResetPasswordRequest $request): JsonResponse { $status = Password::reset( $request->only('email', 'password', 'password_confirmation', 'token'), function (User $user, string $password): void { $user->forceFill([ 'password' => Hash::make($password), ])->save(); $user->tokens()->delete(); event(new PasswordReset($user)); } ); if ($status === Password::PASSWORD_RESET) { return $this->success(message: 'Password reset successfully'); } return $this->error( match ($status) { Password::INVALID_TOKEN => 'Invalid or expired reset token', Password::INVALID_USER => 'User not found', default => 'Unable to reset password', }, 400 ); } }