- NodePop
- API Methods (NodePop)
- Recursos
- Endpoint
/anuncios - [GET] Lista de Anuncios
- [GET] Lista de Anuncios Paginados, filtros y campos de búsqueda
- [GET] Consultar un Anuncio
- [GET] Listar Tags
- [POST] Crear un Anuncio
- [PUT] Actualizar un Anuncio
- WebSite NodePop
- Proyecto backend del API de la app Nodepop, creada como practica parte del curso de Desarrollo Backend con Node.js del Bootcamp Web 7 de Keepcoding.
- El servicio mantiene anuncios de compra o venta de artículos y permite consultar, y buscar filtros por varios criterios.
- Además puedes visitar un site con los anuncios en la base de datos de nodepop después de iniciar la app ingresando al url http://localhost:3000/.
-
Tecnologías: Este proyecto usa EXPRESS, MongoDB, mongoose y Node.js. Se puede conocer las dependencias en
package.json. -
El Api de nodepop esta basada en principios REST y usa los métodos HTTP(GET y POST) para acceder a los recursos.
-
El formato de transferencia soportado por el API para enviar y recibir respuestas es en JSON.
-
Como alternativa a esta se puede revisar la documentacion en línea aquí.
Para este proyecto es necesario tener instalado MongoDB. Primero vamos a arrancar un servidor MongoDB local escribiendo la siguiente lìnea en un terminal:
> ./bin/mongod --dbpath ./data/db --directoryperdbUn paso importante antes de arrancar el servidor es instalar todas las dependencias del proyecto. Para hacerlo, en un terminal ejecutamos lo siguiente:
> npm installEn este proceso se crearà y cargará una colección de documentos de la base de datos necesaria para el funcionamiento de la aplicación 'nodepop', para esto ejecutamos el script installDB dentro del package.json:
> npm run installDBHay varias formas de iniciar o arrancar nodepop:
- En modo DEBUG para el desarrollo, ejecutamos en un terminal:
> npm run dev- En modo Produción, ejecutamos:
> npm run prodPuedes conocer mas revisando el apartado
scriptsen el archivo de configuración package.json
Todavía no cuenta con autenticación.
¿Que error y códigos de estado puede esperar un usuario?
El API devuelve un json, el cual cuenta con una propiedad booleana success, la cual estará en true cuando la respuesta se ha resuelto satisfactoriamente, pero en caso de error el campo success estará en false se pasará un campo error con el mensaje de el error.
{
"success": false,
"error": "Mensaje del error"
}Al estar en desarrollo actualmente no hay límite en la cantidad de solicitudes.
Los recursos son todos los métodos, y filtros aplicados o disponibles para un endpoint en este caso el endpoint /anuncios:
/anuncios/- obtener todos los anuncios de nodepop./anuncios/:id- obtener un anuncio específico./anuncios/tags- obtener una lista con los tags existentes.
El endpoint /anuncios en nuestra API nos permite consultar, paginar, y filtrar datos de todos los anuncios registrados en la base de datos MongoDB de nuestra aplicación Nodepop.
[GET] http://localhost:3000/apiv1/anuncios
GET /apiv1/anuncios
{
"success": true,
"anuncios": [
{
"tags": [
"lifestyle",
"motor"
],
"_id": "5d84855afcc9025b29f6d3b8",
"nombre": "Bicicleta",
"venta": true,
"precio": 230.15,
"foto": "bici.jpg",
"__v": 0
},
{
"tags": [
"lifestyle",
"mobile"
],
"_id": "5d84855afcc9025b29f6d3b9",
"nombre": "iPhone 3GS",
"venta": false,
"precio": 50,
"foto": "iphone.png",
"__v": 0
},
{
"tags": [
"work",
"lifestyle"
],
"_id": "5d84855afcc9025b29f6d3ba",
"nombre": "Teclado",
"venta": true,
"precio": 65,
"foto": "teclado.png",
"__v": 0
},
{
"tags": [
"work",
"lifestyle"
],
"_id": "5d84855afcc9025b29f6d3bb",
"nombre": "Mouse",
"venta": false,
"precio": 29,
"foto": "mouse.png",
"__v": 0
}
]
}Recurso del endpoint /anuncios que retorna una lista de todos anuncios.
http://localhost:3000/apiv1/anuncios?start=:skip&limit=:limit&fields=:campo1 :campo2 :campoN&sort=:campo1 :campoN
- start :
integerDesde que anuncio se quiere consultar - limit :
integerCantidad de anuncios a partir del inicio que desea retornar. - fields :
stringCampos que se quiere seleccionar aparezcan en la consulta. - sort :
stringCampos por los que se quiere ordenar. Ordena de forma ascendente por defecto.- Descendente: En caso de querer ordenar de forma descendente se agrega el signo menos (-) antes del campo por el que se quiere ordenar como por ejemplo
precio.
- Descendente: En caso de querer ordenar de forma descendente se agrega el signo menos (-) antes del campo por el que se quiere ordenar como por ejemplo
- filter :
stringCriterios de búsqueda por campos:- tags = deben estar entre estas opciones [work, lifestyle, motor, mobile]
- venta = puede ser [true o false]
- precio =
numericRango de precios, el primer rango (rango inicial) siempre debe ser menor que el segundo rango.- 10-50 : busca precio entre estos valores pasados.
- 10- : busca valores que tengan precio > (mayor) a este valor pasado.
- -50 : busca valores que tengan precio < (menor) a este valor pasado.
- 30 : busca valores que tengan el precio = (igual) a este valor pasado.
- nombre =
stringBusca en el nombre de los anuncios que empiecen con la cadena que se pase en este parámetro de búsqueda.
GET /apiv1/anuncios Devuelve un listado de anuncios de acuerdo a los parámetros ya sea de filtro, ordenación, selección o búsqueda que se agregue al URL.
[GET] http://localhost:3000/apiv1/anuncios?start=0&limit=2&fields=nombre precio
{
"success": true,
"results": [
{
"_id": "5d84855afcc9025b29f6d3b8",
"nombre": "Bicicleta",
"precio": 230.15
},
{
"_id": "5d84855afcc9025b29f6d3b9",
"nombre": "iPhone 3GS",
"precio": 50
}
]
}Esta petición devuelve anuncios con paginacion de 0 a 2 y seleccionando solo los campos nombre y precio
[GET] http://localhost:3000/apiv1/anuncios?start=0&limit=2&fields=nombre precio -_id
{
"success": true,
"results": [
{
"nombre": "Bicicleta",
"precio": 230.15
},
{
"nombre": "iPhone 3GS",
"precio": 50
}
]
}Esta petición nos devuelve los eventos sin mostrar el campo _id.
[GET] http://localhost:3000/apiv1/anuncios?start=0&limit=2&sort= precio
{
"success": true,
"results": [
{
"tags": [
"lifestyle"
],
"_id": "5d84855afcc9025b29f6d3bd",
"nombre": "Cubo rubik",
"venta": true,
"precio": 15,
"foto": "cubo_rubik.jpg",
"__v": 0
},
{
"tags": [
"work",
"lifestyle"
],
"_id": "5d84855afcc9025b29f6d3bb",
"nombre": "Mouse",
"venta": false,
"precio": 29,
"foto": "mouse.png",
"__v": 0
}
]
}Esta petición me devolverá eventos ordenando según el campo que le pase al parámetro sort.
[GET] http://localhost:3000/apiv1/anuncios?venta=true
{
"success": true,
"results": [
{
"tags": [
"lifestyle",
"mobile"
],
"_id": "5d84855afcc9025b29f6d3b9",
"nombre": "iPhone 3GS",
"venta": false,
"precio": 50,
"foto": "iphone.png",
"__v": 0
},
{
"tags": [
"work",
"lifestyle"
],
"_id": "5d84855afcc9025b29f6d3bb",
"nombre": "Mouse",
"venta": false,
"precio": 29,
"foto": "mouse.png",
"__v": 0
},
{
"tags": [
"work",
"lifestyle"
],
"_id": "5d84855afcc9025b29f6d3bf",
"nombre": "Mochila",
"venta": false,
"precio": 40,
"foto": "mochila.png",
"__v": 0
}
]
}Esta petición nos permite filtrar anuncios según el tipo, en venta si el parametros es true y compra si el parámetro es false.
[GET] http://localhost:3000/apiv1/anuncios?tags=mobile motor
{
"success": true,
"results": [
{
"tags": [
"lifestyle",
"mobile"
],
"_id": "5d84855afcc9025b29f6d3b9",
"nombre": "iPhone 3GS",
"venta": false,
"precio": 50,
"foto": "iphone.png",
"__v": 0
},
{
"tags": [
"mobile",
"lifestyle"
],
"_id": "5d84855afcc9025b29f6d3be",
"nombre": "Smartwatch",
"venta": true,
"precio": 40,
"foto": "smartwatch.png",
"__v": 0
},
{
"tags": [
"lifestyle",
"motor"
],
"_id": "5d84855afcc9025b29f6d3b8",
"nombre": "Bicicleta",
"venta": true,
"precio": 230.15,
"foto": "bici.jpg",
"__v": 0
}
]
}En esta petición listamos todos los anuncios cuyo campo tags contengan mobile y motor.
[GET] http://localhost:3000/apiv1/anuncios?precio=10-30
{
"success": true,
"results": [
{
"tags": [
"lifestyle"
],
"_id": "5d84855afcc9025b29f6d3bd",
"nombre": "Cubo rubik",
"venta": true,
"precio": 15,
"foto": "cubo_rubik.jpg",
"__v": 0
},
{
"tags": [
"work",
"lifestyle"
],
"_id": "5d84855afcc9025b29f6d3bb",
"nombre": "Mouse",
"venta": false,
"precio": 29,
"foto": "mouse.png",
"__v": 0
}
]
}La petición del ejemplo 6 nos devuelve los anuncios cuyo rango de precio este entre >= a 10 y <= a 30.
Hay que tener en cuenta que el valor del rango inicial siempre debe ser menor al rango final, en caso de ser mayor devolvera un error 422.
[GET] http://localhost:3000/apiv1/anuncios?precio=30-10
{
"success": false,
"error": "El primero parámetro del rango de precio debe ser menor"
}[GET] http://localhost:3000/apiv1/anuncios?nombre=bici
{
"success": true,
"results": [
{
"tags": [
"lifestyle",
"motor"
],
"_id": "5d84855afcc9025b29f6d3b8",
"nombre": "Bicicleta",
"venta": true,
"precio": 230.15,
"foto": "bici.jpg",
"__v": 0
}
]
}Esta petición nos permite hacer una búsqueda por el campo nombre.
[GET] http://localhost:3000/apiv1/anuncios/:id
- id: integer Id del anuncio que desea consultar.
[GET] http://localhost:3000/apiv1/anuncios/5d84855afcc9025b29f6d3ba
{
"success": true,
"result": {
"tags": [
"work",
"lifestyle"
],
"_id": "5d84855afcc9025b29f6d3ba",
"nombre": "Teclado",
"venta": true,
"precio": 65,
"foto": "teclado.png",
"__v": 0
}
}Esta petición nos permite buscar un anuncio por su id.
GET /apiv1/anuncios/tags
[GET] http://localhost:3000/apiv1/anuncios/tags
{
"success": true,
"results": [
"lifestyle",
"mobile",
"motor",
"work"
]
}Recurso del endpoint /anuncios/tags que retorna una lista con los tags existentes.
POST /apiv1/anuncios/
- nombre :
stringNombre del artículo. - venta :
booleamSi está en true el artículo sevendesi está enflasese busca. - precio :
numericEs el precio del artículo. - foto :
stringEs el nombre uo URL del archivo de la foto del artículo. - tags :
listEs una lista de los tags de un artículo, el cual puede tener las siguientes: [work, lifestyle, motor, mobile]
[POST] http://localhost:3000/apiv1/anuncios
Headers
Content-Type: application/x-www-form-urlencoded
Body
nombre: Monitor,
venta: false,
precio: 200,
foto:'',
tags: work,
tags: lifestyle
status: 200
{
"success": true,
"result": {
"tags": [
"work",
"lifestyle"
],
"_id": "5d90a457c4d2501fec3af158",
"nombre": "Monitor",
"venta": false,
"precio": 200,
"foto": "",
"__v": 0
}
}PUT /apiv1/anuncios/:id
- nombre :
stringNombre del artículo. - venta :
booleamSi está en true el artículo sevendesi está enflasese busca. - precio :
numericEs el precio del artículo. - foto :
stringEs el nombre uo URL del archivo de la foto del artículo. - tags :
listEs una lista de los tags de un artículo, el cual puede tener las siguientes: [work, lifestyle, motor, mobile]
[PUT] http://localhost:3000/apiv1/anuncios/5d90a457c4d2501fec3af158
Headers
Content-Type: application/x-www-form-urlencoded
Body
nombre: Monitor LG,
venta: false,
precio: 300,
foto:'',
tags: work
status: 200
{
"success": true,
"result": {
"tags": [
"work"
],
"_id": "5d90a457c4d2501fec3af158",
"nombre": "Monitor LG",
"venta": false,
"precio": 300,
"foto": "",
"__v": 0
}
}Podemos ver el site en el home. Aqui se listaran todos los anuncios registrados en la base de datos de la app NodePop.
Además, este site cuenta con filtros en la URL:
http://localhost:3000/?star=1&limit=3&sort=nombre&tags=work
Este filtro nos devuelve, desde el anuncio 1, limitando a 3 resultados y ordenados por el nombre, los anuncios que contengan el tag work.
http://localhost:3000/?star=1&limit=3&sort=nombre&venta=true
En este ejemplo se obtiene como resultado los anuncios que el venta venta sea true es de decir de tipo en venta. En caso de querer los anuncios de tipo compra. el parametro venta deberìa ser false.
