private async Task ValidateEntitiesAndInheritance(IOspSession session, ScopeIds scopeId)
        {
            var dbEntities                  = (await _databaseContext.CkEntities.GetAsync(session)).Where(x => (int)x.ScopeId < (int)scopeId).ToList();
            var dbEntityInheritances        = (await _databaseContext.CkEntityInheritances.GetAsync(session)).Where(x => (int)x.ScopeId < (int)scopeId).ToList();
            var availableEntitiesIds        = dbEntities.Select(x => x.CkId.ToString()).Union(_transientCkModel.CkEntities.Select(x => x.CkId)).ToList();
            var availableEntities           = dbEntities.Union(_transientCkModel.CkEntities).ToList();
            var availableEntityInheritances = dbEntityInheritances.Union(_transientCkModel.CkEntityInheritances).ToList();

            foreach (var ckEntityInheritance in _transientCkModel.CkEntityInheritances)
            {
                if (!availableEntitiesIds.Contains(ckEntityInheritance.OriginCkId))
                {
                    throw new ModelImportException($"CkId '{ckEntityInheritance.OriginCkId}' is unknown for inheritance.");
                }

                if (!availableEntitiesIds.Contains(ckEntityInheritance.TargetCkId))
                {
                    throw new ModelImportException($"CkId '{ckEntityInheritance.TargetCkId}' is unknown for inheritance.");
                }
            }

            foreach (var ckEntity in _transientCkModel.CkEntities)
            {
                if (dbEntities.Any(x => x.CkId == ckEntity.CkId))
                {
                    throw new ModelImportException($"CkId '{ckEntity.CkId}' does already exist in database.");
                }

                foreach (var attribute in ckEntity.Attributes)
                {
                    if (_availableAttributes.All(a => a.AttributeId != attribute.AttributeId))
                    {
                        throw new ModelImportException($"Attribute Id '{attribute.AttributeId}' of CkId '{ckEntity.CkId}' does not exist.");
                    }
                }

                var attributes = GetAllDerivedAttributes(availableEntityInheritances, availableEntities, ckEntity).ToList();

                var systemReservedAttributeNames = attributes.Where(attr => Constants.SystemReservedAttributeNames.Contains(attr.AttributeName)).ToList();
                if (systemReservedAttributeNames.Count > 0)
                {
                    var attributeNames = string.Join(", ", systemReservedAttributeNames.Select(x => x.AttributeName));
                    throw new ModelImportException($"CkId '{ckEntity.CkId}' using attribute names that are system reserved: '{attributeNames}'");
                }

                var duplicateAttributeNames = attributes.GroupBy(a => a.AttributeName).Where(a => a.Count() > 1).ToList();
                if (duplicateAttributeNames.Count > 0)
                {
                    var attributeNames = string.Join(", ", duplicateAttributeNames.Select(x => x.Key));
                    throw new ModelImportException($"CkId '{ckEntity.CkId}' has duplicate attribute names: '{attributeNames}'");
                }

                var duplicateAttributeIds = attributes.GroupBy(a => a.AttributeId).Where(a => a.Count() > 1).ToList();
                if (duplicateAttributeIds.Count > 0)
                {
                    var attributeIds = string.Join(", ", duplicateAttributeIds.Select(x => x.Key));
                    throw new ModelImportException($"CkId '{ckEntity.CkId}' has duplicate attribute IDs: '{attributeIds}'");
                }

                ValidateTextSearchLanguage(ckEntity, attributes);
            }
        }
Esempio n. 2
0
        public async Task ImportCkModelAsync(IOspSession systemSession, string tenantId, ScopeIds scopeId,
                                             string filePath, CancellationToken?cancellationToken)
        {
            ArgumentValidation.Validate(nameof(systemSession), systemSession);
            ArgumentValidation.ValidateString(nameof(tenantId), tenantId);
            ArgumentValidation.ValidateExistingFile(nameof(filePath), filePath);

            var databaseContext = await CreateDatabaseContextByTenantAsync(systemSession, tenantId);

            using var session = await databaseContext.StartSessionAsync();

            session.StartTransaction();

            var importer = new ImportCkModel(databaseContext);
            await importer.Import(session, filePath, scopeId, cancellationToken);

            await session.CommitTransactionAsync();

            await UnloadTenantCachesAsync(tenantId);
        }
        public async Task Validate(IOspSession session, TransientCkModel transientCkModel, ScopeIds scopeId, CancellationToken?cancellationToken)
        {
            _transientCkModel = transientCkModel;

            var dbAttributes = (await _databaseContext.CkAttributes.GetAsync(session)).Where(x => (int)x.ScopeId < (int)scopeId).ToList();

            _availableAttributes = dbAttributes.Union(_transientCkModel.CkAttributes).ToList();

            // ValidateAsync
            await ValidateEntitiesAndInheritance(session, scopeId);

            if (CheckCancellation(cancellationToken))
            {
                return;
            }

            ValidateAttributes();
        }
Esempio n. 4
0
// ReSharper disable once UnusedMember.Global
        public async Task ImportCkModelAsTextAsync(IOspSession systemSession, string tenantId, ScopeIds scopeId,
                                                   string jsonText)
        {
            ArgumentValidation.ValidateString(nameof(tenantId), tenantId);
            ArgumentValidation.ValidateString(nameof(jsonText), jsonText);

            var databaseContext = await CreateDatabaseContextByTenantAsync(systemSession, tenantId);

            using var session = await databaseContext.StartSessionAsync();

            session.StartTransaction();

            var importer = new ImportCkModel(databaseContext);
            await importer.ImportText(session, jsonText, scopeId);

            await session.CommitTransactionAsync();

            await UnloadTenantCachesAsync(tenantId);
        }