public async Task AdvanceBatchAsync(AdvanceDowntimeBatchRequest request) => await _writeRepository.AdvanceBatchAsync(request);
public async Task AdvanceAsync(AdvanceDowntimeBatchRequest request) => await _service.AdvanceBatchAsync(request);
public async Task AdvanceBatchAsync(AdvanceDowntimeBatchRequest request) { var downtimes = await request.Ids .ToAsyncEnumerable() .SelectAwait(async id => await _readRepository.GetByIdAsync(id)) .ToArrayAsync(); foreach (var entity in downtimes) { var costs = entity.Costs .Select(cost => ( source: cost, req: request.Request.Costs .FirstOrDefault(c => c.ActivityCostKind == cost.ActivityCostKind) )) .Select(cost => new DowntimeCostEntity { ActivityCostKind = cost.source.ActivityCostKind, Value = cost.req != null ? cost.source.Value + cost.req.Delta : cost.source.Value, Goal = cost.source.Goal }) .ToArray(); var updatedEntity = new DowntimeEntity { Character = entity.Character, Activity = entity.Activity, Costs = costs }; await(await _container).ReplaceItemAsync( await _entityMutator.UpdateMetadataAsync(updatedEntity, entity, null), entity.Id ); } var deltasByKindByCharacter = downtimes .GroupBy(d => d.Character.Id) .Select(g => ( characterId: g.Key, kinds: g .SelectMany(p => p.Costs) .GroupBy(c => c.ActivityCostKind) .Select(cost => { var delta = request.Request.Costs .FirstOrDefault(c => c.ActivityCostKind == cost.Key) ?.Delta ?? 0; return( activityCostKind: cost.Key, delta: delta * cost.Count() ); }) .Where(req => req != default) )); var daysDeltaByCharacter = deltasByKindByCharacter .Select(character => ( character.characterId, // Limit requests to days as it is the only supported kind by the character api. request: new AwardCharacterRequest { Delta = -character.kinds .FirstOrDefault(c => c.activityCostKind == "days") .delta } )) .Where(req => req.request.Delta != 0); foreach (var(characterId, characterRequest) in daysDeltaByCharacter) { await _characterWriteRepository.AwardAsync(characterId, characterRequest); } }