UNPKG

arcgis-api-client

Version:

ArcGIS Server REST API client module for Node.js

426 lines (365 loc) 13.9 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }(); var _servers = require('./servers'); var _servers2 = _interopRequireDefault(_servers); var _superagent = require('superagent'); var _superagent2 = _interopRequireDefault(_superagent); var _request = require('request'); var _request2 = _interopRequireDefault(_request); var _fs = require('fs'); var _fs2 = _interopRequireDefault(_fs); var _superagentProxy = require('superagent-proxy'); var _superagentProxy2 = _interopRequireDefault(_superagentProxy); var _urlworks = require('./urlworks'); var _urlworks2 = _interopRequireDefault(_urlworks); var _debug = require('debug'); var _debug2 = _interopRequireDefault(_debug); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } (0, _superagentProxy2.default)(_superagent2.default); var log = (0, _debug2.default)('arcgis'); var guid = function guid() { function s4() { return Math.floor((1 + Math.random()) * 0x10000).toString(16).substring(1); } return s4() + ' ' + s4() + ' - ' + s4() + ' - ' + s4() + ' - ' + s4() + ' - ' + s4() + ' ' + s4() + ' ' + s4(); }; var FeatureServer = function () { function FeatureServer(props) { var options = arguments.length <= 1 || arguments[1] === undefined ? {} : arguments[1]; _classCallCheck(this, FeatureServer); var featureServerUrl = props.featureServerUrl; var username = props.username; var password = props.password; this.featureServerUrl = featureServerUrl; this.username = username; this.password = password; this.serverUrl = _urlworks2.default.toArcgisServerBaseUrl(featureServerUrl); this.options = options; this.server = _servers2.default.getServer({ serverUrl: this.serverUrl, username: username, password: password }, options); } _createClass(FeatureServer, [{ key: 'getRequest', value: function getRequest(url, params) { var _this = this; return new Promise(function (resolve, reject) { var req = _superagent2.default.get(url); if (_this.options.proxy) { req = req.proxy(_this.options.proxy); } req.query(params).accept('json').end(function (err, res) { if (err) { return reject(err); } if (!res.ok) { return reject(new Error('Query error (server response not ok).')); } var resBody = void 0; try { resBody = JSON.parse(res.text); } catch (e) { return reject(new Error('Query error (JSON parse error).')); } if (!!resBody.error) { return reject(new Error('Arcgis server: ' + resBody.error.message)); } return resolve(resBody); }); }); } }, { key: 'postRequest', value: function postRequest(url, params) { var _this2 = this; return new Promise(function (resolve, reject) { params = Object.assign({}, { f: 'json' }, params); var req = _superagent2.default.post(url); if (_this2.options.proxy) { req = req.proxy(_this2.options.proxy); } req.type('form').send(params).accept('json').end(function (err, res) { if (err) { return reject(err); } if (!res.ok) { return reject(new Error('Query error (server response not ok).')); } var resBody = void 0; try { resBody = JSON.parse(res.text); } catch (e) { return reject(new Error('Query error (JSON parse error).')); } if (!!resBody.error) { return reject(new Error('Arcgis server: ' + resBody.error.message)); } return resolve(resBody); }); }); } }, { key: 'checkToken', value: function checkToken() { var params = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; var id = arguments.length <= 1 || arguments[1] === undefined ? guid() : arguments[1]; if (this.server.needToken) { return this.server.getToken(id).then(function (token) { log(id, 'token:', token); params.token = token; return params; }); } return Promise.resolve(params); } }, { key: 'query', value: function query() { var _this3 = this; var props = arguments.length <= 0 || arguments[0] === undefined ? { where: '1=1' } : arguments[0]; var params = Object.assign({}, { outFields: '*', returnGeometry: false, where: '1=1' }, props); params.f = 'json'; params = this.prepObjectIds(params); log('query params:', params); return this.checkToken(params).then(function (params) { return _this3.getRequest(_this3.featureServerUrl + '/query', params); }); } }, { key: 'queryCount', value: function queryCount() { var props = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; props.returnCountOnly = true; return this.query(props).then(function (result) { if (!result.hasOwnProperty('count')) { return Promise.reject(new Error('Query result error: no count property returned.')); } return result.count; }); } }, { key: 'add', value: function add() { var _this4 = this; var features = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0]; var params = { features: JSON.stringify(features) }; log('add params:', params); return this.checkToken(params).then(function (params) { return _this4.postRequest(_this4.featureServerUrl + '/addFeatures', params); }).then(function (resBody) { if (!resBody.addResults) { // todo: error.message содержит больше данных return Promise.reject(new Error('Add error.')); } return resBody; }); } }, { key: 'update', value: function update() { var _this5 = this; var features = arguments.length <= 0 || arguments[0] === undefined ? [] : arguments[0]; var params = { features: JSON.stringify(features) }; log('update params:', params); return this.checkToken(params).then(function (params) { return _this5.postRequest(_this5.featureServerUrl + '/updateFeatures', params); }).then(function (resBody) { if (!resBody.updateResults) { // todo: error.message содержит больше данных return Promise.reject(new Error('Update error.')); } return resBody; }); } }, { key: 'prepObjectIds', value: function prepObjectIds() { var params = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; if (params.objectIds) { if (Object.prototype.toString.call(params.objectIds) === '[object Array]') { params.objectIds = params.objectIds.join(', '); } else { if (typeof params.objectIds !== 'string') { log('objectIds type not supported.'); } } } return params; } }, { key: 'delete', value: function _delete() { var _this6 = this; var params = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; params = this.prepObjectIds(params); params.rollbackOnFailure = true; log('delete params:', params); return this.checkToken(params).then(function (params) { return _this6.postRequest(_this6.featureServerUrl + '/deleteFeatures', params); }).then(function (resBody) { if (resBody.success || resBody.deleteResults) { return resBody; } else { return Promise.reject(new Error('Delete error.')); } }); } }, { key: 'addAttachment', value: function addAttachment() { var _this7 = this; var props = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; log('addAttachment props:', props); var params = { f: 'json' }; return this.checkToken(params).then(function (params) { params.objId = props.objId; params.rs = _fs2.default.createReadStream(props.filePath); return _this7.addAttach(params); }).then(function (resBody) { if (!!resBody.addAttachmentResult) { log('!resBody.addAttachmentResult', resBody); // todo: error.message содержит больше данных return Promise.reject(new Error('addAttachmentResult error.')); } return Promise.resolve(resBody); }); } }, { key: 'addAttach', value: function addAttach() { var _this8 = this; var params = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; log('in addAttach'); return new Promise(function (resolve) { var objId = params.objId; var rs = params.rs; var token = params.token; var url = _this8.featureServerUrl + '/' + objId + '/addAttachment'; var r = _request2.default.post(url, function (err, resp, body) { if (err) { return Promise.reject(err); } log(err, body); return resolve(body); }); var form = r.form(); form.append('f', 'json'); if (token) { form.append('token', token); } form.append('attachment', rs); }); } }, { key: 'addAttachmentUrl', value: function addAttachmentUrl() { var _this9 = this; var props = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; log('addAttachmentUrl props:', props); return this.checkToken().then(function (params) { params.objId = props.objId; var rs = _request2.default.get(props.fileUrl); rs.on('error', function (err) { return Promise.reject(err); }); params.rs = rs; return _this9.addAttach(params); }).then(function (resBody) { log(JSON.stringify(resBody)); if (!resBody.addAttachmentResult) { return Promise.reject(new Error('addAttachmentUrl error.')); } return resBody; }); } }, { key: 'deleteAttachment', value: function deleteAttachment() { var _this10 = this; var props = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; var params = { f: 'json', rollbackOnFailure: true, attachmentIds: props.attachmentIds }; if (params.attachmentIds) { if (Object.prototype.toString.call(params.attachmentIds) === '[object Array]') { params.attachmentIds = params.attachmentIds.join(', '); } else { if (typeof params.attachmentIds !== 'string') { return Promise.reject(new Error('attachmentIds type not supported.')); } } } else { return Promise.reject(new Error('attachmentIds is empty.')); } log('deleteAttachment params: ', params); return this.checkToken(params).then(function (params) { return _this10.postRequest(_this10.featureServerUrl + '/' + props.objId + '/deleteAttachments', params); }).then(function (resBody) { if (!resBody.deleteAttachmentResults) { // todo: error.message содержит больше данных return Promise.reject(new Error('deleteAttachmentResults error.')); } return resBody; }); } }, { key: 'attachmentInfos', value: function attachmentInfos(objId) { var _this11 = this; log('attachmentInfos objId:', objId); var params = { f: 'json' }; return this.checkToken(params).then(function (params) { return _this11.getRequest(_this11.featureServerUrl + '/' + objId + '/attachments', params); }).then(function (resBody) { if (!resBody.attachmentInfos) { // todo: error.message содержит больше данных return Promise.reject(new Error('attachmentInfos error.')); } return resBody; }); } }, { key: 'connect', value: function connect() { var _this12 = this; var props = arguments.length <= 0 || arguments[0] === undefined ? {} : arguments[0]; var id = arguments.length <= 1 || arguments[1] === undefined ? guid() : arguments[1]; // Для теста id log(id, 1); var params = { f: 'json' }; return this.checkToken(params, id).then(function (params) { log(id, 2); return _this12.getRequest(_this12.featureServerUrl, params); }).then(function (resBody) { log(id, 3); log(id, resBody.type); if (!(resBody.type && resBody.type === 'Feature Layer')) { return Promise.reject(new Error('Passed URL seems to be not an Arcgis FeatureServer' + ' REST endpoint')); } return resBody; }); } }]); return FeatureServer; }(); exports.default = FeatureServer;