Skip to content

Fake-Sun/tecnoshop-api

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

TecnoShop API

API REST desarrollada con Spring Boot y MySQL para el e-commerce TecnoShop.

Frontend usado como referencia:

Requerimientos cubiertos

  • API REST con Spring Boot.
  • Persistencia en MySQL con Spring Data JPA.
  • Endpoints con GET, POST, PUT, PATCH y DELETE.
  • Organizacion por paquetes: controller, service, repository, model, dto, exception y config.
  • 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.

Modelo

  • 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:

  • CustomerOrder tiene relacion ManyToOne con Customer.
  • CustomerOrder tiene relacion OneToMany con OrderItem.
  • OrderItem tiene relacion ManyToOne con Product.

Tecnologias

  • Java 21
  • Spring Boot 3.5.3
  • Spring Web
  • Spring Data JPA
  • Hibernate Validator
  • MySQL
  • Maven Wrapper

Base de datos

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_clave

Como ejecutar

mvnw.cmd spring-boot:run

La API queda disponible en:

http://localhost:8080

Endpoints

Productos

  • GET /api/products
  • GET /api/products?availableOnly=true
  • GET /api/products?name=Gaming Keyboard
  • GET /api/products/search?name=Gaming Keyboard
  • GET /api/products/{id}
  • POST /api/products
  • PUT /api/products/{id}
  • DELETE /api/products/{id}

Tambien existen aliases en espanol:

  • /api/productos

Clientes

  • GET /api/customers
  • GET /api/customers/{id}
  • GET /api/customers/{id}/orders
  • POST /api/customers
  • PUT /api/customers/{id}
  • DELETE /api/customers/{id}

Tambien existen aliases en espanol:

  • /api/usuarios
  • /api/usuarios/{id}/pedidos

Pedidos

  • GET /api/orders
  • GET /api/orders?customerId=1
  • GET /api/orders/{id}
  • POST /api/orders
  • PUT /api/orders/{id}
  • PATCH /api/orders/{id}/status
  • DELETE /api/orders/{id}

Tambien existe alias en espanol:

  • /api/pedidos

Datos de prueba

Crear cliente

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\"}"

Crear productos

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}"

Buscar productos

curl http://localhost:8080/api/products/1
curl "http://localhost:8080/api/products?name=Wireless ergonomic mouse"

Crear pedido con cantidades

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 }
  ]
}

Cambiar estado del pedido

Estados disponibles:

  • PENDING
  • CONFIRMED
  • SHIPPED
  • DELIVERED
  • CANCELLED
curl -X PATCH http://localhost:8080/api/orders/1/status ^
  -H "Content-Type: application/json" ^
  -d "{\"status\":\"CONFIRMED\"}"

Historial por usuario

curl http://localhost:8080/api/usuarios/1/pedidos

Ejecutar tests

mvnw.cmd test

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors

Languages