117 lines
3.1 KiB
TypeScript
117 lines
3.1 KiB
TypeScript
import { useConfig } from '@abearxiong/use-config';
|
|
import { sequelize } from '@/modules/sequelize.ts';
|
|
import { DataTypes, Model } from 'sequelize';
|
|
import { createToken, checkToken } from '@abearxiong/auth/token';
|
|
import { cryptPwd } from '@abearxiong/auth';
|
|
import { nanoid } from 'nanoid';
|
|
import { CustomError } from '@abearxiong/router';
|
|
|
|
const config = useConfig<{ tokenSecret: string }>();
|
|
|
|
export class User extends Model {
|
|
declare id: string;
|
|
declare username: string;
|
|
declare password: string;
|
|
declare salt: string;
|
|
declare needChangePassword: boolean;
|
|
declare description: string;
|
|
declare data: any;
|
|
async createToken() {
|
|
const { id, username } = this;
|
|
const expireTime = 60 * 60 * 24 * 7; // 7 days
|
|
const now = new Date().getTime();
|
|
const token = await createToken({ id, username }, config.tokenSecret);
|
|
return { token, expireTime: now + expireTime };
|
|
}
|
|
static async verifyToken(token: string) {
|
|
const ct = await checkToken(token, config.tokenSecret);
|
|
const tokenUser = ct.payload;
|
|
return tokenUser;
|
|
}
|
|
static createUser(username: string, password?: string, description?: string) {
|
|
const user = User.findOne({ where: { username } });
|
|
if (user) {
|
|
throw new CustomError('User already exists');
|
|
}
|
|
const salt = nanoid(6);
|
|
let needChangePassword = !password;
|
|
password = password || '123456';
|
|
const cPassword = cryptPwd(password, salt);
|
|
return User.create({ username, password: cPassword, description, salt, needChangePassword });
|
|
}
|
|
createPassword(password: string) {
|
|
const salt = this.salt;
|
|
const cPassword = cryptPwd(password, salt);
|
|
this.password = cPassword;
|
|
return cPassword;
|
|
}
|
|
}
|
|
User.init(
|
|
{
|
|
id: {
|
|
type: DataTypes.UUID,
|
|
primaryKey: true,
|
|
defaultValue: DataTypes.UUIDV4,
|
|
},
|
|
username: {
|
|
type: DataTypes.STRING,
|
|
allowNull: false,
|
|
unique: true,
|
|
},
|
|
password: {
|
|
type: DataTypes.STRING,
|
|
allowNull: false,
|
|
},
|
|
salt: {
|
|
type: DataTypes.STRING,
|
|
allowNull: false,
|
|
},
|
|
description: {
|
|
type: DataTypes.STRING,
|
|
},
|
|
needChangePassword: {
|
|
type: DataTypes.BOOLEAN,
|
|
defaultValue: false,
|
|
},
|
|
data: {
|
|
type: DataTypes.JSON,
|
|
defaultValue: {},
|
|
},
|
|
},
|
|
{
|
|
sequelize,
|
|
tableName: 'cf_user',
|
|
paranoid: true,
|
|
},
|
|
);
|
|
User.sync({ alter: true, logging: false })
|
|
.then((res) => {
|
|
// initializeUser();
|
|
})
|
|
.catch((err) => {
|
|
console.error('Sync User error', err);
|
|
});
|
|
|
|
export const initializeUser = async () => {
|
|
const w = await User.findAndCountAll();
|
|
console.info('[User count]', w.count);
|
|
const password = '2e8a305521bba54f49638ed25e46adf3'; //123456
|
|
const salt = '123';
|
|
const users = [{ username: 'admin' }, { username: 'user' }, { username: 'root' }];
|
|
if (w.count < 1) {
|
|
const newUsers = await User.bulkCreate(
|
|
users.map((user) => {
|
|
return {
|
|
...user,
|
|
password,
|
|
needChangePassword: true,
|
|
salt,
|
|
};
|
|
}),
|
|
);
|
|
console.info('[create new Users]', newUsers);
|
|
}
|
|
};
|
|
|
|
// initializeUser();
|