public async Task CreatePlanAsync(
            DateTime from,
            DateTime to)
        {
            _log.Info($"Creating distribution plan for {from:s} - {to:s}...");

            var claimedGasAmounts = await _claimedGasAmountRepository.GetAsync(from, to);

            _log.Info("Claimed GAS amount found", new
            {
                claimedGasAmounts
            });

            var snapshots = await _snapshotRepository.GetAsync(from, to);

            _log.Info($"{snapshots.Count} balance snapshots found");

            var scale = _assetService.AssetGet(_gasAssetId).Accuracy;

            _log.Info($"GAS scale {scale}");

            var distributionAmounts = DistributionPlanCalculator.CalculateAmounts(snapshots, claimedGasAmounts, scale).ToArray();

            _log.Info($"{distributionAmounts.Length} distribution amounts gotten");

            var distributionPlan = DistributionPlanAggregate.Create(to, distributionAmounts);

            _log.Info($"Distribution plan {distributionPlan.Id} created");

            await _distributionPlanRepository.SaveAsync(distributionPlan);
        }
예제 #2
0
        public async Task <DistributionPlanAggregate> TryGetAsync(
            Guid planId)
        {
            var indexEntity = await _distributionPlanIndexTable.GetDataAsync
                              (
                partition : GetIndexPartitionKey(planId),
                row : GetIndexRowKey()
                              );

            if (indexEntity == null)
            {
                return(null);
            }

            var planEntity = await _distributionPlanTable.GetDataAsync
                             (
                partition : indexEntity.PrimaryPartitionKey,
                row : indexEntity.PrimaryRowKey
                             );

            if (planEntity == null)
            {
                return(null);
            }

            var amountEntities     = new List <DistributionAmountEntity>();
            var amountPartitionKey = GetAmountPartitionKey(planEntity.PlanTimestamp);
            var continuationToken  = (string)null;

            do
            {
                IEnumerable <DistributionAmountEntity> entities;

                (entities, continuationToken) = await _distributionAmountTable
                                                .GetDataWithContinuationTokenAsync(amountPartitionKey, 1000, continuationToken);

                amountEntities.AddRange(entities);
            } while (continuationToken != null);

            return(DistributionPlanAggregate.Restore
                   (
                       planEntity.PlanId,
                       planEntity.PlanTimestamp,
                       amountEntities
                       .Select(x => DistributionPlanAggregate.Amount.Restore(walletId: x.WalletId, amountId: x.AmountId, value: x.AmountValue))
                       .ToArray()
                   ));
        }
예제 #3
0
        public async Task SaveAsync(
            DistributionPlanAggregate distributionPlan)
        {
            var planEntity = new DistributionPlanEntity
            {
                PlanId        = distributionPlan.Id,
                PlanTimestamp = distributionPlan.Timestamp,

                PartitionKey = GetPlanPartitionKey(distributionPlan.Timestamp),
                RowKey       = GetPlanRowKey(distributionPlan.Timestamp)
            };

            var indexEntity = new AzureIndex
            {
                PrimaryPartitionKey = planEntity.PartitionKey,
                PrimaryRowKey       = planEntity.RowKey,

                PartitionKey = GetIndexPartitionKey(distributionPlan.Id),
                RowKey       = GetIndexRowKey()
            };

            var amountsPartition = GetAmountPartitionKey(distributionPlan.Timestamp);
            var amountEntities   = distributionPlan.Amounts.Select(x => new DistributionAmountEntity
            {
                AmountValue = x.Value,
                AmountId    = x.Id,
                WalletId    = x.WalletId,

                PartitionKey = amountsPartition,
                RowKey       = GetAmountRowKey(x.WalletId)
            });

            await _distributionAmountTable.InsertOrReplaceBatchAsync(amountEntities);

            _chaosKitty.Meow(distributionPlan.Id);

            await _distributionPlanIndexTable.InsertOrReplaceAsync(indexEntity);

            _chaosKitty.Meow(distributionPlan.Id);

            await _distributionPlanTable.InsertOrReplaceAsync(planEntity);
        }