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