/// <summary>
        /// Determines if relationship to the source entity already exists.
        /// </summary>
        /// <typeparam name="TT">The type of the t.</typeparam>
        /// <param name="entityId">The entity identifier.</param>
        /// <param name="relatedEntity">The related entity.</param>
        /// <param name="purposeKey">The purpose key.</param>
        /// <param name="qualifierValue">The qualifier value.</param>
        /// <returns></returns>
        public bool RelatedToSourceEntityAlreadyExists <TT>(int entityId, TT relatedEntity, string purposeKey, string qualifierValue) where TT : IEntity
        {
            if (entityId == 0 || relatedEntity.Id == 0)
            {
                return(false);
            }

            var relatedEntityTypeId = EntityTypeCache.GetId <TT>();
            var sourceEntityTypeId  = EntityTypeCache.GetId <T>();

            var relatedEntityService = new Rock.Model.RelatedEntityService(this.Context as RockContext);

            if (relatedEntityService.Queryable().Any(a =>
                                                     a.SourceEntityTypeId == sourceEntityTypeId.Value &&
                                                     a.SourceEntityId == entityId &&
                                                     a.TargetEntityTypeId == relatedEntityTypeId.Value &&
                                                     a.TargetEntityId == relatedEntity.Id &&
                                                     a.PurposeKey == purposeKey &&
                                                     a.QualifierValue == qualifierValue
                                                     )
                )
            {
                return(true);
            }

            return(false);
        }
        /// <summary>
        /// Returns a queryable collection of <see cref="Rock.Data.IEntity"/> entities of the given entity type that (optionally) also have a matching purpose key.
        /// </summary>
        /// <param name="entityId">The Id of the entity you want to get the list of related entities for</param>
        /// <param name="relatedEntityTypeId">A <see cref="System.Int32"/> representing the related entity type identifier.</param>
        /// <param name="purposeKey">A <see cref="System.String"/> representing the purpose key.</param>
        /// <returns>
        /// Returns a queryable collection of <see cref="Rock.Data.IEntity"/> entities.
        /// </returns>
        public IQueryable <IEntity> GetRelatedSourceOrTargetEntities(int entityId, int relatedEntityTypeId, string purposeKey)
        {
            var rockContext = this.Context as RockContext;

            var entityType = EntityTypeCache.Get(typeof(T), false, rockContext);

            var srcQuery = new Rock.Model.RelatedEntityService(rockContext).GetRelatedToSource(entityId, entityType.Id, relatedEntityTypeId, purposeKey);

            var tgtQuery = new Rock.Model.RelatedEntityService(rockContext).GetRelatedToTarget(entityId, entityType.Id, relatedEntityTypeId, purposeKey);

            if (srcQuery != null && tgtQuery != null)
            {
                return(srcQuery.Union(tgtQuery));
            }
            else if (srcQuery != null && tgtQuery == null)
            {
                return(srcQuery);
            }
            else if (srcQuery == null && tgtQuery != null)
            {
                return(tgtQuery);
            }

            return(null);
        }
        /// <summary>
        /// Returns a queryable collection of <see cref="Rock.Data.IEntity" /> source entities (related to the given target entity) for the given entity type and (optionally) also have a matching purpose key.
        /// </summary>
        /// <param name="targetEntityId">The target entity identifier.</param>
        /// <param name="relatedEntityTypeId">A <see cref="System.Int32" /> representing the related entity type identifier.</param>
        /// <param name="purposeKey">A <see cref="System.String" /> representing the purpose key.</param>
        /// <returns>
        /// Returns a queryable collection of <see cref="Rock.Data.IEntity" /> entities.
        /// </returns>
        public IQueryable <IEntity> GetRelatedToTargetEntity(int targetEntityId, int relatedEntityTypeId, string purposeKey)
        {
            var rockContext = this.Context as RockContext;

            var entityType = EntityTypeCache.Get(typeof(T), false, rockContext);

            var tgtQuery = new Rock.Model.RelatedEntityService(rockContext).GetRelatedToTarget(targetEntityId, entityType.Id, relatedEntityTypeId, purposeKey);

            return(tgtQuery);
        }
        /// <summary>
        /// Deletes the relationship between the relatedEntity and the entity for the given QualifierValue.
        /// </summary>
        /// <typeparam name="TT">The type of the t.</typeparam>
        /// <param name="entityId">The entity identifier.</param>
        /// <param name="relatedEntity">The related entity.</param>
        /// <param name="purposeKey">The purpose key.</param>
        /// <param name="qualifierValue">The qualifier value.</param>
        public void DeleteRelatedToSourceEntity <TT>(int entityId, TT relatedEntity, string purposeKey, string qualifierValue) where TT : IEntity
        {
            var relatedEntityTypeId = EntityTypeCache.GetId <TT>();
            var sourceEntityTypeId  = EntityTypeCache.GetId <T>();

            var relatedEntityService = new Rock.Model.RelatedEntityService(this.Context as RockContext);
            var relatedEntityRecords = relatedEntityService.GetRelatedEntityRecordsToSource(entityId, sourceEntityTypeId.Value, relatedEntityTypeId.Value, purposeKey, qualifierValue);

            relatedEntityService.DeleteRange(relatedEntityRecords);
        }
        /// <summary>
        /// Deletes a RelatedEntity for the given source entity, target entity, purpose key, and qualifier value.
        /// </summary>
        /// <typeparam name="TT">The type of the t.</typeparam>
        /// <param name="entityId">The entity identifier.</param>
        /// <param name="targetEntity">The target entity.</param>
        /// <param name="purposeKey">The purpose key.</param>
        /// <param name="qualifierValue">The qualifier value.</param>
        public void DeleteTargetEntityFromSourceEntity <TT>(int entityId, TT targetEntity, string purposeKey, string qualifierValue = null) where TT : IEntity
        {
            var relatedEntityTypeId = EntityTypeCache.GetId <TT>();
            var sourceEntityTypeId  = EntityTypeCache.GetId <T>();

            var relatedEntityService = new Rock.Model.RelatedEntityService(this.Context as RockContext);
            var relatedEntity        = relatedEntityService.GetRelatedEntityRecordToSource(entityId, sourceEntityTypeId.Value, relatedEntityTypeId.Value, targetEntity.Id, purposeKey, qualifierValue);

            if (relatedEntity != null)
            {
                relatedEntityService.Delete(relatedEntity);
            }
        }
        /// <summary>
        /// Adds a relationship between the relatedEntity and the entity
        /// </summary>
        /// <typeparam name="TT">The type of the t.</typeparam>
        /// <param name="entityId">The entity identifier.</param>
        /// <param name="relatedEntity">The related entity.</param>
        /// <param name="purposeKey">The purpose key.</param>
        /// <param name="qualifierValue">The qualifier value.</param>
        public void AddRelatedToSourceEntity <TT>(int entityId, TT relatedEntity, string purposeKey, string qualifierValue) where TT : IEntity
        {
            var relatedEntityService = new Rock.Model.RelatedEntityService(this.Context as RockContext);
            var relatedEntityTypeId  = EntityTypeCache.GetId <TT>();
            var sourceEntityTypeId   = EntityTypeCache.GetId <T>();

            relatedEntityService.Add(
                new RelatedEntity
            {
                SourceEntityTypeId = sourceEntityTypeId.Value,
                SourceEntityId     = entityId,
                TargetEntityTypeId = relatedEntityTypeId.Value,
                TargetEntityId     = relatedEntity.Id,
                PurposeKey         = purposeKey,
                QualifierValue     = qualifierValue
            }
                );
        }
Example #7
0
        /// <summary>
        /// Adds a relationship between the relatedEntity and the entity
        /// </summary>
        /// <typeparam name="TT">The type of the t.</typeparam>
        /// <param name="entityId">The entity identifier.</param>
        /// <param name="relatedEntity">The related entity.</param>
        /// <param name="purposeKey">The purpose key.</param>
        public void AddRelatedToSourceEntity <TT>(int entityId, TT relatedEntity, string purposeKey) where TT : IEntity
        {
            var relatedEntityTypeId = EntityTypeCache.GetId <TT>();
            var sourceEntityTypeId  = EntityTypeCache.GetId <T>();

            var relatedEntityRecord = new RelatedEntity();

            relatedEntityRecord.SourceEntityTypeId = sourceEntityTypeId.Value;
            relatedEntityRecord.SourceEntityId     = entityId;

            relatedEntityRecord.TargetEntityTypeId = relatedEntityTypeId.Value;
            relatedEntityRecord.TargetEntityId     = relatedEntity.Id;

            relatedEntityRecord.PurposeKey = purposeKey;
            var relatedEntityService = new Rock.Model.RelatedEntityService(this.Context as RockContext);

            relatedEntityService.Add(relatedEntityRecord);
        }
        /// <summary>
        /// Sets the related target entities for the given source entity type, purpose key, and qualifier value.
        /// </summary>
        /// <typeparam name="TT">The type of the t.</typeparam>
        /// <param name="entityId">The entity identifier.</param>
        /// <param name="relatedEntities">The related entities.</param>
        /// <param name="purposeKey">The purpose key.</param>
        /// <param name="qualifierValue">The qualifier value.</param>
        public void SetRelatedToSourceEntity <TT>(int entityId, List <TT> relatedEntities, string purposeKey, string qualifierValue) where TT : IEntity
        {
            var relatedEntityTypeId    = EntityTypeCache.GetId <TT>();
            var sourceEntityTypeId     = EntityTypeCache.GetId <T>();
            var currentRelatedEntities = GetRelatedToSourceEntityQualifier <TT>(entityId, purposeKey, qualifierValue).ToList();

            var relatedEntityService = new Rock.Model.RelatedEntityService(this.Context as RockContext);
            var relatedEntityIds     = relatedEntities.Select(a => a.Id).ToList();

            // delete related entities that are no longer in the list
            foreach (var currentRelatedEntity in currentRelatedEntities.Where(a => !relatedEntityIds.Contains(a.Id)))
            {
                // get related entity record(s) that need to be deleted since the relatedEntity is no longer in the list
                var relatedEntityToDelete = relatedEntityService
                                            .Queryable()
                                            .Where(a => a.SourceEntityTypeId == sourceEntityTypeId.Value &&
                                                   a.TargetEntityTypeId == relatedEntityTypeId.Value &&
                                                   a.SourceEntityId == entityId &&
                                                   a.TargetEntityId == currentRelatedEntity.Id &&
                                                   a.PurposeKey == purposeKey &&
                                                   a.QualifierValue == qualifierValue)
                                            .ToList();
                relatedEntityService.DeleteRange(relatedEntityToDelete);
            }

            // add related entity record for related entities that that don't have a related entity record
            foreach (var relatedEntityId in relatedEntityIds.Where(a => !currentRelatedEntities.Any(r => r.Id == a)))
            {
                var relatedEntityRecord = new RelatedEntity
                {
                    SourceEntityTypeId = sourceEntityTypeId.Value,
                    SourceEntityId     = entityId,
                    TargetEntityTypeId = relatedEntityTypeId.Value,
                    TargetEntityId     = relatedEntityId,
                    PurposeKey         = purposeKey,
                    QualifierValue     = qualifierValue
                };

                relatedEntityService.Add(relatedEntityRecord);
            }
        }