async Task ProcessTransaction(TransactionDownloadData <Transaction> transactionDownload) { try { var transaction = transactionDownload.Transaction; var data = transaction.GetFeature <Data>(Data.FeatureId); if (data == null) // Group Stuff { return; } var group = transaction.GetFeature <Group>(Group.FeatureId); var groupId = group.GroupId; var index = group.GroupIndex; var storage = LoadTodoStorage(transactionDownload); if (storage == null) { using (var unpacker = new Unpacker(data.Items[0].Data)) { var targetedTransactionId = Operation.InvalidTransactionId; var transactionTarget = transaction.GetFeature <TransactionTarget>(TransactionTarget.FeatureId); if (transactionTarget != null) { targetedTransactionId = transactionTarget.Targets[0]; } if (index == TodoServiceInfo.TodoTaskStatusIndex) { storage = new TodoRecordStorage <TodoTaskStatusRecord>(new TodoTaskStatusRecord(unpacker), transaction.TransactionId, transaction.AccountId, transaction.Timestamp, targetedTransactionId, groupId); } else if (index == TodoServiceInfo.TodoTaskIndex) { storage = await GetDecryptedRecord <TodoTaskRecord>(transaction, targetedTransactionId, groupId, unpacker); } else if (index == TodoServiceInfo.TodoListNameIndex) { storage = await GetDecryptedRecord <TodoListNameRecord>(transaction, targetedTransactionId, groupId, unpacker); } if (storage != null) { await SaveTodoStorage(transactionDownload, storage); } } } if (storage != null && MissingSecretKeys.Count == 0) { Process(storage); } } catch (Exception ex) { Log.IgnoreException(ex); } }
public void Update(TodoRecordStorage <TodoTaskRecord> itemRecord) { _historyTransactionIds.Add(itemRecord.TransactionId); if (itemRecord.TransactionId > CurrentTaskStorage.TransactionId) { CurrentTaskStorage = itemRecord; } }
public TodoTask(Unpacker unpacker) { _firsItemStorage = new TodoRecordStorage <TodoTaskRecord>(unpacker); CurrentTaskStorage = new TodoRecordStorage <TodoTaskRecord>(unpacker); if (unpacker.UnpackBool()) { CurrentStatusStorage = new TodoRecordStorage <TodoTaskStatusRecord>(unpacker); } unpacker.Unpack(_historyTransactionIds); }
public void Update(TodoRecordStorage <TodoTaskStatusRecord> statusRecord) { _historyTransactionIds.Add(statusRecord.TransactionId); if (CurrentStatusStorage == null) { CurrentStatusStorage = statusRecord; } else { if (statusRecord.TransactionId > CurrentStatusStorage.TransactionId) { CurrentStatusStorage = statusRecord; } } }
void Process(IRecordStorage storage) { LastProcessedTransactionId = Math.Max(storage.TransactionId, LastProcessedTransactionId); _historyTransactionIds.Add(storage.TransactionId); if (storage.GetRecordType() == TodoRecordTypes.ListName) { var nameRecord = storage as TodoRecordStorage <TodoListNameRecord>; if (CurrentListNameRecord != null) { if (storage.TransactionId > CurrentListNameRecord.TransactionId) { CurrentListNameRecord = nameRecord; } } else { CurrentListNameRecord = nameRecord; } } else if (storage.GetRecordType() == TodoRecordTypes.Task) { var itemRecord = storage as TodoRecordStorage <TodoTaskRecord>; _items.TryGetValue(itemRecord.TargetedTransactionId, out var item); if (item == null) { _items[itemRecord.TransactionId] = new TodoTask(itemRecord); } else { item.Update(itemRecord); } } else if (storage.GetRecordType() == TodoRecordTypes.TaskStatus) { var statusRecord = storage as TodoRecordStorage <TodoTaskStatusRecord>; if (_items.TryGetValue(statusRecord.TargetedTransactionId, out var item)) { item.Update(statusRecord); } } }
public TodoList(Unpacker unpacker, Todo todo, ServiceNode serviceNode) { unpacker.Unpack(out byte dataVersion); unpacker.Unpack(out ListId); LastProcessedTransactionId = unpacker.UnpackLong(); if (unpacker.UnpackBool()) { LastUsedSecretKeyInfo = SecretKeyInfo.Restore(unpacker); } unpacker.Unpack(_items, (u) => new TodoTask(u)); unpacker.Unpack(_historyTransactionIds); if (unpacker.UnpackBool()) { CurrentListNameRecord = new TodoRecordStorage <TodoListNameRecord>(unpacker); } Index = BuildIndex(ListId); ServiceNode = serviceNode; Todo = todo; }
public TodoTask(TodoRecordStorage <TodoTaskRecord> itemRecord) { _historyTransactionIds.Add(itemRecord.TransactionId); _firsItemStorage = itemRecord; CurrentTaskStorage = itemRecord; }