👤 Marta Vilaseca Foradada
💻 XVI Bootcamp Full Stack Web
📅 3 Marzo 2024
Desarrollar el API que se ejecutará en el servidor de un servicio de venta de artículos de segunda mano llamado Nodepop.
- Instalación e inicialización
- Guía de uso: Website
- Guía de uso: API
- Anexo: listado de tags válidos
- Anexo: formatos de imagen permitidos
- Anexo: requisitos práctica según enunciado
⏬ Clonamos el repositorio en nuestro sistema
git clone git@github.com:marta-vilaseca/keepcoding-intro-node-pra.git
📂 Cambiamos al directorio del repositorio e instalamos las dependencias necesarias:
cd keepcoding-intro-node-pra
npm install
✅ Nos aseguramos que tenemos el servidor de MongoDB instalado y ejecutándose en nuestro sistema
✅ Cargamos los anuncios por defecto con que vienen incluídos en el archivo initDB.js
que se proporciona en la carpeta del proyecto.
Caution
Ejecutar y confirmar este comando provocará el borrado de todo el contenido actual de la base de datos
Note
El comando solo se ejecutará con éxito si respondemos 'si' a la pregunta que se nos formula
node initDB.js
💻 npm run dev
para inicializar en modo desarrollo, en el cual:
- nodemon irá monitorizando los cambios que se produzcan en la app y reiniciando el servidor automáticamente según sea necesario
- podremos ver información de los errores que se puedan ir produciendo, tanto en la API como en el website
🌍 npm start
para inicializar en modo producción
A partir de aquí podremos :
- acceder al website de NodePop con nuestro navegador a través de la URL
http://localhost:3000/
e interactuar con él mediante distintos filtros (detallados en la sección website) - interactuar con el API directamente mediante API requests (detalladas en la sección API), usando el propio navegador o (en el caso de los endpoints utilizando los métodos POST, PATCH o DELETE) herramientas como Postman.
🔹 Para ver el listado de anuncios completo visitaremos en nuestro navegador la ruta base del website:
http://localhost:3000/
🔹 Para ver un anuncio específico usaremos la ruta base seguida de la ID del mismo:
http://localhost:3000/:id
➜ Ejemplo: http://localhost:3000/65e07cd8a31092a089d1f0fd
Note
Las ID de los anuncios podemos obtenerlas (para poder introducirlas manualmente en nuestra URL) si interactuamos con la API y recibimos los datos de los anuncios en formato JSON. Sin embargo para facilitar las cosas, en el website para acceder a cada anuncio individual bastará con clicar sobre su título o su foto.
🔹 Para ver el listado de los distintos tags que hay en la base de datos usaremos:
http://localhost:3000/tags/
🔹 Para obtener un listado de anuncios filtrados por título, de manera que el nombre o título del anuncio empiece por la :cadena
de caracteres especificada:
http://localhost:3000/?nombre=:cadena
➜ Ejemplo: http://localhost:3000/?nombre=vi
mostrará todos los anuncios cuyo título empiece por vi
🔹 Para obtener listado de anuncios bajo un tag determinado:
http://localhost:3000/?tags=:tag
➜ Ejemplo: http://localhost:3000/?tags=mobile
mostrará todos los anuncios bajo el tag mobile
🔹 Para obtener listado de anuncios en función de su status de venta:
➜ Ejemplo: http://localhost:3000/?tipo=venta
muestra los anuncios de productos en venta
➜ Ejemplo: http://localhost:3000/?tipo=busqueda
muestra los anuncios de productos que alguien esté buscando
🔹 Para obtener listado de anuncios filtrado por (rango de) precio:
- Productos cuyo precio sea
n
o más:/?precio=:n-
➜ Ejemplo:http://localhost:3000/?precio=50-
- Productos cuyo precio sea menor a
n
:/?precio=-:n
➜ Ejemplo:http://localhost:3000/?precio=-100
- Productos cuyo precio esté entre
n
yn1
/?precio=:n-:n1
➜ Ejemplo:http://localhost:3000/?precio=50-100
- Productos cuyo precio sea exactamente
n
/?precio=:n
➜ Ejemplo:http://localhost:3000/?precio=150
🔹 Para aplicar paginación podemos utilizar:
skip
para saltar hasta un elemento determinado
➜ Ejemplo:http://localhost:3000/?skip=2
empezará la lista desde el elemento número 3limit
para determinar cuantos elementos queremos ver de una vez (por página)
➜ Ejemplo:http://localhost:3000/?limit=5
nos mostrará solo 5 elementos de una vez (por página)
🔹 Para ordenar los resultados de acuerdo a un campo determinado. Podemos incluir más de un campo separándolos por espacios, o añadir un '-' como modificador para indicar orden descendiente.
➜ Ejemplo: http://localhost:3000/?sort=-precio
ordenamos por precio DESC
➜ Ejemplo: http://localhost:3000/?sort=-precio%20nombre
ordenamos por precio DESC y luego nombre ASC
http://localhost:3000/?tags=lifestyle&limit=12&precio=100-&sort=-precio%20nombre
A través del endpoint /api/anuncios
(ruta completa http://localhost:3000/api/anuncios
) podemos obtener:
- Un listado general de todos los anuncios
- Un listado filtrado de acuerdo a distintos criterios (nombre, status de venta, precio, tags) y que opcionalmente además podremos:
- paginar
- ordenar por uno o más de los campos existentes, en orden ascendente o descendente
🔸 Para obtener el listado de anuncios completo:
/api/anuncios/
🔸 Para obtener un anuncio específico usaremos la ruta base seguida de la ID del mismo:
/api/anuncios/:id
➜ Ejemplo: http://localhost:3000/api/anuncios/65e07cd8a31092a089d1f0fd
🔸 Para ver el listado de los distintos tags que hay en la base de datos usaremos:
/api/tags/
🔸 Para obtener un listado de anuncios filtrados por título, de manera que el nombre o título del anuncio empiece por la :cadena
de caracteres especificada:
/api/anuncios?nombre=:cadena
➜ Ejemplo: http://localhost:3000/api/anuncios?nombre=vi
mostrará todos los anuncios cuyo título empiece por vi
🔸 Para obtener listado de anuncios de un tag determinado:
/api/anuncios?tags=:tag
➜ Ejemplo: http://localhost:3000/api/anuncios?tags=mobile
mostrará todos los anuncios bajo el tag mobile
🔸 Para obtener listado de anuncios en función de su status de venta:
➜ Ejemplo: http://localhost:3000/api/anuncios?tipo=venta
muestra los anuncios de productos en venta
➜ Ejemplo: http://localhost:3000/api/anuncios?tipo=busqueda
muestra los anuncios de productos que alguien esté buscando
🔸 Para obtener listado de anuncios filtrado por (rango de) precio:
- Productos cuyo precio sea
n
o más:/api/anuncios?precio=:n-
➜ Ejemplo:http://localhost:3000/api/anuncios?precio=50-
- Productos cuyo precio sea menor a
n
:/api/anuncios?precio=-:n
➜ Ejemplo:http://localhost:3000/api/anuncios?precio=-100
- Productos cuyo precio esté entre
n
yn1
/api/anuncios?precio=:n-:n1
➜ Ejemplo:http://localhost:3000/api/anuncios?precio=50-100
- Productos cuyo precio sea exactamente
n
/api/anuncios?precio=:n
➜ Ejemplo:http://localhost:3000/api/anuncios?precio=150
🔸 Para aplicar paginación podemos utilizar:
skip
para saltar hasta un elemento determinado
➜ Ejemplo:http://localhost:3000/api/anuncios?skip=2
empezará la lista desde el elemento número 3limit
para determinar cuantos elementos queremos ver de una vez (por página)
➜ Ejemplo:http://localhost:3000/api/anuncios?limit=5
nos mostrará solo 5 elementos de una vez (por página)
🔸 Para ordenar los resultados de acuerdo a un campo determinado. Podemos incluir más de un campo separándolos por espacios, o añadir un *'-'_ como modificador para indicar orden descendiente.
➜ Ejemplo: http://localhost:3000/api/anuncios?sort=-precio
ordenamos por precio DESC
➜ Ejemplo: http://localhost:3000/api/anuncios?sort=-precio%20nombre
ordenamos por precio DESC y luego nombre ASC
http://localhost:3000/api/anuncios?tags=lifestyle&limit=12&precio=100-&sort=-precio%20nombre
Desde Postman o equivalente, crearemos una POST request apuntando a http://localhost:3000/api/anuncios
A través del apartado Body > x-www-form-urlencoded podemos añadir un nuevo anuncio con los siguientes pares de key/value:
Key | Value | Requerido | |
---|---|---|---|
nombre | [String] | ✔ | |
tipo | [Boolean] | ✔ | true para anuncio de venta, false para anuncio de búsqueda |
precio | [Numérico] | ✔ | |
tags | [String] | ✔ | repetiremos el par key: tags / value: cadena para cada tag que queramos añadir. Tener en cuenta que solo aceptará los tags válidos |
descripcion | [String] | opcional y solo visible en la vista de anuncio individual, podemos añadir un texto para el anuncio. Si no ponemos nada nos rellenará el espacio con un texto lorem ipsum especificado por defecto |
Note
Opcionalmente podemos añadir también un campo foto con un string en formato nombre.ext
(siendo ext
cualquiera de los formatos de imagen válidos). No es estrictamente necesario, ya que se ha previsto que si no se facilita una referencia a una foto de la forma correcta, se guarda el anuncio con una imagen por defecto o placeholder. Esto es sólo a modo de prueba, ya que por el momento no hay una funcionalidad de subida de imágenes así que solo podemos hacer referencia a alguna otra imagen de las que ya estén subidas en en proyecto (en la carpeta /public/images
)
Tras mandarlo y si todo valida correctamente, recibiremos una respuesta en este formato (en este ejemplo hemos mandado foto vacío, así que nos ha guardado el anuncio con el placeholder no-photo.png
):
{
"result": {
"nombre": "Rice cooker",
"tipo": false,
"precio": 110,
"foto": "no-photo.png",
"tags": ["home", "lifestyle"],
"descripcion": "Prueba de descripción de producto. Puede ser tan larga como necesitemos.",
"_id": "65e3c5a2b330409bef4afbdf",
"__v": 0
}
}
Desde Postman o equivalente, crearemos una PATCH request apuntando a http://localhost:3000/api/anuncios/:id
, donde reemplazaremos id por el identificador del anuncio que queremos modificar
A través del apartado Body > x-www-form-urlencoded podemos modificar el anuncio de forma similar a como haríamos para crear uno nuevo, pero solo incluyendo los campos cuyo contenido vamos a cambiar.
Por ejemplo en caso de querer modificar el precio de un anuncio:
Key | Value |
---|---|
precio | Nuevo precio, en formato [Numérico] |
Al enviar y si todo valida correctamente, recibiremos una respuesta en este formato (con el anuncio entero actualizado, en este caso con nuevo precio de 200
):
{
"result": {
"_id": "65e3c5a2b330409bef4afbdf",
"nombre": "Rice cooker",
"venta": false,
"precio": 200,
"foto": "no-photo.png",
"tags": ["home", "lifestyle"],
"descripcion": "Prueba de descripción de producto. Puede ser tan larga como necesitemos.",
"__v": 0
}
}
Desde Postman o equivalente, crearemos una DELETE request apuntando a http://localhost:3000/api/anuncios/:id
, donde reemplazaremos id por el identificador del anuncio que queremos eliminar.
No tenemos que introducir más parámetros.
Caution
No nos pedirá confirmación de ningún tipo, al enviar la petición y si la id proporcionada es correcta se borrará el anuncio automáticamente
Si no ha habido ningún error, recibiremos esta respuesta:
{
"message": "Document successfully deleted."
}
- collectibles
- electronics
- fashion
- games
- home
- lifestyle
- mobile
- motor
- outdoors
- work
Note
La funcionalidad de poder subir imágenes aún no está implementada, pero para hacer pruebas se ha facilitado la posibilidad de, al añadir un anuncio nuevo, poder poner en el apartado foto un string en formato nombre.ext
. Estas son las extensiones/formatos permitidos con este sistema
.jpg
,.jpeg
png
gif
webp
Según especificado en el enunciado o briefing, el servicio mantiene anuncios de compra o venta de artículos y permite tanto buscar como poner filtros por varios criterios, por tanto la API a desarrollar deberá proveer los métodos necesarios para esto.
Los sistemas donde se utilizará la API utilizan bases de datos MongoDB
Además del desarrollo de la API, es necesario que el site tenga una página frontend que muestre la lista de anuncios con los filtros que correspondan, según la URL introducida.
- Nombre del artículo/anuncio
- Si el artículo está en Venta o bien el anuncio es porque alguien está buscando ese producto
- Precio del artículo (de venta o de cuánto está dispuesto a pagar el anunciante, en caso de estarlo buscando)
- Foto del artículo (una sola por anuncio)
- Tags, conteniendo siempre uno o varios de los tags válidos
- Lista de anuncios
- Posibilidad de paginación
- Filtros por tag
- Filtros por tipo de anuncio (venta/búsqueda)
- Filtros por rango de precio (especificando precio min y max)
- Filtro por nombre de artículo (que empiece por el texto buscado)
- Lista de los tags existentes
- Creación de anuncio
- Documentación
- Validar nuestro código con ESLint