/// <summary> /// Deposit /// </summary> /// <param name="transaction"></param> /// <param name="context"></param> /// <returns></returns> public async Task <GrpcService.Account> Deposit(GrpcService.Transaction transaction, ServerCallContext context) { _logger.LogDebug("Enter deposit"); var state = await _daprClient.GetStateEntryAsync <Models.Account>(StoreName, transaction.Id); state.Value ??= new Models.Account() { Id = transaction.Id, }; state.Value.Balance += transaction.Amount; await state.SaveAsync(); return(new GrpcService.Account() { Id = state.Value.Id, Balance = (int)state.Value.Balance, }); }
/// <summary> /// Withdraw /// </summary> /// <param name="transaction"></param> /// <param name="context"></param> /// <returns></returns> public async Task <GrpcService.Account> Withdraw(GrpcService.Transaction transaction, ServerCallContext context) { _logger.LogDebug("Enter withdraw"); var state = await _daprClient.GetStateEntryAsync <Models.Account>(StoreName, transaction.Id); if (state.Value == null) { throw new Exception($"NotFound: {transaction.Id}"); } state.Value.Balance -= transaction.Amount; await state.SaveAsync(); return(new GrpcService.Account() { Id = state.Value.Id, Balance = (int)state.Value.Balance, }); }
/// <summary> /// implement OnTopicEvent to handle deposit and withdraw event /// </summary> /// <param name="request"></param> /// <param name="context"></param> /// <returns></returns> public override async Task <TopicEventResponse> OnTopicEvent(TopicEventRequest request, ServerCallContext context) { if (request.PubsubName == "pubsub") { var input = JsonSerializer.Deserialize <Models.Transaction>(request.Data.ToStringUtf8(), this.jsonOptions); var transaction = new GrpcService.Transaction() { Id = input.Id, Amount = (int)input.Amount, }; if (request.Topic == "deposit") { await Deposit(transaction, context); } else { await Withdraw(transaction, context); } } return(await Task.FromResult(default(TopicEventResponse))); }