Esempio n. 1
0
        public async Task ExecuteAsync(DeleteUnstructuredDataDependenciesCommand command, IExecutionContext executionContext)
        {
            string entityName;

            var entityDefinition = _entityDefinitionRepository.GetByCode(command.RootEntityDefinitionCode);

            EntityNotFoundException.ThrowIfNull(entityDefinition, command.RootEntityDefinitionCode);
            entityName = entityDefinition.Name;

            var query        = new GetEntityDependencySummaryByRelatedEntityQuery(command.RootEntityDefinitionCode, command.RootEntityId);
            var dependencies = await _queryExecutor.ExecuteAsync(query, executionContext);

            var requiredDependency = dependencies.FirstOrDefault(d => !d.CanDelete);

            if (requiredDependency != null)
            {
                throw new ValidationException(
                          string.Format("Cannot delete this {0} because {1} '{2}' has a dependency on it.",
                                        entityName,
                                        requiredDependency.Entity.EntityDefinitionName.ToLower(),
                                        requiredDependency.Entity.RootEntityTitle));
            }

            await _entityFrameworkSqlExecutor
            .ExecuteCommandAsync(_dbContext,
                                 "Cofoundry.UnstructuredDataDependency_Delete",
                                 new SqlParameter("EntityDefinitionCode", command.RootEntityDefinitionCode),
                                 new SqlParameter("EntityId", command.RootEntityId)
                                 );
        }
Esempio n. 2
0
        public IEnumerable <IPermissionApplication> GetPermissions(GetEntityDependencySummaryByRelatedEntityQuery query)
        {
            var entityDefinition = _entityDefinitionRepository.GetByCode(query.EntityDefinitionCode);

            if (entityDefinition == null)
            {
                yield break;
            }

            // Try and get a read permission for the entity.
            var permission = _permissionRepository.GetByEntityAndPermissionType(entityDefinition, CommonPermissionTypes.Read("Entity"));

            if (permission != null)
            {
                yield return(permission);
            }
        }
Esempio n. 3
0
        public async Task <ICollection <EntityDependencySummary> > ExecuteAsync(GetEntityDependencySummaryByRelatedEntityQuery query, IExecutionContext executionContext)
        {
            // Where there are duplicates, prioritise relationships that cannot be deleted
            var dbDependencyPreResult = await _dbContext
                                        .UnstructuredDataDependencies
                                        .AsNoTracking()
                                        .Where(r => r.RelatedEntityDefinitionCode == query.EntityDefinitionCode && r.RelatedEntityId == query.EntityId)
                                        .ToListAsync();

            // Query is split because EF core cannot translate groupings yet
            var dbDependencyGroups = dbDependencyPreResult
                                     .GroupBy(r => new { r.RootEntityDefinitionCode, r.RootEntityId }, (d, e) => e.OrderByDescending(x => x.RelatedEntityCascadeActionId == (int)RelatedEntityCascadeAction.None).FirstOrDefault())
                                     .GroupBy(r => r.RootEntityDefinitionCode)
                                     .ToList();

            var allRelatedEntities = new List <EntityDependencySummary>();

            foreach (var dbDependencyGroup in dbDependencyGroups)
            {
                var definition = _entityDefinitionRepository.GetByCode(dbDependencyGroup.Key) as IDependableEntityDefinition;
                IQuery <IDictionary <int, RootEntityMicroSummary> > getEntitiesQuery;

                EntityNotFoundException.ThrowIfNull(definition, dbDependencyGroup.Key);
                getEntitiesQuery = definition.CreateGetEntityMicroSummariesByIdRangeQuery(dbDependencyGroup.Select(e => e.RootEntityId));

                var entityMicroSummaries = await _queryExecutor.ExecuteAsync(getEntitiesQuery, executionContext);

                foreach (var entityMicroSummary in entityMicroSummaries.OrderBy(e => e.Value.RootEntityTitle))
                {
                    var dbDependency = dbDependencyGroup.SingleOrDefault(e => e.RootEntityId == entityMicroSummary.Key);

                    var entityDependencySummary = new EntityDependencySummary();
                    entityDependencySummary.Entity = entityMicroSummary.Value;

                    // relations for previous versions can be removed even when they are required.
                    entityDependencySummary.CanDelete =
                        dbDependency.RelatedEntityCascadeActionId != (int)RelatedEntityCascadeAction.None ||
                        entityDependencySummary.Entity.IsPreviousVersion;

                    allRelatedEntities.Add(entityDependencySummary);
                }
            }

            return(allRelatedEntities);
        }