diff --git a/server/data/User.ts b/server/data/User.ts index 43508af..4caae6d 100644 --- a/server/data/User.ts +++ b/server/data/User.ts @@ -10,6 +10,7 @@ import UserBean from './UserBean.ts' import FileManager from './FileManager.ts' import { SQLInputValue } from "node:sqlite"; +import DataWrongError from "../api/DataWrongError.ts"; /** * User.ts - Wrapper and manager @@ -19,12 +20,13 @@ import { SQLInputValue } from "node:sqlite"; export default class User { static table_name: string = "Users" private static database: DatabaseSync = User.init() - private static init(): DatabaseSync { + private static init() { const db: DatabaseSync = new DatabaseSync(path.join(config.data_path, User.table_name + '.db')) db.exec(` CREATE TABLE IF NOT EXISTS ${User.table_name} ( /* 序号 */ count INTEGER PRIMARY KEY AUTOINCREMENT, - /* 用户 ID, 哈希 */ id TEXT, + /* 用户 ID, UUID */ id TEXT, + /* 密碼, 哈希 */ password TEXT, /* 注册时间, 时间戳 */ registered_time INT8 NOT NULL, /* 用戶名, 可選 */ username TEXT, /* 昵称 */ nickname TEXT NOT NULL, @@ -35,29 +37,32 @@ export default class User { return db } - static createWithUserNameChecked(userName: string | null, nickName: string, avatar: Buffer | null): User { + static createWithUserNameChecked(userName: string | null, password: string, nickName: string, avatar: Buffer | null) { if (userName && User.findAllBeansByCondition('username = ?', userName).length > 0) - throw new Error(`用户名 ${userName} 已存在`) + throw new DataWrongError(`用户名 ${userName} 已存在`) return User.create( userName, + password, nickName, avatar ) } - static create(userName: string | null, nickName: string, avatar: Buffer | null): User { + static create(userName: string | null, password: string, nickName: string, avatar: Buffer | null) { const user = new User( User.findAllBeansByCondition( 'count = ?', User.database.prepare(`INSERT INTO ${User.table_name} ( id, + password, registered_time, username, nickname, avatar_file_hash, settings - ) VALUES (?, ?, ?, ?, ?, ?);`).run( + ) VALUES (?, ?, ?, ?, ?, ?, ?);`).run( crypto.randomUUID(), + password, Date.now(), userName, nickName, @@ -73,18 +78,18 @@ export default class User { private static findAllBeansByCondition(condition: string, ...args: SQLInputValue[]): UserBean[] { return User.database.prepare(`SELECT * FROM ${User.table_name} WHERE ${condition};`).all(...args) as unknown as UserBean[] } - static findById(id: string): User { + static findById(id: string) { const beans = User.findAllBeansByCondition('id = ?', id) if (beans.length == 0) - throw new Error(`找不到用户 ID 为 ${id} 的用户`) + return null else if (beans.length > 1) console.error(chalk.red(`警告: 查询 id = ${id} 时, 查询到多个相同用户 ID 的用户`)) return new User(beans[0]) } - static findByUserName(userName: string): User { + static findByUserName(userName: string) { const beans = User.findAllBeansByCondition('username = ?', userName) if (beans.length == 0) - throw new Error(`找不到用户名为 ${userName} 的用户`) + return null else if (beans.length > 1) console.error(chalk.red(`警告: 查询 username = ${userName} 时, 查询到多个相同用户名的用户`)) return new User(beans[0]) @@ -95,26 +100,32 @@ export default class User { this.bean = bean } /* 一切的基础都是 count ID */ - private setAttr(key: string, value: unknown): void { + private setAttr(key: string, value: unknown) { User.database.prepare(`UPDATE ${User.table_name} SET ${key} = ? WHERE count = ?`).run(value, this.bean.count) this.bean[key] = value } getUserName(): string | null { return this.bean.username } - setUserName(userName: string): void { + setUserName(userName: string) { this.setAttr("username", userName) } getNickName(): string { return this.bean.nickname } - setNickName(nickName: string): void { + setNickName(nickName: string) { this.setAttr("nickname", nickName) } + getPassword(): string { + return this.bean.password + } + setPassword(password: string) { + this.setAttr("password", password) + } getAvatar(): Buffer | null { return FileManager.findByHash(this.bean.avatar_file_hash)?.readSync() } - setAvatar(avatar: Buffer): void { + setAvatar(avatar: Buffer) { this.setAttr("avatar_file_hash", FileManager.uploadFile(`avatar_user_${this.bean.count}`, avatar).getHash()) } diff --git a/server/data/UserBean.ts b/server/data/UserBean.ts index d5f41b5..99b64dd 100644 --- a/server/data/UserBean.ts +++ b/server/data/UserBean.ts @@ -1,6 +1,7 @@ export default class UserBean { declare count: number declare id: string + declare password: string declare username: string | null declare registered_time: number declare nickname: string