private Crate <StandardQueryCM> ExtractQueryCrate(ICrateStorage storage) { var configurationControls = storage .CrateContentsOfType <StandardConfigurationControlsCM>() .SingleOrDefault(); if (configurationControls == null) { throw new ApplicationException("Action was not configured correctly"); } var actionUi = new ActivityUi(); actionUi.ClonePropertiesFrom(configurationControls); var criteria = JsonConvert.DeserializeObject <List <FilterConditionDTO> >( actionUi.QueryBuilder.Value ); // This is weird to use query's name as the way to address MT type. // MT type has unique ID that should be used for this reason. Query name is something that is displayed to user. It should not contain any internal data. var queryCM = new StandardQueryCM( new QueryDTO() { Name = MT.DocuSignEnvelope.GetEnumDisplayName(), Criteria = criteria } ); return(Crate <StandardQueryCM> .FromContent(QueryCrateLabel, queryCM)); }
private Crate <StandardQueryCM> ExtractQueryCrate(string mtObject) { var configurationControls = Storage .CrateContentsOfType <StandardConfigurationControlsCM>() .SingleOrDefault(); if (configurationControls == null) { throw new ApplicationException("Action was not configured correctly"); } var actionUi = new ActionUi(); actionUi.ClonePropertiesFrom(configurationControls); var criteria = JsonConvert.DeserializeObject <List <FilterConditionDTO> >( actionUi.QueryBuilder.Value ); var queryCM = new StandardQueryCM( new QueryDTO() { Name = mtObject, Criteria = criteria } ); return(Crate <StandardQueryCM> .FromContent(QueryCrateLabel, queryCM)); }
public override async Task Run() { var queryPicker = GetControl <RadioButtonGroup>("QueryPicker"); List <FilterConditionDTO> conditions; Guid?selectedObjectId = null; if (queryPicker.Radios[0].Selected) { var upstreamCrateChooser = (UpstreamCrateChooser)(queryPicker).Radios[0].Controls[0]; var selectedCrate = upstreamCrateChooser.SelectedCrates.FirstOrDefault(); StandardQueryCM queryCM = null; if (selectedCrate != null) { queryCM = Payload.CratesOfType <StandardQueryCM>().FirstOrDefault(x => x.Label == selectedCrate.Label.selectedKey)?.Content; } if (queryCM?.Queries == null || queryCM.Queries.Count == 0) { RaiseError("No upstream crate found"); return; } var query = queryCM.Queries[0]; conditions = query.Criteria ?? new List <FilterConditionDTO>(); selectedObjectId = ExtractUpstreamTypeId(query); } else { var filterPane = (FilterPane)queryPicker.Radios[1].Controls[1]; var availableObjects = (DropDownList)queryPicker.Radios[1].Controls[0]; var criteria = filterPane.Value == null ? null : JsonConvert.DeserializeObject <FilterDataDTO>(filterPane.Value); if (availableObjects.Value == null) { RaiseError("This action is designed to query the Fr8 Warehouse for you, but you don't currently have any objects stored there."); return; } Guid objectId; if (Guid.TryParse(availableObjects.Value, out objectId)) { selectedObjectId = objectId; } conditions = criteria == null || criteria.ExecutionType == FilterExecutionType.WithoutFilter ? new List <FilterConditionDTO>() : criteria.Conditions; } // If no object is found in MT database, return empty result. if (!selectedObjectId.HasValue) { var searchResult = new StandardPayloadDataCM(); Payload.Add(Crate.FromContent("Found MT Objects", searchResult)); Success(); return; } //STARTING NASTY CODE //TODO discuss this with Alex (bahadir) var envIdCondition = conditions.FirstOrDefault(c => c.Field == "EnvelopeId"); if (envIdCondition != null && envIdCondition.Value == "FromPayload") { envIdCondition.Value = GetCurrentEnvelopeId(); } //END OF NASTY CODE using (var uow = _container.GetInstance <IUnitOfWork>()) { var objectId = selectedObjectId.GetValueOrDefault(); var mtType = uow.MultiTenantObjectRepository.FindTypeReference(objectId); if (mtType == null) { RaiseError("Invalid object selected"); return; } Type manifestType = mtType.ClrType; var queryBuilder = MTSearchHelper.CreateQueryProvider(manifestType); var converter = CrateManifestToRowConverter(manifestType); var foundObjects = queryBuilder.Query(uow, CurrentUserId, conditions.ToList()).ToArray(); var searchResult = new StandardPayloadDataCM(); foreach (var foundObject in foundObjects) { searchResult.PayloadObjects.Add(converter(foundObject)); } Payload.Add(Crate.FromContent("Found MT Objects", searchResult)); } Success(); }