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