(userId: string)
| 115 | } |
| 116 | |
| 117 | async function deleteUser(userId: string) { |
| 118 | await dataAbstraction().transaction(async (dtrx) => { |
| 119 | // Check if any group has more than one member |
| 120 | |
| 121 | const memberships = await GroupMemberModel.query(dtrx.trx) |
| 122 | .where('group_members.user_id', userId) |
| 123 | .leftJoin( |
| 124 | GroupMemberModel.query(dtrx.trx) |
| 125 | .groupBy('group_id') |
| 126 | .select('group_id') |
| 127 | .count('* as member_count') |
| 128 | .as('member_counts'), |
| 129 | 'group_members.group_id', |
| 130 | 'member_counts.group_id', |
| 131 | ) |
| 132 | .leftJoin( |
| 133 | GroupMemberModel.query(dtrx.trx) |
| 134 | .where('role', 'owner') |
| 135 | .groupBy('group_id') |
| 136 | .select('group_id') |
| 137 | .count('* as owner_count') |
| 138 | .as('owner_counts'), |
| 139 | 'group_members.group_id', |
| 140 | 'owner_counts.group_id', |
| 141 | ) |
| 142 | .select( |
| 143 | 'group_members.group_id', |
| 144 | raw('COALESCE(member_counts.member_count, 0) as member_count'), |
| 145 | raw('COALESCE(owner_counts.owner_count, 0) as owner_count'), |
| 146 | ); |
| 147 | |
| 148 | if ( |
| 149 | memberships.some( |
| 150 | (count) => |
| 151 | (count as any).member_count > 1 && (count as any).owner_count <= 1, |
| 152 | ) |
| 153 | ) { |
| 154 | throw { |
| 155 | message: |
| 156 | 'Some groups would be left without an owner. Transfer ownership before deleting your account.', |
| 157 | code: 'BAD_REQUEST', |
| 158 | }; |
| 159 | } |
| 160 | |
| 161 | const idsOfGroupsToDelete = memberships |
| 162 | .filter((membership) => (membership as any).member_count <= 1) |
| 163 | .map((membership) => membership.group_id); |
| 164 | |
| 165 | // Get all user data |
| 166 | |
| 167 | const [ |
| 168 | groupPageIds, |
| 169 | invitations, |
| 170 | requests, |
| 171 | visitedPageIds, |
| 172 | sessions, |
| 173 | user, |
| 174 | ] = await Promise.all([ |
no test coverage detected