ns2-front-module-common
Version:
NS2 common module
451 lines • 21.4 kB
JavaScript
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