// ------------------------------------------------------------ // Copyright (c) Microsoft Corporation. // Licensed under the MIT License. // ------------------------------------------------------------ namespace RoutingSample { using System.Text.Json; using System.Threading.Tasks; using Dapr; 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"; /// /// 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("deposit"); endpoints.MapPost("withdraw", Withdraw).WithTopic("withdraw"); }); async Task Balance(HttpContext context) { var client = context.RequestServices.GetRequiredService(); var id = (string)context.Request.RouteValues["id"]; var account = await client.GetStateAsync(StoreName, id); if (account == null) { context.Response.StatusCode = 404; return; } context.Response.ContentType = "application/json"; await JsonSerializer.SerializeAsync(context.Response.Body, account, serializerOptions); } async Task Deposit(HttpContext context) { var client = context.RequestServices.GetRequiredService(); var transaction = await JsonSerializer.DeserializeAsync(context.Request.Body, serializerOptions); var account = await client.GetStateAsync(StoreName, transaction.Id); if (account == null) { account = new Account() { Id = transaction.Id, }; } if (transaction.Amount < 0m) { context.Response.StatusCode = 400; return; } account.Balance += transaction.Amount; await client.SaveStateAsync(StoreName, transaction.Id, account); context.Response.ContentType = "application/json"; await JsonSerializer.SerializeAsync(context.Response.Body, account, serializerOptions); } async Task Withdraw(HttpContext context) { var client = context.RequestServices.GetRequiredService(); var transaction = await JsonSerializer.DeserializeAsync(context.Request.Body, serializerOptions); var account = await client.GetStateAsync(StoreName, transaction.Id); if (account == null) { context.Response.StatusCode = 404; return; } if (transaction.Amount < 0m) { context.Response.StatusCode = 400; return; } account.Balance -= transaction.Amount; await client.SaveStateAsync(StoreName, transaction.Id, account); context.Response.ContentType = "application/json"; await JsonSerializer.SerializeAsync(context.Response.Body, account, serializerOptions); } } } }