1
0
Fork 0
mirror of https://github.com/s-frick/effigenix.git synced 2026-03-28 17:04:49 +01:00
effigenix/frontend/packages/api-client/src/client.ts
Sebastian Frick bbe9e87c33 feat(frontend): TypeScript-Monorepo mit Terminal-UI für Effigenix ERP
Monorepo-Setup (pnpm workspaces) mit vier shared Packages und einer TUI-App:

Shared Packages:
- @effigenix/types: TypeScript-DTOs (UserDTO, RoleDTO, AuthDTO, Enums)
- @effigenix/config: API-Konfiguration und Shared Constants
- @effigenix/validation: Zod-Schemas für Username, E-Mail und Passwort
- @effigenix/api-client: axios-Client mit JWT-Handling (proaktiver + reaktiver
  Token-Refresh), AuthInterceptor, ErrorInterceptor, Resources für auth/users/roles

TUI (apps/cli, Ink 5 / React):
- Authentication: Login/Logout, Session-Restore beim Start, JWT-Refresh
- User Management: Liste, Anlage (Zod-Inline-Validation), Detailansicht,
  Passwort ändern, Sperren/Entsperren mit ConfirmDialog
- Role Management: Liste, Detailansicht, Zuweisen/Entfernen per RoleSelectList (↑↓)
- UX: SuccessDisplay (Auto-Dismiss 3 s), ConfirmDialog (J/N),
  FormInput mit Inline-Fehlern, StatusBar mit API-URL
- Layout: Fullscreen-Modus (alternate screen buffer), Header mit eingeloggtem User
- Tests: vitest + ink-testing-library (15 Tests)
2026-02-18 12:28:16 +01:00

40 lines
1.3 KiB
TypeScript

/**
* Base axios client for the Effigenix API
*/
import axios, { type AxiosInstance } from 'axios';
import { type ApiConfig, DEFAULT_API_CONFIG } from '@effigenix/config';
import { setupAuthInterceptor } from './interceptors/auth-interceptor.js';
import { setupRefreshInterceptor } from './interceptors/refresh-interceptor.js';
import { setupErrorInterceptor } from './interceptors/error-interceptor.js';
import type { TokenProvider } from './token-provider.js';
export type { AxiosInstance };
/**
* Creates and configures an axios instance with all interceptors.
*
* @param config - Optional API configuration (defaults to localhost:8080)
* @param tokenProvider - Provides access/refresh tokens and handles token storage
*/
export function createApiClient(
config: Partial<ApiConfig> = {},
tokenProvider: TokenProvider,
): AxiosInstance {
const resolvedConfig: ApiConfig = { ...DEFAULT_API_CONFIG, ...config };
const client = axios.create({
baseURL: resolvedConfig.baseUrl,
timeout: resolvedConfig.timeoutMs,
headers: {
'Content-Type': 'application/json',
Accept: 'application/json',
},
});
setupAuthInterceptor(client, tokenProvider);
setupRefreshInterceptor(client, tokenProvider);
setupErrorInterceptor(client);
return client;
}