API REST desarrollada con Spring Boot y MySQL para el e-commerce TecnoShop.
Frontend usado como referencia:
- GitHub Pages: https://emilianospinoso.github.io/proyecto-final-ecommerce/
- Repositorio: https://github.com/emilianospinoso/proyecto-final-ecommerce
- API REST con Spring Boot.
- Persistencia en MySQL con Spring Data JPA.
- Endpoints con
GET,POST,PUT,PATCHyDELETE. - Organizacion por paquetes:
controller,service,repository,model,dto,exceptionyconfig. - Validaciones con Hibernate Validator.
- Excepciones personalizadas.
- Manejo centralizado de errores con
@ControllerAdvice. - CORS configurado para frontends locales.
- Busqueda de productos por nombre o ID.
- Gestion de productos con:
- ID
- Nombre
- Descripcion
- Precio
- Categoria
- Imagen URL
- Stock
- Gestion de pedidos con items y cantidades.
- Historial de pedidos por usuario/cliente.
- Validacion de negocio:
- No se puede comprar un producto inactivo.
- No se puede comprar mas cantidad que el stock disponible.
- El total se calcula como
precio * cantidad. - Al crear un pedido se descuenta stock.
- Al cancelar o borrar un pedido se devuelve stock.
Customer: cliente o usuario que realiza pedidos.Product: producto del catalogo.CustomerOrder: pedido realizado por un cliente.OrderItem: linea del pedido con producto, cantidad, precio unitario y subtotal.
Relaciones principales:
CustomerOrdertiene relacionManyToOneconCustomer.CustomerOrdertiene relacionOneToManyconOrderItem.OrderItemtiene relacionManyToOneconProduct.
- Java 21
- Spring Boot 3.5.3
- Spring Web
- Spring Data JPA
- Hibernate Validator
- MySQL
- Maven Wrapper
La aplicacion usa MySQL y puede tomar la conexion desde variables de entorno.
Configuracion en src/main/resources/application.properties:
spring.datasource.url=${DB_URL:jdbc:mysql://localhost:3306/tecnoshop_db?createDatabaseIfNotExist=true&useSSL=false&serverTimezone=America/Argentina/Buenos_Aires}
spring.datasource.username=${DB_USERNAME:root}
spring.datasource.password=${DB_PASSWORD:}Para usar otra configuracion sin tocar el codigo:
set DB_URL=jdbc:mysql://localhost:3306/tecnoshop_db?createDatabaseIfNotExist=true&useSSL=false&serverTimezone=America/Argentina/Buenos_Aires
set DB_USERNAME=root
set DB_PASSWORD=tu_clavemvnw.cmd spring-boot:runLa API queda disponible en:
http://localhost:8080
GET /api/productsGET /api/products?availableOnly=trueGET /api/products?name=Gaming KeyboardGET /api/products/search?name=Gaming KeyboardGET /api/products/{id}POST /api/productsPUT /api/products/{id}DELETE /api/products/{id}
Tambien existen aliases en espanol:
/api/productos
GET /api/customersGET /api/customers/{id}GET /api/customers/{id}/ordersPOST /api/customersPUT /api/customers/{id}DELETE /api/customers/{id}
Tambien existen aliases en espanol:
/api/usuarios/api/usuarios/{id}/pedidos
GET /api/ordersGET /api/orders?customerId=1GET /api/orders/{id}POST /api/ordersPUT /api/orders/{id}PATCH /api/orders/{id}/statusDELETE /api/orders/{id}
Tambien existe alias en espanol:
/api/pedidos
curl -X POST http://localhost:8080/api/customers ^
-H "Content-Type: application/json" ^
-d "{\"firstName\":\"Sofia\",\"lastName\":\"Perez\",\"email\":\"sofia.perez@example.com\",\"address\":\"Av. Siempre Viva 123\"}"curl -X POST http://localhost:8080/api/products ^
-H "Content-Type: application/json" ^
-d "{\"name\":\"Gaming Keyboard\",\"description\":\"RGB mechanical keyboard\",\"category\":\"Tech Accessories\",\"imageUrl\":\"https://dummyimage.com/300x300/cccccc/000000.png\",\"price\":15000,\"stock\":5,\"active\":true}"curl -X POST http://localhost:8080/api/products ^
-H "Content-Type: application/json" ^
-d "{\"name\":\"Wireless Mouse\",\"description\":\"Wireless ergonomic mouse\",\"category\":\"Tech Accessories\",\"imageUrl\":\"https://dummyimage.com/300x300/cccccc/000000.png\",\"price\":8000,\"stock\":3,\"active\":true}"curl http://localhost:8080/api/products/1curl "http://localhost:8080/api/products?name=Wireless ergonomic mouse"curl -X POST http://localhost:8080/api/orders ^
-H "Content-Type: application/json" ^
-d "{\"customerId\":1,\"items\":[{\"productId\":1,\"quantity\":2},{\"productId\":2,\"quantity\":1}]}"Tambien se acepta userId, por compatibilidad con ejemplos de frontend:
{
"userId": 1,
"items": [
{ "productId": 1, "quantity": 2 }
]
}Estados disponibles:
PENDINGCONFIRMEDSHIPPEDDELIVEREDCANCELLED
curl -X PATCH http://localhost:8080/api/orders/1/status ^
-H "Content-Type: application/json" ^
-d "{\"status\":\"CONFIRMED\"}"curl http://localhost:8080/api/usuarios/1/pedidosmvnw.cmd test