Skip to content

Сервисы

Подробная документация всех сервисов приложения.

ApiService (Базовый HTTP сервис)

Базовий сервіс для роботи з HTTP запитами. Використовує 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`;
	}

	private get rawBaseUrl() {
		return this.env.apiUrl();
	}

	get<T>(endpoint: string, params?: Record<string, string | number | boolean | undefined | null>) {
		let httpParams = new HttpParams();
		if (params) {
			const converted = this.convertPagination(params);
			for (const key of Object.keys(converted)) {
				const value = converted[key];
				if (value !== undefined && value !== null) {
					httpParams = httpParams.set(key, String(value));
				}
			}
		}
		return this.http.get<T>(`${this.baseUrl}${endpoint}`, { params: httpParams });
	}

	post<T>(endpoint: string, body: unknown) {
		return this.http.post<T>(`${this.baseUrl}${endpoint}`, body);
	}

	patch<T>(endpoint: string, body: unknown) {
		return this.http.patch<T>(`${this.baseUrl}${endpoint}`, body);
	}

	delete<T>(endpoint: string) {
		return this.http.delete<T>(`${this.baseUrl}${endpoint}`);
	}

	getRaw<T>(endpoint: string, params?: Record<string, string | number | boolean | undefined | null>) {
		// Аналогічно get(), але використовує rawBaseUrl (без /admin)
		return this.http.get<T>(`${this.rawBaseUrl}${endpoint}`, { params: httpParams });
	}

	postRaw<T>(endpoint: string, body: unknown) {
		return this.http.post<T>(`${this.rawBaseUrl}${endpoint}`, body);
	}

	patchRaw<T>(endpoint: string, body: unknown) {
		return this.http.patch<T>(`${this.rawBaseUrl}${endpoint}`, body);
	}

	deleteRaw<T>(endpoint: string) {
		return this.http.delete<T>(`${this.rawBaseUrl}${endpoint}`);
	}

	private convertPagination(params: Record<string, string | number | boolean | undefined | null>) {
		const result = { ...params };
		const page = Number(result["page"]);
		const limit = Number(result["limit"]);
		if (page && limit) {
			result["skip"] = (page - 1) * limit;
			result["take"] = limit;
		} else if (limit) {
			result["take"] = limit;
		}
		delete result["page"];
		delete result["limit"];
		return result;
	}
}

Як це працює

  1. URL формування: baseUrl = env.apiUrl() + "/admin", тобто запит get("/broadcasts") йде на /admin/broadcasts
  2. Конвертація пагінації: параметри page/limit автоматично перетворюються на skip/take через метод convertPagination
  3. Відповідь повертається напряму — без жодного розгортання чи map-операцій

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

typescript
@Injectable({ providedIn: "root" })
export class BroadcastsService {
	private readonly api = inject(ApiService);

	getBroadcasts(params?: { page?: number; limit?: number; status?: string }) {
		return this.api.get<IPaginatedResponse<IBroadcast>>("/broadcasts", params);
	}
}

// Компонент підписується на результат
this.broadcastsService.getBroadcasts({ page: 1, limit: 10 }).subscribe((response) => {
	this.broadcasts = response;
});

Raw методи

Методи getRaw, postRaw, patchRaw, deleteRaw працюють аналогічно, але використовують rawBaseUrl (без /admin префіксу). Це корисно для запитів до ендпоінтів, що не потребують /admin префіксу.

Важно: AuthService працює інакше

INFO

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

typescript
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)
    );
}

updateMe(data: { firstName?: string; lastName?: string }) {
  return this.api.patch<IUser>("/auth/me", data);
}

AuthService

Сервіс для аутентифікації, управління JWT токенами та адміністрування користувачів. Використовує HttpClient напряму для auth ендпоінтів, ApiService для admin-операцій, StorageService для зберігання токенів, UniversalService для SSR-сумісності та EnvService для baseUrl.

Залежності

typescript
private readonly router = inject(Router);
private readonly http = inject(HttpClient);
private readonly api = inject(ApiService);
private readonly storage = inject(StorageService);
private readonly universal = inject(UniversalService);
private readonly env = inject(EnvService);

Методы

login(email: string, password: string)

Виконує вхід користувача в систему. Використовує HttpClient напряму.

Параметры:

  • email — email користувача
  • password — пароль

Возвращает: Observable<undefined>

Пример:

typescript
this.authService.login("user@example.com", "password123").subscribe(() => {
	console.log("Успешный вход");
});

logout()

Виконує вихід із системи, очищує токени через StorageService і робить редірект на сторінку входу.

Пример:

typescript
this.authService.logout();

me()

Отримує інформацію про поточного користувача. Використовує HttpClient напряму.

Возвращает: Observable<IUser>

Пример:

typescript
this.authService.me().subscribe((user) => {
	console.log(user.email);
});

refreshTokens()

Оновлює access та refresh токени. Використовує HttpClient напряму.

Возвращает: Observable<ILoginResponse>

Пример:

typescript
this.authService.refreshTokens().subscribe((response) => {
	// Токени автоматично оновлюються через setTokens
});

updateMe(data: { firstName?: string; lastName?: string })

Оновлює профіль поточного користувача. Використовує ApiService.

Возвращает: Observable<IUser>


getAdminUsers(params?: { page?: number; limit?: number })

Отримує список адмін-користувачів з пагінацією. Використовує ApiService.

Возвращает: Observable<IPaginatedResponse<IUser>>


createAdminUser(data: { email: string; password: string; firstName?: string; lastName?: string })

Створює нового адмін-користувача. Використовує ApiService.

Возвращает: Observable<IUser>


deleteAdminUser(id: string)

Видаляє адмін-користувача. Використовує ApiService.


isAuthenticated

Геттер для перевірки авторизації користувача. Повертає false на сервері (SSR).

Возвращает: boolean

Пример:

typescript
if (this.authService.isAuthenticated) {
	// Користувач авторизований
}

isAuthenticated$

Observable для відстеження стану авторизації.

Возвращает: Observable<boolean>

Пример:

typescript
this.authService.isAuthenticated$.subscribe((isAuth) => {
	console.log("Авторизован:", isAuth);
});

getAccessToken()

Отримує access токен через StorageService з ключем STORAGE_KEYS.ACCESS_TOKEN.

Возвращает: string | null


getRefreshToken()

Отримує refresh токен через StorageService з ключем STORAGE_KEYS.REFRESH_TOKEN.

Возвращает: string | null


getTokenClaims()

Декодує JWT токен та повертає claims. Використовує jwtDecode.

Возвращает: JwtPayload | null


validateToken()

Валідує поточний токен через запит до API (me()). При помилці очищує токени.

Возвращает: Observable<boolean>


IntegrationsService

Сервис для управления интеграциями.

Методы

getAll()

Получить список всех интеграций.

Возвращает: Observable<IIntegration[]>

Пример:

typescript
this.integrationsService.getAll().subscribe((integrations) => {
	console.log(integrations);
});

getById(id: string)

Получить интеграцию по ID.

Параметры:

  • id — UUID интеграции

Возвращает: Observable<IIntegration>

Пример:

typescript
this.integrationsService.getById("uuid-here").subscribe((integration) => {
	console.log(integration.name);
});

create(data: ICreateIntegrationRequest)

Создать новую интеграцию.

Параметры:

  • data — данные для создания интеграции
    • name — название интеграции

Возвращает: Observable<IIntegration>

Пример:

typescript
this.integrationsService.create({ name: "My Integration" }).subscribe((integration) => {
	console.log("Создана:", integration.id);
});

update(id: string, data: IUpdateIntegrationRequest)

Обновить интеграцию.

Параметры:

  • id — UUID интеграции
  • data — данные для обновления
    • name? — новое название (опционально)

Возвращает: Observable<IIntegration>


delete(id: string)

Удалить интеграцию.

Параметры:

  • id — UUID интеграции

Возвращает: Observable<null>


syncHandlers(id: string, data: ISyncHandlersRequest)

Синхронизировать handlers из OpenAPI спецификации integ-core.

Параметры:

  • id — UUID интеграции
  • data — данные для синхронизации
    • integrationName — имя интеграции в integ-core (например, "sofa")
    • baseUrl? — базовый URL (опционально, по умолчанию из env)

Возвращает: Observable<ISyncHandlersResponse>

Пример:

typescript
this.integrationsService.syncHandlers("integration-uuid", { integrationName: "sofa" }).subscribe((result) => {
	console.log("Created:", result.created);
	console.log("Updated:", result.updated);
});

CredentialsService

Сервис для управления credentials интеграций.

Методы

getByIntegration(integrationId: string)

Получить все credentials интеграции.

Параметры:

  • integrationId — UUID интеграции

Возвращает: Observable<ICredential[]>

Пример:

typescript
this.credentialsService.getByIntegration("integration-uuid").subscribe((credentials) => {
	console.log(credentials);
});

create(integrationId: string, data: ICreateCredentialRequest)

Создать новый credential.

Параметры:

  • integrationId — UUID интеграции
  • data — данные credential
    • key — ключ
    • value — значение

Возвращает: Observable<ICredential>

Пример:

typescript
this.credentialsService
	.create("integration-uuid", {
		key: "API_KEY",
		value: "secret-key-here"
	})
	.subscribe();

update(integrationId: string, credentialId: string, data: IUpdateCredentialRequest)

Обновить credential.

Параметры:

  • integrationId — UUID интеграции
  • credentialId — UUID credential
  • data — данные для обновления
    • value — новое значение

Возвращает: Observable<ICredential>


delete(integrationId: string, credentialId: string)

Удалить credential.

Параметры:

  • integrationId — UUID интеграции
  • credentialId — UUID credential

Возвращает: Observable<null>


SecretsService

Сервис для управления секретами интеграций.

Методы

API идентичен CredentialsService:

  • getByIntegration(integrationId: string) — получить все секреты
  • create(integrationId: string, data: ICreateSecretRequest) — создать секрет
  • update(integrationId: string, secretId: string, data: IUpdateSecretRequest) — обновить
  • delete(integrationId: string, secretId: string) — удалить

HandlersService

Сервис для управления обработчиками событий.

Методы

getByIntegration(integrationId: string)

Получить все handlers интеграции.

Возвращает: Observable<IHandler[]>


create(integrationId: string, data: ICreateHandlerRequest)

Создать новый handler.

Параметры:

  • integrationId — UUID интеграции
  • data — данные handler
    • name — название handler'а
    • defaultArgs? — дефолтные аргументы (опционально)

Возвращает: Observable<IHandler>

Пример:

typescript
this.handlersService
	.create("integration-uuid", {
		name: "my-webhook",
		defaultArgs: { timeout: 5000 }
	})
	.subscribe();

update(integrationId: string, handlerId: string, data: IUpdateHandlerRequest)

Обновить handler.

Параметры:

  • integrationId — UUID интеграции
  • handlerId — UUID handler'а
  • data — данные для обновления
    • name? — новое название
    • defaultArgs? — новые дефолтные аргументы

Возвращает: Observable<IHandler>


delete(integrationId: string, handlerId: string)

Удалить handler.

Возвращает: Observable<null>


execute(handlerName: string, method?: string, payload?: IHandlerExecuteRequest)

Выполнить handler (отправить webhook).

Параметры:

  • handlerName — название handler'а
  • method — HTTP метод (по умолчанию 'POST')
  • payload? — данные запроса
    • url? — кастомный URL (опционально)
    • body? — тело запроса (опционально)

Возвращает: Observable<IHandlerExecuteResponse>

Пример:

typescript
this.handlersService
	.execute("my-webhook", "POST", {
		body: { message: "Hello" }
	})
	.subscribe((response) => {
		console.log("Status:", response.statusCode);
		console.log("Body:", response.body);
	});

AccessTokensService

Сервис для управления токенами доступа к API.

Методы

getAll()

Получить все access tokens.

Возвращает: Observable<IAccessToken[]>

Пример:

typescript
this.accessTokensService.getAll().subscribe((tokens) => {
	console.log(tokens);
});

create(data: ICreateAccessTokenRequest)

Создать новый access token.

Параметры:

  • data — данные для создания
    • name — название токена

Возвращает: Observable<IAccessTokenResponse>

Пример:

typescript
this.accessTokensService.create({ name: "My API Token" }).subscribe((response) => {
	console.log("Token:", response.token);
	// ВАЖНО: token виден только один раз!
});

Внимание

Token виден только один раз при создании. Сохраните его в безопасном месте!


delete(tokenId: string)

Удалить access token.

Параметры:

  • tokenId — UUID токена

Возвращает: Observable<null>


BroadcastsService

Сервис для управления email broadcast кампаниями, аудиториями и трекингом доставки.

Методы

getBroadcasts(params?: IPaginationParams & { status?: string })

Получить список всех broadcasts с пагинацией и фильтрацией.

Возвращает: Observable<IPaginatedResponse<IBroadcast>>


getBroadcastById(id: string)

Получить broadcast по ID.

Возвращает: Observable<IBroadcast>


createBroadcast(data: Partial<IBroadcast>)

Создать новый broadcast.

Возвращает: Observable<IBroadcast>


updateBroadcast(id: string, data: Partial<IBroadcast>)

Обновить broadcast.

Возвращает: Observable<IBroadcast>


deleteBroadcast(id: string)

Удалить broadcast.

Возвращает: Observable<void>


sendBroadcast(id: string, data?: { scheduledAt?: string })

Отправить broadcast (немедленно или по расписанию).

Возвращает: Observable<void>


getBroadcastRecipients(broadcastId: string, params?: IPaginationParams & { status?: string })

Получить список получателей broadcast с их статусами.

Возвращает: Observable<IPaginatedResponse<IBroadcastRecipient>>


getEmailEvents(params?: IPaginationParams & { broadcastId?: string; type?: string })

Получить email события (delivered, opened, clicked, bounced, complained).

Возвращает: Observable<IPaginatedResponse<IEmailEvent>>


getAudiences(params?: IPaginationParams)

Получить список всех аудиторий.

Возвращает: Observable<IPaginatedResponse<IAudience>>


getAudienceById(id: string)

Получить аудиторию по ID.

Возвращает: Observable<IAudience>


getAudienceContacts(audienceId: string, params?: IPaginationParams)

Получить контакты в аудитории.

Возвращает: Observable<IPaginatedResponse<IAudienceContact>>


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

SaaS Admin Documentation