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); }
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() )); }
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); }