Skip to content

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