Solición a la prueba técnica Ruby On Rails API REST de usuarios y sus intereses.
Se solicita desarrollar en el lenguaje ruby una serie de endpoints arquitectura REST que permitan administrar la información de usuarios y gestionar los intereses de los mismos.
Se desarrolla un aplicativo usando el framework rails. Cuenta con un modelo usuario y una asoción con un modelo de intereses de tal forma que un usuario pude tener muchos intereses (one to many). Ambos modelos cuentan con sus respectivos endpoints en una rest api con restricción de autenticación y una interfaz web que permite ver la información almacenada.
La estructura utilizada permite versionamiento de la api.
Interfaz gráfica para visualizar la información almacenada.
Abrir la terminal y clonar el proyecto
git clone git@github.com:katorres02/tuaplicaciontest.git
Instalar gemas
bundle install
Crear y migrar la base de datos
rake db:create db:migrate
Iniciar el servidor
rails s
- ruby 2.3.3
- rails 5.1.5
- sqlite3
- rabl
En la terminal del proyecto
rspec
pruebas a los modelosrspec spec/controllers/api/v1/*
pruebas a los controladores
Información acerca de los webservices endpoints desarrollados. Los servicios fueron desarrollados de tal forma que soliciten la autenticación del usuario que realiza acciones por medio de credenciales como parámetros dentro de los headers de la petición.
Tener en cuenta que la arquitectura utilizada permite versionamiento de la api, actualmente se usa la versión 1 'v1'.
A continuación las secciones ó modulos desarrollados.
Controlador de sesiones encargado de controlar la autenticación del usuario y entregar o eliminar el TOKEN de autenticación.
ENDPOINTS | HTTP VERB | Descripción |
---|---|---|
/api/v1/sessions/login.json | POST | Autentica al usuario ya creado, retorna el TOKEN de autenticación |
/api/v1/sessions/logout.json | DELETE | Elimina el TOKEN cerrando la "sesión" del usuario |
headers: Ninguno
params:
{
"email": "carlos@mail.com",
"password": 12345678
}
response:
{
"user": {
"id": 1,
"email": "carlos@mail.com",
"first_name": "carlos",
"second_name": "andres",
"last_name": "torres",
"maiden_name": null,
"authentication_token": "RPUsF7KR9uTh9By2xVEu"
}
}
headers:
{
"X-User-Email": "carlos@mail.com",
"X-User-Token": "RPUsF7KR9uTh9By2xVEu"
}
params: Ninguno response:
{
"message": "Sesión terminada"
}
Controlador de usuarios, gestiona la información del usuario.
ENDPOINTS | HTTP VERB | Descripción |
---|---|---|
/api/v1/users/1.json | GET | Detalle de un usuario específico |
/api/v1/users.json | POST | Crear un usuario |
/api/v1/users/1.json | PUT/PATCH | Editar un usuario |
/api/v1/users/1.json | DELETE | Eliminar un usuario |
headers:
{
"X-User-Email": "carlos@mail.com",
"X-User-Token": "RPUsF7KR9uTh9By2xVEu"
}
params: El identificador(id) del usuario
{
"id": 1
}
response:
{
"user": {
"id": 1,
"email": "carlos@mail.com",
"first_name": "carlos",
"second_name": "andres",
"last_name": "torres",
"maiden_name": null,
"authentication_token": "pYYPPedQ1skMtKUAU61b"
}
}
headers:: Ninguno
params: Datos de creación de usuario, los campos email, contraseña y nombre son obligatorios
{
"user": {
"email": "andres@mail.com",
"password": 12345678,
"first_name": "andres",
"second_name": "carlos",
"last_name": "torres",
"maiden_name": "cruz"
}
}
response:
{
"user": {
"id": 1,
"email": "carlos@mail.com",
"first_name": "carlos",
"second_name": "andres",
"last_name": "torres",
"maiden_name": null,
"authentication_token": "pYYPPedQ1skMtKUAU61b"
}
}
headers::
{
"X-User-Email": "carlos@mail.com",
"X-User-Token": "RPUsF7KR9uTh9By2xVEu"
}
params: Identificador del usuario en la URL y campos del usuario a editar.
{
"id": 1,
"user": {
"email": "andres@mail.com",
"password": 12345678,
"first_name": "andres",
"second_name": "carlos",
"last_name": "torres",
"maiden_name": "cruz"
}
}
response: objeto usuario con campos editados
{
"user": {
"id": 1,
"email": "carlos@mail.com",
"first_name": "carlos",
"second_name": "andres",
"last_name": "torres",
"maiden_name": null,
"authentication_token": "pYYPPedQ1skMtKUAU61b"
}
}
headers::
{
"X-User-Email": "carlos@mail.com",
"X-User-Token": "RPUsF7KR9uTh9By2xVEu"
}
params: Identificador del usuario en la URL
{
"id": 1
}
response: mensaje de usuario eliminado
{
"message": "Registro eliminado"
}
Controlador de intereses de usuarios, gestiona los intereses de cada usuario.
Nótese que los resources de usuarios e intereses están anitados en la url.
ENDPOINTS | HTTP VERB | Descripción |
---|---|---|
/api/v1/users/1/interests.json | GET | Lista de intereses de un usuario |
/api/v1/users/1/interests/1.json | GET | Detalle de un interés específico |
/api/v1/users/1/interests.json | POST | Crear un interés y asociarlo a un usuario |
/api/v1/users/1/interests/1.json | PUT/PATCH | Editar un interés de un usuario |
/api/v1/users/1/interests/1.json | DELETE | Eliminar un interés de un usuario |
headers:
{
"X-User-Email": "carlos@mail.com",
"X-User-Token": "RPUsF7KR9uTh9By2xVEu"
}
params: El identificador(id) del usuario en la url
{
"id": 1
}
response:
[
{
"interest": {
"id": 3,
"name": "Arte"
}
},
{
"interest": {
"id": 4,
"name": "Literatura"
}
}
]
headers::
{
"X-User-Email": "carlos@mail.com",
"X-User-Token": "RPUsF7KR9uTh9By2xVEu"
}
params: ID del usuario y del interés específico en la url
{
"id": "$id del intéres",
"user_id": "$id del usuario"
}
response:
{
"interest": {
"id": 4,
"name": "Literatura"
}
}
headers::
{
"X-User-Email": "carlos@mail.com",
"X-User-Token": "RPUsF7KR9uTh9By2xVEu"
}
params: información del interés que será asociado y el id del usuario.
{
"user_id": 1,
"interest": {
"name": "nuevo interés"
}
}
response: nuevo interés creado y asociado
{
"interest": {
"name": "nuevo interés"
}
}
headers::
{
"X-User-Email": "carlos@mail.com",
"X-User-Token": "RPUsF7KR9uTh9By2xVEu"
}
params: Identificador del usuario en la URL y campos del interés a editar.
{
"id": 1,
"user_id": 1,
"interest": {
"name": "nuevo nombre"
}
}
response: objeto interés con campos editados
{
"interest": {
"name": "nuevo nombre"
}
}
headers::
{
"X-User-Email": "carlos@mail.com",
"X-User-Token": "RPUsF7KR9uTh9By2xVEu"
}
params: Identificador del usuario en la URL y el identificador del interés a eliminar
{
"id": 1,
"user_id": 1
}
response: mensaje de interés eliminado
{
"message": "Registro eliminado"
}
La vista principal del proyecto muestra la lista de usuarios con la información almacenada a través de los servicios. Se puede ver los datos básicos del usuario y la lista de intereses de cada uno.
- Carlos A Torres - Dev principal - katorres02