API Reference
Обзор всех доступных сервисов и API приложения SaaS Admin.
Формат API Ответов
API повертає дані напряму, без обгорток. ApiService повертає відповіді як є:
// POST /admin/auth/sign-in
{
"accessToken": "eyJhbGciOiJIUzI1NiIs...",
"refreshToken": "placeholder"
}
// GET /admin/auth/me
{
"id": "uuid",
"email": "user@example.com",
"firstName": "John",
"lastName": "Doe",
"createdAt": "2024-01-01T00:00:00.000Z"
}Обработка Ответов
ApiService
ApiService використовує EnvService для отримання baseUrl та додає префікс /admin до всіх запитів. Відповіді повертаються напряму, без розгортання:
@Injectable({ providedIn: "root" })
export class ApiService {
private readonly http = inject(HttpClient);
private readonly env = inject(EnvService);
private get baseUrl() {
return `${this.env.apiUrl()}/admin`;
}
get<T>(endpoint: string, params?: Record<string, string | number | boolean | undefined | null>) {
return this.http.get<T>(`${this.baseUrl}${endpoint}`, { params: httpParams });
}
// post, patch, delete працюють аналогічно
}Також доступні getRaw, postRaw, patchRaw, deleteRaw методи, які використовують rawBaseUrl (без /admin префіксу).
Пример использования:
// API повертає напряму масив
integrations$ = this.integrationsService.getAll();
// Компонент отримує дані як єAuthService
AuthService використовує HttpClient напряму для auth ендпоінтів (login, me, refreshTokens), а також ApiService для admin-операцій (updateMe, getAdminUsers, createAdminUser, deleteAdminUser). Зберігає токени через StorageService:
@Injectable({ providedIn: "root" })
export class AuthService {
private readonly http = inject(HttpClient);
private readonly api = inject(ApiService);
private readonly storage = inject(StorageService);
private readonly env = inject(EnvService);
login(email: string, password: string) {
return this.http.post<ILoginResponse>(`${this.env.apiUrl()}/admin/auth/sign-in`, { email, password }).pipe(
tap((response) => {
this.setTokens(response.accessToken, response.refreshToken);
}),
map(() => undefined)
);
}
me() {
return this.http.get<IUser>(`${this.env.apiUrl()}/admin/auth/me`);
}
updateMe(data: { firstName?: string; lastName?: string }) {
return this.api.patch<IUser>("/auth/me", data);
}
}Базовый API Service
Все сервисы используют базовый ApiService для работы с HTTP запросами.
ApiService
Предоставляет методы для выполнения HTTP запросов. Використовує EnvService для baseUrl, додає /admin префікс, має вбудовану конвертацію пагінації (page/limit -> skip/take):
@Injectable({ providedIn: "root" })
export class ApiService {
get<T>(endpoint: string, params?: Record<string, string | number | boolean | undefined | null>): Observable<T>;
post<T>(endpoint: string, body: unknown): Observable<T>;
patch<T>(endpoint: string, body: unknown): Observable<T>;
delete<T>(endpoint: string): Observable<T>;
getRaw<T>(endpoint: string, params?: Record<string, string | number | boolean | undefined | null>): Observable<T>;
postRaw<T>(endpoint: string, body: unknown): Observable<T>;
patchRaw<T>(endpoint: string, body: unknown): Observable<T>;
deleteRaw<T>(endpoint: string): Observable<T>;
}Доменные сервисы
AuthService
Сервис для аутентификации и авторизации пользователей.
IntegrationsService
Управление интеграциями (CRUD операции).
CredentialsService
Управление credentials для интеграций.
SecretsService
Управление секретами интеграций.
HandlersService
Управление обработчиками событий.
AccessTokensService
Управление токенами доступа к API.
Интерфейсы
Все TypeScript интерфейсы описаны в разделе Интерфейсы.
HTTP Interceptors
Auth Interceptor
Автоматически додає JWT токен до кожного запиту через заголовок x-admin-token. Також обробляє 401 помилки з автоматичним оновленням токенів:
export const authInterceptor: HttpInterceptorFn = (req, next) => {
const authService = inject(AuthService);
req = addToken(req, authService.getAccessToken());
return next(req).pipe(
catchError((error) => {
if (error.status !== 401 || isAuthRequest(req.url)) {
return throwError(() => error);
}
// Автоматичне оновлення токенів через refreshTokens()
// При невдачі — logout
})
);
};
function addToken(req, token: string | null) {
if (!token) return req;
return req.clone({ setHeaders: { "x-admin-token": token } });
}Guards
authGuard
Защищает маршруты, требующие авторизации:
export const authGuard: CanActivateFn = () => {
const authService = inject(AuthService);
const router = inject(Router);
if (!authService.isAuthenticated) {
return router.createUrlTree(["/auth/login"]);
}
return true;
};noAuthGuard
Редиректит авторизованных пользователей:
export const noAuthGuard: CanActivateFn = () => {
const authService = inject(AuthService);
const router = inject(Router);
if (authService.isAuthenticated) {
return router.createUrlTree(["/admin/dashboard"]);
}
return true;
};Следующие шаги
- Сервисы — подробная документация всех сервисов
- Интерфейсы — TypeScript типы и интерфейсы
- Функции — описание функциональности