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

Base class for data sources with HTTP client and query builder integration. Combines a configured HTTP client and query builder, providing them to the repository.

Creating a data source

typescript
import {BaseHttpDatasource, QueryBuilder} from '@azure-net/kit/infra';

// Constructor accepts instances of HttpService and QueryBuilder
// It's recommended to create the instance in the provider and provide it to the infrastructure layer. Examples are in the providers section.
class MyDatasource extends BaseHttpDatasource {
    constructor() {
        super({
            http: new HttpService({baseUrl: 'https://some-url.ru'}),
            query: new QueryBuilder({arrayFormat: 'brackets'})
        });
    }
}

const myDatasource = new MyDatasource();
// Class instance has a createRawRequest method that provides us access to http and query via callback
const response = await myDatasource.createRawRequest<IUser[]>(({ http, query }) => http.get(`/users${query.build(myQuery)}`));

Adding custom response handler

typescript
// Base response from backend
export interface IBackendApiResponse<T = unknown> {
    data: T;
    success: boolean;
    message: string;
}

// Custom response handler from previous section
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 is now an instance of our response builder (handler)
const response = await myCustomDataSource.createRequest<ILoginResponse>(({ http }) => http.post('/auth/login', { json: request }));

response.getData() // ILoginResponse