From 10da3b8e77e84103689a73d953175ed7011b71f0 Mon Sep 17 00:00:00 2001 From: CrescentLeaf Date: Mon, 22 Sep 2025 23:08:19 +0800 Subject: [PATCH] =?UTF-8?q?refactor:=20=E9=87=8D=E5=AF=AB=20Chat=20?= =?UTF-8?q?=E6=88=90=E5=93=A1=E9=82=8F=E8=BC=AF=20*=20=E4=B8=8D=E5=86=8D?= =?UTF-8?q?=E5=8D=80=E5=88=86=20user=5Fa/b,=20=E7=9B=B4=E6=8E=A5=E4=BD=BF?= =?UTF-8?q?=E7=94=A8=20members=5Flist=20=E9=9B=99=E6=88=90=E5=93=A1?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=20*=20=E7=88=B2=E4=BB=A5=E5=BE=8C=E7=BE=A4?= =?UTF-8?q?=E8=81=8A=E6=89=93=E4=B8=8B=E5=9F=BA=E7=A4=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/data/Chat.ts | 37 ++++++++++++++++++++++++++----------- server/data/ChatBean.ts | 7 ++++--- server/data/ChatPrivate.ts | 6 ++++-- 3 files changed, 34 insertions(+), 16 deletions(-) diff --git a/server/data/Chat.ts b/server/data/Chat.ts index 1c62787..4033ed2 100644 --- a/server/data/Chat.ts +++ b/server/data/Chat.ts @@ -7,6 +7,7 @@ import ChatBean from './ChatBean.ts' import { SQLInputValue } from "node:sqlite" import chalk from "chalk" import User from "./User.ts" +import ChatType from "./ChatType.ts" /** * Chat.ts - Wrapper and manager @@ -25,8 +26,7 @@ export default class Chat { /* Chat ID */ id TEXT NOT NULL, /* 標題 (群組) */ title TEXT, /* 頭像 (群組) */ avatar BLOB, - /* UserIdA (私信) */ user_a_id TEXT, - /* UserIdB (私信) */ user_b_id TEXT, + /* 成員 */ members_list TEXT, /* 设置 */ settings TEXT NOT NULL ); `) @@ -46,7 +46,7 @@ export default class Chat { return new Chat(beans[0]) } - static create(chatId: string, type: 'private' | 'group') { + static create(chatId: string, type: ChatType) { const chat = new Chat( Chat.findAllBeansByCondition( 'count = ?', @@ -55,16 +55,14 @@ export default class Chat { id, title, avatar, - user_a_id, - user_b_id, + members_list, settings - ) VALUES (?, ?, ?, ?, ?, ?, ?);`).run( + ) VALUES (?, ?, ?, ?, ?, ?);`).run( type, chatId, null, null, - null, - null, + "[]", "{}" ).lastInsertRowid )[0] @@ -81,11 +79,28 @@ export default class Chat { this.bean[key] = value } + getMembersList() { + return JSON.parse(this.bean.members_list) as string[] + } + addMember(userId: string) { + const ls = this.getMembersList() + ls.push(userId) + this.setMembers(ls) + } + setMembers(members: string[]) { + this.setAttr("members_list", JSON.stringify(members)) + } + removeMembers(members: string[]) { + const ls = this.getMembersList().filter((v) => !members.includes(v)) + this.setAttr("members_list", JSON.stringify(ls)) + } getAnotherUserForPrivate(userMySelf: User) { + const user_a_id = this.getMembersList()[0] + const user_b_id = this.getMembersList()[0] // 注意: 這裏已經確定了 Chat, 不需要再指定對方用戶 - if (this.bean.user_a_id == userMySelf.bean.id) - return User.findById(this.bean?.user_b_id as string) - if (this.bean.user_b_id == userMySelf.bean.id) + if (user_a_id == userMySelf.bean.id) + return User.findById(user_b_id as string) + if (user_b_id == userMySelf.bean.id) return userMySelf return null diff --git a/server/data/ChatBean.ts b/server/data/ChatBean.ts index 60f9bca..31f3f38 100644 --- a/server/data/ChatBean.ts +++ b/server/data/ChatBean.ts @@ -1,10 +1,11 @@ +import ChatType from "./ChatType.ts" + export default class ChatBean { - declare type: "private" | "group" + declare type: ChatType declare id: string declare title?: string declare avatar_file_hash?: string - declare user_a_id?: string - declare user_b_id?: string + declare members_list: string declare settings: string [key: string]: unknown diff --git a/server/data/ChatPrivate.ts b/server/data/ChatPrivate.ts index e570158..28889e5 100644 --- a/server/data/ChatPrivate.ts +++ b/server/data/ChatPrivate.ts @@ -13,8 +13,10 @@ export default class ChatPrivate extends Chat { static createForPrivate(userA: User, userB: User) { const chat = this.create(this.getChatIdByUsersId(userA.bean.id, userB.bean.id), 'private') - chat.setAttr('user_a_id', userA.bean.id) - chat.setAttr('user_b_id', userB.bean.id) + chat.setMembers([ + userA.bean.id, + userB.bean.id + ]) } static findByUsersForPrivate(userA: User, userB: User) { const chat = this.findById(this.getChatIdByUsersId(userA.bean.id, userB.bean.id))