This commit is contained in:
RodoIsAlnum
2025-10-28 20:59:38 -06:00
parent fef5ca6aa6
commit 10c131cd47
329 changed files with 3454 additions and 303 deletions

View File

@@ -1,13 +1,13 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.20" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.10" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="9.0.10" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="9.0.10" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="9.0.10">

View File

@@ -35,13 +35,13 @@ namespace BibliotecaAPI.Controllers
{
_context.Libros.Add(libro);
await _context.SaveChangesAsync();
return CreatedAtAction(nameof(GetLibro), new { id = libro.IdLibro }, libro);
return CreatedAtAction(nameof(GetLibro), new { id = libro.Id_Libro }, libro);
}
[HttpPut("{id}")]
public async Task<IActionResult> PutLibro(int id, Libro libro)
{
if (id != libro.IdLibro) return BadRequest();
if (id != libro.Id_Libro) return BadRequest();
_context.Entry(libro).State = EntityState.Modified;
await _context.SaveChangesAsync();
return NoContent();
@@ -50,11 +50,11 @@ namespace BibliotecaAPI.Controllers
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteLibro(int id)
{
var libro = await _context.Libros.FindAsync(IdLibro);
var libro = await _context.Libros.FindAsync(id);
if (libro == null) return NotFound();
_context.Libros.Remove(libro);
await _context.SaveChangesAsync();
return NoContent();
}
}
}
}

View File

@@ -20,11 +20,22 @@ namespace BibliotecaAPI.Controllers
[HttpPost("crear")]
public async Task<ActionResult<Prestamo>> CrearPrestamo(Prestamo prestamo)
{
var libro = await _context.Libros.FindAsync(prestamo.IdLibro);
if (libro == null || libro.CopiasDisponibles <= 0)
// Verificar si el usuario tiene 3 o más préstamos no devueltos
var prestamosActivos = await _context.Prestamos
.Where(p => p.Id_Usuario == prestamo.Id_Usuario && !p.Devuelto)
.CountAsync();
if (prestamosActivos >= 3)
return BadRequest("El usuario ya tiene 3 préstamos activos. Debe devolver al menos uno antes de realizar un nuevo préstamo.");
var libro = await _context.Libros.FindAsync(prestamo.Id_Libro);
if (libro == null || libro.Copias_Disponibles <= 0)
return BadRequest("Libro no disponible.");
libro.CopiasDisponibles--;
libro.Copias_Disponibles--;
prestamo.Fecha_Prestamo = DateTime.Now;
prestamo.Devuelto = false;
_context.Prestamos.Add(prestamo);
await _context.SaveChangesAsync();
@@ -35,37 +46,43 @@ namespace BibliotecaAPI.Controllers
[HttpPut("devolver/{id}")]
public async Task<IActionResult> RegistrarDevolucion(int id)
{
var prestamo = await _context.Prestamos.Include(p => p.Libro).FirstOrDefaultAsync(p => p.Id == id);
var prestamo = await _context.Prestamos
//.Include(p => p.Libro) // propiedad de navegación
.FirstOrDefaultAsync(p => p.Id_Prestamo == id);
if (prestamo == null) return NotFound();
if (prestamo.Devuelto)
return BadRequest("Este préstamo ya fue devuelto.");
prestamo.Devuelto = true;
prestamo.FechaDevolucion = DateTime.Now;
prestamo.Libro.CopiasDisponibles++;
//prestamo.Libro.Copias_Disponibles++;
await _context.SaveChangesAsync();
return Ok("Devolución registrada con éxito.");
}
}
// Consultar préstamos activos
[HttpGet("activos")]
public async Task<ActionResult<IEnumerable<Prestamo>>> GetActivos()
{
return await _context.Prestamos
.Include(p => p.Libro)
.Include(p => p.Usuario)
//.Include(p => p.Libro)
//.Include(p => p.Usuario)
.Where(p => !p.Devuelto)
.ToListAsync();
}
// Consultar préstamos vencidos (más de 15 días)
// Consultar préstamos vencidos (más de 10 días)
[HttpGet("vencidos")]
public async Task<ActionResult<IEnumerable<Prestamo>>> GetVencidos()
{
var hoy = DateTime.Now;
return await _context.Prestamos
.Include(p => p.Libro)
.Include(p => p.Usuario)
.Where(p => !p.Devuelto && (hoy - p.FechaPrestamo).TotalDays > 10)
//.Include(p => p.Libro)
//.Include(p => p.Usuario)
.Where(p => !p.Devuelto && (hoy - p.Fecha_Prestamo).TotalDays > 10)
.ToListAsync();
}
@@ -74,9 +91,9 @@ namespace BibliotecaAPI.Controllers
public async Task<ActionResult<IEnumerable<Prestamo>>> GetHistorialUsuario(int usuarioId)
{
return await _context.Prestamos
.Include(p => p.Libro)
.Where(p => p.IdUsuario == usuarioId)
//.Include(p => p.Libro)
.Where(p => p.Id_Usuario == usuarioId)
.ToListAsync();
}
}
}
}

View File

@@ -27,7 +27,7 @@ namespace BibliotecaAPI.Controllers
{
_context.Usuarios.Add(usuario);
await _context.SaveChangesAsync();
return CreatedAtAction(nameof(GetUsuarios), new { id = usuario.IdUsuario }, usuario);
return CreatedAtAction(nameof(GetUsuarios), new { id = usuario.Id_Usuario }, usuario);
}
}
}

View File

@@ -5,13 +5,13 @@ namespace BibliotecaAPI.Models
public class Libro
{
[Key]
public int IdLibro { get; set; }
public int Id_Libro { get; set; }
public string Titulo { get; set; } = string.Empty;
public string Autor { get; set; } = string.Empty;
public string ISBN { get; set; } = string.Empty;
public int Ano { get; set; }
public string Categoria { get; set; } = string.Empty;
public int CopiasDisponibles { get; set; }
public int Copias_Disponibles { get; set; }
public ICollection<Prestamo> Prestamos {get;set;}
}

View File

@@ -21,13 +21,19 @@ namespace BibliotecaAPI.Models
public DateTime FechaPrestamo { get; set; } = DateTime.Now;
public DateTime? FechaDevolucion { get; set; }
public bool Devuelto { get; set; } = false;*/
public int IdPrestamo { get; set; }
public int IdUsuario { get; set; }
public int IdLibro { get; set; }
public DateTime FechaPrestamo { get; set; }
public bool Devuelto {get;set;}
[Key]
public int Id_Prestamo { get; set; }
[ForeignKey(nameof(Libro))]
public int Id_Libro { get; set; } // FK
//public Libro Libro { get; set; } // Propiedad de navegación
[ForeignKey(nameof(Usuario))]
public int Id_Usuario { get; set; } // FK
//public Usuario Usuario { get; set; } // Propiedad de navegación
public DateTime Fecha_Prestamo { get; set; }
public bool Devuelto { get; set; }
public Usuario Usuario { get; set; }
public Libro Libro { get; set; }
}
}

View File

@@ -5,10 +5,10 @@ namespace BibliotecaAPI.Models
public class Usuario
{
[Key]
public int IdUsuario { get; set; }
public int Id_Usuario { get; set; }
public string Nombre { get; set; } = string.Empty;
public string Apellido { get; set; } = string.Empty;
public DateTime FechaRegistro { get; set; }
public DateTime Fecha_Registro { get; set; }
public ICollection<Prestamo> Prestamos {get;set;}
}

View File

@@ -2,24 +2,23 @@ using BibliotecaAPI.Data;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddDbContext<BibliotecaContext>(options => options.UseSqlite(builder.Configuration.GetConnectionString("DefaultConnection")));
builder.Services.AddControllers();
builder.Services.AddOpenApi();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
// Activar Swagger para probar endpoints
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseSwagger();
app.UseSwaggerUI(
c => {
c.SwaggerEndpoint("/swagger/v1/swagger.json", "Inventario API V1");
c.RoutePrefix = string.Empty; // Swagger en la raíz
}
);
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,20 @@
{
"runtimeOptions": {
"tfm": "net8.0",
"frameworks": [
{
"name": "Microsoft.NETCore.App",
"version": "8.0.0"
},
{
"name": "Microsoft.AspNetCore.App",
"version": "8.0.0"
}
],
"configProperties": {
"System.GC.Server": true,
"System.Reflection.NullabilityInfoContext.IsSupported": true,
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
}
}
}

View File

@@ -0,0 +1,5 @@
{
"Version": 1,
"ManifestType": "Build",
"Endpoints": []
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -0,0 +1,11 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"ConnectionStrings": {
"DefaultConnection": "Data Source=Data/database.db"
}
}

View File

@@ -0,0 +1,9 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*"
}

Some files were not shown because too many files have changed in this diff Show More