/
ilyakos
/
ChatWithAI
Обзор
Документация
Войти
/
ilyakos
/
ChatWithAI
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
ChatWithAI_Server/Program.cs
142 строки
6 KB
ilyakos
новые энд поинты
15 июн 2026, 20:32
15 июн 2026, 20:32
15ab71c
Код
Авторство
О чём код?
using System.Text; using ChatWithAI.Database; using ChatWithAI.Database.Extensions; using ChatWithAI_Server.Services; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; using Microsoft.OpenApi; using Npgsql; namespace ChatWithAI_Server; /// <summary> /// Точка входа в приложение. Настраивает сервисы и конвейер обработки запросов. /// </summary> public class Program { /// <summary> /// Настраивает и запускает веб-приложение. /// </summary> /// <param name="args">Аргументы командной строки.</param> public static void Main(string[] args) { var builder = WebApplication.CreateBuilder(args); // База данных var connectionString = builder.Configuration.GetConnectionString("DefaultConnection") ?? throw new InvalidOperationException("Строка подключения 'DefaultConnection' не задана."); builder.Services.AddDatabase(connectionString); // Сервисы приложения builder.Services.AddScoped<IAuthService, AuthService>(); builder.Services.AddScoped<IChatService, ChatService>(); // HTTP-клиент для LM Studio builder.Services.AddHttpClient<ILmStudioService, LmStudioService>(client => { var baseUrl = builder.Configuration["LmStudio:BaseUrl"] ?? "http://localhost:1234/v1"; client.BaseAddress = new Uri(baseUrl.TrimEnd('/') + "/"); client.Timeout = TimeSpan.FromMinutes(5); }); // Контроллеры builder.Services.AddControllers(); // JWT-аутентификация var jwtKey = builder.Configuration["Jwt:Key"] ?? throw new InvalidOperationException("Jwt:Key не задан. Используйте User Secrets или переменную окружения."); builder.Services .AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = builder.Configuration["Jwt:Issuer"], ValidAudience = builder.Configuration["Jwt:Audience"], IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(jwtKey)) }; }); builder.Services.AddAuthorization(); // Swagger — только в режиме разработки if (builder.Environment.IsDevelopment()) { builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "ChatWithAI API", Version = "v1" }); // Подключаем XML-документацию из обоих проектов var baseDir = AppContext.BaseDirectory; c.IncludeXmlComments(Path.Combine(baseDir, "ChatWithAI_Server.xml"), includeControllerXmlComments: true); c.IncludeXmlComments(Path.Combine(baseDir, "ChatWithAI.Database.xml")); c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { Name = "Authorization", Type = SecuritySchemeType.Http, Scheme = "Bearer", BearerFormat = "JWT", In = ParameterLocation.Header, Description = "Введите JWT-токен в формате: Bearer {токен}" }); c.AddSecurityRequirement(doc => new OpenApiSecurityRequirement { { new OpenApiSecuritySchemeReference("Bearer", doc, null), [] } }); }); } var app = builder.Build(); // Применение миграций при старте. // Код 42P07 означает что таблица уже существует — база создана вне EF. // В этом случае логируем предупреждение и продолжаем: схема актуальна, // приложение работоспособно. Для чистого старта: DROP DATABASE и перезапуск. using (var scope = app.Services.CreateScope()) { var db = scope.ServiceProvider.GetRequiredService<AppDbContext>(); var logger = scope.ServiceProvider.GetRequiredService<ILogger<Program>>(); try { db.Database.Migrate(); } catch (Npgsql.PostgresException ex) when (ex.SqlState == "42P07") { logger.LogWarning( "Миграция пропущена: таблица уже существует (код 42P07). " + "База данных создана вне EF Core. " + "Для сброса: DROP DATABASE {db} и перезапустите приложение.", db.Database.GetDbConnection().Database); } } if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run(); } }