public IActionResult GetReferencing(Guid referencingEntityId, Guid?referencedEntityId) { List <Schema.Domain.RelationShip> result = _relationShipFinder.QueryByEntityId(referencingEntityId, referencedEntityId); return(JOk(result)); }
public bool Merge(Guid entityId, Guid mainRecordId, Guid mergedRecordId, Dictionary <string, Guid> attributeMaps, bool ignorePermissions = false) { var entityMetadata = _entityFinder.FindById(entityId); //retrive main record var queryMain = new QueryExpression(entityMetadata.Name, _languageId); queryMain.ColumnSet.AllColumns = true; queryMain.Criteria.AddCondition(entityMetadata.Name + "id", ConditionOperator.Equal, mainRecordId); var mainRecord = _dataFinder.Retrieve(queryMain, ignorePermissions); if (mainRecord.IsEmpty()) { return(OnException(_loc["notfound_record"])); } //retrive merged record var queryMerged = new QueryExpression(entityMetadata.Name, _languageId); queryMerged.ColumnSet.AllColumns = true; queryMerged.Criteria.AddCondition(entityMetadata.Name + "id", ConditionOperator.Equal, mergedRecordId); var mergedRecord = _dataFinder.Retrieve(queryMerged, ignorePermissions); if (mergedRecord.IsEmpty()) { return(OnException(_loc["notfound_record"])); } var attributeMetadatas = _attributeFinder.FindByEntityId(entityId); var updatedRecord = new Entity(entityMetadata.Name); //set target record values foreach (var attr in attributeMetadatas) { if (attr.IsSystemControl()) { continue; } if (attributeMaps.ContainsKey(attr.Name)) { var eid = attributeMaps[attr.Name]; updatedRecord.SetAttributeValue(attr.Name, eid.Equals(mainRecordId) ? updatedRecord.WrapAttributeValue(_entityFinder, attr, mainRecord[attr.Name]) : updatedRecord.WrapAttributeValue(_entityFinder, attr, mergedRecord[attr.Name])); } else { updatedRecord.SetAttributeValue(attr.Name, updatedRecord.WrapAttributeValue(_entityFinder, attr, mainRecord[attr.Name])); } } //this.VerifyUpdate(updatedRecord); updatedRecord.AddIfNotContain("modifiedon", DateTime.Now); updatedRecord.AddIfNotContain("modifiedby", _user.SystemUserId); var result = false; try { _organizationDataProvider.BeginTransaction(); InternalOnMerge(mergedRecord, updatedRecord, OperationStage.PreOperation, entityMetadata, attributeMetadatas); //result = _dataUpdater.Update(updatedRecord, ignorePermissions); result = _organizationDataProvider.Update(updatedRecord); //update referencing records var relationships = _relationShipFinder.QueryByEntityId(null, entityId); foreach (var rs in relationships) { var relatedEntity = new Entity(rs.ReferencingEntityName); relatedEntity.SetAttributeValue(rs.ReferencingAttributeName, mainRecordId); var queryRelated = new QueryExpression(rs.ReferencingEntityName, _languageId); queryRelated.ColumnSet.AddColumns(rs.ReferencingEntityName + "id"); queryRelated.Criteria.AddCondition(rs.ReferencingAttributeName, ConditionOperator.Equal, mergedRecordId); _organizationDataProvider.Update(relatedEntity, _queryResolverFactory.Get(queryRelated), ignorePermissions: true); } //disabled original record var disabledEntity = new Entity(entityMetadata.Name); disabledEntity.SetIdValue(mergedRecordId); disabledEntity.SetAttributeValue("statecode", false); //result = _dataUpdater.Update(disabledEntity, ignorePermissions); result = _organizationDataProvider.Update(disabledEntity); if (result) { _organizationDataProvider.CommitTransaction(); InternalOnMerge(mergedRecord, updatedRecord, OperationStage.PostOperation, entityMetadata, attributeMetadatas); } else { _organizationDataProvider.RollBackTransaction(); } } catch (Exception e) { _organizationDataProvider.RollBackTransaction(); OnException(e); } return(result); }