Files
WotBlitzStatisticsBlazor/WotBlitzStatisticsPro.GraphQl/Startup.cs
T

163 lines
6.3 KiB
C#
Raw Normal View History

using System;
2021-04-02 13:20:59 +02:00
using System.Security.Claims;
using System.Text;
using System.Threading.Tasks;
using HotChocolate;
2021-04-02 13:20:59 +02:00
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Authorization;
2020-02-15 16:00:42 +03:00
using Microsoft.AspNetCore.Builder;
2021-01-24 18:16:15 +01:00
using Microsoft.AspNetCore.Diagnostics.HealthChecks;
2020-02-15 16:00:42 +03:00
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
2021-01-24 18:16:15 +01:00
using Microsoft.Extensions.Diagnostics.HealthChecks;
2021-04-02 21:45:14 +02:00
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
2021-04-02 13:20:59 +02:00
using Microsoft.IdentityModel.Tokens;
using Serilog;
2020-05-23 11:43:14 +02:00
using WotBlitzStatisticsPro.Common;
using WotBlitzStatisticsPro.Common.Model;
2021-04-02 13:20:59 +02:00
using WotBlitzStatisticsPro.GraphQl.GitHubOauth;
2020-05-23 11:43:14 +02:00
using WotBlitzStatisticsPro.GraphQl.Mutation;
using WotBlitzStatisticsPro.GraphQl.ObjectTypes;
using WotBlitzStatisticsPro.GraphQl.Query;
2021-03-19 19:49:58 +01:00
using WotBlitzStatisticsPro.GraphQl.Resolvers;
2020-05-23 11:43:14 +02:00
using WotBlitzStatisticsPro.Logic;
2020-02-15 16:00:42 +03:00
2020-05-23 11:43:14 +02:00
namespace WotBlitzStatisticsPro.GraphQl
2020-02-15 16:00:42 +03:00
{
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
//services.AddLogging(loggingBuilder =>
// loggingBuilder.AddSerilog(dispose: true));
var wgApiConfig = new WargamingApiSettings();
2020-02-15 16:00:42 +03:00
Configuration.GetSection("WargamingApi").Bind(wgApiConfig);
2020-05-31 15:43:39 +02:00
var mongoConfig = new MongoSettings();
Configuration.GetSection("Mongo").Bind(mongoConfig);
2021-04-02 13:20:59 +02:00
var gitHubOauthConfig = new GitHubOauthAppConfiguration();
Configuration.GetSection("GitHubOAuth").Bind(gitHubOauthConfig);
2020-02-15 16:00:42 +03:00
services.AddSingleton<IWargamingApiSettings>(wgApiConfig);
2020-05-31 15:43:39 +02:00
services.AddSingleton<IMongoSettings>(mongoConfig);
2021-04-02 13:20:59 +02:00
services.AddSingleton(gitHubOauthConfig);
WotBlitzStatisticsLogicInstaller.ConfigureServices(services);
2020-02-15 16:00:42 +03:00
2021-01-24 18:16:15 +01:00
services.AddHealthChecks()
.AddCheck("self", () => HealthCheckResult.Healthy())
.AddMongoDb(mongoConfig.ConnectionString, tags: new[] { "services" });
2020-03-12 19:44:41 +01:00
2021-04-02 13:20:59 +02:00
// GitHub authorization
services.AddHttpClient("github");
services.AddTransient<IGitHubOauthService, GitHubOauthService>();
services.AddAuthorization(options =>
{
options.AddPolicy("GithubMbogaOnly", policy =>
policy.RequireClaim(ClaimTypes.Name, gitHubOauthConfig.AllowedUser));
});
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "https://WotBlitzStatisticsPro.com",
ValidAudience = "https://WotBlitzStatisticsPro.com",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(gitHubOauthConfig.ClientSecret!))
};
});
// Add GraphQL Services
services.AddGraphQLServer()
2021-03-19 19:49:58 +01:00
.AddQueryType(d => d.Name("Query"))
.AddType<WotBlitzStatisticsQuery>()
.AddType<AccountInfoResolver>()
2021-03-23 13:44:03 +01:00
.AddType<WotBlitzAchievementsQuery>()
2021-06-04 14:13:16 +02:00
.AddType<TankInfoResponseType>()
2021-04-02 13:20:59 +02:00
.AddMutationType(d => d.Name("Mutation"))
.AddType<WotBlitzStatisticsMutation>()
.AddType<AuthenticationMutation>()
2020-12-23 17:30:16 +01:00
.AddType<AccountsSearchItemObjectType>()
.AddEnumType<MarkOfMastery>()
.AddEnumType<RealmType>()
2021-04-02 13:20:59 +02:00
.AddEnumType<RequestLanguage>()
.AddAuthorization()
.AddHttpRequestInterceptor(
(context, executor, builder, ct) =>
{
// Get WgAccessToken from header and push it into context
if (context.Request.Headers.ContainsKey("WargamingToken"))
{
var token = context.Request.Headers["WargamingToken"];
if (token.Count == 1)
{
builder.SetProperty("WgToken", token[0]);
}
}
2021-04-02 13:20:59 +02:00
return ValueTask.CompletedTask;
})
.ModifyRequestOptions(opt => opt.IncludeExceptionDetails = true)
.AddErrorFilter(sp =>
new GraphQlErrorFilter
(sp.GetApplicationService<ILogger<GraphQlErrorFilter>>()))
2021-04-02 13:20:59 +02:00
;
2021-04-02 21:45:14 +02:00
// Blazor
services.AddControllersWithViews();
services.AddRazorPages();
2021-04-02 13:20:59 +02:00
}
2020-12-23 17:30:16 +01:00
2021-04-02 13:20:59 +02:00
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
2020-02-15 16:00:42 +03:00
{
2021-04-02 21:45:14 +02:00
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
app.UseWebAssemblyDebugging();
}
else
{
app.UseExceptionHandler("/Error");
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
2021-04-02 13:20:59 +02:00
app
2021-04-02 21:45:14 +02:00
.UseBlazorFrameworkFiles()
.UseStaticFiles()
2020-12-23 17:30:16 +01:00
.UseRouting()
2021-04-02 13:20:59 +02:00
.UseAuthorization()
.UseAuthentication()
2020-12-23 17:30:16 +01:00
.UseEndpoints(endpoints =>
{
2021-04-02 21:45:14 +02:00
endpoints.MapRazorPages();
2020-12-23 17:30:16 +01:00
endpoints.MapGraphQL();
2021-01-24 18:16:15 +01:00
endpoints.MapHealthChecks("/health/self", new HealthCheckOptions
{
Predicate = r => r.Tags.Contains("self")
});
endpoints.MapHealthChecks("/health/startup", new HealthCheckOptions
{
Predicate = r => r.Tags.Contains("services")
});
2021-04-02 21:45:14 +02:00
endpoints.MapFallbackToFile("index.html");
});
2020-02-15 16:00:42 +03:00
}
}
}