"use strict"; (function () { 'use strict'; /** * @ngdoc object * @name locationModule.locationService * * @description * This service performs all server requests related to locationModule and normalizes data returned from server, * before returning it to locationModel * */ angular.module('locationModule') .service('locationService', ['$resource', '$q', function ($resource, $q) { var resource = $resource('/smartit/rest/v2/:type/:action:itemId', {}, { getLocation: { method: 'GET', isArray: true, params: { type: 'location' } }, getLocationsBulk: { method: 'GET', isArray: true, params: { type: 'bulk', action: 'location', include: 'floormap[id,name,locationId]', fields: 'id,name,address', floor_map_count: true, floor_map_with_images_only: true } }, getPOIbyLocation: { url: '/smartit/rest/search', method: 'POST', isArray: true, transformRequest: function (data) { return JSON.stringify({ 'queryName': 'MYIT_FLOOR_MAP_ASSETS_BY_LOCATION_ID', 'queryParameters': [{ 'name': 'locationId', 'value': data.id }], 'attributes': { 'LocationFloorMapAsset': ['id', 'floorMapId', 'name', 'assetTypeId', 'assetStatus', 'desc', 'xPos', 'yPos', 'tag'] } }); } }, getMapTiles: { method: 'GET', isArray: true, params: { type: 'image_tile' } }, getPOItypes: { url: '/smartit/rest/search', method: 'POST', isArray: true }, getPOIById: { url: '/smartit/rest/search', method: 'POST', isArray: true, transformRequest: function (data) { return JSON.stringify({ 'queryName': 'MYIT_FLOOR_MAP_ASSET_GET_BY_ID', 'queryParameters': [{ 'name': 'id', 'value': data.id }], 'attributes': { 'LocationFloorMapAsset': (data.fields || ['id', 'floorMapId', 'name', 'assetTypeId', 'assetStatus', 'xPos', 'yPos', 'locationId']) } }); }, transformResponse: function (data) { var resp = data ? JSON.parse(data) : [], assetData = resp[0] ? resp[0].items : []; return assetData; } } }); /** * @ngdoc function * @name locationModule.locationService#getLocationsBulk * @methodOf locationModule.locationService * * @description * Executes server request to retrieve all locations with floormaps related to it. Performs data normalization for response * @returns {HttpPromise} Future object */ this.getLocationsBulk = function () { return resource.getLocationsBulk().$promise .then(function (data) { var locations = [], locationData = _.findWhere(data, { dataSourceName: 'location' }).items, floormapData = _.findWhere(data, { dataSourceName: 'floormap' }).items; if (locationData.length) { locations = _.filter(locationData, function (location) { return !!location.floorMapCount; }); } return { locations: locations, floormaps: floormapData }; }); }; /** * @ngdoc function * @name locationModule.locationService#getLocationById * @methodOf locationModule.locationService * * @description * Executes server request to retrieve location by id * @param {String} locationId Unique id of the location item * @returns {HttpPromise} Future object */ this.getLocationById = function (locationId) { return resource.getLocation({ itemId: locationId }, { fields: 'id,name,address' }).$promise .then(function (data) { return data[0].items ? data[0].items[0] : {}; }); }; /** * @ngdoc function * @name locationModule.locationService#getPOItypes * @methodOf locationModule.locationService * * @description * Executes server request to retrieve all asset types * @returns {HttpPromise} Future object */ this.getPOItypes = function () { return resource.getPOItypes({ queryName: 'MYIT_ALL_ASSETS_TYPE_QUERY' }).$promise .then(function (resp) { var types = resp[0].items; if (types) { types = _.indexBy(types, 'id'); } return types; }); }; /** * @ngdoc function * @name locationModule.locationService#getPOIbyLocation * @methodOf locationModule.locationService * * @description * Executes server request to retrieve asset list related to a location by locationId * @param {String} locationId Unique id of the location item * @returns {HttpPromise} Future object */ this.getPOIbyLocation = function (locationId) { return resource.getPOIbyLocation({ id: locationId }).$promise .then(function (data) { return data[0].items; }); }; /** * @ngdoc function * @name locationModule.locationService#getPOIdetails * @methodOf locationModule.locationService * * @description * Executes server request to retrieve asset details, by its id. Allows to control fields list, included in server response * @param {String} id Unique id of the asset to retrieve details for * @returns {HttpPromise} Future object */ this.getPOIdetails = function (id, fields) { return resource.getPOIById({ id: id, fields: fields }).$promise .then(function (res) { return res[0]; }); }; /** * @ngdoc function * @name locationModule.locationService#getPOIdetails * @methodOf locationModule.locationService * * @description * Executes server request to retrieve floormap tiles, to use for custom gmap initialization * @param {String} id Unique id of the floormap, to retrieve tiles for * @returns {HttpPromise} Future object */ this.getMapTiles = function (id) { var allPromises = []; for (var i = 0, l = LocationVO.SCALE_LEVELS.length; i < l; i++) { var promise = resource.getMapTiles({ scale: LocationVO.SCALE_LEVELS[i], floor_map_id: id }).$promise; allPromises.push(promise); } return $q.all(allPromises) .then(function (allData) { var floormapTiles = {}; _.each(allData, function (data) { processTilesData(data, floormapTiles); }); return floormapTiles; }); }; /** * @ngdoc function * @name locationModule.locationService#processTilesData * @methodOf locationModule.locationService * * @description * Creates * @param {Array} data Array of tile items returned from server. Server generally returns array with one item, that hold object inside it, * where response details is specified. All results should be contained under items property of response details object * and it should be an array of tile items * @returns {Object} Normalized data object collection of floormap tiles. * All tiles are grouped by zoom size and each group will be used only with specific zoom value. * Each item in group, has key value formed by combining tile column and row values. * It is done to simplify process of searching corresponding tile for custom google map grid item using * column and row value of particular item. * */ function processTilesData(data, allTiles) { var tiles = data[0].items || []; for (var i = 0, l = tiles.length; i < l; i++) { var tile = tiles[i], scale = tile.scale; allTiles[scale] ? angular.noop() : allTiles[scale] = {}; allTiles[scale][tile.column + '_' + tile.row] = tile; } return allTiles; } } ]); })();