Skip to content

Commit 6a63bde

Browse files
committed
Fix: Correcciones de compilación y funcionamiento local exitoso
1 parent 3a844df commit 6a63bde

File tree

9 files changed

+986
-2
lines changed

9 files changed

+986
-2
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
namespace AutoDocOps.Api.DTOs;
2+
3+
/// <summary>
4+
/// Respuesta con información básica de la API
5+
/// </summary>
6+
public class ApiInfoResponse
7+
{
8+
/// <summary>
9+
/// Nombre del servicio
10+
/// </summary>
11+
public string Service { get; set; } = "AutoDocOps API";
12+
13+
/// <summary>
14+
/// Versión del servicio
15+
/// </summary>
16+
public string Version { get; set; } = "1.0.0";
17+
18+
/// <summary>
19+
/// Estado del servicio
20+
/// </summary>
21+
public string Status { get; set; } = "Running";
22+
23+
/// <summary>
24+
/// Timestamp de la respuesta
25+
/// </summary>
26+
public DateTime Timestamp { get; set; } = DateTime.UtcNow;
27+
}
28+
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
using Microsoft.Extensions.Configuration;
2+
using Microsoft.Extensions.DependencyInjection;
3+
using Microsoft.EntityFrameworkCore;
4+
using AutoDocOps.Infrastructure.Data;
5+
using AutoDocOps.Infrastructure.Services;
6+
using Npgsql;
7+
8+
namespace AutoDocOps.Infrastructure;
9+
10+
/// <summary>
11+
/// Configuración de inyección de dependencias para la capa de infraestructura
12+
/// </summary>
13+
public static class DependencyInjection
14+
{
15+
/// <summary>
16+
/// Configura los servicios de la capa de infraestructura
17+
/// </summary>
18+
/// <param name="services">Colección de servicios</param>
19+
/// <param name="configuration">Configuración de la aplicación</param>
20+
/// <returns>Colección de servicios configurada</returns>
21+
public static IServiceCollection AddInfrastructure(this IServiceCollection services, IConfiguration configuration)
22+
{
23+
// Configurar pool de conexiones Npgsql
24+
// Priorizar DATABASE_URL de variables de entorno sobre ConnectionStrings
25+
var connectionString = configuration["DATABASE_URL"]
26+
?? configuration.GetConnectionString("DefaultConnection")
27+
?? throw new InvalidOperationException("Connection string no configurada");
28+
29+
// Configurar Npgsql con pool de conexiones optimizado
30+
var dataSourceBuilder = new NpgsqlDataSourceBuilder(connectionString);
31+
32+
// Configurar pool de conexiones
33+
dataSourceBuilder.ConnectionStringBuilder.Pooling = true;
34+
dataSourceBuilder.ConnectionStringBuilder.MinPoolSize = 5;
35+
dataSourceBuilder.ConnectionStringBuilder.MaxPoolSize = 100;
36+
dataSourceBuilder.ConnectionStringBuilder.ConnectionLifetime = 300; // 5 minutos
37+
dataSourceBuilder.ConnectionStringBuilder.ConnectionIdleLifetime = 60; // 1 minuto
38+
dataSourceBuilder.ConnectionStringBuilder.CommandTimeout = 30;
39+
40+
// Habilitar extensión pgvector para embeddings
41+
dataSourceBuilder.EnableDynamicJson();
42+
43+
var dataSource = dataSourceBuilder.Build();
44+
services.AddSingleton(dataSource);
45+
46+
// Configurar Entity Framework con Npgsql
47+
services.AddDbContext<ApplicationDbContext>(options =>
48+
{
49+
options.UseNpgsql(dataSource, npgsqlOptions =>
50+
{
51+
npgsqlOptions.EnableRetryOnFailure(
52+
maxRetryCount: 3,
53+
maxRetryDelay: TimeSpan.FromSeconds(5),
54+
errorCodesToAdd: null);
55+
56+
// Configurar para usar pgvector
57+
npgsqlOptions.UseVector();
58+
});
59+
60+
// Configuraciones adicionales para desarrollo
61+
options.EnableSensitiveDataLogging(false);
62+
options.EnableDetailedErrors(false);
63+
options.UseQueryTrackingBehavior(QueryTrackingBehavior.NoTracking);
64+
});
65+
66+
// Configurar health checks para la base de datos
67+
services.AddHealthChecks()
68+
.AddNpgSql(connectionString, name: "postgresql");
69+
70+
// Configurar servicios de Supabase
71+
var supabaseUrl = configuration["Supabase:Url"];
72+
var supabaseKey = configuration["Supabase:Key"];
73+
if (!string.IsNullOrEmpty(supabaseUrl) && !string.IsNullOrEmpty(supabaseKey))
74+
{
75+
services.AddSupabaseServices(configuration);
76+
}
77+
78+
// Configurar servicios de OpenAI y embeddings
79+
var openAiApiKey = configuration["OpenAI:ApiKey"];
80+
if (!string.IsNullOrEmpty(openAiApiKey))
81+
{
82+
services.AddEmbeddingServices(configuration);
83+
services.AddOpenAIServices(configuration);
84+
services.AddCodeAnalysisServices(configuration);
85+
}
86+
87+
// Registrar repositorios y servicios
88+
// services.AddScoped<IProjectRepository, ProjectRepository>();
89+
// services.AddScoped<IApiDocumentationRepository, ApiDocumentationRepository>();
90+
// services.AddScoped<IDatabaseSchemaRepository, DatabaseSchemaRepository>();
91+
92+
return services;
93+
}
94+
}
95+
Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,98 @@
1+
2+
#region DTOs de Request y Response
3+
4+
/// <summary>
5+
/// Request para análisis de código .NET
6+
/// </summary>
7+
public record AnalyzeDotNetRequest(string SourceCode, string Language = "es");
8+
9+
/// <summary>
10+
/// Response para análisis de código .NET
11+
/// </summary>
12+
public record AnalyzeDotNetResponse(
13+
bool Success,
14+
string OpenApiSpecification,
15+
CodeMetadata Metadata,
16+
string Message);
17+
18+
/// <summary>
19+
/// Request para análisis de esquema SQL Server
20+
/// </summary>
21+
public record AnalyzeSqlServerRequest(string ConnectionString, string Language = "es");
22+
23+
/// <summary>
24+
/// Response para análisis de esquema SQL Server
25+
/// </summary>
26+
public record AnalyzeSqlServerResponse(
27+
bool Success,
28+
string Documentation,
29+
DatabaseSchemaResult SchemaResult,
30+
string Message);
31+
32+
/// <summary>
33+
/// Request para generar guías de uso
34+
/// </summary>
35+
public record GenerateGuidesRequest(string OpenApiSpecification, string Language = "es");
36+
37+
/// <summary>
38+
/// Response para generar guías de uso
39+
/// </summary>
40+
public record GenerateGuidesResponse(bool Success, string UsageGuides, string Message);
41+
42+
/// <summary>
43+
/// Request para generar colección Postman
44+
/// </summary>
45+
public record GeneratePostmanRequest(string OpenApiSpecification, string BaseUrl);
46+
47+
/// <summary>
48+
/// Response para generar colección Postman
49+
/// </summary>
50+
public record GeneratePostmanResponse(bool Success, string PostmanCollection, string Message);
51+
52+
/// <summary>
53+
/// Request para generar SDK TypeScript
54+
/// </summary>
55+
public record GenerateTypeScriptSDKRequest(string OpenApiSpecification, string PackageName);
56+
57+
/// <summary>
58+
/// Request para generar SDK C#
59+
/// </summary>
60+
public record GenerateCSharpSDKRequest(string OpenApiSpecification, string Namespace);
61+
62+
/// <summary>
63+
/// Response para generar SDK
64+
/// </summary>
65+
public record GenerateSDKResponse(bool Success, string SDKCode, string Message);
66+
67+
/// <summary>
68+
/// Request para chat semántico
69+
/// </summary>
70+
public record SemanticChatRequest(string Question, string? Context = null, string Language = "es");
71+
72+
/// <summary>
73+
/// Response para chat semántico
74+
/// </summary>
75+
public record SemanticChatResponse(bool Success, string Answer, string Context, string Message);
76+
77+
/// <summary>
78+
/// Request para generar diagrama ER
79+
/// </summary>
80+
public record GenerateERDiagramRequest(string SchemaDefinition, string Language = "es");
81+
82+
/// <summary>
83+
/// Response para generar diagrama ER
84+
/// </summary>
85+
public record GenerateERDiagramResponse(bool Success, string MermaidCode, string Message);
86+
87+
/// <summary>
88+
/// Request para generar diccionario de datos
89+
/// </summary>
90+
public record GenerateDataDictionaryRequest(string SchemaDefinition, string Language = "es");
91+
92+
/// <summary>
93+
/// Response para generar diccionario de datos
94+
/// </summary>
95+
public record GenerateDataDictionaryResponse(bool Success, string DataDictionary, string Message);
96+
97+
#endregion
98+

backend/src/AutoDocOps.Api/AutoDocOps.Api/Program.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,3 +265,9 @@ public partial class AppJsonSerializerContext : JsonSerializerContext
265265
{
266266
}
267267

268+
269+
/// <summary>
270+
/// Clase Program pública para tests de integración
271+
/// </summary>
272+
public partial class Program { }
273+
Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
using AutoDocOps.Api.DTOs;
2+
using AutoDocOps.Api.Endpoints;
3+
4+
namespace AutoDocOps.Api.Extensions;
5+
6+
/// <summary>
7+
/// Extensiones para la configuración de la aplicación web
8+
/// </summary>
9+
public static class WebApplicationExtensions
10+
{
11+
/// <summary>
12+
/// Configura los endpoints de la API
13+
/// </summary>
14+
/// <param name="app">Aplicación web</param>
15+
/// <returns>Aplicación web configurada</returns>
16+
public static WebApplication ConfigureEndpoints(this WebApplication app)
17+
{
18+
// Endpoint de información de la API
19+
app.MapGet("/api/info", () => new ApiInfoResponse
20+
{
21+
Service = "AutoDocOps API",
22+
Version = "1.0.0",
23+
Status = "Running",
24+
Timestamp = DateTime.UtcNow
25+
})
26+
.WithName("GetApiInfo")
27+
.WithTags("General")
28+
.WithOpenApi()
29+
.WithSummary("Obtiene información de la API")
30+
.WithDescription("Retorna información básica sobre la API AutoDocOps");
31+
32+
// Mapear endpoints de documentación con IA
33+
app.MapDocumentationEndpoints();
34+
35+
// Grupo de endpoints para proyectos
36+
var projectsGroup = app.MapGroup("/api/projects")
37+
.WithTags("Projects")
38+
.RequireAuthorization();
39+
40+
projectsGroup.MapGet("/", () => "Lista de proyectos")
41+
.WithName("GetProjects")
42+
.WithOpenApi();
43+
44+
projectsGroup.MapPost("/", () => "Crear proyecto")
45+
.WithName("CreateProject")
46+
.WithOpenApi();
47+
48+
// Grupo de endpoints para gestión de documentación
49+
var docsGroup = app.MapGroup("/api/docs")
50+
.WithTags("Documentation Management")
51+
.RequireAuthorization();
52+
53+
docsGroup.MapGet("/{projectId:guid}", (Guid projectId) => $"Documentación del proyecto {projectId}")
54+
.WithName("GetDocumentation")
55+
.WithOpenApi();
56+
57+
docsGroup.MapPost("/{projectId:guid}/generate", (Guid projectId) => $"Generar documentación para {projectId}")
58+
.WithName("GenerateDocumentation")
59+
.WithOpenApi();
60+
61+
return app;
62+
}
63+
64+
/// <summary>
65+
/// Configura headers de seguridad
66+
/// </summary>
67+
/// <param name="app">Aplicación web</param>
68+
/// <returns>Aplicación web configurada</returns>
69+
public static WebApplication UseSecurityHeaders(this WebApplication app)
70+
{
71+
app.Use(async (context, next) =>
72+
{
73+
// HSTS
74+
context.Response.Headers.Append("Strict-Transport-Security", "max-age=31536000; includeSubDomains");
75+
76+
// CSP
77+
context.Response.Headers.Append("Content-Security-Policy",
78+
"default-src 'self'; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data: https:;");
79+
80+
// Otros headers de seguridad
81+
context.Response.Headers.Append("X-Content-Type-Options", "nosniff");
82+
context.Response.Headers.Append("X-Frame-Options", "DENY");
83+
context.Response.Headers.Append("X-XSS-Protection", "1; mode=block");
84+
context.Response.Headers.Append("Referrer-Policy", "strict-origin-when-cross-origin");
85+
86+
await next();
87+
});
88+
89+
return app;
90+
}
91+
92+
/// <summary>
93+
/// Aplica migraciones de base de datos
94+
/// </summary>
95+
/// <param name="app">Aplicación web</param>
96+
/// <returns>Tarea asíncrona</returns>
97+
public static async Task ApplyMigrationsAsync(this WebApplication app)
98+
{
99+
using var scope = app.Services.CreateScope();
100+
101+
// Aquí se aplicarían las migraciones cuando se configure Entity Framework
102+
// var context = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
103+
// await context.Database.MigrateAsync();
104+
105+
await Task.CompletedTask;
106+
}
107+
}
108+

backend/src/AutoDocOps.Application/AutoDocOps.Application/AutoDocOps.Application.csproj

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,9 @@
1313
<ItemGroup>
1414
<PackageReference Include="MediatR" Version="12.4.1" />
1515
<PackageReference Include="FluentValidation" Version="11.10.0" />
16-
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="8.0.2" />
16+
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="9.0.7" />
17+
<PackageReference Include="Microsoft.Extensions.Http" Version="9.0.7" />
18+
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" Version="9.0.7" />
1719
<PackageReference Include="System.Text.Json" Version="8.0.5" />
1820
</ItemGroup>
1921

0 commit comments

Comments
 (0)