diff --git a/server/api/ApiDeclare.ts b/server/api/ApiDeclare.ts index b01b66d..4bdf33a 100644 --- a/server/api/ApiDeclare.ts +++ b/server/api/ApiDeclare.ts @@ -8,6 +8,9 @@ export type CallMethod = "User.setAvatar" | "User.getMyInfo" | + "User.getMyContactGroups" | + "User.setMyContactGroups" | + "Chat.getInfo" | "Chat.sendMessage" | "Chat.getMessageHistory" diff --git a/server/api/UserApi.ts b/server/api/UserApi.ts index 419f96a..297ee65 100644 --- a/server/api/UserApi.ts +++ b/server/api/UserApi.ts @@ -195,6 +195,50 @@ export default class UserApi extends BaseApi { } } }) + // 獲取聯絡人列表 + this.registerEvent("User.getMyContactGroups", (args) => { + if (this.checkArgsMissing(args, ['token'])) return { + msg: "參數缺失", + code: 400, + } + + const token = TokenManager.decode(args.token as string) + if (!this.checkToken(token)) return { + code: 401, + msg: "令牌無效", + } + + const user = User.findById(token.author) + + return { + msg: "成功", + code: 200, + data: { + contact_groups: user!.getContactGroups() + } + } + }) + // 更新聯絡人列表 + this.registerEvent("User.setMyContactGroups", (args) => { + if (this.checkArgsMissing(args, ['token', 'contact_groups'])) return { + msg: "參數缺失", + code: 400, + } + + const token = TokenManager.decode(args.token as string) + if (!this.checkToken(token)) return { + code: 401, + msg: "令牌無效", + } + + const user = User.findById(token.author) + user!.setContactGroups(args.contact_groups as { [key: string]: string[] }) + + return { + msg: "成功", + code: 200, + } + }) /* * ================================================ * 公開資料 diff --git a/server/data/User.ts b/server/data/User.ts index 8cedebd..2da82ee 100644 --- a/server/data/User.ts +++ b/server/data/User.ts @@ -33,27 +33,28 @@ export default class User { /* 用戶名, 可選 */ username TEXT, /* 昵称 */ nickname TEXT NOT NULL, /* 头像, 可选 */ avatar_file_hash TEXT, + /* 聯絡人組 */ contact_groups TEXT NOT NULL, /* 设置 */ settings TEXT NOT NULL ); `) - return db + return db } - + static createWithUserNameChecked(userName: string | null, password: string, nickName: string, avatar: Buffer | null) { if (userName && User.findAllBeansByCondition('username = ?', userName).length > 0) throw new DataWrongError(`用户名 ${userName} 已存在`) - return User.create( + return User.create( userName, password, nickName, avatar ) } - + static create(userName: string | null, password: string, nickName: string, avatar: Buffer | null) { const user = new User( User.findAllBeansByCondition( - 'count = ?', + 'count = ?', User.database.prepare(`INSERT INTO ${User.table_name} ( id, password, @@ -61,22 +62,29 @@ export default class User { username, nickname, avatar_file_hash, + contact_groups, settings - ) VALUES (?, ?, ?, ?, ?, ?, ?);`).run( + ) VALUES (?, ?, ?, ?, ?, ?, ?, ?);`).run( crypto.randomUUID(), password, Date.now(), userName, nickName, null, + '{}', "{}" ).lastInsertRowid )[0] ) avatar && user.setAvatar(avatar) + user.setContactGroups({ + 默認: [ + user.bean.id + ] + }) return 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[] } @@ -96,7 +104,7 @@ export default class User { console.error(chalk.red(`警告: 查询 username = ${userName} 时, 查询到多个相同用户名的用户`)) return new User(beans[0]) } - + declare bean: UserBean constructor(bean: UserBean) { this.bean = bean @@ -112,6 +120,21 @@ export default class User { setUserName(userName: string) { this.setAttr("username", userName) } + getContactGroups() { + try { + return JSON.parse(this.bean.contact_groups) + } catch (e) { + console.log(chalk.yellow(`警告: 聯絡人組解析失敗: ${(e as Error).message}`)) + return { + 默認: [ + this.bean.id + ] + } + } + } + setContactGroups(contactGroups: { [key: string]: string[] }) { + this.setAttr("contact_groups", JSON.stringify(contactGroups)) + } getNickName(): string { return this.bean.nickname } diff --git a/server/data/UserBean.ts b/server/data/UserBean.ts index 37f001c..e97d40d 100644 --- a/server/data/UserBean.ts +++ b/server/data/UserBean.ts @@ -6,6 +6,7 @@ export default class UserBean { declare registered_time: number declare nickname: string declare avatar_file_hash?: string + declare contact_groups: string declare settings: string [key: string]: unknown