Se asume la previa instalación de:
- Node 10.19.0 o superior
- MongoDB 1.3.6 o superior
Clonar el repo:
git clone https://github.com/calmarti/NodepopAvanzado.git
Instalar las dependencias:
npm install
Los ficheros initdb.js
y advertSample.json
(muestra de 6 anuncios) permiten incializar la base de datos:
npm run initdb
Colección de anuncios:
name: { type: String, required: true },
sale: { type: Boolean, required: true },
price: {type: Number, required:true },
tags: { type: [String] },
picture: { type: String }
Colección de usuarios:
email: { type: String, unique: true },
password: { type: String },
La colección de usuarios tiene un único usuario registrado:
email: admin@example.com password: 1234
Se asume que el servidor de MongoDB ha sido arrancado.
Para establecer la conexión a MongoDB (a través de mongoose) e iniciar la aplicación de Express:
npm start
ó en modo desarrollo:
npm run dev
El endpoint de autenticación devuelve un JWT token de 2 horas de duración
http://127.0.0.1:3000/apiv1/auth
Para acceder a cualquier endpoint es necesario enviar el token JWT en la cabecera 'Authentication' o en el body de la peticion POST.
Devuelve todos los anuncios:
http://127.0.0.1:3000/apiv1/adverts
Campos
Name: nombre del producto
Price: precio del producto
Sale = true
si es un anuncio de venta / false
si es un anuncio de compra
Tags: array de tags o categorías a las que pertenece el producto
Picture: Cadena con la ruta de la foto del producto
Par clave-valor:
http://127.0.0.1:3000/apiv1/adverts?campo=valor
Por campo seleccionado
http://127.0.0.1:3000/apiv1/adverts/?select=campo
Paginación
-
skip=n
: ignora los primeros n anuncios -
limit=n
: muestra solo n anuncios
Ordenación
sort = campo
Ordenación descendente: sort = -campo
Por rango de precio están disponibles estas opciones:
- Rango cerrado:
http://127.0.0.1:3000/apiv1/adverts/?price=min-max
- Rango abierto superior a un mínimo:
http://127.0.0.1:3000/apiv1/adverts/?price=min-
- Rango abierto inferior a un máximo:
http://127.0.0.1:3000/apiv1/adverts/?price=-max
Para crear un nuevo anuncio (formato multipart/form-data)
http://127.0.0.1:3000/apiv1/adverts
Campos del anuncio:
name, price, sale, tags, picture
(los types deben coincidir con los definidos en el schema)
Nota: el campo picture debe ser de tipo file
El redimensionamiento del fichero de imagen (en caso de haberlo) se realiza con un microservicio, gracias a las librerías: code y jimp
El servicio se activa y permanece en modo 'listening' al arrancar la aplicación.
La ejecución del servicio se produce al subir una foto como parte de la creación de un anuncio.
Para obtener la lista de tags o categorías:
http://127.0.0.1:3000/apiv1/adverts/tags
Test del endpoint GET /apiv1/auth con Supertest y Jest.
npm run test:inv
El test pasa los dos casos de prueba implementados (estatus 401 y estatus 200), pero no fue posible lograr que Jest cerrara correctamente.
La aplicación cuenta con una interfaz de frontend internacionaliada en: inglés, español y francés
La ruta index renderiza esta documentación gracias a la librería strapdown.js
http://127.0.0.1:3000/
La ruta demo (accesible desde index), renderiza en el frontend algunas de las peticiones GET indicadas arriba
http://127.0.0.1:3000/demo