Home - PabloGallazzi/java-spring GitHub Wiki

Welcome to the tp-tacs wiki!

API REST:

Todos los mensajes que no sean OK (es decir != 2xx) tendrán el formato:

{"message":"mensajeDescriptivo", "status":400,"error":"tipoDeError","cause":[]}

Donde cause es un array de String por ejemplo: ["user_name_already_used", "user_password_length_below_6_chars"].

Todas las respuestas pueden llegar a devolver los siguientes status de error, que aunque no deberían suceder, deben estar definidas, y poder ser manejadas.

FAILURE_RESPONSE_STATUS: 500 o 503, el 500 con body (el definido arriba), y el 503 sin body.

Además podrán retornar errores específicos que se especifican más adelante.

Los request deben ir autenticados, por el token que se generará en base al user y al password, y ese token tendrá scopes para la diferenciación de los usuarios admin y no admin. También se puede consultar el tipo de usuario directo a donde esté guardado el mismo, pero la idea es diferenciar el “scope” que va a tener el request. El token se envía en el query string con el nombre "access_token".

Si el request no esta autenticado y fuese requerido, se devuelve alguno de los siguientes según corresponda:

{"message":"Access token must be provided", "status":401,"error":"unauthorized","cause":[]}
{"message":"invalid_token", "status":401,"error":"unauthorized","cause":[]}
{"message":"Forbidden", "status":403,"error":"unauthorized","cause":[]}

#User Stories:

Como usuario quiero poder crear una cuenta con user y pass.

URI: /users

  • METHOD: POST

REQUEST_BODY :

{ "user_name": "unNombre", "user_password": "unaPassword"}

SUCCESS_RESPONSE_STATUS: 201

SUCCESS_RESPONSE_BODY :

{"user_name": "unNombre", "user_id": 123}

FAILURE_RESPONSE_STATUS: 400

FAILURE_RESPONSE_BODY :

{"message":"Unable to create user", "status":400,"error":"validation_error","cause":[]}

En cause pueden venir, la combinación de alguno de estos

"user_name_already_used"

"user_password_length_below_6_chars"

"user_password_must_contain_one_of_|;,._-|"

"must_provide_a_password"

"must_provide_a_user_name"

Como usuario quiero poder loguearme a mi cuenta con user y pass.

URI: /users/authenticate

  • METHOD: POST

REQUEST_BODY :

{ "user_name": "unNombre", "user_password": "unaPassword"}

SUCCESS_RESPONSE_STATUS: 200

SUCCESS_RESPONSE_BODY :

{"expiration_date":1460431274003,"access_token":"1-387cc2ae79133a-3ad50793d64f9a6f76","user_id":1,"scopes":["admin","read","write"]}

FAILURE_RESPONSE_STATUS: 400

FAILURE_RESPONSE_BODY :

{"message":"Unable to authenticate user", "status":404,"error":"invalid_credentials","cause":[]}

Acá decidimos no especificar si lo que está mal es el usuario o la password por un tema de seguridad.

Como usuario quiero poder consultar el catálogo de personajes de Marvel utilizando la API provista por la compañía.

URI: /characters?sort=SORT&criteria=CRITERIA&offset=OFFSET&limit=LIMIT&name_starts_with=NAME_STARTS_WITH

  • METHOD: GET

REQUEST_BODY : NO TIENE

SUCCESS_RESPONSE_STATUS: 200

SUCCESS_RESPONSE_BODY :

{"paging": {"total":123,"limit":20,"offset":0} ,"results":[{"id": 123,"name":"nombre","description":"info"}]}

Donde los posibles valores son:

SORT : modified, name

CRITERIA : desc, asc

OFFSET : número (depende de la cantidad)

LIMIT : número (entre 1 y 100)

NAME_STARTS_WITH : nombre comienza con...

FAILURE_RESPONSE_STATUS: 400

FAILURE_RESPONSE_BODY :

{"message":"Unable to get characters", "status":400,"error":"bad_request","cause":["missing_param_limit","invalid_param_criteria"]}

Como usuario quiero ver cuales son mis personajes marcados como favoritos

URI: /users/{user}/characters/favorites

  • METHOD: GET

REQUEST_BODY : NO TIENE

SUCCESS_RESPONSE_STATUS: 200

SUCCESS_RESPONSE_BODY :

[{"id": 123,"name":"info","description":"info"}]

Como usuario quiero poder marcar / desmarcar personajes como mis favoritos.

URI: /users/{user}/characters/favorites/{id} (para ambos)

  • METHOD: DELETE

REQUEST_BODY : NO TIENE

SUCCESS_RESPONSE_STATUS: 204

SUCCESS_RESPONSE_BODY : NO TIENE

FAILURE_RESPONSE_STATUS: 400

FAILURE_RESPONSE_BODY :

{"message":"Unable to remove characters", "status":400,"error":"bad_id","cause":["character_id_must_be_a_natural_number"]}

FAILURE_RESPONSE_STATUS: 404

FAILURE_RESPONSE_BODY :

{"message":"Unable to remove character","status":404,"error":"character_not_found","cause":[]}
  • METHOD: POST

REQUEST_BODY :

{"id": 123, "name":"nombre"}

SUCCESS_RESPONSE_STATUS: 201

SUCCESS_RESPONSE_BODY :

{"id": 123, "name":"nombre"}

FAILURE_RESPONSE_STATUS: 400

FAILURE_RESPONSE_BODY :

{"message":"Unable to add characters", "status":400,"error":"bad_id","cause":["character_id_must_be_a_natural_number"]}

Como usuario quiero poder crear un grupo de personajes y ponerle nombre

URI: /users/{user}/teams

  • METHOD: POST

REQUEST_BODY :

{"team_name": "unNombre", "members": [{"id": 123, "name":"nombre"},{"id": 456,"name":"nombre"}]}

SUCCESS_RESPONSE_STATUS: 201

SUCCESS_RESPONSE_BODY :

{"team_id": 123, "team_name": "unNombre", "members": [{"id": 123,"name":"nombre"},{"id": 456,"name":"nombre"}]}

FAILURE_RESPONSE_STATUS: 400

FAILURE_RESPONSE_BODY :

{"message":"Unable to crete team", "status":400,"error":"already_exists","cause":["team_name_already_exists"]}

Como usuario quiero poder consultar un grupo y sus personajes

URI: /users/{user}/teams/{team}

  • METHOD: GET

REQUEST_BODY : NO TIENE

SUCCESS_RESPONSE_STATUS: 200

SUCCESS_RESPONSE_BODY :

{"team_id": 123, "team_name": "unNombre", "members": [{"id": 123,"field1":"value","field2":"value"},{"id": 456,"field1":"value","field2":"value"}]}

FAILURE_RESPONSE_STATUS: 404

FAILURE_RESPONSE_BODY :

{"message":"Unable to get team", "status":404,"error":"not_found","cause":[]}

Como usuario quiero poder agregar un personaje a un grupo

URI: /users/{user}/teams/{team}/character

  • METHOD: POST

REQUEST_BODY :

{"id": 123,"name":"nombre"}

SUCCESS_RESPONSE_STATUS: 201

SUCCESS_RESPONSE_BODY :

{"id": 123,"name":"nombre"}

FAILURE_RESPONSE_STATUS: 400

FAILURE_RESPONSE_BODY :

{"message":"Unable to add character", "status":400,"error":"bad_id","cause":["character_id_must_be_a_natural_number"]}

Como usuario quiero poder eliminar un personaje de un grupo

URI: /users/{user}/teams/{team}/character/{id}

  • METHOD: DELETE

REQUEST_BODY : NO TIENE

SUCCESS_RESPONSE_STATUS: 204

SUCCESS_RESPONSE_BODY : NO TIENE

FAILURE_RESPONSE_STATUS: 400

FAILURE_RESPONSE_BODY :

{"message":"Unable to remove character", "status":400,"error":"bad_id","cause":["character_id_must_be_a_natural_number"]}

FAILURE_RESPONSE_STATUS: 404

FAILURE_RESPONSE_BODY :

{"message":"Unable to remove character", "status":404,"error":"not:_found","cause":[]}

Como administrador quiero poder ver los siguientes datos de un usuario:

  • User

  • Cantidad de grupos creados

  • Cantidad de personajes favoritos

  • Último acceso

  • Detalle de un grupo (nombre, personajes)

URIS:

/users/{user}

/users/{user}/teams/{team}

  • METHOD: GET

REQUEST_BODY : NO TIENE

SUCCESS_RESPONSE_STATUS: 200

Acá entra en juego el tema de los scopes definido arriba.

Como administrador quiero tener un ranking de los personajes favoritos en la app.

URI: /characters/ranking?limit=LIMIT

  • METHOD: GET

REQUEST_BODY : NO TIENE

SUCCESS_RESPONSE_STATUS: 200

SUCCESS_RESPONSE_BODY :

[{"id": 123, "elected_times":10}]

LIMIT : número (entre 1 y 100)

Como administrador quiero seleccionar 2 grupos de usuarios diferentes y mostrar la intersección.

URI: /teams/commons/{id}/{id2}

  • METHOD: GET

REQUEST_BODY : NO TIENE

SUCCESS_RESPONSE_STATUS: 200

SUCCESS_RESPONSE_BODY :

[{"id": 123,"name":"nombre"}]

FAILURE_RESPONSE_STATUS: 404

FAILURE_RESPONSE_BODY :

{"message":"Unable to get commons", "status":404,"error":"not:_found","cause":["id $id not found","id2 $id not found"]}

FAILURE_RESPONSE_STATUS: 400

FAILURE_RESPONSE_BODY :

{"message":"Unable to get commons", "status":400,"error":"not:_found","cause":["team_id_must_be_a_natural_number"]}