Реализовать compositionProviderEngine (движок провайдера которы позволит делать композицию)
Opened this issue · 2 comments
bonkalol commented
Пример:
export class CompositionProviderTest extends Super {
static override request: typeof Super.request = Super.request({
engine: providerCompositionEngine([
{
request: (_, params) => new Banners().get(Object.get(params, 'opts.query.bannersQuery')),
writeResultInto: 'banners'
},
{
request: (_, params) => new Cards().get(Object.get(params, 'opts.query.contentQuery')),
writeResultInto: 'content'
}
])
});
}
Драфт интерфейса (обсуждаемо)
export interface CompositionProvider {
/**
* Запрос который необходимо выполнить.
*
* @param options
* @param params
*/
request(options: RequestOptions, params: MiddlewareParams): Promise<RequestResponseObject>;
/**
* В какие поля результирующего объекта будет записан ответ данного запроса.
*/
writeResultInto: string;
/**
* Если функция вернула false, то запрос не будет создан.
*
* Если функция вернула promise, то будет выполнено ожидание разрешения этого промиса,
* и в случае если он разрешится с false, запрос не будет создан.
*
* @param options
* @param params
*/
requestFilter?(options: RequestOptions, params: MiddlewareParams): CanPromise<boolean>;
/**
* Если true, то при ошибки данного запроса будет сбой всей композиции.
*/
failCompositionOnError?: boolean;
}
Зачем?
У extraProviders есть ряд недостатков, в том числе отсутствует необходимая гибкость при создании композиций. А такой простой функционал, как движок для композиции провайдеров, даёт хорошую гибкость и позволяет реализовать как сложные, так и простые сценарии.
bonkalol commented
за базовой имплементацией приходите к @bonkalol , она у меня есть, от нее можно отталкиваться или вообще взять ее и просто перенести в клиент
kobezzza commented
Тут нужно учесть пару нюансов:
- У нас в провайдер сейчас приходит объект стейта и ИД. Если просто делать создание дата провайдера, то это сломается. В идеале нужно сделать хэлпер по типу https://github.com/V4Fire/Client/blob/v4-new-init/src/components/super/i-block/providers/index.ts#L299
export class CompositionProviderTest extends Super {
static override request: typeof Super.request = Super.request({
engine: providerCompositionEngine([
{
request: (_, params, {createDataProviderInstance}) => createDataProviderInstance(Banners).get(Object.get(params, 'opts.query.bannersQuery')),
writeResultInto: 'banners'
}
])
});
}
-
Надо поддержать на уровне движка методы dropCache и destroy как вот тут https://github.com/V4Fire/Core/blob/v4/src/core/request/engines/provider/index.ts#L71
-
writeResultInto предлагаю заменить на as