Commit 0247c9f0 authored by Pedro Eduardo Trujillo's avatar Pedro Eduardo Trujillo
Browse files

Mejora gestión de params y auth en RestManager

Unifica la publicación de parámetros agregados, para informar tanto si
se añaden directamente al pedir datos como de antemano (donde único se
publicaba actualmente). Incorpora el estado actual real de los
parámetros aplicables, tanto los propios de un componente como los
valores compartidos a nivel de vista.

Aprovecha la publicación de parámetros añadidos para alimentar a la
petición de sugerencias de texto, para no requerir la asignación
explícita de valores de filtrados que pueda heredar de su target de
búsqueda principal.

Renombra implementación de RestManager para reflejar lo que realmente
aporta, que es el uso de XHR para comunicarse.

Revisa métodos de interfaz de RestManager, eran incorrectos actualmente.

Reubica importación y aplicación de extensiones de RestManager, ya que
realmente forman parte de la base de RestManager y no de la
implementación específica de XHR.

Refactoriza y replantea la manera de aplicar las credenciales a las
peticiones que lo requieren, para no contaminar la implementación y
simplificar su gestión.
parent ea4219ba
Loading
Loading
Loading
Loading
+3 −3
Original line number Diff line number Diff line
@@ -11,7 +11,7 @@ define([
	, 'src/app/component/Loading'
	, 'src/app/component/meta/MetaTags'
	, 'src/app/component/ModuleStore'
	, 'src/app/component/request/RestManagerImpl'
	, 'src/app/component/request/RestManagerXhrImpl'
	, 'src/app/component/Router'
	, 'src/app/util/CheckBrowser'
	, 'src/component/base/_Module'
@@ -33,7 +33,7 @@ define([
	, Loading
	, MetaTags
	, ModuleStore
	, RestManagerImpl
	, RestManagerXhrImpl
	, Router
	, CheckBrowser
	, _Module
@@ -122,7 +122,7 @@ define([

			new CookieLoader();

			new RestManagerImpl({
			new RestManagerXhrImpl({
				parentChannel,
				apiUrl: redmicConfig.getEnvVariableValue('envApiUrl'),
			});
+10 −7
Original line number Diff line number Diff line
define([
	'dojo/_base/declare'
	, 'src/app/component/request/_Auth'
	, 'src/app/component/request/_Params'
	, 'src/app/component/request/_Receive'
	, 'src/app/component/request/_RestManagerItfc'
	, 'src/app/component/request/_Send'
	, 'src/component/base/_Module'
], function(
	declare
	, _Auth
	, _Params
	, _Receive
	, _RestManagerItfc
	, _Send
	, _Module
) {

	return declare([_Module, _RestManagerItfc], {
	return declare([_Module, _Send, _Receive, _Params, _Auth, _RestManagerItfc], {
		// summary:
		//   Componente encargado de la entrada/salida de datos, para consulta, escritura y borrado.

@@ -195,12 +203,7 @@ define([

			const requesterChannel = this._getRequesterChannel(componentInfo);

			const params = this._manageRequestParams(req, requesterChannel);

			const target = req.target,
				addedParams = req.params;

			this._emitEvt('REQUEST_PARAMS_CHANGED', {target, params, addedParams});
			this._manageRequestParams(req, requesterChannel);
		},

		_getRequesterChannel: function(componentInfo) {
+2 −12
Original line number Diff line number Diff line
@@ -2,23 +2,15 @@ define([
	'dojo/_base/declare'
	, 'dojo/request/xhr'
	, 'dojo/request/notify'
	, 'src/app/component/request/_Auth'
	, 'src/app/component/request/_Params'
	, 'src/app/component/request/_Receive'
	, 'src/app/component/request/_Send'
	, 'src/app/component/request/RestManager'
], function(
	declare
	, requestXhr
	, requestNotify
	, _Auth
	, _Params
	, _Receive
	, _Send
	, RestManager
) {

	return declare([RestManager, _Send, _Receive, _Auth, _Params], {
	return declare(RestManager, {
		// summary:
		//   Implementación del componente RestManager, que provee comunicación mediante dojo/request/xhr.

@@ -36,9 +28,7 @@ define([

		_launchRequest: function(url, options) {

			const opts = this._getOptionsWithAuthIfNeeded(url, options);

			return requestXhr(url, opts).response;
			return requestXhr(url, options).response;
		}
	});
});
+20 −14
Original line number Diff line number Diff line
@@ -35,25 +35,31 @@ define([
			this.inherited(arguments);
		},

		_getOptionsWithAuthIfNeeded: function(url, options) {
		_getAuthHeaders: function(url) {

			if (!this._requestedUrlNeedsAuth(url)) {
				return options;
				return;
			}

			const authHeader = this._getAuthHeaderNeededByUrl(url);
			const authHeaderName = 'Authorization',
				authHeaderValue = this._getAuthHeaderNeededByUrl(url);

			if (!authHeader) {
				return options;
			if (!authHeaderValue) {
				return;
			}

			if (!options.headers) {
				options.headers = {};
			}
			return {
				[authHeaderName]: authHeaderValue
			};
		},

			options.headers.Authorization = authHeader;
		_addAuthHeadersToOptions: function(options, authHeaders) {

			if (!authHeaders || !options) {
				return;
			}

			return options;
			options.headers = this._merge([options.headers ?? {}, authHeaders]);
		},

		_requestedUrlNeedsAuth: function(url) {
+42 −43
Original line number Diff line number Diff line
@@ -36,26 +36,36 @@ define([
		_manageRequestParams: function(req, requesterChannel) {

			const target = req.target,
				reqParams = req.params ?? {},
				sharedParams = reqParams.sharedParams;
				sharedParams = !!req.params?.sharedParams;

			delete reqParams.sharedParams;
			const reqParams = {
				path: {...req.params?.path},
				query: {...req.params?.query ?? req.query /*TODO temporal, recupera antiguo formato de query*/}
			};

			// TODO temporal, convierte antiguo formato de query en el primer nivel al nuevo de params anidado
			if (req.query && !reqParams.query) {
				reqParams.query = req.query;
				delete req.query;
			if (sharedParams) {
				const sharedChannel = this._getSharedChannel(requesterChannel);
				this._mixinRequestParams(target, reqParams, sharedChannel);
			} else {
				this._mixinRequestParams(target, reqParams, requesterChannel);
			}

			if (sharedParams) {
				const sharedChannel = this._getSharedChannel(requesterChannel),
					sharedAddedRequestParams = this._mixinRequestParams(target, reqParams, sharedChannel);
			this._emitRequestParamsChanged(target, requesterChannel, reqParams);
		},

				return sharedAddedRequestParams;
		_getSharedChannel: function(requesterChannel) {

			if (!requesterChannel) {
				return;
			}

			const requesterAddedRequestParams = this._mixinRequestParams(target, reqParams, requesterChannel);
			return requesterAddedRequestParams;
			const splitter = this.channelSeparator,
				viewChannelLength = 3,
				sharedSuffix = '/sharedParams';

			const viewChannel = requesterChannel.split(splitter).slice(0, viewChannelLength).join(splitter);

			return `${viewChannel}${sharedSuffix}`;
		},

		_mixinRequestParams: function(target, reqParams, requesterChannel) {
@@ -64,8 +74,6 @@ define([
				nextParams = this._merge([prevParams, reqParams]);

			this._setRequestParams(target, requesterChannel, nextParams);

			return nextParams;
		},

		_getRequestParams: function(target, requesterChannel) {
@@ -83,43 +91,36 @@ define([
			this._requestParams[requesterChannel][target] = params;
		},

		_getSharedChannel: function(requesterChannel) {

			if (!requesterChannel) {
				return;
			}
		_emitRequestParamsChanged: function(target, requesterChannel, addedParams) {

			const splitter = this.channelSeparator,
				viewChannelLength = 3,
				sharedSuffix = '/sharedParams';

			const viewChannel = requesterChannel.split(splitter).slice(0, viewChannelLength).join(splitter);
			const params = this._getMergedRequestParams(target, requesterChannel);

			return `${viewChannel}${sharedSuffix}`;
			this._emitEvt('REQUEST_PARAMS_CHANGED', {target, addedParams, params});
		},

		_getTargetWithPathParamsReplaced: function(target, requesterChannel) {
		_getMergedRequestParams: function(target, requesterChannel) {

			const requesterRequestPathParams = this._getRequestParams(target, requesterChannel).path;
			const requesterRequestParams = this._getRequestParams(target, requesterChannel),
				sharedRequestParams = this._getRequestParams(target, this._getSharedChannel(requesterChannel));

			const sharedChannel = this._getSharedChannel(requesterChannel),
				sharedRequestPathParams = this._getRequestParams(target, sharedChannel).path;
			const path = this._merge([sharedRequestParams.path, requesterRequestParams.path]),
				query = this._merge([sharedRequestParams.query, requesterRequestParams.query]);

			return {path, query};
		},

			const apiUrl = this.apiUrl;
		_getTargetWithPathParamsReplaced: function(target, requesterChannel) {

			const pathParams = this._merge([{apiUrl}, sharedRequestPathParams, requesterRequestPathParams]);
			const apiUrl = this.apiUrl,
				mergedRequestPathParams = this._getMergedRequestParams(target, requesterChannel).path,
				pathParams = this._merge([{apiUrl}, mergedRequestPathParams]);

			return lang.replace(target, pathParams);
		},

		_getQueryDataWithQueryParamsReplaced: function(target, requesterChannel) {

			const requesterRequestQueryParams = this._getRequestParams(target, requesterChannel).query;
		_getQueryDataFromQueryParams: function(target, requesterChannel) {

			const sharedChannel = this._getSharedChannel(requesterChannel),
				sharedRequestQueryParams = this._getRequestParams(target, sharedChannel).query;

			const mergedRequestQueryParams = this._merge([sharedRequestQueryParams, requesterRequestQueryParams]),
			const mergedRequestQueryParams = this._getMergedRequestParams(target, requesterChannel).query,
				queryDfd = new Deferred();

			if (!this._targetHasSchema(target)) {
@@ -139,13 +140,11 @@ define([
			return !!redmicConfig.schemas[target];
		},

		_getQueryModel: function(target, queryParams) {
		_getQueryModel: function(target, data) {

			const modelInstance = this._queryModels[target] ?? this._createQueryModel(target);

			this._publish(modelInstance.getChannel('DESERIALIZE'), {
				data: queryParams
			});
			this._publish(modelInstance.getChannel('DESERIALIZE'), {data});

			return modelInstance;
		},
Loading