Skip to content

Commit

Permalink
Docu diseño api casi terminada #55 [skip ci]
Browse files Browse the repository at this point in the history
  • Loading branch information
mariasanzs committed Dec 12, 2020
1 parent f8d4434 commit cf84232
Show file tree
Hide file tree
Showing 2 changed files with 202 additions and 26 deletions.
208 changes: 202 additions & 6 deletions docs/api.md
Original file line number Diff line number Diff line change
@@ -1,27 +1,224 @@
#DOCUMENTACIÓN DEL DESARROLLO DE LA API

Para desarrollar la aplicación he usado Sinatra, puedes ver alguna documentación que he desarrollado sobre la elección de este y su uso [aquí](https://github.com/mariasanzs/makeupIV/blob/master/docs/sinatra.md#justificaci%C3%B3n-t%C3%A9cnica-del-framework-sinatra-y-documentaci%C3%B3n-sobre-c%C3%B3mo-se-usa-en-la-pr%C3%A1ctica)

## Puesta en marcha de la aplicación:

Lo primero que debemos de hacer es
Lo primero que debemos de hacer es añadir todas las rutas necesarias para el funcionamiento de la aplicación y crear una clase (en mi caso Myapp) que hereda de la clase Sinatra::Base que ofrece funciones que se pueden habilitar y facilitan el uso de Sinatra.

~~~
require 'sinatra'
require 'json'
require 'logger'
require_relative '../src/almacen.rb'
require_relative '../src/compra.rb'
class MyApp < Sinatra::Base
log = ::Logger.new(File.join(File.dirname(File.expand_path(__FILE__)),'.','log','info.log'))
configure do
use ::Rack::CommonLogger, log
end
~~~

Con respecto a todo lo relacionado con 'log', podemos ver [aquí](LINK) un poco mejor sobre el uso de un middleware para la creación de un fichero log

~~~
Al no disponer de persistencia en la aplicación se han creado las siguientes estancias de clase para poder testear las rutas, además de esto se han declarado las dos clases que funcianarán como clases controladoras ( Almacén y Compra)
~~~

@@cliente = 'clientepordefecto'
@@almacen = Almacen.new
@@obj = Maquillaje.new('prueba',[4, 5, 6, 7],10.0,5.0,[3, 2, 1, 7],TipoProducto::LABIOS,[['maria15','labios30'],[15,30]])
@@almacen.anadirProducto(@@obj)
@@cesta = Compra.new(@@cliente)

~~~
También deberemos de crear unas rutas para funcionalidades generales:
Para que aparezca al iniciar el servidor en:
> http:https://localhost:9292
~~~
get '/' do
log.info "Accediendo a la página principal de MakeupIV"
{:status => 'ok'}.to_json
end
~~~
Y para el caso en el que no se encuentre la ruta dada devolviendo el estado 404 (Not Found):
~~~
error 404 do
content_type :json
log.info "ERROR!!! -> ruta no encontrada"
{:status => 'Error: ruta no encontrada'}.to_json
end
~~~
Podemos probarlo haciendo:
> http:https://localhost:9292/noexisto
## Rutas asociadas a historias de usuario:
A la hora de hacer el diseño se han creado varias rutas asociadas a distinas historias de usuario y para las que se usan varios tipos de peticiones.
A la hora de hacer el diseño se han creado varias rutas asociadas a distinas historias de usuario y para las que se usan varios tipos de peticiones (GET, POST y DELETE)
* Para la [HU01](https://github.com/mariasanzs/makeupIV/issues/9)
Especificamos la ruta: get /disponibilidad/:producto siendo producto el nombre de un producto del que queremos consultar su disponibilidad.
Buscamos el producto que corresponde con ese nombre y consultamos cuantas unidades quedan de dicho producto. En caso de que se produzca algún error durante estas funciones se manejan las excepciones y se muestra el resultado al usuario devolviendo también un estado de éxito (200) o de error (400).
~~~

get '/disponibilidad/:producto' do
content_type :json
nombreproducto = params['producto'].to_s
begin
res = @@almacen.buscarProducto(nombreproducto).consultarUnidadesDisponibles()
log.info "Accediendo a la disponibilidad de un producto"
status 200
{:unidadesDisponibles => res}.to_json
rescue StandardError
log.info "ERROR!!! -> Accediendo a la disponibilidad de un producto"
status 400
{:status => "Error: no hay disponibilidad de este producto"}.to_json
end
end

~~~
Podemos probar esta ruta poniendo en marcha el servicio y haciendo:
> http:https://localhost:9292/disponibilidad/prueba en el navegador
o
> curl --header "Content-Type:application/json" --request GET --data '{"producto":"prueba"}' https://localhost:9292/disponibilidad/prueba
* Para la [HU02](https://github.com/mariasanzs/makeupIV/issues/10)
El código para esta historia de usuario es muy similar al anterior, solo que esta vez se llama a la función que lista las características de un producto.
Puedes probar la ruta iniciando el servicio y haciendo:
> http:https://localhost:9292/características/prueba en el navegador
o
> curl --header "Content-Type:application/json" --request GET --data '{"producto":"prueba"}' https://localhost:9292/caracteristicas/prueba
* Para la [HU03](https://github.com/mariasanzs/makeupIV/issues/12)
Nuevamente la ruta es una petición get muy similar a las anteriores, pero en este caso se llama a la función que de makeupiv.rb que muestra los tonos en los que está disponible un producto.
> http:https://localhost:9292/tonos/prueba en el navegador
o
> curl --header "Content-Type:application/json" --request GET --data '{"producto":"prueba"}' https://localhost:9292/tonos/prueba
* Para la [HU04](https://github.com/mariasanzs/makeupIV/issues/13)
En este caso se muestra el tanto por ciento de descuento que se aplica a un producto siguiendo el mismo esquema de código mediante una petición GET
> http:https://localhost:9292/descuento/prueba en el navegador
o
> curl --header "Content-Type:application/json" --request GET --data '{"producto":"prueba"}' https://localhost:9292/descuento/prueba
* Para la [HU05](https://github.com/mariasanzs/makeupIV/issues/32)
Especificamos la ruta: get /producto/:producto/canjearCodigo/:codigo. `Producto` es el nombre del producto al que le queremos aplicar un código de descuento `codigo`
Buscamos el producto y consultamos si dicho código de descuento se le puede aplicar, en caso afirmativo se devuelve el precio rebajado y un estado de éxito ( status 200 ) en caso que o bien el producto o bien el código no sean válidos se devuelve error (status 400)
~~~
get '/producto/:producto/canjearCodigo/:codigo' do
content_type :json
begin
n_codigo = params['codigo']
nombreproducto = params['producto']
prod = @@almacen.buscarProducto(nombreproducto)
begin
res = prod.canjearCodigo(n_codigo)
log.info "Canjeando código de un producto"
status 200
{:preciorebajado => res}.to_json
rescue StandardError
status 400
log.info "ERROR!!! -> Canjeando código de un producto"
{:status => 'Error: Este código no es válido'}.to_json
end
rescue StandardError
status 400
{:status => 'Error: Este producto no está en el catálogo'}.to_json
end
end
~~~
Puedes probarlo poniendo en marcha el servidor y haciendo:
> http:https://localhost:9292/producto/prueba/canjearCodigo/maria15 en el navegador
o
> curl --header "Content-Type:application/json" --request GET --data '{"producto":"prueba", "canjearCodigo":"maria15"}' https://localhost:9292/producto/canjearCodigo/maria15
* Para la [HU06](https://github.com/mariasanzs/makeupIV/issues/42)
El caso de la HU es algo diferente ya que deberemos de especificar diferentes rutas:
**get /preciocesta :**
Al igual que en los casos anteriores, se devuelve un estado de éxito con el valor total de todos los productos añadidos a la cesta.
Puedes probarlo haciendo:
> http:https://localhost:9292/preciocesta
curl --header "Content-Type:application/json" --request GET http:https://localhost:9292/preciocesta
**post /anadirCesta/:producto :**
Esta vez se realiza una petición POST ya que se modificará el valor de la instancia de clase @@cesta añadiendo a ella un producto.
Aún así, debido a la simplicidad que aporta Sinatra, el caso sigue siendo muy similar a los casos anteriores.
>curl --header "Content-Type:application/json" --request POST --data '{"producto":"prueba"}' http:https://localhost:9292/anadirCesta/producto
**delete /quitarCesta/:producto :**
Al igual que podemos añadir productos a la cesta también tenemos que poder quitarlos de esta, por ello debemos de realizar una petición DELETE para eliminar el producto que se encuentra dentro de la cesta.
Para probarlo en el servidor deberíamos de hacer:
>curl --header "Content-Type:application/json" --request DELETE --data '{"producto":"prueba"}' http:https://localhost:9292/quitarCesta/producto
* Para la [HU08](https://github.com/mariasanzs/makeupIV/issues/53)
Para esta última Historia de usuario solo se ha implementado el caso en el que se quitar un producto del almacén haciendo también una petición DELETE al igual que ocurría en el caso anterior. La ruta es la siguiente: delete '/quitarProducto/:producto'
Puedes probar la ruta iniciando el servidor y haciendo curl:
> curl --header "Content-Type:application/json" --request DELETE --data '{"producto":"prueba"}' http:https://localhost:9292/quitarProducto/producto
## Test de la API
Puedes consultar todos los test del archivo MyApp.rb en el fichero [testMyapp.rb](https://github.com/mariasanzs/makeupIV/blob/master/spec/testMyapp.rb)
Expand Down Expand Up @@ -97,14 +294,13 @@ Se describe el test "Quitar un producto del almacen" para comprobar la ruta ´po
Para el caso de Error 404 y '/' también se han creado los test "Hay un error 404" y "Pagina Inicial" respectivamente
Por último para ejecutar los test de integración concretos de la app podemos hacer
Por último para ejecutar los test de integración podemos hacer
> rake test_app
> rake test
## Registro en un archivo de log de todas las peticiones realizadas
Se ha creado un fichero de log haciendo uso de un middleware y que puede consultar [aquí
###PON LA RUTA
Se ha creado un fichero de log haciendo uso de un middleware y que puede consultar [aquí](https://github.com/mariasanzs/makeupIV/tree/master/sinatra/log). También puedes consultar toda la documentación de como he realizado esto haciendo click [aquí]() |||||||||||||||||||||||||||||||||||||||||||||||PON RUTA
Expand Down
20 changes: 0 additions & 20 deletions sinatra/myapp.rb
Original file line number Diff line number Diff line change
Expand Up @@ -181,26 +181,6 @@ class MyApp < Sinatra::Base
end
end

post '/anadirProducto/:nombre/:tonos/:precio/:preciorebajado/:unidades/:tipo/:codigos' do
content_type :json
nombreproducto = params['nombre']
#if @@almacen.buscarProducto(nombreproducto).nil?
# tonosp = params['tonos']
preciop = params['precio']
preciorebajadop = params['preciorebajado']
# unidadesp = params['unidades']
tipop = params['tipo']
# codigosp = params['codigos']
#producto = Maquillaje.new(nombreproducto, tonosp, preciop, preciorebajadop, unidadesp, tipop, codigosp)
#@@almacen.anadirAlmacen(producto)
status 200
tam = @@almacen.productos.size
{:anadidoAlmacen => nombreproducto, :tamanoAlmacen => tam }.to_json
#else
# status 400
# {:status => 'Error: Este producto ya está en el almacen'}.to_json
#end
end

error 404 do
content_type :json
Expand Down

0 comments on commit cf84232

Please sign in to comment.