219 lines
6.8 KiB
JavaScript
219 lines
6.8 KiB
JavaScript
import { Feature } from 'oak-frontend-base';
|
||
import { OakRowInconsistencyException, OakUnloggedInException, OakUserUnpermittedException, } from 'oak-domain/lib/types/Exception';
|
||
import { tokenProjection } from '../types/Projection';
|
||
import { OakUserInfoLoadingException } from '../types/Exception';
|
||
import { LOCAL_STORAGE_KEYS } from '../config/constants';
|
||
import { cloneDeep } from 'oak-domain/lib/utils/lodash';
|
||
export class Token extends Feature {
|
||
tokenValue;
|
||
environment;
|
||
cache;
|
||
storage;
|
||
isLoading = false;
|
||
async loadSavedToken() {
|
||
let tokenValue = await this.storage.load(LOCAL_STORAGE_KEYS.token);
|
||
if (!tokenValue) {
|
||
// 历史数据,原来用的key太随意
|
||
tokenValue = await this.storage.load('token:token');
|
||
if (tokenValue) {
|
||
await this.storage.save(LOCAL_STORAGE_KEYS.token, tokenValue);
|
||
await this.storage.remove('token:token');
|
||
}
|
||
}
|
||
if (tokenValue) {
|
||
this.tokenValue = tokenValue;
|
||
// this.loadTokenInfo();
|
||
}
|
||
else {
|
||
this.tokenValue = undefined;
|
||
}
|
||
this.publish();
|
||
}
|
||
constructor(cache, storage, environment) {
|
||
super();
|
||
this.cache = cache;
|
||
this.storage = storage;
|
||
this.environment = environment;
|
||
this.tokenValue = ''; // 置个空字符串代表还在load storage缓存的数据
|
||
this.loadSavedToken();
|
||
}
|
||
async loadTokenInfo() {
|
||
if (this.tokenValue && !this.isLoading) {
|
||
this.isLoading = true;
|
||
await this.cache.refresh('token', {
|
||
data: cloneDeep(tokenProjection),
|
||
filter: {
|
||
id: this.tokenValue,
|
||
},
|
||
});
|
||
this.publish();
|
||
this.isLoading = false;
|
||
}
|
||
}
|
||
async loginByMobile(mobile, password, captcha, disableRegist) {
|
||
const env = await this.environment.getEnv();
|
||
const { result } = await this.cache.exec('loginByMobile', {
|
||
password,
|
||
mobile,
|
||
captcha,
|
||
disableRegist,
|
||
env,
|
||
});
|
||
this.tokenValue = result;
|
||
await this.storage.save(LOCAL_STORAGE_KEYS.token, result);
|
||
this.publish();
|
||
}
|
||
async loginByWechatInWebEnv(wechatLoginId) {
|
||
const env = await this.environment.getEnv();
|
||
const { result } = await this.cache.exec('loginByWechat', {
|
||
env: env,
|
||
wechatLoginId,
|
||
});
|
||
this.tokenValue = result;
|
||
await this.storage.save(LOCAL_STORAGE_KEYS.token, result);
|
||
this.publish();
|
||
}
|
||
async loginWechat(code, params) {
|
||
const env = await this.environment.getEnv();
|
||
const { result } = await this.cache.exec('loginWechat', {
|
||
code,
|
||
env: env,
|
||
wechatLoginId: params?.wechatLoginId,
|
||
});
|
||
this.tokenValue = result;
|
||
await this.storage.save(LOCAL_STORAGE_KEYS.token, result);
|
||
this.publish();
|
||
}
|
||
async loginWechatMp() {
|
||
const { code } = await wx.login();
|
||
const env = await this.environment.getEnv();
|
||
const { result } = await this.cache.exec('loginWechatMp', {
|
||
code,
|
||
env: env,
|
||
});
|
||
this.tokenValue = result;
|
||
await this.storage.save(LOCAL_STORAGE_KEYS.token, result);
|
||
this.publish();
|
||
}
|
||
async syncUserInfoWechatMp() {
|
||
const info = await wx.getUserProfile({
|
||
desc: '同步微信昵称和头像信息',
|
||
});
|
||
const { userInfo: { nickName: nickname, avatarUrl }, encryptedData, signature, iv, } = info;
|
||
await this.cache.exec('syncUserInfoWechatMp', {
|
||
nickname,
|
||
avatarUrl,
|
||
encryptedData,
|
||
signature,
|
||
iv,
|
||
});
|
||
this.publish();
|
||
}
|
||
async logout() {
|
||
await this.cache.exec('logout', {});
|
||
this.removeToken();
|
||
}
|
||
removeToken() {
|
||
this.tokenValue = undefined;
|
||
this.storage.remove(LOCAL_STORAGE_KEYS.token);
|
||
this.publish();
|
||
}
|
||
getTokenValue() {
|
||
return this.tokenValue;
|
||
}
|
||
getToken(allowUnloggedIn) {
|
||
if (this.tokenValue === '') {
|
||
throw new OakUserInfoLoadingException();
|
||
}
|
||
if (this.tokenValue) {
|
||
const token = this.cache.get('token', {
|
||
data: cloneDeep(tokenProjection),
|
||
filter: {
|
||
id: this.tokenValue,
|
||
},
|
||
})[0];
|
||
if (!token) {
|
||
this.loadTokenInfo();
|
||
if (allowUnloggedIn) {
|
||
return undefined;
|
||
}
|
||
throw new OakUserInfoLoadingException();
|
||
}
|
||
return token;
|
||
}
|
||
if (allowUnloggedIn) {
|
||
return undefined;
|
||
}
|
||
throw new OakUnloggedInException();
|
||
}
|
||
getUserId(allowUnloggedIn) {
|
||
const token = this.getToken(allowUnloggedIn);
|
||
if (token?.userId) {
|
||
return token.userId;
|
||
}
|
||
}
|
||
// getUserInfo 不要求登录
|
||
getUserInfo() {
|
||
const token = this.getToken(true);
|
||
if (token?.user) {
|
||
return token.user;
|
||
}
|
||
}
|
||
isRoot() {
|
||
const token = this.getToken(true);
|
||
return !!token?.user?.isRoot;
|
||
}
|
||
/**
|
||
* 这个是指token的player到底是不是root
|
||
* @returns
|
||
*/
|
||
isReallyRoot() {
|
||
const token = this.getToken(true);
|
||
return !!token?.player?.isRoot;
|
||
}
|
||
async sendCaptcha(mobile, type) {
|
||
const env = await this.environment.getEnv();
|
||
const { result } = await this.cache.exec('sendCaptcha', {
|
||
mobile,
|
||
env: env,
|
||
type,
|
||
});
|
||
return result;
|
||
}
|
||
async switchTo(userId) {
|
||
if (!this.isReallyRoot()) {
|
||
throw new OakUserUnpermittedException();
|
||
}
|
||
const currentUserId = this.getUserId();
|
||
if (currentUserId === userId) {
|
||
throw new OakRowInconsistencyException(undefined, '您已经是当前用户');
|
||
}
|
||
await this.cache.exec('switchTo', {
|
||
userId,
|
||
});
|
||
this.publish();
|
||
}
|
||
async refreshWechatPublicUserInfo() {
|
||
await this.cache.exec('refreshWechatPublicUserInfo', {});
|
||
this.publish();
|
||
}
|
||
async getWechatMpUserPhoneNumber(code) {
|
||
const env = await this.environment.getEnv();
|
||
await this.cache.exec('getWechatMpUserPhoneNumber', {
|
||
code,
|
||
env: env,
|
||
});
|
||
// this.publish();
|
||
}
|
||
async wakeupParasite(id) {
|
||
const env = await this.environment.getEnv();
|
||
const { result } = await this.cache.exec('wakeupParasite', {
|
||
id,
|
||
env: env,
|
||
});
|
||
this.tokenValue = result;
|
||
await this.storage.save(LOCAL_STORAGE_KEYS.token, result);
|
||
this.publish();
|
||
}
|
||
}
|