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); } }
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(); }
// 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); }