SwapDude/SWAD.API/Startup.cs
Lisoveliy aebe654c38
Some checks are pending
Deploy / update (push) Waiting to run
Build Project .NET / build (push) Waiting to run
chore: init commit from GitHub
2025-05-12 19:44:33 +03:00

117 lines
4.4 KiB
C#
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using System.Reflection;
using Microsoft.Extensions.Options;
using Microsoft.OpenApi.Models;
using StackExchange.Redis;
using SWAD.API.Middlewares;
using SWAD.API.Models.Config;
using SWAD.API.Models.Config.ApiServices;
using SWAD.API.Services.Links;
using SWAD.API.Services.MusicAPI.Api;
using SWAD.API.Services.MusicAPI.Auth;
namespace SWAD.API;
public static class Startup
{
private static ServicesEndpointsConfig? _servicesEndpointsConfig;
public static void Configure(WebApplicationBuilder builder)
{
SetConfigurations(builder);
}
public static void ConfigureServices(IServiceCollection services)
{
SetServiceUsages(services);
SetCustomServices(services);
}
public static void ConfigureApplication(WebApplication app)
{
SetAppUsages(app);
SetAppMappings(app);
}
private static void SetConfigurations(WebApplicationBuilder builder)
{
//Json config setup
builder.Configuration.AddJsonFile("appsettings.json", false, true) //load base settings
.AddJsonFile("appsettings.local.json", true, true); //load local settings
builder.Services.Configure<ApiServicesConfig>
(builder.Configuration.GetSection(ApiServicesConfig.ConfigName));
builder.Services.Configure<ServicesEndpointsConfig>
(builder.Configuration.GetSection(ServicesEndpointsConfig.ConfigName));
//Get config for setup
_servicesEndpointsConfig = builder.Configuration
.GetSection(ServicesEndpointsConfig.ConfigName)
.Get<ServicesEndpointsConfig>();
}
private static void SetServiceUsages(IServiceCollection services)
{
services.AddProblemDetails();
services.AddControllers();
services.AddSwaggerGen(options =>
{
options.SwaggerDoc("v1", new OpenApiInfo
{
Version = Assembly.GetExecutingAssembly().GetName().Version!.ToString(),
Title = "SWAD.API",
Description =
"Share With All, Dude - Platform for sharing music links from one music service to another for free!\n" +
"API Reference for SWAD.Front and for guys who trying to make themself stuff :)",
TermsOfService = new Uri("https://github.com/SpectruMTeamCode/SWAD/tree/main"),
Contact = new OpenApiContact
{
Name = "GitHub",
Url = new Uri("https://github.com/SpectruMTeamCode/SWAD/tree/main")
}
});
options.IncludeXmlComments(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "doc.xml"));
options.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
});
}
private static void SetCustomServices(IServiceCollection services)
{
//Custom services setup
//TODO read from config
services.AddSingleton(ConnectionMultiplexer.Connect(_servicesEndpointsConfig.Redis));
services.AddSingleton(p =>
p.GetService<ConnectionMultiplexer>()?.GetDatabase() ??
throw new NullReferenceException("Чёт с инжектом редиса не то"));
services.AddSingleton(p => ConnectionMultiplexer.Connect(_servicesEndpointsConfig.Redis));
services.AddSingleton(p => p.GetService<ConnectionMultiplexer>()!.GetDatabase());
services.AddSingleton<LinksService>();
//Register all IAPIService implementations
foreach (var service in ApiService.GetAllImplementations()) services.AddSingleton(typeof(ApiService), service);
//Register all AuthService implementations
foreach (var service in AbstractAuthService.GetAllImplementations())
services.AddSingleton(typeof(AbstractAuthService), service);
}
private static void SetAppUsages(WebApplication app)
{
app.UseMiddleware<ExceptionMiddleware>();
app.UseSwagger();
app.UseSwaggerUI(options =>
{
options.InjectStylesheet("/swagger-ui/theme-flattop.css");
options.IndexStream = () => Assembly.GetEntryAssembly()!.GetManifestResourceStream("SWAD.API.index.html");
});
app.UseStaticFiles();
}
private static void SetAppMappings(WebApplication app)
{
app.MapControllers();
//Redirect to swagger
app.Map("/", () => { return Results.LocalRedirect("/swagger"); });
}
}