Ext.define('saas.model.Session', { extend: 'Ext.data.Model', fields: [ { name: 'token', type: 'string' }, { name: 'expire', type: 'number' }, { name: 'timestamp', type: 'number' }, { name: 'span', type: 'number' }, { name: 'account' } ], statics: { login: function(username, password, companyId) { let params = { username: username, password: password }; if(companyId) { params.companyId = companyId; } return new Ext.Promise(function (resolve, reject) { Ext.Ajax.request({ url: '/api/auth/authorize', params: params, method: 'POST', success: function (response) { var res = Ext.decode(response.responseText); if (res.success) { var session = saas.model.Session.loadData(res.data.token); session.set('account', res.data.account); // 服务端与本地存在时间差 session.set('span', session.get('timestamp') - new Date().getTime()); if (!session.isValid()) { reject({ message: '登录失败,无效身份令牌' }); } else { resolve(session); } } else { Ext.log.error('request failure with code: ', res.code, ', message: ', res.message); reject(res); } }, failure: function (response) { Ext.log.error('server-side failure with status code: ', response.status); reject(response); } }); }); }, switchCompany: function(oldSession, companyId) { return new Ext.Promise(function (resolve, reject) { Ext.Ajax.request({ url: '/api/auth/switch/company', params: { companyId: companyId }, method: 'GET', headers: { 'Authorization': oldSession.get('token') }, success: function (response) { var res = Ext.decode(response.responseText); if (res.success) { var newSession = saas.model.Session.loadData(res.data); newSession.set('account', oldSession.get('account')); // 服务端与本地存在时间差 newSession.set('span', newSession.get('timestamp') - new Date().getTime()); if (!newSession.isValid()) { reject({ message: '切换失败,无效身份令牌' }); } else { resolve(newSession); } } else { Ext.log.error('request failure with code: ', res.code, ', message: ', res.message); reject(res); } }, failure: function (response) { Ext.log.error('server-side failure with status code: ', response.status); reject(response); } }); }); } }, isValid: function() { return !Ext.isEmpty(this.get('token')) && this.get('token').length > 128 && this.get('timestamp') + this.get('expire') * 1000 > new Date().getTime() + this.get('span'); }, logout: function() { return new Ext.Promise(function (resolve, reject) { resolve({}); }); } });