Files
ZYZ/shared/db/User.ts
2021-01-28 12:01:26 +08:00

120 lines
3.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { COUNTER } from './../consts';
import { CounterModel } from './Counter';
import BaseModel from './BaseModel';
import { index, getModelForClass, prop, DocumentType } from '@typegoose/typegoose';
import { genCode } from '../pubUtils/util';
/**
* 用户字段接口
*/
@index({ tel: 1 })
@index({ uid: 1 })
export default class User extends BaseModel {
@prop({ required: true })
uid: number;
@prop({ required: true })
username: string;
@prop({ required: true })
userCode: string; // 用户唯一字符串标识
@prop({ required: true })
token: string;
@prop({ required: true })
tel: string;
@prop({ required: true, default: '' })
telHash: string;
@prop({ required: true, default: '' })
channelId: string;
@prop({ required: false })
guestId: string;
// 最后登录 IP
@prop({ required: false })
ip: string;
@prop({ required: true })
lastLoginTime: Date;
@prop({ required: true })
createTime: Date;
platform: string;
@prop({ required: true, default: [] })
platforms: [{
platform: string; // 平台ios, android, web, pc
unionId: string; // 用户标识
}];
@prop({ required: true, default: 'com.bantu.zyz' })
pkgName: string;
// 服务器类型official, channel, ios, oversea
@prop({ required: true, default: 'official' })
serverType: string;
// 账号是否被屏蔽
@prop({ required: true, default: false })
blocked: boolean;
// 用户权限0-普通用户1-测试用户
@prop({ required: true, default: 0 })
auth: number;
public static async updateToken(tel: string, token: string, platform: string, pkgName: string, serverType: string, lean = true) {
let user: UserType = await UserModel.findOne({ tel }).lean();
const curTime: Date = new Date();
let update = {};
if (!user) {
const uid = await CounterModel.getNewCounter(COUNTER.UID);
const userCode = genCode(8);
const doc = new UserModel();
update = Object.assign(update, { platform, pkgName, serverType, createTime: curTime, uid, userCode, username: `用户${uid}` }, doc.toJSON());
}
update = Object.assign(update, { token, lastLoginTime: curTime });
user = await UserModel.findOneAndUpdate({ tel }, update, { upsert: true, new: true }).lean(lean);
return user;
}
public static async findUserByToken(token: string, lean = true) {
const user: UserType = await UserModel.findOne({ token }).select('uid token serverType auth').lean(lean);
return user;
}
public static async findUserByTel(tel: string, lean = true) {
const user: UserType = await UserModel.findOne({ tel }).select('uid tel').lean(lean);
return user;
}
public static async findUserByUid(uid: number, lean = true) {
const user: UserType = await UserModel.findOne({ uid }).select('uid tel').lean(lean);
return user;
}
public static async addAuth(uid: number, auth: number, lean = true) {
const user: UserType = await UserModel.findOneAndUpdate({ uid }, { auth }).select('uid tel').lean(lean);
return user;
}
public static async findUserByField(field: string, value?: Array<number|string>, lean = true) {
let searchObj = {};
if(field != 'all') {
searchObj[field] = {
$in: value
};
}
const user: UserType[] = await UserModel.find(searchObj).select('uid tel username serverType auth').lean(lean);
return user;
}
}
export const UserModel = getModelForClass(User);
export interface UserType extends Pick<DocumentType<User>, keyof User>{};