MCPcopy Create free account
hub / github.com/ChatLab/ChatLab / mergeMembers

Function mergeMembers

packages/core/src/query/member-ops.ts:48–108  ·  view source on GitHub ↗
(db: DatabaseAdapter, memberId1: number, memberId2: number)

Source from the content-addressed store, hash-verified

46 * with more messages (or the lower id on tie). The secondary member is deleted.
47 */
48export function mergeMembers(db: DatabaseAdapter, memberId1: number, memberId2: number): boolean {
49 if (memberId1 === memberId2) return false
50
51 try {
52 const rows = db
53 .prepare(
54 `
55 SELECT
56 m.id,
57 m.platform_id as platformId,
58 m.account_name as accountName,
59 m.group_nickname as groupNickname,
60 m.aliases,
61 m.avatar,
62 COUNT(msg.id) as messageCount
63 FROM member m
64 LEFT JOIN message msg ON m.id = msg.sender_id
65 WHERE m.id IN (?, ?)
66 GROUP BY m.id
67 `
68 )
69 .all(memberId1, memberId2) as unknown as MemberMergeRow[]
70
71 if (rows.length !== 2) return false
72
73 const [memberA, memberB] = rows
74 let primary = memberA
75 let secondary = memberB
76
77 if (
78 memberB.messageCount > memberA.messageCount ||
79 (memberB.messageCount === memberA.messageCount && memberB.id < memberA.id)
80 ) {
81 primary = memberB
82 secondary = memberA
83 }
84
85 const mergedAliases = Array.from(new Set([...parseAliases(primary.aliases), ...parseAliases(secondary.aliases)]))
86 const mergedAccountName = primary.accountName || secondary.accountName
87 const mergedGroupNickname = primary.groupNickname || secondary.groupNickname
88 const mergedAvatar = primary.avatar || secondary.avatar
89
90 db.transaction(() => {
91 db.prepare('UPDATE message SET sender_id = ? WHERE sender_id = ?').run(primary.id, secondary.id)
92 db.prepare('UPDATE member_name_history SET member_id = ? WHERE member_id = ?').run(primary.id, secondary.id)
93 db.prepare('UPDATE meta SET owner_id = ? WHERE owner_id = ?').run(primary.platformId, secondary.platformId)
94 db.prepare(`UPDATE member SET account_name = ?, group_nickname = ?, avatar = ?, aliases = ? WHERE id = ?`).run(
95 mergedAccountName,
96 mergedGroupNickname,
97 mergedAvatar,
98 JSON.stringify(mergedAliases),
99 primary.id
100 )
101 db.prepare('DELETE FROM member WHERE id = ?').run(secondary.id)
102 })
103
104 return true
105 } catch {

Callers 1

member-ops.test.tsFile · 0.90

Calls 5

parseAliasesFunction · 0.85
allMethod · 0.65
prepareMethod · 0.65
transactionMethod · 0.65
runMethod · 0.65

Tested by

no test coverage detected