UNPKG

ns2-front-module-common

Version:
602 lines 23.6 kB
import { Inject, Injectable, Injector } from "@angular/core"; import { URLSearchParams } from "@angular/http"; import { UUID } from "angular2-uuid"; // Services import { CookieService } from "ngx-cookie-service"; import { HttpService } from "./http.service"; // Urls import { CurrentUserUrls } from '../urls/current-user-urls.model'; import { Observable } from 'rxjs/Observable'; import "rxjs/operator/map"; // RxMq import Rxmq from "rxmq"; // Имя ключа в хранилище (localStorage или sessionStorage) export var STORAGE_TOKEN_KEY = 'token'; var CurrentUserService = (function () { function CurrentUserService(injector, persistStorage, tempStorage, cookiesService) { this.injector = injector; this.persistStorage = persistStorage; this.tempStorage = tempStorage; this.cookiesService = cookiesService; this.token = ''; this.usersEndPoint = ''; this.temporaryDeviceUUID = ''; this.ESBChannel = Rxmq.channel(CurrentUserService.ESB_CHANNEL_NAME); } // Получение соц сетей CurrentUserService.prototype.getSocials = function () { var _this = this; return new Promise(function (resolve, reject) { var url = _this.usersEndPoint + 'self/socials'; _this.injector.get(HttpService).get(url) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(function (data) { resolve(data); }, function (err) { reject(err); }); }); }; /** * Предзагрузка * * @returns {Promise<string[]>} */ CurrentUserService.prototype.load = function () { var _this = this; return new Promise(function (resolve, reject) { _this.restoreToken() .then(function (token) { var tokenResolve = function () { resolve(token); }; _this.loadInfoRemote().then(tokenResolve) .catch(function (err) { (err.statusCode == 401) ? tokenResolve() : reject(err); }); }) .catch(resolve); }); }; /** * Установка URL до сервиса users * * @param usersEndPoint */ CurrentUserService.prototype.setUsersEndPoint = function (usersEndPoint) { this.usersEndPoint = usersEndPoint; }; /** * Проверка текущей сессии пользователя * * @returns {Promise<T>} */ CurrentUserService.prototype.isAuth = function () { return !!this.getToken(); }; /** * Авторизация в системе * * @param email * @param password * @param rememberMe */ CurrentUserService.prototype.login = function (email, password, rememberMe) { var _this = this; return new Promise(function (resolve, reject) { var url = _this.usersEndPoint + 'users/login'; var body = { email: email, password: password }; _this.injector.get(HttpService).post(url, body) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(function (token) { _this.storeToken(token, rememberMe) .then(function (token) { _this.token = token; _this.loadInfoRemote() .then(function () { resolve(); }) .catch(function (err) { reject(err); }); }) .catch(function () { _this.token = ''; reject(); }); }, function (err) { reject(err); }); }); }; /** * Регистрация нового пользователя * * @param email * @param password * @param password_repeat * @param firstname * @param lastname * @param geo_guid * @param phone */ CurrentUserService.prototype.register = function (email, password, password_repeat, firstname, lastname, geo_guid, phone) { var _this = this; return new Promise(function (resolve, reject) { var url = _this.usersEndPoint + 'users/register'; var body = { email: email, password: password, password_repeat: password_repeat, firstname: firstname, lastname: lastname, geo_guid: geo_guid, phone: phone }; _this.injector.get(HttpService).post(url, body) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(function (data) { resolve(data); }, function (err) { reject(err); }); }); }; /** * Проверка email адреса на первом этапе регистрации * * @param email * @returns {Promise<T>} */ CurrentUserService.prototype.registerCheckEmail = function (email) { var _this = this; return new Promise(function (resolve, reject) { var url = _this.usersEndPoint + 'users/register-check-email'; var params = new URLSearchParams(); params.set('email', email); _this.injector.get(HttpService).get(url, { search: params }) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(function (correctEmail) { resolve(correctEmail); }, function (err) { reject(err); }); }); }; /** * Замена номера телефона при переходе с третьего шага на второй * * @param user_guid * @param phone * @returns {Promise<T>} */ CurrentUserService.prototype.registerChangePhone = function (user_guid, phone) { var _this = this; return new Promise(function (resolve, reject) { var url = _this.usersEndPoint + 'users/register-change-phone'; var body = { user_guid: user_guid, phone: phone }; _this.injector.get(HttpService).put(url, body) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(function (newPhone) { resolve(newPhone); }, function (err) { reject(err); }); }); }; /** * Проверка кода подтверждения из СМС * * @param user_guid * @param code * @returns {Promise<T>} */ CurrentUserService.prototype.confirm = function (user_guid, code) { var _this = this; return new Promise(function (resolve, reject) { var url = _this.usersEndPoint + 'users/confirm'; var body = { user_guid: user_guid, code: code }; _this.injector.get(HttpService).post(url, body) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(function (data) { resolve(data); }, function (err) { reject(err); }); }); }; // Загрузка информации о текущем пользователе CurrentUserService.prototype.loadInfoRemote = function () { var _this = this; return new Promise(function (resolve, reject) { var url = CurrentUserUrls.self; _this.injector.get(HttpService).get(url) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(function (info) { _this.info = info; _this.ESBChannel.subject(CurrentUserService.ESB_USER_LOGIN).next(info); resolve(info); }, function (err) { reject(err); }); }); }; /** * Запрос ссылки сброса пароля на почту * * @param email * @returns {Promise<T>} */ CurrentUserService.prototype.reminderPassword = function (email) { var _this = this; return new Promise(function (resolve, reject) { var url = _this.usersEndPoint + 'users/reminder-password'; var body = { email: email }; _this.injector.get(HttpService).post(url, body) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(function (result) { resolve(result); }, function (err) { reject(err); }); }); }; /** * Проверка токена восстановления пароля. Используется при открытии страницы восстановления, токен передается * в параметре урла * * @param token * @returns {Promise<T>} */ CurrentUserService.prototype.restorePasswordCheck = function (token) { var _this = this; return new Promise(function (resolve, reject) { var url = _this.usersEndPoint + 'users/restore-password-check'; var params = new URLSearchParams(); params.set('token', token); _this.injector.get(HttpService).get(url, { search: params }) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(function (result) { resolve(result); }, function (err) { reject(err); }); }); }; /** * Восстановление пароля * * @param token * @param password * @param password_repeat * @returns {Promise<T>} */ CurrentUserService.prototype.restorePassword = function (token, password, password_repeat) { var _this = this; return new Promise(function (resolve, reject) { var url = _this.usersEndPoint + 'users/restore-password'; var body = { token: token, password: password, password_repeat: password_repeat }; _this.injector.get(HttpService).put(url, body) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(function (result) { resolve(result); }, function (err) { reject(err); }); }); }; /** * Установка города * * @param geo_guid * @returns {Promise<T>} */ CurrentUserService.prototype.setGeo = function (geo_guid) { var _this = this; return new Promise(function (resolve, reject) { var url = _this.usersEndPoint + 'self/geo'; var body = { geo_guid: geo_guid }; _this.injector.get(HttpService).put(url, body) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(function (result) { _this.info.session.geo_guid = result.geo_guid; _this.ESBChannel.subject(CurrentUserService.ESB_SESSION_CHANGE_CITY).next({ oldGeoGuid: _this.info.session.geo_guid, newGeoGuid: result.geo_guid }); resolve(result); }, function (err) { reject(err); }); }); }; /** * Добавляет подписчика на смену текущего города * @param {Function} then Функция-подписчик * @returns {Subscription} */ CurrentUserService.prototype.onGeoChange = function (then) { return this.ESBChannel.observe(CurrentUserService.ESB_SESSION_CHANGE_CITY).subscribe(then); }; /** * Добавляет подписчика на авторизацию пользователя * @param {Function} then Функция-подписчик * @returns {Subscription} */ CurrentUserService.prototype.onLogin = function (then) { return this.ESBChannel.observe(CurrentUserService.ESB_USER_LOGIN).subscribe(then); }; /** * Добавляет подписчика на выход пользователя из системы * @param {Function} then Функция-подписчик * @returns {Subscription} */ CurrentUserService.prototype.onLogout = function (then) { return this.ESBChannel.observe(CurrentUserService.ESB_USER_LOGOUT).subscribe(then); }; /** * Выход из аккаунта * * @returns {Promise<T>} */ CurrentUserService.prototype.logout = function () { var _this = this; return new Promise(function (resolve, reject) { var url = _this.usersEndPoint + 'self/logout'; var handler = function () { _this.ESBChannel.subject(CurrentUserService.ESB_USER_LOGOUT).next(); _this.localLogout().then(resolve).catch(reject); }; _this.injector.get(HttpService).delete(url).subscribe(handler, handler); }); }; CurrentUserService.prototype.localLogout = function () { this.token = ''; this.cookiesService.delete(CurrentUserService.USER_TOKEN_NAME); return Promise.race([ this.persistStorage.remove(STORAGE_TOKEN_KEY), this.persistStorage.removeByTag(STORAGE_TOKEN_KEY), this.tempStorage.remove(STORAGE_TOKEN_KEY), this.tempStorage.removeByTag(STORAGE_TOKEN_KEY) ]); }; /** * Обновить профиль текущего пользователя * @param newUserData Новые данные пользователя */ CurrentUserService.prototype.saveProfile = function (newUserData) { var _this = this; return new Observable(function (observer) { _this.injector.get(HttpService) .post(CurrentUserUrls.self, newUserData) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(function (response) { _this.info = response; observer.next(response); observer.complete(); }, function (error) { observer.error(error); observer.complete(); }); }); }; /** * Отправить данные пользователя на модерацию * @param userData Данные пользователя */ CurrentUserService.prototype.sendOnModeration = function (userData) { var _this = this; return new Observable(function (observer) { _this.injector.get(HttpService) .post(CurrentUserUrls.moderation, userData) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(function (response) { _this.info = response; observer.next(response); observer.complete(); }, function (error) { observer.error(error); observer.complete(); }); }); }; /** * Сохранить токен в локал сторадж * * @param token * @param rememberMe */ CurrentUserService.prototype.storeToken = function (token, rememberMe) { if (rememberMe) { return this.persistStorage.set(STORAGE_TOKEN_KEY, token); } else { return this.tempStorage.set(STORAGE_TOKEN_KEY, token); } }; /** * Восстанавливает значение токена из хранилища */ CurrentUserService.prototype.restoreToken = function () { var _this = this; return new Promise(function (resolve, reject) { var cookieToken = _this.cookiesService.get(CurrentUserService.USER_TOKEN_NAME); if (cookieToken) { _this.token = cookieToken; _this.storeToken(_this.token, true) .then(function () { resolve(cookieToken); _this.cookiesService.delete(CurrentUserService.USER_TOKEN_NAME); }); } else { _this.persistStorage.get(STORAGE_TOKEN_KEY) .then(function (token) { _this.token = token; resolve(token); }) .catch(function () { _this.tempStorage.get(STORAGE_TOKEN_KEY) .then(function (token) { _this.token = token; resolve(token); }) .catch(function () { reject(); }); }); } }); }; // Установить причину отказа модерации CurrentUserService.prototype.setRejectionReason = function (reason) { this.info.reject_reason = reason; }; /** * Получить токен текущего пользователя * * @returns {string} */ CurrentUserService.prototype.getToken = function () { return this.token; }; /** * Установить токен пользователю * * @param token */ CurrentUserService.prototype.setToken = function (token) { this.token = token; }; /** * Получить информацию о текущем пользователе * * @returns {CurrentUserInfoInterface} */ CurrentUserService.prototype.getInfo = function () { return this.info; }; /** * Метод отправки приглашения пользователю * @param {string} email E-mail пользователя которого необходимо пригласить * @returns {Promise<T>} */ CurrentUserService.prototype.invite = function (email) { var _this = this; return new Promise(function (resolve, reject) { var url = _this.usersEndPoint + 'self/invite'; _this.injector.get(HttpService).post(url, { email: email }) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(function () { resolve(); }, function (err) { reject(err); }); }); }; /** * Получить всех партнеров текущего пользователя * * @returns {Promise<T>} */ CurrentUserService.prototype.getPartners = function () { var _this = this; return new Promise(function (resolve, reject) { var url = _this.usersEndPoint + 'self/partners'; _this.injector.get(HttpService).get(url) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(resolve, reject); }); }; /** * Добавить избранных партнеров текущему пользователю * * @returns {Promise<T>} */ CurrentUserService.prototype.addPartners = function (partnersGuid) { var _this = this; return new Promise(function (resolve, reject) { var url = _this.usersEndPoint + 'self/partners'; _this.injector.get(HttpService).put(url, partnersGuid) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(resolve, reject); }); }; /** * Установить избранных партнеров текущему пользователю * * @returns {Promise<T>} */ CurrentUserService.prototype.setPartners = function (partnersGuid) { var _this = this; return new Promise(function (resolve, reject) { var url = _this.usersEndPoint + 'self/partners'; _this.injector.get(HttpService).post(url, partnersGuid) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(resolve, reject); }); }; /** * Удалить избранного пользователя * * @returns {Promise<T>} */ CurrentUserService.prototype.deletePartner = function (partnerGuid) { var _this = this; return new Promise(function (resolve, reject) { var url = _this.usersEndPoint + 'self/partner/' + partnerGuid; _this.injector.get(HttpService).delete(url) .map(function (response) { return response.json(); }) .map(function (response) { return response.data; }) .subscribe(resolve, reject); }); }; /** * Возвращает временный уникальный идентификатор устройства * @returns {string} */ CurrentUserService.prototype.getTemporaryDeviceUUID = function () { if (!this.temporaryDeviceUUID) { this.temporaryDeviceUUID = UUID.UUID(); } return this.temporaryDeviceUUID; }; Object.defineProperty(CurrentUserService.prototype, "isCandidate", { // Пользователь является кандидатом get: function () { return this.info.rank === 'candidate'; }, enumerable: true, configurable: true }); return CurrentUserService; }()); export { CurrentUserService }; CurrentUserService.ESB_CHANNEL_NAME = 'current-user'; CurrentUserService.ESB_SESSION_CHANGE_CITY = 'session.change-city'; CurrentUserService.ESB_INFO_UPDATE = 'info.update'; CurrentUserService.ESB_USER_LOGIN = 'user.login'; CurrentUserService.ESB_USER_LOGOUT = 'user.logout'; CurrentUserService.USER_TOKEN_NAME = 'X-User-Token'; CurrentUserService.decorators = [ { type: Injectable }, ]; /** @nocollapse */ CurrentUserService.ctorParameters = function () { return [ { type: Injector, }, { type: undefined, decorators: [{ type: Inject, args: ['StorageInterface',] },] }, { type: undefined, decorators: [{ type: Inject, args: ['StorageInterface',] },] }, { type: CookieService, }, ]; }; //# sourceMappingURL=current-user.service.js.map