Skip to content

Latest commit

 

History

History
508 lines (357 loc) · 9.57 KB

README.md

File metadata and controls

508 lines (357 loc) · 9.57 KB

#Nodepop API

##Detalles del despliegue

URL - http://izabelaproject.cloudapp.net/

Archivo estático - http://izabelaproject.cloudapp.net/public/nodepop.jpg

IP - http://65.52.38.99/

Datos para logear

{
  "nombre": "Test",
  "clave": "claveSecreta",
  "email": "[email protected]"
}

Nodepop ofrece un servicio a una app de venta de artículos de segunda mano.

Funciones disponibles desde la API:

  • registro del nuevo usuario
  • autentificación del usuario
  • crear un nuevo anuncio
  • seleción de la lista de anuncios
  • recibir foto del artículo
  • presentación de la lista de tags

Los detalles se puede encontrar en la parte 'Funcionamiento'.

##Arquitectura:

  • Primeros pasos:

Antes de arrancar la API hay que instalar todos los módulos usados por la API Nodepop:

npm install

Para preparar una base de datos de MongoDB, hay que arrancar el instalador de la base de datos usando el comando:

npm run installDB

El instalador limpia las coleciones con los Anuncios y los Usuarios (si ya existían antes) y introduce los datos ejemplares a la base de datos.

A parte de los anuncios crea un nuevo usuario, que se puede usar enviando las peticiones al API. El usuario de test es:

{
  "nombre": "Test",
  "clave": "claveSecreta",
  "email": "[email protected]"
}

Para arrancar la API sirve un comando:

npm run start

Despúes de arrancarla, la API esta esperando a las peticiones en el host 127.0.0.1 y puerto 3000.

  • Internacionalización

La API proporciona los errores y mensajes del éxito en dos idiomas - inglés y español. Cambio se puede hacer a traves del parámetro Accept-Language en el Header.

  • Autenticación

Todas las funcionalidades a parte de autenticación requieren usar un token. Se puede recibrlo durante el proceso de login. Luego se lo usa en el Header (x-access-token) o como el parámetro addicional de las llamadas POST y GET.

Las contraseñas de los usuarios se guardan el la base de datos como un hash.

  • Registro de los tokens

Si las peticione se envia usando un dispositivo Android o iPad/iPhone se guarda en la base de datos el token recibido desde un dispositivo, el típo del dispositivo y el email del usuario.

##Funcionamiento

###1. Registo de nuevo usuario: Método:

POST /apiv1/usuarios/nuevo

Argumentos:

  • clave : String, obligatorio, contraseña del usuario
  • nombre : String, obligatorio, nombre del usuario
  • email: String, obligatorio, único, email del usuario

Ejemplo:

{
nombre: 'Nombre',
clave: 'claveSecreta',
email: [email protected]
}

Todos los argumentos son obligatorios. API cambia la clave en un hash y guarda en esta forma en la base de datos.

Resultado finalizado con éxito debuelve JSON:

{
  "ok": true,
  "result": "Usuario guardado correctamnte",
  "userEmail": "[email protected]"
}

Posibles errores:

  • Falta alguno de los tres parametros:
{
  "ok": false,
  "error": "Falta datos"
}
  • Tenemos ya un usuario registrado con este mismo email:
{
  "ok": "false",
  "error": "Usuario con este email ya existe"
}

###2. Autentificación del usuario Método:

POST /apiv1/usuarios/authenticate

Argumentos:

  • clave : String, obligatorio, contraseña del usuario
  • nombre : String, obligatorio, nombre del usuario
  • email: String, obligatorio, email del usuario

Ejemplo:

{
nombre: 'Nombre',
clave: 'claveSecreta',
email: '[email protected]'
}

Todos los argumentos son obligatorios.

Resultado finalizado con éxito devuelve JSON:

{
  "ok": true,
  "result": "Autenticación correcta"
  "token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJfaWQiOiI1NjEwMzA1YzkyMzkzYjgyMDUzNWY0MzkiLCJub21icmUiOiJURVNUIiwiZW1haWwiOiJlbWFpbEBzYXMuZXMiLCJjbGF2ZSI6IiQyYSQxMCRTaW5YdXBUREVZV0xNdWh6L3VSL1VPOXFxUER1VkNnV01qYkNVbGhJVjhaSExSY1pWT2U5YSIsIl9fdiI6MH0.xqoXj321FiO6NuX8eIn2M_n9aA5XYhX3jHyqP__8PTc"
}

El proceso devuelve un token, cual sirve para autentificación del usuario. Se requiere usarlo en todas las peticiones a parte de autentificación. Token se puede enviar como:

  • un parámetro adicional en URL haciendo las peticiones GET,
  • un parámetro adicional en el body del JSON haciendo las peticiones POST,
  • en el Header como un argumento de 'x-access-token'

Posibles errores:

  • Falta alguno de los tres parámetros:
{
  "ok": false,
  "error": "Falta datos"
}
  • No hay usuario con el mismo email y nombre en la base de datos:
{
  "ok": "false",
  "error": "Usuario no encontrado"
}
  • Contraseña es incorrecto:
{
  "ok": false,
  "result": "Contraseña incorrecta"
}

###3. Creción del nuevo anuncio Método:

POST /apiv1/anuncios 

Argumentos:

  • nombre : String, obligatorio, nombre del artículo;
  • precio : Number, min:0, obligatorio, precio de venta o precio que el solicitante estaría dipsuesto de pagar por la compra del objeto;
  • venta : Boolean, obligatorio, típo de anuncio true=venta, false=búsqueda
  • foto : String, opcional, nombre del fichero con la foto asociada con el anuncio;
  • tags : Array[String], tags permitidos - 'mobile', 'lifestyle', 'work', 'motor', obligatorio;
{
    "nombre": "Bicicleta",
    "precio": 22,
    "venta": false,
    "foto" : "bici.jpg",
    "tags": [
        "mobile",
        "lifestyle"
    ]
}

Resultado terminado con exito devuelve JSON:

{
  "ok": true,
  "anuncio": {
    "__v": 0,
    "nombre": "Bicicleta",
    "precio": 22,
    "venta": false,
    "foto": "bici.jpg",
    "_id": "561029c778cfdc4c05c0490b",
    "tags": [
      "mobile",
      "lifestyle"
    ]
  }
}

Posibes errores:

La validación de los campos se hace a traves del Mongoose. Si algún de los campos no cumple los requisitos o falta algún paramatro de los parametros obligatorios se recibirá un error:

{
  "ok": false,
  "error": "Error de la validación de los parametros"
}

###4. Seleción de los anuncios Método:

GET /apiv1/anuncios

Parámetros:

  • nombre : String, opcional, seleciona artículos que su nombre se empieza con el dato buscado;
  • venta : Boolean, opcional, seleciona anuncios de compra o venta;
  • tag: String, seleciona anuncios que contiene tag o tags buscados, modos de usarlo:

Todos los anuncios que contienen entre sus tags un tag 'mobile':

tag=mobile

Todos los anuncios que contienen entre sus tags un tag 'mobile' y también 'lifestyle':

tag=mobile,lifestyle
  • precio : rango del precio, modos de usarlo:

Precio entre (x,y):

	precio=x-y

Precio mayor que x:

	precio=x-

Precio menor que:

	precio=-x

Precio igual que x:

	precio=x
  • limit : Numero, min=0, sirve para especificar cuantos resultados tiene que devolver la búsqueda;
  • start : Numero, min=0, sirve para especificar cunatos primeros resultados tiene que no incluir la búsqueda;
  • sort : Numero, por defecto id, permite elegir como ordenar los resultados, modos de usarlo:

Búsqueda por el precio ascendiente:

	sort=precio

Búsqueda por el precio descendiente:

	sort=precio
  • incluideTotal : Boolean, donde true sygnifica que en el resultado recibiremos tambien el numero de los anuncios que cumplan los requisitos

Ejemplo:

GET /apiv1/anuncios?includeTotal=true&limit=1

Resultado:

{
  "ok": true,
  "result": [
    {
      "_id": "561142a53a2460bd0635a1a8",
      "nombre": "Bicicleta",
      "precio": 22,
      "venta": false,
      "foto": "bici.jpg",
      "__v": 0,
      "tags": [
        "lifestyle"
      ]
    }
  ],
  "total": 4
}

El resultado devuelve sólo un resultado, ya que en la petición el limit=1, pero recibimos total=4 - lo que syginfica que hay otros tres más resultados que cumplen los requisitos.

Ejemplos:

Seleción de sólo dos primeros articulos con el nombre que empieza de 'bi' y con precio mayor que 20:

GET /apiv1/anuncios?limit=2&nombre=bi&precio=20-

Resultado:

{
  "ok": true,
  "result": [
    {
      "_id": "561029a878cfdc4c05c04909",
      "nombre": "Bicicleta",
      "precio": 25,
      "venta": false,
      "__v": 0,
      "tags": [
        "lifestyle"
      ]
    },
    {
      "_id": "561029b478cfdc4c05c0490a",
      "nombre": "Bicicleta",
      "precio": 22,
      "venta": true,
      "__v": 0,
      "tags": [
        "work",
        "lifestyle"
      ]
    }
  ]
}

Seleción de los articulos que contienen tag - mobil y lifestyle y con precio menor que 100:

GET /apiv1/anuncios?tag=mobile,lifestyle&venta=false&precio=-100

Resultado:

{
  "ok": true,
  "result": [
    {
      "_id": "561029b478cfdc4c05c0490a",
      "nombre": "iPhone",
      "precio": 30,
      "venta": false,
      "__v": 0,
      "tags": [
        "mobile",
        "lifestyle"
      ]
    },
    {
      "_id": "561029c778cfdc4c05c0490b",
      "nombre": "Mobile",
      "precio": 25,
      "venta": false,
      "foto": "iPhone.jpg",
      "__v": 0,
      "tags": [
        "mobile",
        "lifestyle",
        "work"
      ]
    }
  ]
}

###5. Recibir foto del artículo Método:

GET /apiv1/anuncios/foto/

Argumentos:

  • nombre del fichero : String, mandatory, por defecto .jpg

Ejemplo de uso:

GET /apiv1/anuncios/foto/ipad.jpg

Como resultado la API envia el fichero.

###6. Presentación de los tags Método:

GET /apiv1/anuncios/tags

La consulta no recibe ningun parametro.

Devuelve un objeto de tipo JSON con todos los tags que existen en la base de datos. Selciona sólo los valores únicos.

Resultado finalizado con éxito:

{
  "ok": true,
  "tags": [
    "motor",
    "lifestyle",
    "work"
  ]
}

En este caso tenemos en la base sólo tres tags de cuatro permitidos.