API REST desarrollada con .NET 8 y Clean Architecture para gestión de productos y categorías.
cd ECommerce.API
dotnet run --launch-profile httpSwagger disponible en: http://localhost:5228/swagger
La API usa JWT Bearer Token. Todos los endpoints de Categorías y Productos requieren estar autenticado.
POST /api/auth/login
Body:
{
"email": "admin@ecommerce.com",
"password": "Admin123!"
}Respuesta:
{
"token": "eyJhbGciOiJIUzI1NiIsInR5...",
"expiration": "2026-05-30T14:00:00Z"
}- Copiá el valor de
token - Hacé clic en el botón Authorize (arriba a la derecha en Swagger)
- Escribí:
Bearer eyJhbGciOiJIUzI1NiIsInR5... - Clic en Authorize → Close
A partir de ese momento todos los endpoints funcionan con tu sesión.
GET /api/categorias
No requiere body. Retorna la lista completa.
Respuesta 200 OK:
[
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"nombre": "Electrónica",
"descripcion": "Productos electrónicos y tecnología"
}
]GET /api/categorias/{id}
Reemplazá {id} con el GUID de la categoría.
Respuesta 200 OK:
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"nombre": "Electrónica",
"descripcion": "Productos electrónicos y tecnología"
}Retorna 404 Not Found si no existe.
POST /api/categorias
Body:
{
"nombre": "Electrónica",
"descripcion": "Productos electrónicos y tecnología"
}Respuesta 201 Created:
{
"id": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
"nombre": "Electrónica",
"descripcion": "Productos electrónicos y tecnología"
}Retorna 400 Bad Request si el nombre está vacío o supera los 100 caracteres.
PUT /api/categorias/{id}
Reemplazá {id} con el GUID de la categoría a editar.
Body:
{
"nombre": "Tecnología",
"descripcion": "Electrónica y gadgets"
}Respuesta 204 No Content (sin body).
Retorna 404 Not Found si no existe, 400 Bad Request si los datos son inválidos.
DELETE /api/categorias/{id}
Reemplazá {id} con el GUID de la categoría a eliminar.
Respuesta 204 No Content (sin body).
Retorna 404 Not Found si no existe.
GET /api/productos
No requiere body. Retorna la lista completa.
Respuesta 200 OK:
[
{
"id": "1a2b3c4d-0000-0000-0000-000000000001",
"nombre": "Mouse Gamer",
"precio": 4500.50,
"stock": 20,
"categoriaId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}
]GET /api/productos/{id}
Reemplazá {id} con el GUID del producto.
Respuesta 200 OK:
{
"id": "1a2b3c4d-0000-0000-0000-000000000001",
"nombre": "Mouse Gamer",
"precio": 4500.50,
"stock": 20,
"categoriaId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}Retorna 404 Not Found si no existe.
GET /api/productos/categoria/{categoriaId}
Reemplazá {categoriaId} con el GUID de la categoría.
Retorna todos los productos que pertenecen a esa categoría.
Respuesta 200 OK: lista de productos (mismo formato que GET all).
POST /api/productos
Body:
{
"nombre": "Mouse Gamer",
"precio": 4500.50,
"stock": 20,
"categoriaId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}Respuesta 201 Created:
{
"id": "1a2b3c4d-0000-0000-0000-000000000001",
"nombre": "Mouse Gamer",
"precio": 4500.50,
"stock": 20,
"categoriaId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}Retorna 400 Bad Request si:
- El nombre está vacío o supera los 200 caracteres
- El precio es 0 o negativo
- El stock es negativo
- La categoría no existe
PUT /api/productos/{id}
Reemplazá {id} con el GUID del producto a editar.
Body:
{
"nombre": "Mouse Gamer RGB",
"precio": 5200.00,
"stock": 15,
"categoriaId": "3fa85f64-5717-4562-b3fc-2c963f66afa6"
}Respuesta 204 No Content (sin body).
Retorna 404 Not Found si el producto o la categoría no existen.
DELETE /api/productos/{id}
Reemplazá {id} con el GUID del producto a eliminar.
Respuesta 204 No Content (sin body).
Retorna 404 Not Found si no existe.
| Código | Significado |
|---|---|
200 OK |
Operación exitosa con datos |
201 Created |
Recurso creado exitosamente |
204 No Content |
Operación exitosa sin datos de retorno |
400 Bad Request |
Datos de entrada inválidos |
401 Unauthorized |
No autenticado o token inválido |
404 Not Found |
Recurso no encontrado |
- .NET 8 — ASP.NET Core Web API
- Clean Architecture — Domain / Application / Infrastructure / API
- MediatR — patrón CQRS (Commands y Queries)
- FluentValidation — validación de entrada
- Entity Framework Core 8 — ORM
- SQLite — base de datos (archivo
stock.db) - JWT Bearer — autenticación
- Swagger / OpenAPI — documentación interactiva