public async Task <PushState> PushItem(IndexItemModel item) { Report($@" --------------------------------------------------------------------------------- Begin synchronizing item {JsonConvert.SerializeObject(item, Formatting.Indented)}..."); _pusher.SetIndex(_indexerModel); _pusher.SetItem(item); var result = await Task.Run(() => { try { entityRepository.BeginTransaction(); attributeRepository.BeginTransaction(); messageRepository.BeginTransaction(); var pushState = PushState.Success; var destinationId = item.GetDestinationId(); if (!string.IsNullOrWhiteSpace(destinationId)) { if (item.HasState(ItemState.Removed)) { _pusher.Remove(); } else { _pusher.Update(); } } else { destinationId = _pusher.GetDestinationId(); if (!string.IsNullOrWhiteSpace(destinationId)) { if (item.HasState(ItemState.Removed)) { _pusher.Remove(destinationId); } else { _pusher.Update(destinationId); } } else // still cannot find a destinationId, which means the entity/attribute does not exists { pushState = _pusher.Create(out destinationId); } } if (!string.IsNullOrWhiteSpace(destinationId) && (pushState & PushState.Success) > 0) { entityRepository.UpdateItemDestinationId(_indexerModel, item.GetSourceId(), destinationId); // Detect dependencies that depends on "Synced" step UpdateDependencies(item, destinationId); } else { // Signal to tell that the item is success or not entityRepository.Retry(_indexerModel, item.GetId(), pushState); } entityRepository.Commit(); attributeRepository.Commit(); return(pushState); } catch { entityRepository.RollBack(); attributeRepository.RollBack(); // Update invalid item // Increate retry count // Next time when queue items, it will be put behind because of the retry count entityRepository.Retry(_indexerModel, item.GetId(), PushState.Failed); throw; } finally { Report($@" Ended synchronizing... --------------------------------------------------------------------------------- "); } }); return(result); }