Crear modelos
Crear controllers
Crear rutas
Crear postman para documentar y facilitar las pruebas los endpoints
Dockerizar el proyecto 😳
Describir cada endpoint
Pequeño tutorial de como utilizar el programa
Rendimiento en endpoints como add/remove produc
Falta de seguridad
Mal planteamiento de modelos
Mal manejo de errores
Mal planteamiento de modelos
* Concurrencia de dato en Productos y Eventos
* Poniendo un campo stock me ahorraría esta concurrencia de datos.
Inheritance
* Hacer que Productos y Eventos hereden de un modelo padre los campos
que se repiten (precio, nombre, thumbnail y descripción).
Mejor escalado y mejor manejo del de tipo de producto (producto o evento en este caso)
Falta de seguridad
* Añadiría una capa de usuarios para poder mejorar la seguridad de cada carrito.
Una capa de usuarios y tokens para más seguridad (standard jwt por ejemplo)
Mejora de rendimiento
* En algunos endpoints como add/remove product/event recorro un array,
pudiendo dar problemas de rendimiento
Errores y validaciones
* Me he centrado en lo esencial del ejercicio que es un carrito de compra,
por ende me falta muchas validaciones y errores, aquí dejo ejemplos:
* Validar si está fuera de stock
* Validar si existe x modelo
* Install rails
Instalar ruby on rails xd
* Ruby version 2.6 to > 2.7
Mi ordenador tenía una versión de ruby antigua; visitando 3423423 foros
pude cambiar de versión y proseguir.
* Problems with M1 :)
Movida con el procesador de mi ordenador teniendo que volver a visitar 4534579 foros.
* Aprender ruby y rails
Aprender este bonito lenguaje parecido a si amigo python
y documentarme de las clases más importantes de rails
* Manejo de errores
rails genera errores por default y no he descubierto todavía como
generar mis errores con mis messages personalizados ·
* Variables de entorno
rails no cargaba bien las variables del archivo .env
stack overflow me ayudo a quitar este simple if.
* Error al hacer migrate en docker
Configure docker-compose y Dockerfile.
Fui a la terminal del contendor y puse este comando: rake db:migrate.
Hizo la migración y todo funcionaba 🙂
* Tests
Aun no estoy familiarizado con los unit tests o cualquier otro patrón de tests
Estoy formándome en este campo gracias!
Endpoint | HTTP Method | Description | Body |
---|---|---|---|
/events | GET | Obtain a list of all events. | N/A |
/events/:id | GET | Retrieve details of a specific event by ID. | N/A |
/events | POST | Create a new event. |
{
"name":string,
"price":integer,
"thumbnail":string,
"description":string
} |
/products | GET | Fetch a list of all products. | N/A |
/products/:id | GET | Retrieve details of a specific product by ID. | N/A |
/products | POST | Create a new product. |
{
"name":string,
"price":integer,
"thumbnail":string,
"description":string
} |
/carts | GET | Get a list of all carts. | N/A |
/carts/:id | GET | Retrieve details of a specific cart by ID. | N/A |
/carts | POST | Create a new cart. | N/A |
/carts/:id/products | POST | Add a product to a cart by ID. |
{
"products_ids":integer[]
} |
/carts/:id/products | DELETE | Remove a product from a cart by ID. |
{
"products_ids":integer[]
} |
/carts/:id/events | POST | Add an event to a cart by ID. |
{
"event_ids":integer[]
} |
/carts/:id/events | DELETE | Remove an event from a cart by ID. |
{
"event_ids":integer[]
} |
/tickets | GET | Retrieve a list of all tickets. | N/A |
/tickets/:id | GET | Fetch details of a specific ticket by ID. | N/A |
/tickets | POST | Create a new ticket. |
{
"cart_id":integer
} |
#root dir
cp env.example .env
#/.env
# Elige el nombre de usuario de la base de datos
export DB_USER=user
# La contraseña de la base de datos que tiene que poner la aplicación
export DB_PASSWORD=password
# Elige el nombre de la base de datos
export DB_DATABASE=database
# Elige la contraseña para la base de datos
export DB_ROOT_PASSWORD=password
#root dir
docker-compose up --build
# Ir a la terminal de la aplicación en el contenedor de docker
rake db:migrate
![image](https://private-user-images.githubusercontent.com/101220133/268266189-dfe2303e-dbab-4008-9686-1f350c180d1f.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQwMDA2ODIsIm5iZiI6MTcyNDAwMDM4MiwicGF0aCI6Ii8xMDEyMjAxMzMvMjY4MjY2MTg5LWRmZTIzMDNlLWRiYWItNDAwOC05Njg2LTFmMzUwYzE4MGQxZi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODE4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgxOFQxNjU5NDJaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1jMGU5OGM1MzRhN2FiNjhjYTUxYTMyZTNiYTA5ZDlhNGQ0YzFlMjIyNTEyZDBjNjg3ZTZiNjg4ODE0Y2YwMDlkJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.UUqjkDBDrs4VAfkeS12sk285DIbqANYbGLuXVusG6PA)
Adjunto postman en le proyecto /shopping-cart.postman_collection.json
![image](https://private-user-images.githubusercontent.com/101220133/268269580-b8264d44-b7eb-40e8-8048-96ddea1768c1.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQwMDA2ODIsIm5iZiI6MTcyNDAwMDM4MiwicGF0aCI6Ii8xMDEyMjAxMzMvMjY4MjY5NTgwLWI4MjY0ZDQ0LWI3ZWItNDBlOC04MDQ4LTk2ZGRlYTE3NjhjMS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODE4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgxOFQxNjU5NDJaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1hYzRmNjg0ZDQ0OTMxMmViZmFlZTMxNzJjOGQ2NDY2NDJjNTYxZDZjODY0YWI4ZDk4YmNiYmQzOWViMjk0ZDQ1JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.SAwaiA244M8s_kvO0ITLY5XlphunaL77IxdXZfckJWM)
Repetir el proceso con sus respectivos endpoints
Cuando se crea un carrito no tiene productos y eventos por default
![image](https://private-user-images.githubusercontent.com/101220133/268270320-b3aa746a-f261-465c-9c30-f5779cd589cf.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQwMDA2ODIsIm5iZiI6MTcyNDAwMDM4MiwicGF0aCI6Ii8xMDEyMjAxMzMvMjY4MjcwMzIwLWIzYWE3NDZhLWYyNjEtNDY1Yy05YzMwLWY1Nzc5Y2Q1ODljZi5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODE4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgxOFQxNjU5NDJaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT1hMjllZDIyNTkwNzU4NjIwMmI4MzAwMGZmYThhNTExNzQ3MDNmMTBjNWUzYjY4ZDBmMzQwYmQ5ODIxZjY3NGMwJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.YLlKol6wwYnivEHGRAqNeinfbYksU6x1sH2Lb7kY35w)
Ver aquí como funciona los endpoint de añadir productos/eventos
![image](https://private-user-images.githubusercontent.com/101220133/268270665-1558e5ac-1d10-488e-9d56-554852f9eb76.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQwMDA2ODIsIm5iZiI6MTcyNDAwMDM4MiwicGF0aCI6Ii8xMDEyMjAxMzMvMjY4MjcwNjY1LTE1NThlNWFjLTFkMTAtNDg4ZS05ZDU2LTU1NDg1MmY5ZWI3Ni5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODE4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgxOFQxNjU5NDJaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0yYjkyMGY1ODdkZGVkOWY5M2IyY2UwMDBkZWM5ZTFjZWM2NjE2NjNiZmI1MmZlODE3YjZlYWJmNTBmMTdjNGZjJlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.CqZthx1P4sxeQ91Iw3QdvyWBGotjJ2Bdh67JDZa6UdU)
Por último crear nuestro tiquet
![image](https://private-user-images.githubusercontent.com/101220133/268271217-129d709c-be5c-4bf4-bf9a-80615a8fef71.png?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3MjQwMDA2ODIsIm5iZiI6MTcyNDAwMDM4MiwicGF0aCI6Ii8xMDEyMjAxMzMvMjY4MjcxMjE3LTEyOWQ3MDljLWJlNWMtNGJmNC1iZjlhLTgwNjE1YThmZWY3MS5wbmc_WC1BbXotQWxnb3JpdGhtPUFXUzQtSE1BQy1TSEEyNTYmWC1BbXotQ3JlZGVudGlhbD1BS0lBVkNPRFlMU0E1M1BRSzRaQSUyRjIwMjQwODE4JTJGdXMtZWFzdC0xJTJGczMlMkZhd3M0X3JlcXVlc3QmWC1BbXotRGF0ZT0yMDI0MDgxOFQxNjU5NDJaJlgtQW16LUV4cGlyZXM9MzAwJlgtQW16LVNpZ25hdHVyZT0yMmJiNWUzNDIxNzdhMTc4M2QzNDY3NGNkYWVjNzE2YzJkMzRjYjk4ZjRkMzI5YzM2OTE2YTZmYTZhNDNiMDk0JlgtQW16LVNpZ25lZEhlYWRlcnM9aG9zdCZhY3Rvcl9pZD0wJmtleV9pZD0wJnJlcG9faWQ9MCJ9.SBBkHTFyyajMtnAR8jSbZmsLNJDT2DUxmfHmwbCXVGM)