(function () { 'use strict'; angular.module('streamApp').service('userService', function (apiProxy, $location) { const login = "login"; const register = "register"; const forgotPassword = "forgotpassword"; const resetPassword = "resetpassword"; const sharingRequest = "sharingrequest"; const termsOfService = "termsofservice"; const emailSubscription = "emailsubscription"; const links = "links"; const start = "start"; const contact = "contact"; const linkValues = {}; var user = { authenticated: false, userName: null, variants: {} }; this.getUser = function () { const current = $location.path().toLowerCase(); return apiProxy.GET({ url: 'api/users', }).then(function (data) { user.userName = data.data.Name; user.canShareDate = data.data.canShareDate; user.premiumMember = data.data.PremiumMember; user.variants = data.data.Variants; user.email = data.data.Email; user.privateMode = data.data.PrivateMode; user.authenticated = true; return user; }).catch(function (response) { if (response.status === 401) { user.userName = null; user.authenticated = false; if (!current.includes(login) && !current.includes(register) && !current.includes(forgotPassword) && !current.includes(resetPassword) && !current.includes(sharingRequest) && !current.includes(termsOfService) && !current.includes(emailSubscription) && !current.includes(start) && !current.includes(contact) && !current.includes(links) ) { let params = Object.keys($location.search()); let returnUrl = params.reduce((l, r) => l + r + '=' + $location.search()[r] + '&', $location.path() + '?').slice(0, -1); logOff().catch(); $location.url(login + "?start=" + encodeURIComponent(returnUrl)); } return user; } }); }; this.isAuthenticated = function () { return this.getUser().then(function (user) { return user; }); }; this.updateName = function (name) { return apiProxy.PUT({ url: 'api/users', data: { name: name } }).then((data) => data.data.Name); }; this.updatePrivateMode = function (isPrivate) { return apiProxy.PUT({ url: 'api/users/' + isPrivate + '/private', }).then((data) => data.data); }; this.login = function (token) { return apiProxy.POST({ url: 'api/users/login', data: { token } }) .then((result) => apiProxy.setToken(result.data)) .then(() => this.isAuthenticated()); }; /* this.link = function (token) { if (token) { if (!linkValues[token]) { linkValues[token] = apiProxy.POST({ url: 'api/users/link', data: { token } }) .then((result) => apiProxy.setToken(result.data)) .then(() => this.isAuthenticated()) .catch((err) => err); } return linkValues[token]; } return Promise.resolve(); };*/ this.createToken = function (email) { return apiProxy.POST({ url: 'api/users/token', data: { email } }).then(function (data) { return data.data; }); }; this.register = function (email, acceptTerms, name) { return apiProxy.POST({ url: 'api/users/register', data: { email: email, acceptTerms: acceptTerms, name: name } }) .then((result) => apiProxy.setToken(result.data)) .then(() => this.isAuthenticated()); }; function logOff() { return apiProxy.POST({ url: 'api/users/logOff', }) .then(()=> apiProxy.setToken(undefined)) .then(function () { user.userName = null; user.authenticated = false; return user; }); }; this.logOff = logOff; this.getRelationships = function () { return apiProxy.GET({ url: 'api/users/relationships', }).then(data => data.data); }; this.updateRelationships = function (ids) { return apiProxy.POST({ url: 'api/users/relationships', data: { ids } }).then(data => data.data); }; this.reset = function (email) { return apiProxy.POST({ url: 'api/users/reset', data: { email: email } }).then(function (data) { return data.data.message; }); }; this.validateToken = function (token) { return apiProxy.GET({ url: 'api/users/reset/' + token, }).then(function (data) { return data.data.Valid; }).catch(response => false); }; this.shareRequest = function (token) { return apiProxy.GET({ url: 'api/users/shareRequest/' + token, }).then(function (data) { return data.data.Name; }); }; this.planCount = function () { return apiProxy.GET({ url: 'api/users/plans/', }).then(function (data) { return data.data.count; }); }; this.shareRequestConfirm = function (token) { return apiProxy.POST({ url: 'api/users/shareRequest/' + token + '/confirm', }).then(function (data) { return data.data; }); }; this.resetPassword = function (password, confirmPassword, token) { return apiProxy.PUT({ url: 'api/users/password/reset', data: { newPassword: password, confirmPassword: confirmPassword , token: token } }).then(function (data) { return data.data.message; }); }; this.updatePassword = function (existingPassword, password, confirmPassword) { return apiProxy.PUT({ url: 'api/users/password', data: { newPassword: password, confirmPassword: confirmPassword, oldPassword: existingPassword } }).then(function (data) { return data.data.message; }); }; this.getProfile = function () { return apiProxy.GET({ url: 'api/users/profile', }).then(function (data) { return data.data; }); }; this.saveReasons = function (reasons) { return apiProxy.POST({ url: 'api/users/reasons', data: { reasons: reasons } }).then(function ( data ) { return data.data; }); }; this.getReasons = function () { return apiProxy.GET({ url: 'api/users/reasons', }).then(function (data) { return data.data; }); }; this.getPrompts = function () { return apiProxy.GET({ url: 'api/prompts', }).then(function (data) { return data.data; }); }; this.getPrompt = function (id) { return apiProxy.GET({ url: 'api/prompts/' + id, }).then(function (data) { return data.data; }); }; this.getPromptsAll = function (take) { return apiProxy.GET({ url: 'api/prompts/all?take=' + take, }).then(function (data) { return data.data; }); }; this.getPromptsAllAsked = function () { return apiProxy.GET({ url: 'api/prompts/asked', }).then(function (data) { return data.data; }); }; this.getPromptsAllToAnswer = function () { return apiProxy.GET({ url: 'api/prompts/toAnswer', }).then(function (data) { return data.data; }); }; this.getPromptToAsk = function (id) { return apiProxy.GET({ url: 'api/prompts/' + id + '/asked', }).then(function (data) { return data.data; }); }; this.getAskedQuestion = function (id) { return apiProxy.GET({ url: 'api/prompts/' + id + '/asked', }).then(function (data) { return data.data; }); }; this.giveFeedback = function (token) { return apiProxy.POST({ url: 'api/users/giveFeedback', data: { token } }).then((data) => data.data); }; this.addQuestion = function (question) { return apiProxy.POST({ url: 'api/prompts', data: { question } }).then((data) => data.data); }; this.editQuestion = function (id, question) { return apiProxy.PUT({ url: 'api/prompts/' + id, data: { question } }).then((data) => data.data); }; this.askQuestion = function (promptId, userIds) { return apiProxy.POST({ url: 'api/prompts/' + promptId +'/ask', data: { userIds } }).then((data) => data.data); }; }); })();