using MTWorkHR.Application; using MTWorkHR.Infrastructure; using Microsoft.EntityFrameworkCore; using MTWorkHR.Core; using MTWorkHR.Core.Global; using MTWorkHR.Application.Middlewares; using MTWorkHR.Application.Services.Interfaces; using MTWorkHR.Application.Filters; using MTWorkHR.Application.StartupService; using Microsoft.AspNetCore.Mvc; using MTWorkHR.Infrastructure.DBContext; using Microsoft.AspNetCore.Mvc.Controllers; using Microsoft.OpenApi.Models; using MTWorkHR.API.Swagger; using Azure.Storage.Blobs; using Moq; using Microsoft.Extensions.DependencyInjection; var builder = WebApplication.CreateBuilder(args); if (OperatingSystem.IsLinux()) { builder.Configuration.AddJsonFile("appsettings.Linux.json", optional: true, reloadOnChange: true); } var config = new AppSettingsConfiguration(); // Add services to the container. builder.Services.AddDbContext(options => { options.UseSqlServer(config.ConnectionStrings.MTWorkHRConnectionString); // options.UseSqlServer(builder.Configuration.GetSection("ConnectionStrings:MTWorkHRConnectionString").Value); }); builder.Configuration.Bind(config); builder.Services.AddApplicationServices(config); builder.Services.AddInfrastructureIdentityServices(config); //builder.Services.AddPersistenceServices(builder.Configuration); //builder.Services.AddIdentityServices(config); builder.Services.AddHostedService(); if (builder.Environment.IsDevelopment()) { var mockBlobServiceClient = new Mock(); // Mock BlobContainerClient since this is what BlobServiceClient interacts with. var mockBlobContainerClient = new Mock(); // Set up the mock to return a mock BlobContainerClient when requested. mockBlobServiceClient .Setup(x => x.GetBlobContainerClient(It.IsAny())) .Returns(mockBlobContainerClient.Object); builder.Services.AddSingleton(mockBlobServiceClient.Object); } else { // Use the actual connection string for production or other environments. builder.Services.AddSingleton(x => new BlobServiceClient(config.ConnectionStrings.BlobConnectionString)); } //builder.Services.AddControllers(); builder.Services.AddControllers(options => { //add filter by instance options.Filters.Add(new InputValidationActionFilter()); //add filter By the type options.Filters.Add(typeof(InputValidationActionFilter)); }); //disable default model validation, because we handle this in InputValidationActionFilter and LoggingMiddleware. builder.Services.Configure(options => { options.SuppressModelStateInvalidFilter = true; }); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); //builder.Services.AddSwaggerGen(); //-------------------------- builder.Services.AddSwaggerGen(swagger => { //This is to apply global headers for all requests swagger.OperationFilter(); //This is to export enums to front swagger.SchemaFilter(); //This is to generate the Default UI of Swagger Documentation swagger.SwaggerDoc("v1", new OpenApiInfo { Version = "v1", Title = "MTWorkHR.API", Description = "MTWorkHR.APIDesc" }); swagger.CustomOperationIds( d => (d.ActionDescriptor as ControllerActionDescriptor)?.ControllerName + (d.ActionDescriptor as ControllerActionDescriptor)?.ActionName ); // To Enable authorization using Swagger (JWT) swagger.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme() { Name = "Authorization", Type = SecuritySchemeType.ApiKey, Scheme = "Bearer", BearerFormat = "JWT", In = ParameterLocation.Header, Description = "Enter 'Bearer' [space] and then your valid token in the text input below.\r\n\r\nExample: \"Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9\"", }); swagger.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } }, new string[] {} } }); }); //-------------------------- var app = builder.Build(); // Configure the HTTP request pipeline. // if (app.Environment.IsDevelopment()) // { app.UseSwagger(); //app.UseSwaggerUI(); app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "MTWorkHR.API v1")); // } app.UseCors(x => x .AllowAnyMethod() .AllowAnyHeader() .SetIsOriginAllowed(origin => true) // allow any origin .AllowCredentials()); // allow credentials app.UseHttpsRedirection(); app.UseAuthentication(); app.UseAuthorization(); app.UseMiddleware(); app.MapControllers(); app.Run();