// ------------------------------------------------------------ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. // ------------------------------------------------------------ namespace RoutingSample { using System; using System.Text.Json; using System.Threading.Tasks; using Dapr.Client; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Http; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; /// /// Startup class. /// public class Startup { /// /// State store name. /// public const string StoreName = "statestore"; /// /// Pubsub component name. "pubsub" is name of the default pub/sub configured by the Dapr CLI. /// public const string PubsubName = "pubsub"; /// /// Initializes a new instance of the class. /// /// Configuration. public Startup(IConfiguration configuration) { this.Configuration = configuration; } /// /// Gets the configuration. /// public IConfiguration Configuration { get; } /// /// Configures Services. /// /// Service Collection. public void ConfigureServices(IServiceCollection services) { services.AddDaprClient(); services.AddSingleton(new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase, PropertyNameCaseInsensitive = true, }); } /// /// Configures Application Builder and WebHost environment. /// /// Application builder. /// Webhost environment. /// Options for JSON serialization. public void Configure(IApplicationBuilder app, IWebHostEnvironment env, JsonSerializerOptions serializerOptions) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); app.UseCloudEvents(); app.UseEndpoints(endpoints => { endpoints.MapSubscribeHandler(); endpoints.MapGet("{id}", Balance); endpoints.MapPost("deposit", Deposit).WithTopic(PubsubName, "deposit"); endpoints.MapPost("withdraw", Withdraw).WithTopic(PubsubName, "withdraw"); }); async Task Balance(HttpContext context) { Console.WriteLine("Enter Balance"); var client = context.RequestServices.GetRequiredService(); var id = (string)context.Request.RouteValues["id"]; Console.WriteLine("id is {0}", id); var account = await client.GetStateAsync(StoreName, id); if (account == null) { Console.WriteLine("Account not found"); context.Response.StatusCode = 404; return; } Console.WriteLine("Account balance is {0}", account.Balance); context.Response.ContentType = "application/json"; await JsonSerializer.SerializeAsync(context.Response.Body, account, serializerOptions); } async Task Deposit(HttpContext context) { Console.WriteLine("Enter Deposit"); var client = context.RequestServices.GetRequiredService(); var transaction = await JsonSerializer.DeserializeAsync(context.Request.Body, serializerOptions); Console.WriteLine("Id is {0}, Amount is {1}", transaction.Id, transaction.Amount); var account = await client.GetStateAsync(StoreName, transaction.Id); if (account == null) { account = new Account() { Id = transaction.Id, }; } if (transaction.Amount < 0m) { Console.WriteLine("Invalid amount"); context.Response.StatusCode = 400; return; } account.Balance += transaction.Amount; await client.SaveStateAsync(StoreName, transaction.Id, account); Console.WriteLine("Balance is {0}", account.Balance); context.Response.ContentType = "application/json"; await JsonSerializer.SerializeAsync(context.Response.Body, account, serializerOptions); } async Task Withdraw(HttpContext context) { Console.WriteLine("Enter Withdraw"); var client = context.RequestServices.GetRequiredService(); var transaction = await JsonSerializer.DeserializeAsync(context.Request.Body, serializerOptions); Console.WriteLine("Id is {0}", transaction.Id); var account = await client.GetStateAsync(StoreName, transaction.Id); if (account == null) { Console.WriteLine("Account not found"); context.Response.StatusCode = 404; return; } if (transaction.Amount < 0m) { Console.WriteLine("Invalid amount"); context.Response.StatusCode = 400; return; } account.Balance -= transaction.Amount; await client.SaveStateAsync(StoreName, transaction.Id, account); Console.WriteLine("Balance is {0}", account.Balance); context.Response.ContentType = "application/json"; await JsonSerializer.SerializeAsync(context.Response.Body, account, serializerOptions); } } } }