// Note: the data types used in this sample are generated from data.proto in GrpcServiceSample public override async Task RunAsync(CancellationToken cancellationToken) { using var client = new DaprClientBuilder().Build(); Console.WriteLine("Invoking grpc deposit"); var deposit = new GrpcServiceSample.Generated.Transaction() { Id = "17", Amount = 99 }; var account = await client.InvokeMethodGrpcAsync <GrpcServiceSample.Generated.Transaction, Account>("grpcsample", "deposit", deposit, cancellationToken); Console.WriteLine("Returned: id:{0} | Balance:{1}", account.Id, account.Balance); Console.WriteLine("Completed grpc deposit"); Console.WriteLine("Invoking grpc withdraw"); var withdraw = new GrpcServiceSample.Generated.Transaction() { Id = "17", Amount = 10, }; await client.InvokeMethodGrpcAsync("grpcsample", "withdraw", withdraw, cancellationToken); Console.WriteLine("Completed grpc withdraw"); Console.WriteLine("Invoking grpc balance"); var request = new GetAccountRequest() { Id = "17", }; account = await client.InvokeMethodGrpcAsync <GetAccountRequest, Account>("grpcsample", "getaccount", request, cancellationToken); Console.WriteLine($"Received grpc balance {account.Balance}"); }
/// <summary> /// Deposit /// </summary> /// <param name="transaction"></param> /// <param name="context"></param> /// <returns></returns> public async Task <GrpcServiceSample.Generated.Account> Deposit(GrpcServiceSample.Generated.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 GrpcServiceSample.Generated.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 <GrpcServiceSample.Generated.Account> Withdraw(GrpcServiceSample.Generated.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 GrpcServiceSample.Generated.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 GrpcServiceSample.Generated.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))); }