(db: DatabaseAdapter, memberId1: number, memberId2: number)
| 46 | * with more messages (or the lower id on tie). The secondary member is deleted. |
| 47 | */ |
| 48 | export 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 { |
no test coverage detected