UNPKG

ns2-front-module-common

Version:
451 lines 21.4 kB
import { Injectable, Inject } from "@angular/core"; import { URLSearchParams } from "@angular/http"; import { HttpService } from "./http.service"; import Rxmq from "rxmq"; import { CurrentUserService } from "./current-user.service"; var RealtyService = (function () { function RealtyService(httpService, currentUser, cache) { var _this = this; this.httpService = httpService; this.currentUser = currentUser; this.cache = cache; this.realtyChannel = Rxmq.channel(RealtyService.ESB_REALTY_CHANNEL_NAME); this.currentUser.onGeoChange(function (geo) { geo = geo || {}; _this.cache.removeByTag(geo.oldGeoGuid || ''); }); } /** * Получить метаданные для формы создания/редактирования объявления * * @param actionGuid тип действия/сделки (куплю, продам, сниму и сдам) * @param entityGuid тип объекта/специализация (квартира, комната, дом и т.д.) */ RealtyService.prototype.getFormMetadata = function (actionGuid, entityGuid) { var _this = this; return new Promise(function (resolve, reject) { var cacheKey = _this.cache.getCacheKey(actionGuid, entityGuid); _this.cache.get(cacheKey).then(function (data) { resolve(data); }).catch(function () { var url = _this.endPoint + "form/" + actionGuid + "/" + entityGuid; var tags = [actionGuid, entityGuid, actionGuid + '_' + entityGuid, _this.currentUser.getInfo().session.geo_guid]; _this.httpService.get(url) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(function (data) { _this.cache .set(cacheKey, data, 0, tags) .then(function () { resolve(data); }) .catch(function () { resolve(data); }); }, reject); }); }); }; RealtyService.prototype.getAllFormMetadata = function () { var _this = this; return new Promise(function (resolve, reject) { var globalCacheKey = _this.cache.getCacheKey(RealtyService.FULL_FORM_METADATA_KEY); _this.cache.get(globalCacheKey) .then(function (data) { resolve(data); }) .catch(function () { var url = _this.endPoint + "form/full-meta-info"; _this.httpService.get(url) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(function (data) { var allTagsObject = {}, depends = [], el, tags, cacheKey; for (var i = 0; i < data.length; i++) { el = data[i]; tags = [el.action_guid, el.entity_guid, el.action_guid + '_' + el.entity_guid, _this.currentUser.getInfo().session.geo_guid]; cacheKey = _this.cache.getCacheKey(el.action_guid, el.entity_guid); for (var i_1 = 0; i_1 < tags.length; i_1++) { if (!allTagsObject.hasOwnProperty(tags[i_1])) { allTagsObject[tags[i_1]] = true; } } depends.push(_this.cache.set(cacheKey, el.meta, 0, tags)); } var allTags = Object.keys(allTagsObject); allTags.push(_this.currentUser.getInfo().session.geo_guid); depends.push(_this.cache.set(globalCacheKey, data, 0, allTags)); Promise.all(depends) .then(function () { resolve(data); }) .catch(function (err) { reject(err); }); }, reject); }); }); }; /** * Получить метаданные для формы фильтрации объявлений * * @param actionGuid тип действия/сделки (куплю, продам, сниму и сдам) */ RealtyService.prototype.getFilterMetaData = function (actionGuid) { var _this = this; return new Promise(function (resolve, reject) { var url = _this.endPoint + "filter/" + actionGuid; _this.httpService.get(url) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(function (data) { resolve(data); }, reject); }); }; /** * Создать объявление * * @param {string} actionGuid тип сделки * @param {string} entityGuid тип объекта недвижимости * @param data данные для сохранения * @returns {Promise<any>} */ RealtyService.prototype.create = function (actionGuid, entityGuid, data) { var _this = this; return new Promise(function (resolve, reject) { var url = _this.endPoint + "data/" + actionGuid + "/" + entityGuid; _this.httpService.post(url, data) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(resolve, reject); }); }; /** * Обновить объявление * @param {string} actionGuid Тип сделки * @param {string} entityGuid Тип объекта недвижимости * @param {string} guid Идентификатор объявления * @param data Данные объявления * @returns {Promise<any>} */ RealtyService.prototype.update = function (actionGuid, entityGuid, guid, data) { var _this = this; return new Promise(function (resolve, reject) { var url = _this.endPoint + "data/" + actionGuid + "/" + entityGuid + "/" + guid; _this.httpService.put(url, data) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(resolve, reject); }); }; /** * Возвращает список объявлений * @param body Тело запроса (@todo: разработать формат для передачи фильтров и передавать эту модель) * @param query Параметры запроса * @returns {Promise<ResponseListModel<any>>} */ RealtyService.prototype.filter = function (body, query) { return this.loadList(this.endPoint + 'data/filter', body, query); }; /** * Возвращает список объявлений пользователя * @param body Тело запроса (@todo: разработать формат для передачи фильтров и передавать эту модель) * @param query Параметры запроса * @returns {Promise<ResponseListModel<any>>} */ RealtyService.prototype.getMyRealty = function (body, query) { return this.loadList(this.endPoint + 'data/get-my-realty', body, query); }; /** * Возвращает список объявлений добавленных текущим пользователем в избранное * @param body Тело запроса (@todo: разработать формат для передачи фильтров и передавать эту модель) * @param query Параметры запроса * @returns {Promise<ResponseListModel<any>>} */ RealtyService.prototype.getFavoritesRealty = function (body, query) { return this.loadList(this.endPoint + 'data/get-favorites-realty', body, query); }; /** * Публикует объявление * @param actionGuid Идентификатор действия * @param entityGuid Идентификатор типа недвижимости * @param guid Идентификатор объявления */ RealtyService.prototype.publish = function (actionGuid, entityGuid, guid) { var _this = this; return new Promise(function (resolve, reject) { var url = _this.endPoint + "data/" + actionGuid + "/" + entityGuid + "/" + guid + "/publish"; _this.httpService.put(url, {}) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(function (data) { _this.realtyChannel.subject(RealtyService.ESB_REALTY_PUBLISHED_CHANGE).next({ actionGuid: actionGuid, entityGuid: entityGuid, guid: guid, state: true }); resolve(data); }, reject); }); }; /** * Снимает объявление с публикации * @param actionGuid Идентификатор действия * @param entityGuid Идентификатор типа недвижимости * @param guid Идентификатор объявления */ RealtyService.prototype.unPublish = function (actionGuid, entityGuid, guid) { var _this = this; return new Promise(function (resolve, reject) { var url = _this.endPoint + "data/" + actionGuid + "/" + entityGuid + "/" + guid + "/publish"; _this.httpService.delete(url) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(function (data) { _this.realtyChannel.subject(RealtyService.ESB_REALTY_PUBLISHED_CHANGE).next({ actionGuid: actionGuid, entityGuid: entityGuid, guid: guid, state: false }); resolve(data); }, reject); }); }; /** * Добавляет подписчика на публикацию/снятие с публикации объявления * @param {Function} then Функция-подписчик * @returns {Subscription} */ RealtyService.prototype.onPublishedChange = function (then) { return this.realtyChannel.observe(RealtyService.ESB_REALTY_PUBLISHED_CHANGE).subscribe(then); }; /** * Удаляет объявление * @param actionGuid Идентификатор действия * @param entityGuid Идентификатор типа недвижимости * @param guid Идентификатор объявления */ RealtyService.prototype.remove = function (actionGuid, entityGuid, guid) { var _this = this; return new Promise(function (resolve, reject) { var url = _this.endPoint + "data/" + actionGuid + "/" + entityGuid + "/" + guid; _this.httpService.delete(url) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(function (data) { _this.realtyChannel.subject(RealtyService.ESB_REALTY_REMOVE).next({ actionGuid: actionGuid, entityGuid: entityGuid, guid: guid }); resolve(data); }, reject); }); }; /** * Добавляет подписчика на удаление объявления * @param {Function} then Функция-подписчик * @returns {Subscription} */ RealtyService.prototype.onRemove = function (then) { return this.realtyChannel.observe(RealtyService.ESB_REALTY_REMOVE).subscribe(then); }; /** * Добавляет объявление в избранное текущего пользователя * * @param {string} realtyGuid Идентификатор объявления * @returns {Promise<ResponseListModel<any>>} */ RealtyService.prototype.addRealtyToFavorite = function (realtyGuid) { var _this = this; return new Promise(function (resolve, reject) { var url = _this.endPoint + 'data/' + realtyGuid + '/favorites'; _this.httpService.post(url, null) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(function (data) { _this.realtyChannel.subject(RealtyService.ESB_REALTY_FAVORITES_CHANGE).next({ guid: realtyGuid, state: true }); resolve(data); }, reject); }); }; /** * Удалляет объявление из избранного текущего пользователя * * @param {string} realtyGuid Идентификатор объявления * @returns {Promise<ResponseListModel<any>>} */ RealtyService.prototype.removeRealtyFromFavorite = function (realtyGuid) { var _this = this; return new Promise(function (resolve, reject) { var url = _this.endPoint + 'data/' + realtyGuid + '/favorites'; _this.httpService.delete(url) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(function (data) { _this.realtyChannel.subject(RealtyService.ESB_REALTY_FAVORITES_CHANGE).next({ guid: realtyGuid, state: false }); resolve(data); }, reject); }); }; /** * Добавляет подписчика на добавление/удаление объявления из избранного * @param {Function} then Функция-подписчик * @returns {Subscription} */ RealtyService.prototype.onFavoriteChange = function (then) { return this.realtyChannel.observe(RealtyService.ESB_REALTY_FAVORITES_CHANGE).subscribe(then); }; /** * Возвращает данные о указанном объявлении * @param guid Идентификатор объявления * @returns {Promise<any>} */ RealtyService.prototype.load = function (guid) { var _this = this; return new Promise(function (resolve, reject) { var url = _this.endPoint + 'data/' + guid; _this.httpService.get(url) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(resolve, reject); }); }; /** * Устанавливает точку входа в сервис объявлений * @param endPoint */ RealtyService.prototype.setEndPoint = function (endPoint) { this.endPoint = endPoint; }; /** * Синхронизирует метаданные формы с бэкендом * @returns {Promise<any>} */ RealtyService.prototype.synchronizeFormMetaInfo = function () { var _this = this; return new Promise(function (resolve) { var url = _this.endPoint + 'form/last-modified'; _this.httpService.get(url) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(function (data) { var process = function (localInfo) { _this.processFormMetaInfo(localInfo, data).then(resolve).catch(resolve); }; _this.cache.get(RealtyService.LAST_MODIFIED_INFO_KEY) .then(function (localInfo) { process(localInfo); }) .catch(function () { process({}); }); }, function () { resolve(); }); }); }; /** * Получение объявлений по списку идентификаторов * @param {string[]} realtyGuids * @returns {Promise<any>} */ RealtyService.prototype.getRealtyByGuids = function (realtyGuids) { var _this = this; return new Promise(function (resolve, reject) { var url = _this.endPoint + "data/get-by-guids"; _this.httpService.post(url, realtyGuids) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(resolve, reject); }); }; RealtyService.prototype.loadList = function (url, body, query) { var _this = this; return new Promise(function (resolve, reject) { var params = new URLSearchParams(); if (query) { var keys = Object.keys(query); for (var i = 0; i < keys.length; i++) { var key = keys[i]; params.set(key, query[key]); } } _this.httpService.post(url, body, { params: params }) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(resolve, reject); }); }; /** * Сравнивает локальные метаданные и удаленные. * При обнаружении измененных, добавленных или удаленных метаданных - удаляет все записи из кеша относящиеся к этим метаданным * * @param {any} localInfo Объект с локальными метаданными, где ключ - результат конкатенации actionGuid & entityGuid, значение - timestamp последнего изменения * @param {any[]} remoteInfo Массив объектов метаинформации на сервере * @returns {Promise<[]>} */ RealtyService.prototype.processFormMetaInfo = function (localInfo, remoteInfo) { var depends = []; var resultLocalInfo = {}; var updateLocalInfo = false; localInfo = localInfo || {}; // Проверяем измененные и добавленные записи for (var _i = 0, remoteInfo_1 = remoteInfo; _i < remoteInfo_1.length; _i++) { var remoteItem = remoteInfo_1[_i]; remoteItem = remoteItem || {}; var remoteLastModified = remoteItem.updated || 0; var actionGuid = remoteItem.action_guid || ''; var entityGuid = remoteItem.entity_guid || ''; var localKey = actionGuid + '_' + entityGuid; if (!localInfo.hasOwnProperty(localKey)) { updateLocalInfo = true; } else if (localInfo.hasOwnProperty(localKey) && ((localInfo[localKey] < remoteLastModified) || (remoteLastModified == 0))) { depends.push(this.cache.removeByTag(localKey)); updateLocalInfo = true; } resultLocalInfo[localKey] = remoteLastModified; } // Проверяем удаленные записи var localKeys = Object.keys(localInfo); for (var i = 0; i < localKeys.length; i++) { var localKey = localKeys[i]; if (!resultLocalInfo.hasOwnProperty(localKey)) { depends.push(this.cache.removeByTag(localKey)); updateLocalInfo = true; } } if (updateLocalInfo) { depends.push(this.cache.set(RealtyService.LAST_MODIFIED_INFO_KEY, resultLocalInfo)); } return Promise.all(depends); }; return RealtyService; }()); export { RealtyService }; RealtyService.LAST_MODIFIED_INFO_KEY = 'realty_forms_last_modified_info'; RealtyService.FULL_FORM_METADATA_KEY = 'full_form_metadata_info'; RealtyService.ESB_REALTY_CHANNEL_NAME = 'realty'; RealtyService.ESB_REALTY_FAVORITES_CHANGE = 'favorite.change'; RealtyService.ESB_REALTY_PUBLISHED_CHANGE = 'published.change'; RealtyService.ESB_REALTY_REMOVE = 'remove'; RealtyService.decorators = [ { type: Injectable }, ]; /** @nocollapse */ RealtyService.ctorParameters = function () { return [ { type: HttpService, }, { type: CurrentUserService, }, { type: undefined, decorators: [{ type: Inject, args: ['StorageInterface',] },] }, ]; }; //# sourceMappingURL=realty.service.js.map