2024-10-01 00:47:14 +08:00

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();