- 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 --directoryperdb
Un paso importante antes de arrancar el servidor es instalar todas las dependencias del proyecto. Para hacerlo, en un terminal ejecutamos lo siguiente:
> npm install
En 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 installDB
Hay 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 prod
Puedes conocer mas revisando el apartado
scripts
en 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 :
integer
Desde que anuncio se quiere consultar - limit :
integer
Cantidad de anuncios a partir del inicio que desea retornar. - fields :
string
Campos que se quiere seleccionar aparezcan en la consulta. - sort :
string
Campos 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 :
string
Criterios de búsqueda por campos:- tags = deben estar entre estas opciones [work, lifestyle, motor, mobile]
- venta = puede ser [true o false]
- precio =
numeric
Rango 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 =
string
Busca 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 :
string
Nombre del artículo. - venta :
booleam
Si está en true el artículo sevende
si está enflase
se busca. - precio :
numeric
Es el precio del artículo. - foto :
string
Es el nombre uo URL del archivo de la foto del artículo. - tags :
list
Es 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 :
string
Nombre del artículo. - venta :
booleam
Si está en true el artículo sevende
si está enflase
se busca. - precio :
numeric
Es el precio del artículo. - foto :
string
Es el nombre uo URL del archivo de la foto del artículo. - tags :
list
Es 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
.