@@ -351,15 +351,40 @@ func (svc *service) RemoveEntityMembers(ctx context.Context, session authn.Sessi
351351 return svc .ProvisionManageService .RemoveEntityMembers (ctx , session , entityID , members )
352352}
353353
354- func (svc * service ) RoleRemoveMembers (ctx context.Context , session authn.Session , entityID , roleID string , members []string ) (err error ) {
355- for _ , member := range members {
356- if err := svc .repo .DeleteInvitation (ctx , member , entityID ); err != nil && err != repoerr .ErrNotFound {
354+ func (svc * service ) RoleRemoveMembers (ctx context.Context , session authn.Session , entityID , roleID string , members []string ) error {
355+ ro , err := svc .repo .RetrieveEntityRole (ctx , entityID , roleID )
356+ if err != nil {
357+ return errors .Wrap (svcerr .ErrViewEntity , err )
358+ }
359+
360+ if _ , err := svc .ProvisionManageService .BuiltInRoleActions (roles .BuiltInRoleName (ro .Name )); err == nil {
361+ membersPage , err := svc .repo .RoleListMembers (ctx , ro .ID , 0 , 0 )
362+ if err != nil {
363+ return errors .Wrap (svcerr .ErrViewEntity , err )
364+ }
365+ if membersPage .Total <= uint64 (len (members )) {
366+ return svcerr .ErrRetainOneMember
367+ }
368+ }
369+
370+ for _ , memberID := range members {
371+ if err := svc .repo .DeleteInvitation (ctx , memberID , entityID ); err != nil && err != repoerr .ErrNotFound {
357372 return err
358373 }
359374 }
375+
360376 return svc .ProvisionManageService .RoleRemoveMembers (ctx , session , entityID , roleID , members )
361377}
362378
363- func (svc * service ) RoleRemoveAllMembers (ctx context.Context , session authn.Session , entityID , roleID string ) (err error ) {
364- return svcerr .ErrNotFound
379+ func (svc * service ) RoleRemoveAllMembers (ctx context.Context , session authn.Session , entityID , roleID string ) error {
380+ ro , err := svc .repo .RetrieveEntityRole (ctx , entityID , roleID )
381+ if err != nil {
382+ return errors .Wrap (svcerr .ErrViewEntity , err )
383+ }
384+
385+ if _ , err := svc .ProvisionManageService .BuiltInRoleActions (roles .BuiltInRoleName (ro .Name )); err == nil {
386+ return svcerr .ErrRetainOneMember
387+ }
388+
389+ return svc .ProvisionManageService .RoleRemoveAllMembers (ctx , session , entityID , roleID )
365390}
0 commit comments