Skip to content

API Reference

Обзор всех доступных сервисов и API приложения SaaS Admin.

Формат API Ответов

API повертає дані напряму, без обгорток. ApiService повертає відповіді як є:

json
// 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 до всіх запитів. Відповіді повертаються напряму, без розгортання:

typescript
@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 префіксу).

Пример использования:

typescript
// API повертає напряму масив
integrations$ = this.integrationsService.getAll();
// Компонент отримує дані як є

AuthService

AuthService використовує HttpClient напряму для auth ендпоінтів (login, me, refreshTokens), а також ApiService для admin-операцій (updateMe, getAdminUsers, createAdminUser, deleteAdminUser). Зберігає токени через StorageService:

typescript
@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):

typescript
@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 помилки з автоматичним оновленням токенів:

typescript
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

Защищает маршруты, требующие авторизации:

typescript
export const authGuard: CanActivateFn = () => {
	const authService = inject(AuthService);
	const router = inject(Router);

	if (!authService.isAuthenticated) {
		return router.createUrlTree(["/auth/login"]);
	}

	return true;
};

noAuthGuard

Редиректит авторизованных пользователей:

typescript
export const noAuthGuard: CanActivateFn = () => {
	const authService = inject(AuthService);
	const router = inject(Router);

	if (authService.isAuthenticated) {
		return router.createUrlTree(["/admin/dashboard"]);
	}

	return true;
};

Следующие шаги

SaaS Admin Documentation