Skip to main content

API Service

Import API utilities from the subpath:

import {
ApiService,
AuthService,
TokenManager,
createApiClient,
createCustomQuery,
createFirebaseAuthProvider,
createFirebaseAppCheckProvider,
createCustomAuthProvider,
createCustomAppCheckProvider,
type ApiConfig,
type ApiRequestConfig,
type ApiResponse,
type RetryConfig,
} from '@codella-software/utils/api-service'

Quick setup

const authProvider = createFirebaseAuthProvider({ auth })

const client = createApiClient({
authProvider,
apiConfig: {
baseUrl: 'https://api.example.com',
withCredentials: true,
refreshTokenRoute: '/api/v1/users/me',
},
})

await client.authService.initializeSession()
const response = await client.authService.get<{ id: string; email: string }>('/users/me')

createApiClient() returns:

  • authService
  • apiService
  • tokenManager
  • errorHandler

ApiService

Promise methods:

  • get(url, params?)
  • post(url, data?, params?, customHeaders?)
  • put(url, data?, params?, customHeaders?)
  • patch(url, data?, params?, customHeaders?)
  • delete(url, params?)
  • getFile(url, params?)
  • getFileByPost(url, params?, body?)

Observable methods:

  • request$(config)
  • get$(url, params?, config?)
  • post$(url, data?, params?, config?)
  • put$(url, data?, params?, config?)
  • patch$(url, data?, params?, config?)
  • delete$(url, params?, config?)
  • getFile$(url, params?)
  • postFile$(url, data?, params?)

AuthService

AuthService wraps ApiService and ensures session initialization first.

Key methods:

  • initializeSession()
  • reinitialize()
  • reset()
  • request$(config)
  • get$ / post$ / put$ / patch$ / delete$
  • get / post / put / patch / delete
  • getFile()
  • getFileByPost()

Providers

Firebase auth

const authProvider = createFirebaseAuthProvider({
auth: {
currentUser: auth.currentUser,
onAuthStateChanged: auth.onAuthStateChanged,
},
})

Firebase App Check

const appCheckProvider = createFirebaseAppCheckProvider({
appCheck,
getToken,
})

Custom auth

const authProvider = createCustomAuthProvider({
getIdToken: async () => localStorage.getItem('token'),
isAuthenticated: () => Boolean(localStorage.getItem('token')),
})

RTK Query

import { createApi } from '@reduxjs/toolkit/query/react'

const baseQuery = createCustomQuery(client.apiService)

export const api = createApi({
reducerPath: 'api',
baseQuery,
endpoints: () => ({}),
})