public void Delete(int id)
        {
            TriggerDeleteEvent(id);

            // get all groups where this user is the only admin
            // delete all returned groups that only have this user as the member
            var groups = _relationshipController.GetRelatedActors(id, ActorType.Group);
            groups.ForEach(g => _groupController.RemoveMember(g.Id, id));

            _userController.Delete(id);

            _logger.LogInformation($"{id}");
        }
Beispiel #2
0
        /// <summary>
        /// Cleanly remove a group member. If it is the admin, admin will be delegated to another member.
        /// If the only member, the group will be deleted.
        /// </summary>
        /// <param name="groupId"></param>
        /// <param name="memberId"></param>
        public void RemoveMember(int groupId, int memberId)
        {
            var members = _relationshipController.GetRelatedActors(groupId, ActorType.User, ActorVisibilityFilter.All);

            if (members.All(m => m.Id != memberId))
            {
                throw new InvalidRelationshipException($"The actor with id {memberId} is not a member of the group: {groupId}.");
            }

            var relationship = _relationshipController.GetRelationship(groupId, memberId);

            if (members.Count == 1)
            {
                _relationshipController.Delete(relationship);
                Delete(groupId);
            }
            else
            {
                var groupControllers = members
                                       .Where(m => IsGroupController(m.Id, groupId))
                                       .ToList();

                // If this is the only group controller, assign control to another member
                if (groupControllers.Count == 1 && groupControllers.Any(gc => gc.Id == memberId))
                {
                    _relationshipController.Delete(relationship);

                    var relationships             = _relationshipController.GetRelationships(groupId, ActorType.User);
                    var newControllerRelationship = relationships.First();
                    var newControllerId           = newControllerRelationship.AcceptorId != groupId
                                                ? newControllerRelationship.AcceptorId
                                                : newControllerRelationship.RequestorId;

                    AssignController(newControllerId, groupId);
                }
                else
                {
                    _relationshipController.Delete(relationship);
                }
            }
        }