V4Fire/Core

Реализовать compositionProviderEngine (движок провайдера которы позволит делать композицию)

Opened this issue · 2 comments

Пример:

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 , она у меня есть, от нее можно отталкиваться или вообще взять ее и просто перенести в клиент

Тут нужно учесть пару нюансов:

  1. У нас в провайдер сейчас приходит объект стейта и ИД. Если просто делать создание дата провайдера, то это сломается. В идеале нужно сделать хэлпер по типу 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'
			}
		])
	});
}
  1. Надо поддержать на уровне движка методы dropCache и destroy как вот тут https://github.com/V4Fire/Core/blob/v4/src/core/request/engines/provider/index.ts#L71

  2. writeResultInto предлагаю заменить на as