UNPKG

geoportal-access-lib

Version:

French Geoportal resources access library

225 lines (194 loc) 7.42 kB
import CommonService from "../CommonService"; import DefaultUrlService from "../DefaultUrlService"; import AutoCompleteResponseFactory from "./Response/AutoCompleteResponseFactory"; import Logger from "../../Utils/LoggerByDefault"; import MR from "../../Utils/MessagesResources"; import Helper from "../../Utils/Helper"; import ErrorService from "../../Exceptions/ErrorService"; /** * @classdesc * Appel du service d'autocomplétion du Géoportail : * envoi de la requête construite selon les paramètres en options, * éventuellement parsing et analyse de la réponse, * retour d'une réponse en paramètre de la fonction onSuccess. * @constructor * @extends {Gp.Services.CommonService} * @alias Gp.Services.AutoComplete * * @param {Object} options - options spécifiques au service (+ les options heritées) * * @param {String} options.text - La chaîne de caractère à compléter. * Cette chaîne n'est pas "URL encodée". * C'est l'API qui s'occupe de l'encoder pour l'inclure dans la requête. * * @param {Array.<String>} [options.type = ["StreetAddress"]] - Type de l'objet recherché. * Le service d'autocomplétion du Géoportail permet de rechercher des toponymes 'PositionOfInterest' et/ou des adresses postales 'StreetAddress'. * D'autres types pourront être rajoutés selon l'évolution du service. * Par défaut, type = ['StreetAddress']. * * @param {String} [options.territory] - Limitation de la zone de recherche de localisants. * Le service d'autocomplétion du Géoportail permet de limiter la recherche à la métropole et la Corse : options.territory = 'METROPOLE', * DOMS TOMS : options.territory = 'DOMTOM', ou à un département : options.territory = '31' * Pas de valeur par défaut. * La valeur par défaut est donc celle du service. * Le service d'autocomplétion du Géoportail renvoie toutes les informations quand aucun territoire n'est spécifié. * * @param {Number} [options.maximumResponses = 10] - Nombre de réponses maximal que l'on souhaite recevoir. * Pas de valeur par défaut. * La valeur par défaut sera donc celle du service : 10. * * @example * var options = { * // options communes aux services * apiKey : null, * serverUrl : 'http://localhost/service/', * protocol : 'JSONP', // JSONP|XHR * proxyURL : null, * httpMethod : 'GET', // GET|POST * timeOut : 10000, // ms * rawResponse : false, // true|false * scope : null, // this * onSuccess : function (response) {}, * onFailure : function (error) {}, * // spécifique au service * text : "", * type : "StreetAddress", * territory : 'METROPOLE', * maximumResponses : 10 * }; */ function AutoComplete (options_) { if (!(this instanceof AutoComplete)) { throw new TypeError(MR.getMessage("CLASS_CONSTRUCTOR", "AutoComplete")); } /** * Nom de la classe (heritage) * FIXME instance ou classe ? */ this.CLASSNAME = "AutoComplete"; this.logger = Logger.getLogger("Gp.Services.AutoComplete"); this.logger.trace("[Constructeur AutoComplete (options)]"); var options = this.patchOptionConvertor(options_); if (!options.serverUrl) { options.serverUrl = DefaultUrlService.AutoComplete.newUrl(); } // appel du constructeur par heritage CommonService.apply(this, arguments); if (!options.text) { throw new Error(MR.getMessage("PARAM_MISSING", "text")); } // ajout des options spécifiques au service this.options.text = options.text; // on definit des parametres par defaut if (!options.type) { options.type = ["StreetAddress,PositionOfInterest"]; } this.options.type = options.type; this.options.territory = options.terr || ""; this.options.maximumResponses = options.maximumResponses || 10; // INFO // le service ne repond pas en mode POST (405 Method Not Allowed) if (this.options.protocol === "XHR" && this.options.httpMethod === "POST") { this.logger.warn("Le service ne gére pas le mode d'interrogation en POST, on bascule sur du GET !"); this.options.httpMethod = "GET"; // on surcharge ! } // attributs d'instances /** * Format forcé de la réponse du service : "json" * sauf si l'on souhaite une reponse brute (options.rawResponse) */ this.options.outputFormat = (this.options.rawResponse) ? "" : "json"; } /** * @lends module:AutoComplete# */ AutoComplete.prototype = Object.create(CommonService.prototype, { // todo // getter/setter }); /* * Constructeur (alias) */ AutoComplete.prototype.constructor = AutoComplete; /** * Patch pour la convertion des options vers le nouveau formalisme. * * @param {Object} options_ - options du service * @return {Object} - options */ AutoComplete.prototype.patchOptionConvertor = function (options_) { const options = options_; if (options.filterOptions) { this.logger.warn("The parameter 'filterOptions' is deprecated"); if (options.filterOptions.type) { this.logger.warn("The parameter 'filterOptions.type' is deprecated"); if (!options.type) { options.type = options.filterOptions.type; } } if (options.filterOptions.territory) { this.logger.warn("The parameter 'filterOptions.territory' is deprecated"); if (!options.terr) { options.terr = options.filterOptions.territory; } } delete options.filterOptions; } return options; }; /** * (overwrite) * Création de la requête * * @param {Function} error - callback des erreurs * @param {Function} success - callback */ AutoComplete.prototype.buildRequest = function (error, success) { // ex. // http://wxs.ign.fr/CLEF/ols/apis/completion? // text=Brie-Comt& // type=StreetAddress,PositionOfInterest& // territory=METROPOLE& // maximumResponses=10 // traitement des param KPV sous forme de tableau var territory = ""; if (this.options.territory) { territory = this.options.territory; } var type = ""; if (this.options.type) { type = this.options.type.join(","); } // normalisation de la requete avec param KPV this.request = Helper.normalyzeParameters({ text : encodeURIComponent(this.options.text), type : type, terr : territory, maximumResponses : this.options.maximumResponses }); (!this.request) ? error.call(this, new ErrorService(MR.getMessage("SERVICE_REQUEST_BUILD"))) : success.call(this, this.request); }; /** * (overwrite) * Analyse de la reponse * * @param {Function} error - callback des erreurs * @param {Function} success - callback de succès de l'analyse de la réponse */ AutoComplete.prototype.analyzeResponse = function (error, success) { if (this.response) { var options = { response : this.response, rawResponse : this.options.rawResponse, onSuccess : success, onError : error, scope : this }; AutoCompleteResponseFactory.build(options); } else { error.call(this, new ErrorService(MR.getMessage("SERVICE_RESPONSE_EMPTY"))); } }; export default AutoComplete;