Пример #1
0
        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);
            }
        }
Пример #2
0
 public void Update(TodoRecordStorage <TodoTaskRecord> itemRecord)
 {
     _historyTransactionIds.Add(itemRecord.TransactionId);
     if (itemRecord.TransactionId > CurrentTaskStorage.TransactionId)
     {
         CurrentTaskStorage = itemRecord;
     }
 }
Пример #3
0
        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);
        }
Пример #4
0
 public void Update(TodoRecordStorage <TodoTaskStatusRecord> statusRecord)
 {
     _historyTransactionIds.Add(statusRecord.TransactionId);
     if (CurrentStatusStorage == null)
     {
         CurrentStatusStorage = statusRecord;
     }
     else
     {
         if (statusRecord.TransactionId > CurrentStatusStorage.TransactionId)
         {
             CurrentStatusStorage = statusRecord;
         }
     }
 }
Пример #5
0
        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);
                }
            }
        }
Пример #6
0
 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;
 }
Пример #7
0
 public TodoTask(TodoRecordStorage <TodoTaskRecord> itemRecord)
 {
     _historyTransactionIds.Add(itemRecord.TransactionId);
     _firsItemStorage   = itemRecord;
     CurrentTaskStorage = itemRecord;
 }