Data Sources
- import:
@azure-net/kit/infra - Preferred location (for base shared datasources):
src/app/core/datasources - Preferred location (for context):
src/app/contexts/{ContextName}/infrastructure/http/datasources
Базовый класс для источников данных с интеграцией HTTP-клиента и построителя запросов. Объединяет в себе настроенный HTTP-клиент и query-builder, предоставляя их репозиторию.
Создание источника данных
typescript
import {BaseHttpDatasource, QueryBuilder} from '@azure-net/kit/infra';
// В конструкторе принимает инстанс HttpService и QueryBuilder
// Рекомендуется создавать инстанс именно в провайдере и предоставлять слою инфраструктуры, примеры в разделе по провайдерам.
class MyDatasource extends BaseHttpDatasource {
constructor() {
super({
http: new HttpService({baseUrl: 'https://some-url.ru'}),
query: new QueryBuilder({arrayFormat: 'brackets'})
});
}
}
const myDatasource = new MyDatasource();
// Экземпляр класса имеет метод createRawRequest предоставляющий нам доступ к http и query посредством callback
const response = await myDatasource.createRawRequest<IUser[]>(({ http, query }) => http.get(`/users${query.build(myQuery)}`));Добавление кастомного обработчика ответов
typescript
// Базовый ответ от бэкенда
export interface IBackendApiResponse<T = unknown> {
data: T;
success: boolean;
message: string;
}
// Кастомный обработчик ответов из предыдущего раздела
export class CustomApiResponse<TData = unknown, TMeta = unknown> extends ResponseBuilder<TData, TMeta, IBackendApiResponse<TData>> {
override unwrapData(data: IBackendApiResponse<TData>): TData {
return data.data;
}
paginate() {
return this.addMeta({ page: Number(this.response.data.data.meta.page), total: Number(this.response.data.data.meta.total) });
}
}
export class MyCustomDatasource extends BaseHttpDatasource {
async createRequest<T>(callback: CreateRequestCallbackType<IBackendApiResponse<T>>) {
return new CustomApiResponse<T, unknown>(await this.createRawRequest<IBackendApiResponse<T>>(callback));
}
}
const myCustomDataSource = new MyCustomDatasource({http: new HttpService({baseUrl: 'https://some-base-url.ru'})});
// response теперь инстанс нашего билдера (обработчика) ответов
const response = await myCustomDataSource.createRequest<ILoginResponse>(({ http }) => http.post('/auth/login', { json: request }));
response.getData() // ILoginResponse