Rock.Model.GroupMemberService.GetInverseRelationship C# (CSharp) Method

GetInverseRelationship() public method

Gets the inverse relationship. Returns the Rock.Model.GroupMember who has an inverse relationship to the provided Rock.Model.GroupMember.
In Rock, examples of inverse relationships include: Parent/Child, Can Check In/Check in By, Sibling/Sibling, Grandparent/Grandchild, etc.
public GetInverseRelationship ( GroupMember groupMember, bool createGroup ) : GroupMember
groupMember GroupMember A representing the person to find the inverse relationship for.
createGroup bool A flag indicating if a new can be created /// for the person with the inverse relationship.
return GroupMember
        public GroupMember GetInverseRelationship( GroupMember groupMember, bool createGroup )
        {
            var groupRole = groupMember.GroupRole;
            if ( groupRole == null )
            {
                groupRole = Queryable( true )
                    .Where( m => m.Id == groupMember.Id )
                    .Select( m => m.GroupRole )
                    .FirstOrDefault();
            }

            if ( groupRole != null )
            {
                if ( groupRole.Attributes == null )
                {
                    groupRole.LoadAttributes();
                }

                if ( groupRole.Attributes.ContainsKey( "InverseRelationship" ) )
                {
                    Guid ownerRoleGuid = new Guid( Rock.SystemGuid.GroupRole.GROUPROLE_KNOWN_RELATIONSHIPS_OWNER );

                    var memberInfo = Queryable( true )
                        .Where( m =>
                            m.GroupId == groupMember.GroupId &&
                            m.GroupRole.Guid.Equals( ownerRoleGuid ) )
                        .Select( m => new
                        {
                            PersonId = m.PersonId,
                            RoleId = m.GroupRoleId
                        } )
                        .FirstOrDefault();

                    int? ownerPersonId = null;
                    int? ownerRoleId = null;

                    if ( memberInfo != null )
                    {
                        ownerPersonId = memberInfo.PersonId;
                        ownerRoleId = memberInfo.RoleId;
                    }

                    if ( ownerPersonId.HasValue && ownerRoleId.HasValue )
                    {
                        // Find related person's group
                        var inverseGroup = Queryable( true )
                            .Where( m =>
                                m.PersonId == groupMember.PersonId &&
                                m.Group.GroupTypeId == groupRole.GroupTypeId &&
                                m.GroupRole.Guid.Equals( ownerRoleGuid ) )
                            .Select( m => m.Group )
                            .FirstOrDefault();

                        if ( inverseGroup == null && createGroup )
                        {
                            var ownerGroupMember = new GroupMember();
                            ownerGroupMember.PersonId = groupMember.PersonId;
                            ownerGroupMember.GroupRoleId = ownerRoleId.Value;

                            inverseGroup = new Group();
                            inverseGroup.Name = groupRole.GroupType.Name;
                            inverseGroup.GroupTypeId = groupRole.GroupTypeId.Value;
                            inverseGroup.Members.Add( ownerGroupMember );
                        }

                        if ( inverseGroup != null )
                        {
                            Guid inverseRoleGuid = Guid.Empty;
                            if ( Guid.TryParse( groupRole.GetAttributeValue( "InverseRelationship" ), out inverseRoleGuid ) )
                            {
                                var inverseGroupMember = Queryable( true )
                                    .Where( m =>
                                        m.PersonId == ownerPersonId &&
                                        m.GroupId == inverseGroup.Id &&
                                        m.GroupRole.Guid.Equals( inverseRoleGuid ) )
                                    .FirstOrDefault();

                                if ( inverseGroupMember == null )
                                {
                                    var inverseRole = new GroupTypeRoleService( (RockContext)Context ).Get( inverseRoleGuid );
                                    if ( inverseRole != null )
                                    {
                                        inverseGroupMember = new GroupMember();
                                        inverseGroupMember.PersonId = ownerPersonId.Value;
                                        inverseGroupMember.Group = inverseGroup;
                                        inverseGroupMember.GroupRoleId = inverseRole.Id;
                                        Add( inverseGroupMember );
                                    }
                                }

                                return inverseGroupMember;
                            }
                        }
                    }
                }
            }

            return null;
        }

Usage Example

Esempio n. 1
0
        /// <summary>
        /// Adds the related person to the selected person's known relationships with a role of 'Can check in' which
        /// is typically configured to allow check-in.  If an inverse relationship is configured for 'Can check in'
        /// (i.e. 'Allow check in by'), that relationship will also be created.
        /// </summary>
        /// <param name="personId">A <see cref="System.Int32"/> representing the Id of the Person.</param>
        /// <param name="relatedPersonId">A <see cref="System.Int32"/> representing the Id of the related Person.</param>
        /// <param name="currentPersonId">A <see cref="System.Int32"/> representing the Id of the Person who is logged in.</param>
        public static void CreateCheckinRelationship(int personId, int relatedPersonId, int?currentPersonId)
        {
            using (new UnitOfWorkScope())
            {
                var groupMemberService     = new GroupMemberService();
                var knownRelationshipGroup = groupMemberService.Queryable()
                                             .Where(m =>
                                                    m.PersonId == personId &&
                                                    m.GroupRole.Guid.Equals(new Guid(SystemGuid.GroupRole.GROUPROLE_KNOWN_RELATIONSHIPS_OWNER)))
                                             .Select(m => m.Group)
                                             .FirstOrDefault();

                if (knownRelationshipGroup != null)
                {
                    int?canCheckInRoleId = new GroupTypeRoleService().Queryable()
                                           .Where(r =>
                                                  r.Guid.Equals(new Guid(SystemGuid.GroupRole.GROUPROLE_KNOWN_RELATIONSHIPS_CAN_CHECK_IN)))
                                           .Select(r => r.Id)
                                           .FirstOrDefault();
                    if (canCheckInRoleId.HasValue)
                    {
                        var canCheckInMember = groupMemberService.Queryable()
                                               .FirstOrDefault(m =>
                                                               m.GroupId == knownRelationshipGroup.Id &&
                                                               m.PersonId == relatedPersonId &&
                                                               m.GroupRoleId == canCheckInRoleId.Value);

                        if (canCheckInMember == null)
                        {
                            canCheckInMember             = new GroupMember();
                            canCheckInMember.GroupId     = knownRelationshipGroup.Id;
                            canCheckInMember.PersonId    = relatedPersonId;
                            canCheckInMember.GroupRoleId = canCheckInRoleId.Value;
                            groupMemberService.Add(canCheckInMember, currentPersonId);
                            groupMemberService.Save(canCheckInMember, currentPersonId);
                        }

                        var inverseGroupMember = groupMemberService.GetInverseRelationship(canCheckInMember, true, currentPersonId);
                        if (inverseGroupMember != null)
                        {
                            groupMemberService.Save(inverseGroupMember, currentPersonId);
                        }
                    }
                }
            }
        }
All Usage Examples Of Rock.Model.GroupMemberService::GetInverseRelationship