Сервисы
Подробная документация всех сервисов приложения.
ApiService (Базовый HTTP сервис)
Базовий сервіс для роботи з HTTP запитами. Використовує 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`;
}
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;
}
}Як це працює
- URL формування:
baseUrl=env.apiUrl() + "/admin", тобто запитget("/broadcasts")йде на/admin/broadcasts - Конвертація пагінації: параметри
page/limitавтоматично перетворюються наskip/takeчерез методconvertPagination - Відповідь повертається напряму — без жодного розгортання чи map-операцій
Пример использования
@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.
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.
Залежності
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>
Пример:
this.authService.login("user@example.com", "password123").subscribe(() => {
console.log("Успешный вход");
});logout()
Виконує вихід із системи, очищує токени через StorageService і робить редірект на сторінку входу.
Пример:
this.authService.logout();me()
Отримує інформацію про поточного користувача. Використовує HttpClient напряму.
Возвращает: Observable<IUser>
Пример:
this.authService.me().subscribe((user) => {
console.log(user.email);
});refreshTokens()
Оновлює access та refresh токени. Використовує HttpClient напряму.
Возвращает: Observable<ILoginResponse>
Пример:
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
Пример:
if (this.authService.isAuthenticated) {
// Користувач авторизований
}isAuthenticated$
Observable для відстеження стану авторизації.
Возвращает: Observable<boolean>
Пример:
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[]>
Пример:
this.integrationsService.getAll().subscribe((integrations) => {
console.log(integrations);
});getById(id: string)
Получить интеграцию по ID.
Параметры:
id— UUID интеграции
Возвращает: Observable<IIntegration>
Пример:
this.integrationsService.getById("uuid-here").subscribe((integration) => {
console.log(integration.name);
});create(data: ICreateIntegrationRequest)
Создать новую интеграцию.
Параметры:
data— данные для создания интеграцииname— название интеграции
Возвращает: Observable<IIntegration>
Пример:
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>
Пример:
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[]>
Пример:
this.credentialsService.getByIntegration("integration-uuid").subscribe((credentials) => {
console.log(credentials);
});create(integrationId: string, data: ICreateCredentialRequest)
Создать новый credential.
Параметры:
integrationId— UUID интеграцииdata— данные credentialkey— ключvalue— значение
Возвращает: Observable<ICredential>
Пример:
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 credentialdata— данные для обновления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— данные handlername— название handler'аdefaultArgs?— дефолтные аргументы (опционально)
Возвращает: Observable<IHandler>
Пример:
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>
Пример:
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[]>
Пример:
this.accessTokensService.getAll().subscribe((tokens) => {
console.log(tokens);
});create(data: ICreateAccessTokenRequest)
Создать новый access token.
Параметры:
data— данные для созданияname— название токена
Возвращает: Observable<IAccessTokenResponse>
Пример:
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>>
Следующие шаги
- Интерфейсы — TypeScript типы
- Функции — описание функциональности