# Tutorial: Sistema de inventario con log
En este tutorial vamos a ver el paso a paso de cómo subir a la nube un servidor para el control de inventarios. Es una API Rest y se utiliza el entorno de trabajo Spring. Vamos a ver la estructura del proyecto, las clases y cómo subirlo a un nodo de AWS con Putty. También veremos cómo hacer peticiones al servidor mediante Postman.
Para acceder y descargar el proyecto, ir al siguiente enlace https://github.com/esgonzalezca/SpringLenguajes
### Estructura del proyecto

Entramos a src/main/java/com/spring/aop/api/

**Advice**
Dentro de este directorio está la clase que contiene los pointcuts para la petición GET (myPointCutGet) y para la petición POST (myPointCutPost). Ambos son de tipo execution.
Después están las dos funciones que se usarán para hacer los logs:applicationLoggerPost para las peticiones POST, donde se crea un ObjectMapper, se obtiene el nombre del método, el nombre de la clase y los argumentos para registrar la información en el log. Luego con pjp.proceed() se ejecuta el JoinPoint. Esta función tiene la anotación
@Around porque reemplaza el código que está en el joinpoint
La segunda función applicationLoggerGet cumple prácticamente la misma función de applicationLoggerPost pero como tiene la anotación @AfterReturning recibe el retorno del pointcut (myPointCutGet) en la variable redVal y luego hace el registro en el log.

**Model**
En la clase Product se describen los atributos de los productos que estarán en nuestro repositorio, los constructores, getters y setters.

**Service**
En la clase ProductService se inicia la base de datos y se hacen las operaciones de consulta y adición de registros.

**Controller**
En la clase ProductController es donde se expone la información con REST, hay una petición POST (save) para guardar un producto o una lista de productos.
La petición GET (findProducts) para obtener todos los productos en el sistema.
En esta clase usamos la clase ProductService para acceder a la base de datos.

**Repository**
La clase ProductRepository hereda de JpaRepository, hay que declarar la tabla con Producto y el tipo de dato de la llave primaria (Integer).

Y por último, fuera de los directorios vistos arriba, está la clase SpringAopApplication, donde está el método main para correr el servidor.

### Creación del .jar
Usaremos el IDE Netbeans.

En la parte superior de la pantalla haremos clic en el icono del Martillo con la escoba. Así se creará un archivo .jar con un nombre genérico (el cual se puede cambiar más adelante) en la carpeta “Target” de nuestro directorio del proyecto en local.
### Creación del Dockerfile
Ahora crearemos un archivo llamado “Dockerfile” que no tendrá extensión y tendrá este contenido:

Nótese que aquí “myService.jar” es como se debe llamar el archivo ejecutable de Java. Este archivo debe estar en la misma carpeta del Dockerfile ya que será transportado a la carpeta /opt/app de nuestro entorno virtual (nodo de AWS). Recuerde que este archivo .jar fue generado al principio dentro de la carpeta target de nuestro proyecto en local.
### Creación del nodo EC2
**Nota:** Para esta sección se usó una máquina t2.micro de AWS (se puede acceder a una de estas máquinas con la capa gratuita de AWS).
Vamos a la página de AWS https://aws.amazon.com/, creamos una cuenta y accedemos a la consola.

Vamos a la sección EC2

Vamos a la sección instances y oprimimos Launch instance.

Seleccionamos Amazon Linux 2 64 bits(X86) y luego en “Select”.

Seleccionamos la t2.micro.

Luego hacemos click en “Review and Launch”.

Hacemos click en Launch. A continuación nos pedirá ingresar un nuevo valor de llave. Ingresamos los datos como sale a continuación.

### Acceder al nodo usando Putty
Ya con la llave del nodo, accedemos a él mediante Putty. Descargar en: https://www.putty.org
Interfaz inicial de Putty

En el cuadro de Host Name ingresamos la IP del nodo del nodo que creamos unos pasos arriba. Para el caso de la exposición hecha en clase:

Luego vamos a la categoría SSH - Auth.

En el campo Private key file for authentication ponemos la ruta de la llave del nodo de AWS. Luego regresamos a la categoría Session y oprimimos open.

Accedemos con el usuario ec2-user (es el usuario por defecto).

Desde esta ventana de comandos instalamos docker para hacer el contenedor para correr nuestra API.

Iniciamos docker.

Luego vamos a la carpeta donde está el Dockerfile.
umagen

Construimos el contenedor.

Corremos el contenedor.

Ya está corriendo el servidor, debajo comenzarán a aparecer los logs.

### Peticiones al servidor con Postman
Enlace para descargar Postman: https://www.postman.com/downloads/
Agregamos una nueva petición de tipo GET para obtener la lista de productos de nustro inventario. En la dirección escribimos la ip del nodo seguida por ":" el puerto "/" findProducts. Damos click a Send para enviar la petición al servidor.

Log del servidor.

Ahora agregamos otra petición de tipo POST para agregar productos al inventario. Ingresamos la misma ruta cambiando lo que va depués del "/" por save. En la pestaña *Body* seleccionamos *raw* y *JSON* para escribir el cuerpo de la petición (los artículos que vamos a agregar). Enviamos la petición son *Send*

Log del servidor

Luego hacemos otro GET para obtener la lista de productos actualizada.

Log del servidor
