Máster en Ingeniería Web por la Universidad Politécnica de Madrid (miw-upm)
Back-end con Tecnologías de Código Abierto: SPRING
Proyecto TPV. Este proyecto es un apoyo docente de la asignatura. Es una aplicación Back-end, mediante programación asíncrona, funcionando conjuntamente con Front-end: betca-tpv-angular, realizado en Angular.
Estado del código
Tecnologías necesarias
Java (8)
Maven (3.6)
Spring-Boot (2.1)
Reactor
MondoDB (4.0)
--- CI: GitHub
Travis-CI
Sonarcloud
Better Code Hub
Heroku
⚙️ Instalación del proyecto
- Clonar el repositorio en tu equipo, mediante consola:
> cd <folder path>
> git clone https://github.com/miw-upm/betca-tpv-spring
-
Importar el proyecto mediante IntelliJ IDEA
- Import Project, y seleccionar la carpeta del proyecto.
- Marcar Create Project from external model, elegir Maven.
- Next … Finish.
-
Ejecución
- Ejecución de test: se utiliza MongoDB embebido.
- Ejecución en local:
- Se debe tener arrancado el motor de MongoDB:
mongodb://localhost:27017/tpv
- Ejecutar mediante linea de comando:
> mvn clean spring-boot:run
- Se debe tener arrancado el motor de MongoDB:
📖 Documentación del proyecto
Este proyecto es la práctica de Angular desarrollada de forma colaborativa por todos los alumnos. Se parte de la versión
core
, ya implementada, y se pretende ampliar con un conjunto de mejoras.
Un Terminal Punto de Venta es un sistema informático que gestiona el proceso de venta mediante una interfaz accesible para los vendedores o compradores. Un único sistema informático permite la creación e impresión del recibo ticket o factura de venta —con los detalles de las referencias y precios— de los artículos vendidos, actualiza los cambios en el nivel de existencias de mercancías (STOCK) en la base de datos...
Arquitectura
Responsabilidades
config
Clases de configuración de Spring.exceptions
tratamiento de errores, convierte las excepciones lanzadas en respuestas de error HTTP.rest_controllers
Clases que conforman el API.- Define el path del recurso.
- Deben organizar la recepción de datos de la petición.
- Delega en los dtos la validación de campos.
- Delega en exceptions las respuestas de errores HTTP.
- Delega en los bussines_controllers la ejecución de la petición.
bussines_controllers
Clases que procesan la petición.- Desarrollan el proceso que conlleva la ejecución de la petición.
- Construye los documents a partir de los dtos de entrada.
- Delega en los dtos la construcción de los dtos de respuesta a partir de los documents.
- Delega en los repositories el acceso básico a las BD.
- Delega en los data_services procesos de acceso avanzado a las BD.
- Delega en los business_services procesos genéricos avanzados de la capa de negocio.
busines_services
Clases de servicios de apoyo, como fachada de construcción de PDF, fachada de tratamiento de JWT, encriptación...data_services
Clases de servicios avanzados de BD.repositories
Clases de acceso a BD mediante el patrón DAO.- Operaciones CRUD sobre BD.
- Consultas a BD.
documents
Clases con los documentos persistentes en BD y utilidades.
Autenticación
Se plantean mediante Basic Auth para logearse y obtener un API Key o token de tipo JSON Web Tokens (JWT). Uso del Bearer APIkEY para el acceso a los recursos.
Para obtener el API Key se accede al recurso: POST \users\token
, enviando por Basic auth las credenciales, van en la cabecera de la petición.
Para el acceso a los recursos, se envia el token mediante Bearer auth, tambien en la cabecera de la petición.
Authorization = Basic "user:pass"Base64
Authorization = Bearer "token"Base64
Para asegurar los recursos, se plantea una filosofía distribuida, es decir, se establece sobre cada recursos (clase). Para ello, se anotará sobre cada clase los roles permitidos; modificando el rol sobre el método si éste, tuviese un rol diferente.
@PreAuthorize("hasRole('ADMIN') or hasRole('MANAGER')")
public class Clazz {
//...
@PreAuthorize("hasRole('ADMIN')")
public void method(){...}
//...
public void method2(){...}
}
Existe un rol especial que se obtiene cuando se envía el usuario y contraseña por Basic Auth y es el rol de authenticated, sólo se utiliza para logearse.
Tratamiento de errores
Se realiza un tratamiento de error centralizado.
Documentos
DTOs
Son los objetos de transferencia del API, para recibir los datos (input) y enviar las respuestas (output).
- Los input se encargan de las validaciones de entrada mediante las anotaciones.
- Los output. Se deben poder construir a partir de los documentos. Añadir la anotación
@JsonInclude(Include.NON_NULL)
para que no se devuelvan null en el Json.
Bases de datos
Se dispone de un servicio para poblar la BD: DatabaseSeederService se carga automáticamente al iniciar la aplicación en el perfil dev.
Existe el recurso/admins/db
para poder borrar o poblar la BD.
El servicioDatabaseSeederService
nos permiter recargar las BD.
Se debe intentar no abusar de la recarga, ya que ralentiza la ejecución de los tests.
❗ Si se crea un nuevo documento, se debe añadir el deleteAll()
asociado al nuevo documento, dentro del método deleteAllAndInitialize
de la clase DatabaseSeederService