(teamId, userId, newOwnerId)
| 101 | } |
| 102 | |
| 103 | async transferOwnership(teamId, userId, newOwnerId) { |
| 104 | const newOwnerRole = await db.TeamRole |
| 105 | .findOne({ where: { team_id: teamId, user_id: newOwnerId } }); |
| 106 | |
| 107 | if (newOwnerRole?.role !== "teamAdmin") { |
| 108 | return new Promise((resolve, reject) => reject(new Error("New owner must be a team admin"))); |
| 109 | } |
| 110 | |
| 111 | const otherTeams = await db.TeamRole |
| 112 | .findAll({ where: { user_id: userId, role: "teamOwner", team_id: { [Op.ne]: teamId } } }); |
| 113 | |
| 114 | if (otherTeams.length < 1) { |
| 115 | return new Promise((resolve, reject) => reject(new Error("The user needs to be the owner of at least one other team"))); |
| 116 | } |
| 117 | |
| 118 | const transaction = await db.sequelize.transaction(); |
| 119 | |
| 120 | try { |
| 121 | // all good now, change the teamRole of the owner to teamAdmin, and vice versa |
| 122 | await db.TeamRole.update({ role: "teamAdmin" }, { where: { team_id: teamId, user_id: userId }, transaction }); |
| 123 | await db.TeamRole.update({ role: "teamOwner" }, { where: { team_id: teamId, user_id: newOwnerId }, transaction }); |
| 124 | |
| 125 | await transaction.commit(); |
| 126 | |
| 127 | return true; |
| 128 | } catch (error) { |
| 129 | await transaction.rollback(); |
| 130 | return new Promise((resolve, reject) => reject(error)); |
| 131 | } |
| 132 | } |
| 133 | |
| 134 | // add a new team role |
| 135 | addTeamRole(teamId, userId, roleName, projects, canExport) { |
no test coverage detected