-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathProgram.cs
More file actions
98 lines (75 loc) · 3.1 KB
/
Program.cs
File metadata and controls
98 lines (75 loc) · 3.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
using Microsoft.EntityFrameworkCore;
using SisgenApi.MODELS;
using Microsoft.OpenApi.Models;
using Azure.Storage.Blobs;
var builder = WebApplication.CreateBuilder(args);
// --- 1. CONFIGURACIÓN DE SERVICIOS ---
// Base de Datos Azure SQL
var sqlConnection = builder.Configuration.GetConnectionString("SisgenConnection");
builder.Services.AddDbContext<SisgenDBContext>(options =>
options.UseSqlServer(sqlConnection));
// 1. ASEGÚRATE QUE ESTA LÍNEA EXISTA:
// builder.Services.AddControllers();
// (Esto activa los controladores que acabamos de crear)
// para que ignore las mayúsculas:
builder.Services.AddControllers().AddJsonOptions(options => {
options.JsonSerializerOptions.PropertyNameCaseInsensitive = true;
});
// Azure Blob Storage Connection (para uso en los endpoints)
var storageConnection = builder.Configuration.GetConnectionString("AzureStorageConnection");
// Swagger / OpenAPI
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo
{
Title = "Sisgen API 2026",
Version = "v1",
Description = "API para integración con .NET MAUI"
});
});
var app = builder.Build();
// --- 2. CONFIGURACIÓN DEL PIPELINE ---
// Habilitar Swagger siempre para agilizar el desarrollo
app.UseSwagger();
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Sisgen API v1"));
// Redirección HTTPS automática
app.UseHttpsRedirection();
app.UseAuthorization();
// --- 3. ENDPOINTS (RUTAS) ---
// SUBIDA DE ARCHIVOS (Word, Excel, PDF, Imágenes)
app.MapPost("/subir-archivo", async (IFormFile archivo) =>
{
if (archivo == null || archivo.Length == 0)
return Results.BadRequest("Archivo no válido.");
var blobServiceClient = new BlobServiceClient(storageConnection);
var containerClient = blobServiceClient.GetBlobContainerClient("archivos-app");
// Creamos el contenedor de forma segura (Acceso privado por defecto al crear)
await containerClient.CreateIfNotExistsAsync();
// Nombre único para evitar sobrescribir archivos con el mismo nombre
var nombreUnico = $"{Guid.NewGuid()}{Path.GetExtension(archivo.FileName)}";
var blobClient = containerClient.GetBlobClient(nombreUnico);
// Subida mediante Stream para eficiencia de memoria
using var stream = archivo.OpenReadStream();
await blobClient.UploadAsync(stream, true);
// Retornamos URL y metadatos
return Results.Ok(new
{
url = blobClient.Uri.ToString(),
nombreOriginal = archivo.FileName,
nombreEnServidor = nombreUnico
});
}).DisableAntiforgery(); // Desactivado para compatibilidad directa con MAUI
// PRODUCTOS: Obtener lista
app.MapGet("/Productos", async (SisgenDBContext db) =>
await db.Productos.ToListAsync());
// PRODUCTOS: Crear nuevo (Aquí guardarás la URL devuelta por /subir-archivo)
app.MapPost("/Productos", async (SisgenDBContext db, Productos producto) =>
{
db.Productos.Add(producto);
await db.SaveChangesAsync();
return Results.Created($"/Productos/{producto.Id}", producto);
});
// ASEGÚRATE QUE ESTA LÍNEA EXISTA ANTES DEL RUN:
app.MapControllers();
app.Run();