Skip to main content

User Service API Reference

The UsersService class, located in frontend/src/client/sdk.gen.ts, serves as the primary interface for interacting with the backend user management API. It encapsulates all logic for user CRUD operations, profile management, and registration, providing a type-safe bridge between the frontend and the FastAPI backend.

Core Concepts

The UsersService is implemented as a static class, meaning its methods are called directly on the class itself without instantiation. Every method returns a CancelablePromise, which integrates seamlessly with the project's asynchronous state management.

The service distinguishes between three primary scopes of operation:

  1. Current User ("Me"): Methods targeting the authenticated user's own profile (e.g., readUserMe, updatePasswordMe).
  2. Administrative: Methods requiring superuser privileges to manage other users (e.g., readUsers, updateUser).
  3. Public: Methods accessible without authentication (e.g., registerUser).

Integration with TanStack Query

In this codebase, UsersService is rarely called in isolation. Instead, it is used as the data-fetching layer for TanStack Query hooks (useQuery and useMutation).

Data Fetching with useQuery

For retrieving data, the service methods are passed as the queryFn. For example, the useAuth hook uses readUserMe to maintain the global user state:

// frontend/src/hooks/useAuth.ts
const { data: user } = useQuery<UserPublic | null, Error>({
queryKey: ["currentUser"],
queryFn: UsersService.readUserMe,
enabled: isLoggedIn(),
})

Data Mutation with useMutation

For actions that modify data, such as creating a user, the service methods are wrapped in a mutationFn. This allows the application to handle loading states, success toasts, and cache invalidation:

// frontend/src/components/Admin/AddUser.tsx
const mutation = useMutation({
mutationFn: (data: UserCreate) =>
UsersService.createUser({ requestBody: data }),
onSuccess: () => {
showSuccessToast("User created successfully")
form.reset()
setIsOpen(false)
},
onSettled: () => {
queryClient.invalidateQueries({ queryKey: ["users"] })
},
})

Authentication and Configuration

The UsersService relies on the global OpenAPI configuration defined in frontend/src/client/core/OpenAPI.ts. This configuration is initialized in frontend/src/main.tsx to handle base URLs and authentication tokens.

Base URL and Token Resolution

The service automatically attaches the authentication token to requests by resolving the OpenAPI.TOKEN property:

// frontend/src/main.tsx
OpenAPI.BASE = import.meta.env.VITE_API_URL
OpenAPI.TOKEN = async () => {
return localStorage.getItem("access_token") || ""
}

Error Handling

Errors returned by UsersService (instances of ApiError) are handled globally in main.tsx. If a service call returns a 401 or 403 status, the application clears the local token and redirects the user to the login page:

const handleApiError = (error: Error) => {
if (error instanceof ApiError && [401, 403].includes(error.status)) {
localStorage.removeItem("access_token")
window.location.href = "/login"
}
}

API Reference Summary

Current User Management

These methods interact with the /api/v1/users/me endpoints and are used in components like UserInformation.tsx and ChangePassword.tsx.

  • readUserMe(): Retrieves the current authenticated user's profile.
  • updateUserMe({ requestBody }): Updates the current user's basic information.
  • updatePasswordMe({ requestBody }): Specifically handles password changes for the current user.
  • deleteUserMe(): Allows a user to delete their own account.

Administrative Operations

These methods target specific users by ID and typically require the is_superuser flag to be true on the requesting user. They are primarily used in the Admin.tsx route and associated components.

  • readUsers({ skip, limit }): Retrieves a paginated list of all users.
  • createUser({ requestBody }): Creates a new user (Admin-only creation).
  • readUserById({ userId }): Fetches details for a specific user.
  • updateUser({ userId, requestBody }): Updates any user's profile.
  • deleteUser({ userId }): Removes a user from the system.

Public Operations

  • registerUser({ requestBody }): Hits the /api/v1/users/signup endpoint. This is used for open registration and does not require an Authorization header.