@@ -187,16 +187,16 @@ export class OrganizationService {
187187 if ( userId ) {
188188 await this . auth . checkPermissionOnOrganization ( userId , "write_members" , orgId ) ;
189189 }
190- if ( role !== "owner" ) {
191- const members = await this . teamDB . findMembersByTeam ( orgId ) ;
192- if ( ! members . some ( ( m ) => m . userId !== memberId && m . role === "owner" ) ) {
193- throw new ApplicationError ( ErrorCodes . CONFLICT , "Cannot remove the last owner of an organization." ) ;
194- }
195- }
196190 const members = await this . teamDB . findMembersByTeam ( orgId ) ;
197- const firstMember = members . filter ( ( m ) => m . userId !== BUILTIN_INSTLLATION_ADMIN_USER_ID ) . length === 0 ;
198- if ( firstMember ) {
199- // first member (that is not an admin) is going to be an owner
191+ const hasOtherRegularOwners =
192+ members . filter (
193+ ( m ) =>
194+ m . userId !== BUILTIN_INSTLLATION_ADMIN_USER_ID && //
195+ m . userId !== memberId && //
196+ m . role === "owner" ,
197+ ) . length > 0 ;
198+ if ( ! hasOtherRegularOwners ) {
199+ // first regular member is going to be an owner
200200 role = "owner" ;
201201 log . info ( { userId : memberId } , "First member of organization, setting role to owner." ) ;
202202 }
@@ -208,12 +208,15 @@ export class OrganizationService {
208208 await this . auth . addOrganizationRole ( orgId , memberId , role ) ;
209209 } ) ;
210210 } catch ( err ) {
211- //TODO simply removing the user is not necessarily the right thing to do here, as the user might have been a member before
212- await this . auth . removeOrganizationRole ( orgId , memberId , "member" ) ;
211+ await this . auth . removeOrganizationRole (
212+ orgId ,
213+ memberId ,
214+ members . find ( ( m ) => m . userId === memberId ) ?. role || "member" ,
215+ ) ;
213216 throw err ;
214217 }
215- // we can remove the built-in installation admin now
216- if ( firstMember ) {
218+ // we can remove the built-in installation admin if we have added an owner
219+ if ( ! hasOtherRegularOwners ) {
217220 try {
218221 await this . removeOrganizationMember ( memberId , orgId , BUILTIN_INSTLLATION_ADMIN_USER_ID ) ;
219222 } catch ( error ) {
0 commit comments