// ------------------------------------------------------------
// 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);
}
}
}
}