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 installLos ficheros initdb.js y advertSample.json (muestra de 6 anuncios) permiten incializar la base de datos:
npm run initdbColecció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 devEl 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/advertsCampos
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=valorPor campo seleccionado
http://127.0.0.1:3000/apiv1/adverts/?select=campoPaginació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=-maxPara crear un nuevo anuncio (formato multipart/form-data)
http://127.0.0.1:3000/apiv1/advertsCampos 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/tagsTest 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