Para acceder a la página del proyecto, ir al siguiente link: https://tradeaway.herokuapp.com/
- PostgreSQL
- Se necesita una base de datos con nombre y usuario/contraseña como están configurados en
src/config/database.js
- Se necesita una base de datos con nombre y usuario/contraseña como están configurados en
- Node.js v10.9.0 o superior
- Yarn
- Clonar el repositorio
- Crear contenedor:
docker-compose build
- Clonar repositorio
- Instalar dependencias:
yarn install
- Configurar la base de datos
docker-compose exec web sequelize db:migrate
- Crear la base de datos
./node_modules/.bin/sequelize db:create webcitos_dev
- Correr las migraciones
./node_modules/.bin/sequelize db:migrate
- Correr las seeds
./node_modules/.bin/sequelize db:seed:all
docker-compose up web
yarn start
o
node index.js
o
./node_modules/.bin/nodemon
Luego ir a http://localhost:3000
A continuación se tienen algunas líbrerías relevantes que fueron utilizadas en el proyecto:
- Librería pkgcloud: utilizada para usar Google Cloud Storage para subir y descargar las imágenes de items, usuarios y algunas imágenes de vistas. Para usarla se necesitan credenciales que están en las variables de entorno.
- Librería lodash: utilizada para hacer los json con los que responde la API de TradeAway.
- Librería jsonwebtoken: utilizada para autenticar usuarios a través de tokens en la API de TradeAway. Para usarla se necesitan credenciales que están en las variables de entorno.
- Google Cloud Vision API: utilizada para identificar imágenes de items a subir por los usuarios para filtrar su ingreso a la página (solo se acepta tecnología portátil) e identificar atributos como su modelo y categoría. Para usarla se necesitan credenciales que están en las variables de entorno.
A continuación se tiene el diagrama de clases de la base de datos creada para la aplicación junto con algunos detalles:
- El state de Publication puede ser exchange o gift y el state de Trade puede ser not_concreted o concreted. En cambio el state de Item se refiere al estado del item (nuevo, viejo, qué tan viejo, lo describe el usuario).
- El usuario que hace una request a una publicación (identificada por publication_id) es el dueño del userID del modelo de Request, además el item_offered_id es opcional ya que depende de si la publicación es para exchange o gift, si es exchange se pide, si no se deja como null.
- Los atributos quality_offered, puntuality y fullfillment_offer de Review son notas que pueden ir del 0 al 5.
- GET
/
: Ruta principal
- GET
/users/
: Lista todos los usuarios (no utilizado) - GET
/users/new
: Crea un nuevo modelo de usuario - GET
/users/:id/edit
: Permite la edición de un usuario - GET
/users/:id
: Obtiene la información de un usuario - GET
/users/:id/trades
: Obtiene los trades de un usuario (no utilizado) - GET
/users/:id/image
: Obtiene la imagen del usuario pedido - POST
/users/
: Crea un nuevo usuario - PATCH
/users/:id
: Modifica un usuario existente - DELETE
/users/:id
: Elimina un usuario existente
- GET
/publications/
: Lista todas las publicaciones - GET
/publications/new
: Crea un nuevo modelo de publicación - GET
/publications/:id
: Obtiene la información de una publicación - GET
/publications/:id/edit
: Permite la edición de una publicación - POST
/publications/
: Crea una nueva publicación - PATCH
/publications/:id
: Modifica una publicación existente - DELETE
/publications/:id
: Elimina una publicación existente
- GET
/items/
: Lista todos los items - GET
/items/new/:pid
: Crea un nuevo modelo de item (no utilizado) - GET
/items/:id
: Obtiene la información de un item - GET
/items/:id/image
: Obtiene la imagen del item pedido - GET
/items/:id/edit
: Permite la edición de un item - POST
/items/
: Crea un nuevo item (no utilizado) - PATCH
/items/:id
: Modifica un item existente - DELETE
/items/:id
: Elimina un item existente
- GET
/requests/actualUser
: Da la información de cuántas ofertas ha hecho el usuario de la sesión actual - GET
/requests/publications/:pid
: Muestra las ofertas hechas a dicha publicación - GET
/requests/publications/:pid/new
: Crea un nuevo modelo de request a una publicación específica - GET
/requests/:id
: Obtiene la información de un request (no utilizado) - GET
/requests/:id/edit
: Permite la edición de un request (no utilizado) - POST
/requests/
: Crea un nuevo request - PATCH
/requests/:id
: Modifica un request ya existente (no utilizado) - DELETE
/requests/:id
: Elimina un request existente
- GET
/trades/
: Lista todos los trades (utilizado sólo para debugging) - GET
/trades/new
: Crea un nuevo modelo de trade - GET
/trades/:tid
: Obtiene la información de un trade - GET
/trades/:id/edit
: Permite la edición de un trade (no utilizado) - POST
/trades/:id_request/:state
: Crea un nuevo trade con los datos suministrados - PATCH
/trades/:id
: Modifica un trade ya existente - DELETE
/trades/:id
: Elimina un trade existente
- GET
/reviews/
: Lista todos los reviews (utilizado para debugging) - GET
/reviews/trades/new/:tid
: Permite la creación de un modelo review nuevo - GET
/reviews/:id
: Obtiene la información de un review - GET
/reviews/:id/edit
: Permite la edición de un review (no utilizado) - POST
/reviews/
: Crea un nuevo review - PATCH
/reviews/:id
: Modifica el review según lo que el usuario puede ingresar - DELETE
/reviews/:id
: Elimina un review ya existente (no utilizado)
La aplicación ofrece diversas funcionalidades a través de una API. El acceso a algunas funcionalidades es restringido a usuarios, en esos casos es necesario autenticarse antes de consultar la API. Las funcionalidades son las siguientes:
- Ruta:
/api/users/session
- Método: POST
- Parámetros: email, password
- Respuesta: En caso de entregar parámetros válidos se responde con un json que contiene un token que permite acceder a los otros métodos de la API. En otro caso, se retorna un error 401.
Ejemplo:
curl http://localhost:3000/api/users/session -X PUT -d '{"email": "Ivan.Wolf@gmail.com", "password": "123web"}' -H 'Content-Type: application/json'
- Ruta:
/api/users/me
- Método: GET
- Parámetros: -
- Header: 'Authorization: Bearer TOKEN'
- Respuesta: En caso de entregar un token válido se responde con un json que contiene la información del usario al que pertenece el token. En otro caso, se retorna un error 401.
Ejemplo:
curl http://localhost:3000/api/users/me -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQiOjIsImlhdCI6MTU0MzAxOTc1NX0.p0SV3cXlbHwoLDyFAewuN-IhUyy6LmBh3HZoXYDww-I'
- Ruta:
/api/users/my-publications
- Método: GET
- Parámetros: -
- Header: 'Authorization: Bearer TOKEN'
- Respuesta: En caso de entregar un token válido se retorna una lista con todas las publicaciones del usario al que pertenece el token, cada una siendo un json que muestra los detalles más básicos de la publicación. En otro caso, se retorna un error 401.
- Ruta:
/api/publications
- Método: GET
- Parámetros: -
- Respuesta: Se retorna una lista con todas las publicaciones, cada una siendo un json que muestra los detalles más básicos de la publicación.
- Ruta:
/api/publications/:id
- Método: GET
- Parámetros: -
- Respuesta: Se retorna un json con información detallada sobre una publicación en particular.
- Ruta:
/api/items
- Método: GET
- Parámetros: -
- Respuesta: Se retorna una lista con todos los items, cada uno siendo un json que muestra los detalles más básicos del item.
- Ruta:
/api/items/:id
- Método: GET
- Parámetros: -
- Respuesta: Se retorna un json con información detallada sobre un item en particular.
- Ruta:
/api/requests/new
- Método: POST
- Parámetros: publicationId, message, itemOfferedId (opcional, depende de si la publicación es para exchange o gift)
- Header: 'Authorization: Bearer TOKEN', 'Content-Type: application/json'
- Respuesta: Retorna un json con la respuesta, si es negativa será 400 con una descripción breve del error. En caso de ser positiva se avisará con un mensaje de "Request created!".
Ejemplo:
curl http://localhost:3000/api/requests/new -H 'Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VySWQTU0MzU1MTg1Nn0.zkijYE1lt0ORtsu_mvIR-beSEZ9p6ngSCpkgNB1QLGU' -H 'Content-Type: application/json' --data '{"publicationId": "5", "itemOfferedId": "8", "message": "exchange with me! c:"}'