Adopcion Mascotas
Adopcion Mascotas
Adopcion Mascotas
Autor
Tomás Muñoz Testón
Tutor
Santiago Alonso Villaverde
Jennifer Pérez Benedí
A mi tutor Santiago Alonso, por ayudarme tanto con este proyecto, empujarme a hacer
cosas grandes y hacer que crea en mis posibilidades.
A mi gran amigo Rodrigo de Miguel, por ser mi compañero de batallas y hacer que todo
sea posible.
Resumen ................................................................................................................... 1
Abstract..................................................................................................................... 1
1. INTRODUCCIÓN......................................................................................................... 2
i
2.3.2. Estructura y jerarquía de componentes React - Redux ........................................... 29
a) Estructura ............................................................................................................ 29
b) Jerarquía.............................................................................................................. 32
2.4. Configuración de la forja ................................................................................... 33
ii
Modelo de datos: ......................................................................................... 73
API REST - Conexión cliente - servidor .......................................................... 75
Componentes............................................................................................... 83
Sprint Review ............................................................................................... 86
d.4.) Quinto sprint - Módulo animales ..................................................................... 86
Diagramas de casos de uso ........................................................................... 89
Modelo de datos: ......................................................................................... 89
API REST - Conexión cliente - servidor .......................................................... 90
Componentes............................................................................................... 98
Sprint Review ............................................................................................. 102
d.5.) Sexto sprint - Login y gestión de imágenes principales. .................................. 103
Diagramas de casos de uso ......................................................................... 105
API REST - Conexión cliente - servidor ........................................................ 105
Componentes............................................................................................. 108
Sprint Review ............................................................................................. 109
d.6.) Séptimo sprint - Obtener imágenes y contacto vía email. ............................... 110
Diagramas de casos de uso ......................................................................... 112
API REST - Conexión cliente - servidor ........................................................ 112
Componentes............................................................................................. 115
Sprint Review ............................................................................................. 116
d.7.) Octavo sprint - Contacto vía whatsapp y verificar cuenta protectora .............. 117
Diagramas de casos de uso ......................................................................... 118
API REST - Conexión cliente - servidor ........................................................ 119
Componentes............................................................................................. 121
Sprint Review ............................................................................................. 121
4. CONCLUSIONES Y POSIBLES AMPLIACIONES .......................................................... 122
5. BIBLIOGRAFÍA........................................................................................................ 125
iii
Índice figuras
Figura 1. Evolución del número de animales que llegan cada año a refugios o protectoras.
Fuente: Fundación Affinity. ........................................................................................... 3
Figura 11. Diagrama de flujo que sigue Redux desde una interacción, hasta que la
aplicación actualiza la UI. ............................................................................................ 25
Figura 20 - AlertCheckComponent............................................................................... 85
iii
Figura 24. Diagrama de Casos de Uso - Módulo animales. ........................................... 89
Figura 34. Módulo obtener imagen principal y envío email protectora...................... 112
Figura 37. Módulo gestión whatsapp y verificación email protectora. ....................... 118
iv
Figura 48. Información sobre botones - guía de estilos. ............................................. 132
v
Resumen
Abstract
Pet abandonment is an important problem in Spain. The number of animals that end up in the
shelters is growing again since 2015.
Adoptaunanimal is a web platform that allows unifying the animal shelters in a single place to
improve their presence on the Internet and increase the visibility of their animals. This platform
allows users to search for a specific animal, view the animal’s information in detail and contact
the shelter if they wish.
This project aims to illustrate the development process of the platform, using agile
methodologies to tolerate changing requirements and provide product value in early stages of
the project. The technologies used are current as React and Redux on the client side, NodeJS
and Express on the server side and Mongoose with MongoDB for database integration
1
1. INTRODUCCIÓN
Introducción
1.1. Contexto
En 2018, 138.307 perros y gatos fueron abandonados en España (Figura 1). 17 de cada
1000 perros y 10 de cada 1000 gatos terminaron en un refugio o protectora durante el
año 2018[1]. Estos datos permiten estimar la tasa de abandono y/o pérdida de animales
en 23 perros y 7 gatos por cada 10.000 habitantes (Población española estimada en
46.733.038 personas 1). El abandono de animales es todavía un importante problema en
España. Según Fundación Affinity, las cifras de animales que llegaron a un refugio o
protectora en 2018 son comparables a las de 2017, confirmándose el estancamiento de
la tímida tendencia a la baja observada a lo largo de los últimos años[1].
Figura 1. Evolución del número de animales que llegan cada año a refugios o protectoras. Fuente:
Fundación Affinity.
Con una media de casi 380 animales desatendidos en las calles cada día, España se sitúa
a la cabeza de Europa en cuanto a abandono se refiere.
Entre las causas atribuibles a este problema destacan las siguientes: camadas no
deseadas (15,5%), el fin de la temporada de caza (12,2%), los factores económicos
(11,7%), el comportamiento del animal (11,4%), y la pérdida del interés por el animal
(10,7%) (Figura 2)[2].
1
Fuente: Instituto Nacional de Estadística (diciembre- 2018).
3
Introducción
4
Introducción
Figura 3. Motivos para no adoptar un animal de compañía en personas inicialmente interesadas en una
adopción. Fuente Fundación Affinity.
Observando estos datos se puede ver que los aspectos físicos en general y la raza siguen
siendo algunos de los criterios por los que una persona se decide a adoptar o no a un
animal.
En otras ocasiones, los animales acaban volviendo al refugio tras haber sido adoptados.
Esto ocurre porque en la mayoría de los casos no se disponía de la información necesaria
para favorecer una buena adopción. Por eso, es de vital importancia que las personas
reflexionen y se informen de las consecuencias y la responsabilidad que supone tener
un animal de compañía2[3]. La concienciación es la única vía posible para cambiar esta
realidad presente.
2
Guía tenencia responsable (Gobierno de España)
5
Introducción
Los principales motivos por los que se devuelve un animal a la protectora son:
Las protectoras viven una realidad preocupante ya que la mayoría están desbordadas.
Sin embargo, este problema se podría solucionar con el control de la cría y la
esterilización, tal y como hacen países vecinos de España como Holanda, y con la
identificación mediante microchip para facilitar la recuperación de un animal perdido y
mejorar la conducta de los propietarios.
6
Introducción
1.2. Motivación
Los buscadores de animales que existen a día de hoy en internet utilizan tecnología
anticuada o están abandonados.
No todas las protectoras tienen una página web o lugar donde gestionar y dar visibilidad
a sus animales en internet ya sea por falta de dinero o porque la actualización de las
herramientas que disponen supone mucho tiempo.
1.3. Objetivos
El presente trabajo fin de máster (de ahora en adelante TFM), tiene como objetivo crear
una plataforma web que permita unificar todas las protectoras del ámbito nacional
(empezando por la Comunidad de Madrid). Permitirá que las protectoras puedan
gestionar y mejorar la visibilidad de sus animales y que cualquier usuario pueda
encontrar de una forma sencilla un animal (en un principio perros y gatos) concreto o
saber qué protectoras tiene cerca, así como su información o contacto.
7
2. GESTIÓN DEL PROYECTO Y TECNOLOGÍAS
Gestión del proyecto y tecnologías
Antes de comenzar con el proyecto se realizó un plan de empresa donde se trataron las
siguientes cuestiones:
2.1.2. Competencia
Para analizar la competencia se buscó en internet plataformas web que hiciesen algo
parecido. Se analizaron sus redes sociales y se utilizó SimilarWeb para generar informes
sobre cada una de sus webs.
a) Bambu-difunde
Esta página web se consideró como competencia directa. En ella se observa que tiene
dado de alta a 103 protectoras, de las cuales la mitad se distribuyen entre las provincias
de:
● Barcelona (27%).
● Alicante (14,5%).
● Madrid (10,6%).
9
Gestión del proyecto y tecnologías
Según SimilarWeb (a día 18 de enero de 2019), el 80% de las visitas que recibe la web
proviene de buscadores, el 12% de forma directa y tan solo un 1.6% de redes sociales
(principalmente Facebook). Las personas que acceden la mayoría son de España
(86,59%) y el resto de los países Latinoamericanos. No han pagado nada para aumentar
su tráfico en la web.
b) Miwuki
10
Gestión del proyecto y tecnologías
Con todos estos datos se deduce que han podido comprar seguidores. Además, parece
que los datos de los perros están desactualizados, ya que figuran perros que en
notificaciones de la protectora por redes sociales nombran como adoptado.
Según SimilarWeb, las visitas que recibió la página en diciembre de 2018 se dividen en
un 12% en la página publicitaria, un 5% en la plataforma web y entre un 4,7% y un 23%
de descargas en la App Android).
La plataforma web:
● 11280 visitas.
11
Gestión del proyecto y tecnologías
c) mascotasadopción.com
2.1.3 Marketing
12
Gestión del proyecto y tecnologías
13
Gestión del proyecto y tecnologías
En la Fase 1:
● Generar un Plan de Empresa y una especificación de requisitos básica. Detallar
la Idea de negocio, funcionalidades básicas y futuras, realizar un estudio de
mercado y analizar las tecnologías que se van a utilizar.
● Planificar el desarrollo del proyecto utilizando metodologías ágiles (en este caso
se utiliza SCRUM).
En la Fase 2:
● Realizar demostraciones de la aplicación en las protectoras con el objetivo de
que la utilicen y puedan dar las primeras impresiones.
En la Fase 3:
● Mejorar la funcionalidad básica y añadir nueva (priorizando aquellas que las
protectoras han considerado más importantes en las primeras impresiones).
14
Gestión del proyecto y tecnologías
a) No tener éxito
En caso de que la plataforma web esté generando pérdidas pasado un año desde su
lanzamiento, se valorará entre eliminar la aplicación o dejarla con los servidores y BBDD
en sus planes gratuitos para que se mantenga el uso de forma gratuita.
15
Gestión del proyecto y tecnologías
En este caso se valorará la reducción de los recursos en los servidores y BBDD para evitar
la pérdida de dinero y/o cambio de estrategia de marketing.
Para facilitar la comunicación y tener un seguimiento del proyecto se han usado las
siguientes tecnologías:
2.2.1. Trello
○ Review: si hay alguna tarea que está pendiente de revisión por parte de
cualquier integrante del proyecto.
16
Gestión del proyecto y tecnologías
Es una aplicación online de alojamiento de archivos. En este caso es de gran utilidad para
compartir documentación y código desarrollado. Se sigue la siguiente estructura de
carpetas:
● Plantillas: en esta carpeta se almacena todo lo referente al diseño de la
plataforma web.
2.2.3. Heroku
Se decide usar Heroku para el despliegue de la aplicación por su facilidad de uso y por el
precio.
17
Gestión del proyecto y tecnologías
Para el control de administración y revisión del código se decide usar Github. Esta
plataforma permite centralizar el código en un solo lugar. Además, la flexibilidad de Git
permite una fácil revisión del código y gestionar distintas versiones. Esto se puede lograr
mediante el uso de metodologías como “Atlassian GitFlow WorkFlow”[5]. Esta
metodología proporciona un conjunto de buenas prácticas para la gestión del código
fuente ya que define una estructura de ramificación que está estrictamente relacionada
con las actividades del proceso de desarrollo haciendo que cada actividad individual de
codificación tenga su propia rama. Para ello, la convención establece seis tipos de ramas:
● Master: contiene la versión estable de la aplicación (producción). Sólo puede
existir una rama de este tipo en el proyecto.
● Release: antes de mezclar la rama “Develop” con “Master”, se crea esta rama
que sirve para ajustar y probar la versión. Al finalizar, estas ramas también
deberían de mezclarse de nuevo en la rama ‘Develop’ para incorporar los
cambios de ajuste hechos en el desarrollo actual.
● Bug: son similares a las ramas “Feature” pero en este caso el objetivo es arreglar
un problema o fallo.
● Hotfix: al igual que las ramas “Bug”, sirven para arreglar un problema, pero en
este caso son errores que son urgentes. Al completar una rama “Hotfix” debe
fundirse de nuevo en la rama “master” y también en la rama “Develop”.
18
Gestión del proyecto y tecnologías
Las ramas “Master” y Develop” son ramas que sus nombres no varían. En cambio, el
resto adoptan la siguiente nomenclatura:
{branchType}/{task#}-sample-task-name
Ejemplos:
● feature/#1-login-module
● bug/#2-login-module-error
Esta forma de clasificar las ramas permite una organización rigurosa por parte del
desarrollador. Además, facilita la integración en un entorno de trabajo en el que se
utilizan metodologías ágiles como Scrum por la flexibilidad del código producido.
Para gestionar las tareas asociadas al proyecto se utiliza Github. Esta plataforma permite
gestionar las tareas en un tablero Kanban, utilizar estados en las tareas, asignarlas a
miembros del equipo de desarrollo, utilizar un chat para las discusiones y tener un
histórico de estados. Como el código se aloja en esta herramienta, se pueden vincular
los los commits de Git directamente a la tarea utilizando el número de identificación de
la tarea. Esta característica es muy útil en la revisión de las tareas jerárquicas y facilita
considerablemente la revisión del Git log.
Para almacenar las imágenes de los animales, logos de las protectoras, etc. se utiliza un
servicio de almacenamiento que ofrece escalabilidad, disponibilidad de datos, seguridad
y rendimiento. Ofrece facilidades de integración con aplicaciones, controles de acceso y
organizar los datos[6].
19
Gestión del proyecto y tecnologías
a) Javascript
El lenguaje de programación Javascript sigue siendo uno de los más usados en los
últimos años (Figura 8)[7], [8]. Está ganando impulso continuamente tanto en
aplicaciones del lado del servidor como del cliente. El motor Chrome V8 está mejorando
su rendimiento en el lado del cliente con el uso de entornos de trabajo (comúnmente
conocidos como Frameworks3) como Angular o librerías como ReactJS o Vue [9].
3
https://es.wikipedia.org/wiki/Framework
20
Gestión del proyecto y tecnologías
b) Angular vs React
Angular fue creado por Google y comenzó como un marco MV*, es decir, podía usarse
como MVC (Modelo - vista - controlador) o una arquitectura MVVM (modelo - vista -
vista - modelo). Es flexible y por ello complicado de dominar ya que no existe una forma
específica de trabajar.
La primera versión que se creó de Angular fue la 1.X que no es compatible con versiones
posteriores, ya que Angular 2.X fue una reescritura completa de todo el entorno de
trabajo. Los controladores desaparecieron y fueron sustituidos por componentes y
directivas. Además, incorporaron la posibilidad de usar Typescript proporcionando la
posibilidad de tener tipos estáticos y algunas características atractivas que no están
presentes en Javascript[9].
Por otro lado, React, a diferencia de Angular, es una biblioteca de creación de interfaces
flexible, creada y mantenida por Facebook. React utiliza una arquitectura basada en
componentes.
Esta arquitectura es fácil de mantener y muy reutilizable por lo que permite acelerar el
proceso de desarrollo haciendo que el desarrollador se centre en lo demás. Sin embargo,
no es la arquitectura basada en componentes lo que hace a React una buena alternativa,
si no el Virtual Data Object Model (DOM). Esta característica permite que el DOM virtual
de React pueda crear más de 200,000 nodos por segundo. No solo eso, sino que recrea
el DOM para cada cambio. Además, con el algoritmo “Diffing” es capaz de reducir el
cálculo de la diferencia desde una complejidad de O(n^3) a O(n) 4.
Una de las virtudes de React es la incorporación de JSX, una extensión de Javascript que
permite escribir código HTML como si fuera código Javascript[9].
4
https://reactjs.org/docs/reconciliation.html#the-diffing-algorithm
21
Gestión del proyecto y tecnologías
Tanto Angular 2 cómo React son muy utilizadas (Figura 9) y cualquiera de ellas se podría
haber utilizado para implementar este proyecto. Sin embargo se opta por utilizar React
por la curva de aprendizaje y su simplicidad.
Ambas tecnologías están muy bien documentadas, son bastante maduras y hay una gran
comunidad detrás.
22
Gestión del proyecto y tecnologías
Figura 10. Frameworks, bibliotecas y herramientas más utilizadas en 2018. Fuente: Stackoverflow.
c) Redux
Como los requisitos en aplicaciones Javascript de una sola página se están volviendo
cada vez más complicados, surge la idea de manejar el estado del código.
23
Gestión del proyecto y tecnologías
Redux es una librería creada en 2015 por Dan Abramov que facilita la gestión de las
continuas variaciones (mutabilidad), con la incertidumbre de cuándo se producen
(asincronismo), ya que el principal objetivo de Redux es hacer predecible los cambios de
estado, poniendo restricciones de cómo y cuándo se producen estas actualizaciones,
haciendo que el estado sea transparente y determinista. Está librería está en gran parte
influenciada por Flux 5, creada por Facebook para las aplicaciones de React utilizando
lenguaje Elm6 [10].
Redux permite:
● Tener una fuente única de verdad: mantener un único objeto que almacena el
estado de toda la aplicación, permitiendo el acceso a este estado a todos los
componentes.
● Funciones puras: usar funciones puras para definir cómo cambia el estado en
base a una acción (mantiene lo mismos tipos de variables de entrada y salida).
En Redux, este tipo de funciones se conocen como “Reducers”.
5
https://facebook.github.io/flux/
6
https://elm-lang.org/
24
Gestión del proyecto y tecnologías
Figura 11. Diagrama de flujo que sigue Redux desde una interacción, hasta que la aplicación actualiza la
UI.
En este proyecto se utilizará Redux junto con React porque permite describir la interfaz
de usuario como una función de estado en respuesta a acciones y centralizar el control
del estado.
d) Webpack
25
Gestión del proyecto y tecnologías
Webpack permite trabajar con cualquier tipo de archivo (CSS, preprocesadores CSS,
preprocesadores Javascript, imágenes, etc) simplemente indicando el “loader” a utilizar.
Gracias a esto, podemos preprocesar el código JSX de los componentes de React. El
archivo de configuración utilizado en el proyecto tiene la siguiente configuración:
entry: [
'./src/index.js'
]
Aquí le indicamos que el punto de entrada desde el que debe empezar a leer y realizar
el proceso es el fichero index.js
output: {
path: path.join(__dirname, 'public/'),
publicPath: path.join(__dirname, 'public/'),
filename: 'bundle.js'
}
26
Gestión del proyecto y tecnologías
Con esta configuración le estamos indicando donde ha de situar el fichero de salida, será
en la carpeta build con el nombre bundle.js. Si lo servimos desde un servidor de
desarrollo, la ruta pública será “public/”.
module: {
rules: [
{
test: /\.css$/,
use: ['style-loader', 'css-loader'],
},
],
loaders: [
{exclude: '/node_modules/', loader: 'babel', query: {presets: ['react', 'es2015',
'stage-1']}},
{
test: /\.scss/,
loader: ExtractTextPlugin.extract(
"style-loader",
"css-loader!sass-loader"
)
},
{
test: /\.css/,
loader: ExtractTextPlugin.extract("style-loader", "css-loader")
}
],
}
| .jsx” les pase el “loader” de Babel. Además, se añade unas opciones de configuración
a Babel con el objeto “query” indicando que utilice el “preset” de “es2015” para
transpilar la sintaxis de Javascript para aquellos navegadores que aún no lo soporten a
la versión que si lo soportan y el “preset” de React que permite el procesamiento de JSX
a Javascript.
resolve: {
extensions: ['', '.js', '.jsx', '.json', '.css', '.scss', '.png', '.jpg', '.jpeg', '.gif'],
modulesDirectories: [
'node_modules'
]
}
Con “resolve” se indica a webpack cuales son las extensiones de los ficheros en los que
se tiene que fijar desde el directorio en el que se encuentre el fichero
“webpack.config.js” hacia dentro.
devServer: {
historyApiFallback: true,
contentBase: './public',
port: process.env.PORT || 5555
}
devServer: {
historyApiFallback: true,
contentBase: './public',
port: process.env.PORT || 5555
}
28
Gestión del proyecto y tecnologías
e) Jest
Jest es un framework de testing desarrollado por Facebook y destaca por ser rápido y
flexible. Aunque nace en el contexto de React, es un framework de tesing
generalista[13].
Para poder utilizarlo hay que añadir una dependencia en el fichero package.json
utilizando NPM:
En este proyecto se utiliza la agrupación a nivel de fichero, añadiendo un test por cada
componente.
a) Estructura
Los componentes son una parte esencial de una aplicación React. Dividir la interfaz de
usuario en componentes permite tener piezas independientes y reutilizables.
29
Gestión del proyecto y tecnologías
Estos componentes disponen de un estado que permite administrar datos dentro del
componente. El estado es una de las grandes ventajas de React (aunque el concepto no
es específico de esta tecnología).
El renderizado de los componentes se describe con JSX8. Cabe destacar que React solo
puede devolver un elemento directo, por lo que las devoluciones del renderizado deben
estar envueltas en un solo elemento externo con una etiqueta HTML <div>.
Para poder utilizar un componente se tiene que importar el archivo donde se quiera
utilizar y dentro del renderizado del JSX se coloca el nombre del componente entre los
símbolos de menos que y mayor que:
<Ejemplo
Props={propiedades}
/>
7
https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes
8
https://medium.com/@Thoughtworks_es/qu%C3%A9-demonios-es-jsx-txt-f5841e51f664
9
https://reactjs.org/docs/higher-order-components.html
30
Gestión del proyecto y tecnologías
31
Gestión del proyecto y tecnologías
b) Jerarquía
Una de las adaptaciones que se tiene que hacer para desarrollar en React es como crear
la jerarquía de componentes. Lo primero que se debería hacer es dibujar los
componentes (y subcomponentes) y darles nombres. Para saber si se debe crear un
componente se pueden utilizar técnicas como “el principio de responsabilidad única 10,
es decir, un componente idealmente debería hacer solo una cosa. Si termina creciendo,
se debe descomponer en subcomponentes más pequeños (Figura 13).
Cuando ya se tiene clara la jerarquía de componentes se debe crear una versión del
componente que tome el modelo de datos y lo represente, pero sin interactividad. Es
una buena práctica desacoplar estos procesos porque crear una versión estática
requiere mucha escritura sin pensar, y agregar interactividad requiere mucha reflexión
y poca escritura[10].
10
https://en.wikipedia.org/wiki/Single_responsibility_principle
11
https://en.wikipedia.org/wiki/Don%27t_repeat_yourself
32
Gestión del proyecto y tecnologías
Aunque este TFM se centra en el desarrollo de la parte cliente, se explica el resto de las
tecnologías que se han utilizado, tanto la parte de servidor como el resto de las
tecnologías necesarias para el despliegue de la aplicación. Se puede construir de arriba
hacia abajo o al revés. Es decir, se puede comenzar con la construcción de los
componentes de más arriba en la jerarquía o con los de más abajo.
En proyectos simples, generalmente es más fácil ir de arriba a abajo, y en proyectos más
grandes, es más fácil ir de abajo hacia arriba y escribir pruebas a medida que se
construye.
33
Gestión del proyecto y tecnologías
Este sistema facilita a los desarrolladores compartir y reutilizar código generado como
paquetes o a veces también denominados módulos. Al crear un proyecto Node con
NPM, crea por defecto un archivo llamado “package.json” donde viene toda la
configuración previa necesaria para que un proyecto Node pueda ejecutarse[16].
Node.js (de ahora en adelante Node), es un entorno de código abierto 15, multi-
plataforma, para la capa del servidor (pero no limitado a ello), basado en el lenguaje de
programación Javascript, asíncrono 16, con entrada-salida de datos en una arquitectura
12
https://www.redhat.com/es/topics/api/what-are-application-programming-interfaces
13
https://developer.mozilla.org/es/docs/Glossary/REST
14
https://es.wikipedia.org/wiki/Mapeo_objeto-relacional
15
Software distribuido y desarrollado libremente. Se focaliza más en los beneficios prácticos
(acceso al código fuente) que en cuestiones éticas o de libertad que tanto se destacan en el
software libre.
16
La programación asíncrona establece la posibilidad de hacer que algunas operaciones
devuelvan el control al programa llamante antes de que hayan terminado mientras siguen
operando en segundo plano.
34
Gestión del proyecto y tecnologías
Express es una infraestructura para aplicaciones web Node.js. Tiene un tamaño muy
reducido y es muy flexible. Proporciona un conjunto sólido de características para las
aplicaciones web. Con miles de métodos de utilidad para el uso de HTTP y “middleware”
que permiten crear una API rápida, sólida y sencilla[17].
router_animales.route('/animal')
.get(SA_animales.buscarTodosAnimales)
app.listen(config.port, () => {
};
En las primeras dos líneas se incluye el módulo Express y se crea una aplicación de
Express. Este elemento se denomina comúnmente “app”, y posee métodos para el
enrutamiento de las peticiones HTTP.
17
https://developer.mozilla.org/es/docs/Glossary/Callback_function
35
Gestión del proyecto y tecnologías
El bloque final de código define y crea el servidor, que estará escuchando en el puerto
configurado en el archivo de configuración en la variable de entorno “port”.
2.4.5. Heroku
18
https://es.wikipedia.org/wiki/Tipado_fuerte
19
https://elements.heroku.com/addons
20
Plataforma como servicio - “Platform as a services”
36
Gestión del proyecto y tecnologías
Esta plataforma utiliza el modelo de contenedor para ejecutar y escalar todas las
aplicaciones de Heroku. A estos contenedores los denomina “Dynos”. Estos
contenedores son Linux aislados y virtualizados que están diseñados para ejecutar
código en función de un comando especificado por el usuario. Su aplicación puede
escalar a cualquier número específico de Dynos en función de la demanda de
recursos[4].
En este proyecto se enlazan distintos servicios con una rama de Github para generar un
despliegue continuo, es decir, cada vez que existe un cambio en dicha rama se despliega
automáticamente en el servicio asociado:
● Servicio para pre-producción: este servicio se utiliza para probar la aplicación
antes de que pase al servicio de producción.
● Servicio demo: se crea este servicio para poder realizar demostraciones a los
posibles clientes.
2.4.6. CORS
21
Inglés: Cross-Site Scription
37
Gestión del proyecto y tecnologías
CORS define una forma en la cual un navegador y un servidor pueden interactuar para
determinar si es seguro permitir una petición de origen cruzado[20]. Esto permite tener
más libertad y funcionalidad que las peticiones de mismo origen.
Dentro de este proyecto se realiza una especial para CORS en las peticiones que se hacen
a Amazon Web Services (S3) para pedir imágenes22.
22
Configuración CORS Amazon Web Services:
https://docs.aws.amazon.com/es_es/AmazonS3/latest/dev/cors.html
38
3. PLANIFICACIÓN DEL PROYECTO
Planificación del proyecto
o El servicio que tiene toda la lógica de negocio y la expone para que pueda
ser consumida por la plataforma web.
• Los datos de los clientes, usuarios y animales se almacenan en una base de datos
alojada en la nube y accesible solo por la plataforma web.
• Todos los posibles datos y cómo acceder a ello se describirán en una Wiki.
• Se abandonan unos 130.000 animales al año, por lo que la aplicación tiene que
estar preparado para poder soportar con fluidez búsquedas en bases de datos
con miles de animales.
40
Planificación del proyecto
○ Animales:
■ CRUDA.
■ Buscar todos los animales de una protectora.
■ Modificar estado de un animal.
■ Obtener una propiedad concreta de un animal.
■ Subir imagen principal de un animal en AWS S3.
■ Subir galería de imágenes de animal en AWS S3.
■ Subir galería de videos de animales a AWS S3.
■ Obtener imagen principal de animal en AWS S3.
○ Configuración y utilidades:
■ Envío de parámetros de configuración.
■ Obtener datos de geolocalización por código postal.
■ Obtener datos de geolocalización de dirección.
■ Obtener distancia entre dos puntos geográficos.
■ Envío de email a protectora.
23
CRUDA = crear, leer, actualizar y leer todo (Create, Read, Update and All (Read)).
41
Planificación del proyecto
42
Planificación del proyecto
● A intervalos regulares, el equipo reflexiona sobre cómo ser más efectivo para, a
continuación, ajustar y perfeccionar su comportamiento en consecuencia.
3.3.2. SCRUM
43
Planificación del proyecto
● Se decidió que las iteraciones tuvieran una duración de dos semanas. Del tiempo
disponible (académico), se optó por:
○ Se comienza el proyecto a febrero de 2019, dejando el mes de junio de
2019 para redactar la documentación.
● El número de días trabajados por semana serán tres (viernes, sábado y domingo).
Por lo que cada iteración aplica a solo estos tres días.
● Al final de cada iteración se mantiene una reunión para mostrar los resultados
obtenidos durante el mismo. En esta reunión se realizan observaciones de las
24
https://www.netmind.es/knowledge-center/estimando-con-planning-poker-y-story-points/
25
https://www.scrum.org/resources/blog/why-do-we-use-story-points-estimating
44
Planificación del proyecto
a) Inception Deck
Una buena práctica para comenzar un proyecto de software es utilizar Inception Deck.
Son una serie de técnicas conocidas para la toma de requisitos y de customer
engagement 26 que Jonathan Rasmusson recoge en su libro “Agile Samurai 27” [24] .
Estas técnicas hablan de cómo deben participar todos los implicados en el proyecto, con
la intención de que todo el mundo comparta la misma visión del producto, conocer los
riesgos existentes y las necesidades para abordar el proyecto de forma correcta (30).
Todas estas tareas exponen la ruta a seguir que acabará derivando en las historias de
usuario y tareas a desarrollar por el equipo. De esta hoja de ruta también se pueden
26
https://en.wikipedia.org/wiki/Customer_engagement
27
https://pragprog.com/titles/jtrap/the-agile-samurai
45
Planificación del proyecto
estimar unos costes, pero como las metodologías ágiles exigen flexibilidad, es una vista
panorámica inicial que puede variar con el paso de las semanas[25].
Como el inception deck se centra en el entendimiento del cliente con los desarrolladores
y el autor de este TFM es a su vez el propio cliente y se ha partido de una idea previa,
que sería la creación de un servicio donde los clientes puedan registrar su animales y
que potenciales usuarios puedan encontrarlos, no se expone una fase de inception deck,
aunque si se contesta a una de las preguntas que si aporta al proyecto, la estimación y
priorización de características.
Cuando ya se conocen los tiempos y el esfuerzo del proyecto, se puede saber el tiempo
que te llevará realizar cada tarea y si se tienen los recursos suficientes.
Para recoger todas las características del producto se utiliza un Product Backlog donde
quedan reflejadas todas las características de la aplicación. Para cada característica se
asigna el esfuerzo que costaría realizarla. Para ello, se han establecido un total de 100
Story Points (SP) a repartir entre las distintas características. Además, también se asocia
a cada una de ellas una referencia al esfuerzo que conlleva (puntos de esfuerzo: PE) que
oscilan entre 1 y 5 (1 - poco esfuerzo, 5 - mucho esfuerzo). Esta unidad de referencia se
establece como medida comparativa al esfuerzo que costaría crear una fase completa
(crear, leer, modificar, eliminar y listar). Esto permite mantener y priorizar las historias
de usuario asignando unidades de valor a cada historia y se puede ver cómo se quedan
priorizadas en base a las necesidades de la aplicación. En las primeras iteraciones hay
que enfocarse sobre características que aporten mayor valor de negocio y realizar
primero aquellas que sean más críticas.
46
Planificación del proyecto
c) Product Backlog
Las historias de usuario son descripciones breves y simples de una característica contada
desde la perspectiva de la persona que desea la nueva capacidad, generalmente un
usuario o un cliente del sistema. La plantilla que se ha utilizado para la descripción es:
Como <tipo de usuario>, quiero/necesito <un objetivo> para/con la finalidad <un
motivo/finalidad>.
Para detallar las historias de usuario se ha utilizado la plantilla que ofrece Mike Cohn(31)
añadiendo los criterios de aceptación con esta plantilla:
Dada <una situación>, cuando <ocurre algo>, entonces <consecuencia>
ID HUXX
Alias Título
Enunciado Como <tipo de usuario>, quiero <un objetivo>, de forma que <motivo>
Criterios de
Dada <una situación>, cuando <ocurre algo>, entonces <consecuencia>
aceptación
Conversación Detalles
47
Planificación del proyecto
Como sistema,
Enunciado quiero poder entender las tecnologías que queremos utilizar
con la finalidad de poder desarrollar una aplicación web multiplataforma.
Criterios de
-
aceptación
Tecnologías que se han aprendido: React + Redux, Webpack, NodeJS +
Conversación
Express, Amazon Web Services S3 y Heroku.
Esfuerzo: 5
Valor: 50 SP
Prioridad: Alta
Como sistema,
Enunciado quiero poder tener una arquitectura web desplegada
con la finalidad de poder tener disponible una base de la aplicación.
Criterios de
-
aceptación
Conversación -
Esfuerzo: 5
Valor: 50 SP
Prioridad: Alta
48
Planificación del proyecto
ID HU03
ID HU04
Como protectora/usuario,
Enunciado quiero poder ver la información de una protectora,
con la finalidad de poder ver la información.
En el panel de administración o listado de animales, cuando pulse sobre el
Criterios de
perfil de la protectora, se podrán ver los datos de la protectora
aceptación
seleccionada.
Estos datos lo podrán ver las protectoras para consultar sus propios datos o
Conversación los usuarios en el listado de animales. Dentro de este listado de animales se
podrá ver la protectora asociada a cada animal.
Esfuerzo: 2
Valor: 5 SP
Prioridad: Alta
49
Planificación del proyecto
ID HU05
Como protectora,
Enunciado quiero poder modificar la información registrada,
con la finalidad de poder modificar la información.
En el panel de administración de las protectoras, seleccionando la opción
Criterios de
‘modificar perfil’, podré visualizar los datos actualmente registrado y se
aceptación
podrán cambiar los datos registrados y guardarlos.
Conversación
Esfuerzo: 4
Valor: 10 SP
Prioridad: Media
ID HU06
Como protectora,
Enunciado quiero poder eliminar el perfil,
con la finalidad de eliminar el registro de la plataforma
Criterios de En el panel de administración, seleccionando la opción de ‘eliminar cuenta’,
aceptación se eliminan todos los datos de la protectora.
Conversación
Esfuerzo: 1
Valor: 3 SP
Prioridad: Baja
50
Planificación del proyecto
ID HU07
Como usuario,
quiero ver el listado con la información básica de todas las protectoras
Enunciado
registradas en el sistema,
con el objetivo de encontrar la protectora que busco.
Criterios de Accediendo a la opción de ‘ver todas las protectoras’, se podrá ver un listado
aceptación de protectoras con su información básica.
Conversación
Esfuerzo: 1
Valor: 5 SP
Prioridad: Baja
ID HU08
Como protectora,
quiero poder verificar que el email con el que me he registrado me
Enunciado
pertenece,
para poder utilizar la plataforma.
Criterios de Mediante un email que envíe la plataforma a la cuenta de email con el que
aceptación se haya registrado, podrá hacer clic sobre un enlace para verificar la cuenta.
Conversación
Esfuerzo: 2
Valor: 6 SP
Prioridad: Alta
51
Planificación del proyecto
ID HU09
Como protectora,
Enunciado deseo poder reactivar mi cuenta,
para poder acceder de nuevo a la plataforma.
Mediante una opción en la parte de Login, podré introducir un email válido
Criterios de
(que ya haya existido) y podré verificar que la cuenta es mía haciendo clic
aceptación
sobre un enlace que recibiré en la cuenta introducida.
Conversación
Esfuerzo: 1
Valor: 2 SP
Prioridad: Baja
ID HU10
Como protectora,
Enunciado deseo poder acceder a la plataforma,
para poder modificar mis datos o los animales que tenga registrados.
Introduciendo el email y la contraseña con la que se hizo el registro y
Criterios de
pulsando en el botón “Login”, podré acceder al panel de administración que
aceptación
ofrece la plataforma.
Conversación
Esfuerzo: 2
Valor: 10 SP
Prioridad: Alta
52
Planificación del proyecto
ID HU11
Como protectora,
Enunciado quiero poder registrar una imagen principal,
para que sea la imagen que aparezca en la información básica.
Criterios de En el registro de la información, habrá un apartado donde pueda seleccionar
aceptación o arrastrar una imagen, recortarla y seleccionarla como imagen principal.
Conversación
Esfuerzo: 4
Valor: 9 SP
Prioridad: Alta
ID HU12
Como protectora/usuario,
Enunciado quiero poder obtener la imagen principal de una protectora,
para poder asociar la imagen con la protectora
Criterios de En la información de la protectora, existirá una parte donde se pueda
aceptación visualizar la imagen principal de una protectora (Logo).
Conversación
Esfuerzo: 2
Valor: 8 SP
Prioridad: Alta
53
Planificación del proyecto
ID HU13
Como protectora,
Enunciado quiero poder subir imágenes de la protectora,
para que los usuarios puedan visualizarlas.
En el registro de la información, habrá un apartado donde se puedan
Criterios de
seleccionar o arrastrar varias imágenes y recortarlas. Cuando se pulse al
aceptación
botón guardar se subirán al servicio de Amazon Web Services S3.
Conversación
Esfuerzo: 5
Valor: 10 SP
Prioridad: Baja
ID HU14
Como protectora,
Enunciado quiero poder subir videos de la protectora,
para que los usuarios puedan visualizarlos.
En el registro de la información, habrá un apartado donde se puedan
Criterios de
seleccionar o arrastrar videos. Cuando se pulse el botón guardar se subirán
aceptación
al servicio de Amazon Web Services S3.
Conversación
Esfuerzo: 5
Valor: 10 SP
Prioridad: Baja
54
Planificación del proyecto
ID HU15
Como protectora/usuario,
Enunciado quiero poder obtener las imágenes de una protectora,
para poder ver cómo es la protectora.
Criterios de En el detalle de una protectora, además de ver sus datos se podrán visualizar
aceptación imágenes de la protectora.
Esfuerzo: 3
Valor: 7 SP
Prioridad: Alta
ID HU16
Como protectora/usuario,
Enunciado quiero poder obtener los videos de una protectora,
para poder ver cómo es la protectora.
Criterios de Cuando se cargue la información de la protectora, existirá la posibilidad de
aceptación visualizar videos de la protectora.
Esfuerzo: 3
Valor: 7 SP
Prioridad: Baja
55
Planificación del proyecto
ID HU17
Como protectora,
quiero poder seleccionar de mis teléfonos registrados por cuales se pueden
Enunciado
contactar por whatsapp,
para que el sistema ofrezca solo esos nùmeros como contacto vía whatsapp.
En el registro de la protectora, habrá un campo donde se podrán meter
números móviles y existirá la posibilidad de colocar estos móviles como
Criterios de
“contacto vía whatsapp”. Los usuarios de la plataforma podrán seleccionar
aceptación
el número con el que quieren contactar y abrirá de forma automática la
aplicación Whatsapp.
Conversación
Esfuerzo: 3
Valor: 8 SP
Prioridad: Alta
ID HU18
Como protectora,
Enunciado deseo poder registrar un animal,
para que los usuarios puedan verlos.
En el panel de administración existirá la posibilidad de registrar un animal
Criterios de pulsando un botón. Rellenando los datos y las imágenes deberán registrarse
aceptación en el sistema. Estos datos deberán poder visualizarlos los usuarios en el
listado de animales sí coinciden con los filtros.
Conversación
Esfuerzo: 5
Valor: 10 SP
Prioridad: Alta
56
Planificación del proyecto
ID HU19
Como protectora,
Enunciado deseo poder visualizar la información de un animal,
para conocer la información de un animal.
En el panel de administración habrá un botón para listar los animales que
Criterios de
tiene registrados una protectora. En este listado se podrá seleccionar un
aceptación
animal para conocer más información.
Conversación
Esfuerzo: 3
Valor: 5 SP
Prioridad: Alta
ID HU20
Como protectora,
Enunciado deseo poder modificar los datos de un animal,
para que pueda corregir la información de un animal.
En cada detalle del animal, habrá un botón para poder modificar los datos.
Criterios de Una vez modificados, si se pulsa el botón guardar se sobrescriben los datos
aceptación en el sistema. Estos datos deberán poder visualizarse de forma correcta en
el listado de animales que visualizan los usuarios en el sistema.
Conversación
Esfuerzo: 5
Valor: 10 SP
Prioridad: Media
57
Planificación del proyecto
ID HU21
Como protectora,
Enunciado quiero poder eliminar un animal,
para que no aparezca en el listado de animales.
Criterios de En cada detalle del animal habrá un botón para eliminar. Si se elimina dejará
aceptación de aparecer en el listado de animales.
Conversación
Esfuerzo: 2
Valor: 2 SP
Prioridad: Baja
ID HU22
Como protectora/usuario,
Enunciado quiero poder listar animales según un filtro,
para poder seleccionar el que busco o realizar tareas de administración.
Criterios de Tanto en el panel de administración como en la búsqueda de usuarios se
aceptación podrán visualizar todos los animales según un filtro específico.
En el listado de animales existirá un filtro con el que buscar los animales que
Conversación
aparecen en dicho listado.
Esfuerzo: 5
Valor: 5 SP
Prioridad: Alta
58
Planificación del proyecto
ID HU23
Como protectora,
Enunciado quiero poder registrar una imagen principal,
para que en los listados aparezca por defecto esta imagen.
En el registro de la información de un animal, habrá un apartado donde
Criterios de
pueda seleccionar o arrastrar una imagen, recortarla y seleccionarla como
aceptación
imagen principal.
Conversación
Esfuerzo: 4
Valor: 9 SP
Prioridad: Media
ID HU24
Como protectora/usuario,
Enunciado quiero poder obtener la imagen principal de un animal,
para poder asociar los datos de un animal a una imagen.
Criterios de En la información del animal, existirá una parte donde se pueda visualizar la
aceptación imagen principal de un animal.
Conversación
Esfuerzo: 2
Valor: 8 SP
Prioridad: Alta
59
Planificación del proyecto
ID HU25
Como protectora,
Enunciado quiero poder subir imágenes de un animal,
para que los usuarios puedan visualizarlas en el listado.
En el registro de la información de un animal seleccionado, habrá un
Criterios de apartado donde se puedan seleccionar o arrastrar varias imágenes y
aceptación recortarlas. Cuando se pulse el botón guardar se subirán al servicio de
Amazon Web Services S3 y quedará vinculadas a ese animal.
Conversación
Esfuerzo: 4
Valor: 5 SP
Prioridad: Alta
ID HU26
Como protectora,
Enunciado quiero poder subir videos de los animales,
para que los usuarios puedan visualizarlos.
En el registro de la información de un animal seleccionado, habrá un
Criterios de apartado donde se puedan seleccionar o arrastrar videos. Cuando se pulse
aceptación el botón guardar se subirán al servicio de Amazon Web Services S3 y
quedarán vinculados a ese animal.
Conversación
Esfuerzo: 4
Valor: 5 SP
Prioridad: Baja
60
Planificación del proyecto
ID HU 27
Como protectora/usuario,
Enunciado quiero poder obtener las imágenes de un animal,
para poder ver como es el animal.
Criterios de En el detalle de un animal, además de ver sus datos se podrán visualizar
aceptación imágenes del animal.
Esfuerzo: 2
Valor: 7 SP
Prioridad: Alta
ID HU28
Como usuario,
Enunciado quiero poder contactar con una protectora,
para obtener más información de un animal o adoptarlo.
Cuando se seleccione un animal dentro del listado de animales, nos dará la
opción de poder contactar con la protectora que ha subido el animal vía
Criterios de
email. Dentro de este panel, podemos poner el email, el asunto (que ya
aceptación
estarán preestablecidos) y el cuerpo del mensaje. Al pulsar enviar le llegará
al email que haya registrado dicha protectora.
Conversación
Esfuerzo: 2
Valor: 9 SP
Prioridad: Alta
61
Planificación del proyecto
ID HU29
Como usuario,
Enunciado quiero poder añadir un animal a mi lista de favoritos,
para poder tener localizados en un sitio los que me gustan
En el listado de animales, existirá un icono (por ejemplo, un corazón), que si se
Criterios de pulsa se guardará en un listado de favoritos la información de un animal. Si
aceptación pulsamos sobre un icono de favorito en un animal que ya lo es se eliminará del
listado.
Conversación
Esfuerzo: 1
Valor: 2 SP
Prioridad: Baja
ID HU30
Como usuario,
Enunciado quiero poder eliminar un animal de la lista de favoritos,
para poder eliminar los que ya no me interesan
En la lista de animales favoritos, existirá una opción para eliminar el animal
Criterios de
de la lista de favoritos. Si pulsamos sobre esta opción dejará de visualizarse
aceptación
este animal en el listado de favoritos.
Conversación
Esfuerzo: 1
Valor: 2 SP
Prioridad: Baja
62
Planificación del proyecto
63
Planificación del proyecto
d) Desarrollo de sprints
Por tanto, para este sprint se han identificado las siguientes tareas estimando el
esfuerzo con Planning poker:
Esfuerzo 21
Tiempo estimado 40
Tiempo dedicado 46
Comentarios
Esfuerzo 13
Comentarios
Esfuerzo 8
Tiempo estimado 20
Tiempo dedicado 18
Comentarios
64
Planificación del proyecto
Esfuerzo 8
Tiempo estimado 6
Tiempo dedicado 10
Comentarios
Guía de estilos:
Para facilitar el diseño de los componentes, se crea una guía de estilos que facilite la
creación de los componentes React. Ver Anexo A.
Sprint Review:
En este primer sprint el sprint review no es de gran utilidad ya que fue una fase de
investigación.
Esfuerzo 21
Tiempo estimado 18
Tiempo dedicado 21
Comentarios
65
Planificación del proyecto
Esfuerzo 13
Tiempo estimado 10
Tiempo dedicado 10
Comentarios
Esfuerzo 5
Tiempo estimado 15
Tiempo dedicado 18
Comentarios
Esfuerzo 3
Tiempo estimado 2
Tiempo dedicado 3
Comentarios
Esfuerzo 5
Tiempo estimado 1
Tiempo dedicado 1
Comentarios
66
Planificación del proyecto
Esfuerzo 5
Tiempo estimado 2
Tiempo dedicado 2
Comentarios
En esta tarea se genera el marco estructural de archivos y carpetas necesarias para que
el proyecto sea legible. Para hacer esto, la documentación de React y Redux
proporcionan una guía de buenas prácticas en la que se basa este proyecto (incluso
proporciona un cliente para generar un proyecto React básico) 28.
28
https://es.reactjs.org/docs/create-a-new-react-app.html
67
Planificación del proyecto
68
Planificación del proyecto
● app.js: Este fichero contiene toda la información para crear un servidor capaz de
servir la aplicación.
69
Planificación del proyecto
○ Autor.
○ Versión.
Sprint Review
En este sprint se aprovechó esta reunión para comprobar que la arquitectura de cliente
y la de servidor se integran correctamente, ya que el autor de este TFM solo investigó la
arquitectura de cliente.
En este sprint se lleva a cabo el módulo de protectora. El total de horas asociadas a este
sprint son 48 horas. Las historias de usuario asociadas a este sprint se dividen en las
siguientes tareas:
70
Planificación del proyecto
Esfuerzo 13
Tiempo estimado 11
Tiempo dedicado 6
Comentarios
Esfuerzo 3
Tiempo estimado 2
Tiempo dedicado 1
Comentarios
Esfuerzo 21
Tiempo estimado 12
Tiempo dedicado 21
Comentarios
HU03 Crear protectora / T03_04 Conectar cliente con servidor para registrar protectora
Esfuerzo 5
Tiempo estimado 3
Tiempo dedicado 3
Comentarios
71
Planificación del proyecto
Esfuerzo 5
Tiempo estimado 6
Tiempo dedicado 3
HU04 Leer protectora / T04_02 Conectar cliente con el servidor para leer una protectora
Esfuerzo 5
Tiempo estimado 3
Tiempo dedicado 3
Comentarios
Esfuerzo 21
Tiempo estimado 8
Tiempo dedicado 21
Comentarios
HU05 Modificar protectora / T05_02 Conectar cliente con servidor para modificar protectora
Esfuerzo 5
Tiempo estimado 3
Tiempo dedicado 3
Comentarios
72
Planificación del proyecto
Modelo de datos:
{
nombre: {type: String, required: false, unique: true},
password: {type: String, required: true},
NIF: {type: String, required: false},
URL: {type: String},
facebook: {type: String},
instagram: {type: String},
twitter: {type: String},
descripcion: {type: String},
direccion: {
calle: {type: String, required: true},
numero: {type: Number},
29
https://developer.mozilla.org/es/docs/Learn/JavaScript/Objects/JSON
73
Planificación del proyecto
74
Planificación del proyecto
Para conectar los componentes de la aplicación con los datos del servidor se utiliza
peticiones al servidor bajo el protocolo HTTP 30. Los endpoints que proporciona el
servidor para estas tareas son:
URL /protectora
Método POST
Parámetros URL -
Parámetros Query -
{
nombre: {type: String, required: true, unique:true},
password: {type:String, required:true},
cod_Postal: {type: String, required: true},
calle: {type: String, required: true, formato: "<NOMBRE_CALLE>"},
numero: {type: Number, required: true, formato: "<NUMERO>"},
NIF: {type: String, required: true},
URL: {type: String},
facebook: {type: String},
instagram: {type: String},
Parámetros en el Body twitter: {type: String},
descripcion: {type: String},
telefonos: [
{
telefono:String,
WhatsApp:Boolean
}
],
email: {type: String, required: true, unique:true},
realiza_envios: {type: Boolean, default: false},
}
30
https://developer.mozilla.org/es/docs/Web/HTTP/Methods
75
Planificación del proyecto
URL /protectora
Método PUT
Parámetros URL -
Parámetros Query -
{
nombre: {type: String, required: true, unique:true},
cod_Postal: {type: String, required: true},
Parámetros en el Body calle: {type: String, required: true, formato: "<NOMBRE_CALLE>"},
numero: {type: Number, required: true, formato: "<NUMERO>"}
URL: {type: String},
facebook: {type: String},
76
Planificación del proyecto
code: 502
content: error.DIRECCION_MAL_ESPECIFICADA
URL /protectora/:id
Método GET
77
Planificación del proyecto
● básica
{
logo,
nombre,
direccion,
estado,
telefonos,
emails
}
● parcial (+ basica)
{
logo,
nombre,
direccion,
NIF,
URL,
facebook,
instagram,
twitter,
descripcion,
email,
estado,
fecha_registro,
realiza_envios,
telefonos,
visitas_recibidas,
}
● pesada (+ parcial)
{
logo,
nombre,
galeria_imagenes,
galeria_videos,
}
78
Planificación del proyecto
● completa (+ pesada)
{
logo,
nombre,
direccion,
NIF,
URL,
facebook,
instagram,
twitter,
descripcion,
realiza_envios,
email,
estado,
telefonos,
visitas_recibidas,
galeria_imagenes,
galeria_videos,
password
}
Parámetros en el Body -
Code: 200
Respuesta satisfactoria
Content: JSON Proyección parámetro :tipo
Code: 404 - NOT_FOUND
79
Planificación del proyecto
URL /protectora
Método POST
Parámetros URL -
Parámetros Query -
{
nombre: {type: String, required: true, unique:true},
password: {type:String, required:true},
cod_Postal: {type: String, required: true},
calle: {type: String, required: true, formato: "<NOMBRE_CALLE>"},
numero: {type: Number, required: true, formato: "<NUMERO>"},
NIF: {type: String, required: true},
URL: {type: String},
facebook: {type: String},
instagram: {type: String},
twitter: {type: String},
Parámetros en el Body
descripcion: {type: String},
telefonos: [
{
telefono:String,
WhatsApp:Boolean
}
],
email: {type: String, required: true, unique:true},
realiza_envios: {type: Boolean, default: false},
}
80
Planificación del proyecto
Crear protectora y Modificar protectora - Obtener datos dirección por código postal
URL /utils/GeocodeByCodPostal
Método GET
Parámetros URL -
Requeridos:
Parámetros Query ● :cod_postal
● :pais (por defecto España)
Parámetros en el Body -
Code: 200
Content:
Content:
{
"cod_Postal": "28200",
Respuesta satisfactoria "municipio": "San Lorenzo de El Escorial",
"provincia": "Madrid",
"comunidad": "Comunidad de Madrid",
"pais": "España"
}
81
Planificación del proyecto
URL /protectora/:id/whatsapp
Método GET
Required:
Parámetros URL
● id=[MongoID]
Parámetros Query -
Parámetros en el Body -
Code: 200
Content:
Content:
{
"totalRecord": <NUMERO DE WHATSAPP ACTIVOS>,
"result": {
"_id": <ID PROTECTORA>,
"telefonos": [
Respuesta satisfactoria {
"telefono": "676736397",
"WhatsApp": true,
"_id": "5b22f2f93284b110015a29b5"
}
]
}
}
82
Planificación del proyecto
Componentes
Los componentes que se han diseñado e implementado para estas historias de usuario
son:
● Componentes de formulario
83
Planificación del proyecto
84
Planificación del proyecto
● Componentes Alerts:
85
Planificación del proyecto
Sprint Review
Después del desarrollo de esta iteración y comprobado que se cumplen los criterios de
aceptación, se realizaron las siguientes observaciones:
● Revisar los posibles problemas por CORS 31.
● Crear un control de errores genérico. Para ello el servidor tendría que devolver
un mensaje de error para que el cliente simplemente lo muestre.
En este sprint se lleva a cabo el módulo de animales. El total de horas asociadas a este
sprint son 48 horas.
Las historias de usuario asociadas a este sprint se dividen en las siguientes tareas:
31
https://developer.mozilla.org/es/docs/Web/HTTP/Access_control_CORS
86
Planificación del proyecto
Esfuerzo 21
Tiempo estimado 15
Tiempo dedicado 18
Comentarios
HU18 Crear animal/ T18_02 Conectar cliente con servidor para crear animal
Esfuerzo 5
Tiempo estimado 2
Tiempo dedicado 2
Comentarios
Esfuerzo 8
Tiempo estimado 4
Tiempo dedicado 4
HU19 Leer protectora / T19_02 Conectar cliente con el servidor para leer un animal
Esfuerzo 5
Tiempo estimado 2
Tiempo dedicado 2
Comentarios
87
Planificación del proyecto
Esfuerzo 5
Tiempo estimado 3
Tiempo dedicado 8
Comentarios
Esfuerzo 13
Tiempo estimado 8
Tiempo dedicado 10
Comentarios
Esfuerzo 13
Tiempo estimado 12
Tiempo dedicado 15
Comentarios
HU20 Modificar animal / T20_02 Conectar cliente con servidor para modificar animal
Esfuerzo 5
Tiempo estimado 2
Tiempo dedicado 2
Comentarios
88
Planificación del proyecto
Modelo de datos:
{
nombre: {type: String},
especie: {type: String, enum: parametros.especie_animal, required: true},
raza: {type: String, enum: [].concat(parametros.razas_Gato, parametros.razas_Perro),
required: true},
mestizo: {type: Boolean, required: true},
sexo: {type: String, enum: parametros.sexos, required: true},
tamano: {type: String, enum: parametros.tamaños_animal, required: true},
edad: {type: String, enum: parametros.edades_animal, required: true},
ppp: {type: Boolean},
color: {type: [String]},
32
https://developer.mozilla.org/es/docs/Learn/JavaScript/Objects/JSON
89
Planificación del proyecto
Para conectar los componentes de la aplicación con los datos del servidor se utiliza
peticiones al servidor bajo el protocolo HTTP 33. Los endpoints que proporciona el
servidor para estas tareas son:
33
https://developer.mozilla.org/es/docs/Web/HTTP/Methods
90
Planificación del proyecto
URL /animal
Método POST
Parámetros URL -
Parámetros Query -
{
nombre: {type: String},
especie: {type: String, enum: parametros.especie_animal,
required: true},
raza: {type: [String], enum: `parametros.raza_Perro o Gato`,
required: true},
mestizo: {type: Boolean, required: true},
sexo: {type: String, enum: parametros.sexos, required: true},
tamano: {type: String, enum: parametros.tamanos_animal,
required: true},
edad: {type: String, enum: parametros.edades_animal, required:
true},
Parámetros en el Body ppp: {type: Boolean, required: true},
color: {type: [String], required: true},
caracter: {type: [String], required: true},
chip: {type: Boolean, required: true},
descripcion: {type: String, required: true},
esterilizado: {type: Boolean, required: true},
enfermedades: {type: Boolean, default:false},
vacunas: {type: Boolean, required: true},
fecha_entrada_Protectora: {type: Date, required: true, formato:
"<AAAA-MM-DD>"},
estado: {type: String, enum: parametros.estados_animal,
required: true}
}
91
Planificación del proyecto
Code: 200
Respuesta satisfactoria
Content: JSON con proyección pedida
Code: 400 - BAD REQUEST
Content: Array de parámetros erróneos
URL /animal/:id
Método PUT
Parámetros Query -
{
nombre: {type: String},
especie: {type: String, enum: parametros.especie_animal,
required: true},
Parámetros en el Body
raza: {type: [String], enum: `parametros.raza_Perro o Gato`,
required: true},
mestizo: {type: Boolean, required: true},
sexo: {type: String, enum: parametros.sexos, required: true},
92
Planificación del proyecto
Code: 200
Respuesta satisfactoria
Content: JSON con proyección pedida
Code: 400 - BAD REQUEST
Content: Array de parámetros erroneos
93
Planificación del proyecto
content:
● ERROR_BUSCAR_ANIMAL
● ENTIDAD_DUPLICADA
● ERROR_AL_REGISTRAR_ANIMAL
URL /animal/:id
Método GET
● básica
{
nombre,
protectora,
lugar,
estado,
especie,
raza,
mestizo,
Parámetros Query sexo,
ppp,
visitas_recibidas,
fecha_registro,
img_principal,
}
● parcial (+ basica)
{
img_principal,
nombre,
protectora,
especie,
94
Planificación del proyecto
raza,
mestizo,
sexo,
tamano,
edad,
ppp,
color,
caracter,
chip,
descripcion,
esterilizado,
enfermedades,
vacunas,
lugar,
fecha_entrada_Protectora,
fecha_registro,
fecha_Adopcion,
estado,
visitas_recibidas,
}
● pesada (+ parcial)
{
img_principal,
nombre,
protectora,
galeria_imagenes,
galeria_videos,
}
● completa (+ pesada)
{
img_principal,
nombre,
protectora,
95
Planificación del proyecto
especie,
raza,
mestizo,
sexo,
tamano,
edad,
ppp,
color,
caracter,
chip,
descripcion,
esterilizado,
enfermedades,
vacunas,
lugar,
fecha_entrada_Protectora,
fecha_registro,
fecha_Adopcion,
estado,
visitas_recibidas,
galeria_imagenes,
galeria_videos,
}
● Protectora Embebida:
{
nombre,
email,
telefonos,
URL,
}
:conP = [false, true] -> Por defecto: true (Inserta subdocumento
con la protectora).
Parámetros en el Body -
96
Planificación del proyecto
Code: 200
Respuesta satisfactoria
Content: JSON Proyección pedida
Code: 404 - NOT_FOUND
URL /animal
Método GET
Parámetros URL -
● Opcional:
○ :tipo = [‘basica’, ‘parcial’, ‘pesada’, ‘completa’] ->
Por defecto ‘basica’
Parámetros Query
○ Config
■ :num -> default 10
■ :pag -> default 0
Parámetros en el Body -
Code: 200
Respuesta satisfactoria
Content: JSON proyección pedida.
Code: 403 - FORBIDDEN
Content: errror.EMAIL_DUPLICADO
Respuesta de error
Code: 400 - BAD REQUEST
Content: Array de parámetros erroneos
97
Planificación del proyecto
URL /protectora/:id_prot/animales
Método GET
● Opcional:
○ :tipo = [‘basica’, ‘parcial’, ‘pesada’, ‘completa’] ->
Por defecto ‘basica’
Parámetros Query
○ Config
■ :num -> default 10
■ :pag -> default 0
Parámetros en el Body -
Code: 200
Respuesta satisfactoria
Content: JSON proyección pedida.
Code: 400 - BAD REQUEST
Content: Array de parámetros erroneos
Componentes
Los componentes que se han diseñado e implementado para estas historias de usuario
son:
98
Planificación del proyecto
99
Planificación del proyecto
100
Planificación del proyecto
101
Planificación del proyecto
Sprint Review
Después del desarrollo de esta iteración y comprobado que se cumplen los criterios de
aceptación, se realizaron las siguientes observaciones:
● Los componentes se están realizando correctamente ya que se están generando
lo más desacoplados posible para que sean lo más reutilizables.
● Los filtros podrían ser activados o desactivados en vez de filtrar siempre por
todos.
● Cuando se hace una recarga de datos cambiando los filtros queda la cabecera
demasiado pegada a la parte superior.
102
Planificación del proyecto
● Se han estimado las tareas de una forma demasiado optimista, por lo que no se
llegaba a tiempo.
Esfuerzo 13
Tiempo estimado 13
Tiempo dedicado 13
Comentarios
HU10 login protectora / T10_02 Conectar cliente con servidor para login protectora
Esfuerzo 3
Tiempo estimado 2
Tiempo dedicado 2
Comentarios
HU11 Subir imagen principal de protectora a AWS S3 / T11_01 Crear componente Drag &
Drop & Crop
Esfuerzo 21
Tiempo estimado 21
Tiempo dedicado 25
Comentarios
103
Planificación del proyecto
HU11 Subir imagen principal de protectora a AWS S3 / T11_02 Introducir el componente Drag
& Drop & Crop en formulario protectora
Esfuerzo 5
Tiempo estimado 4
Tiempo dedicado 3
Comentarios
HU11 Subir imagen principal de protectora a AWS S3 / T11_02 conectar el componente Drag
& Drop & Crop parte protectora al servidor
Esfuerzo 3
Tiempo estimado 2
Tiempo dedicado 2
Comentarios
HU23 Subir imagen principal de protectora a AWS S3 / T23_01 Introducir el componente Drag
& Drop & Crop en formulario animales
Esfuerzo 5
Tiempo estimado 4
Tiempo dedicado 4
Comentarios
HU23 Subir imagen principal de protectora a AWS S3 / T23_02 conectar el componente Drag
& Drop & Crop parte animales al servidor
Esfuerzo 3
Tiempo estimado 2
Tiempo dedicado 2
Comentarios
104
Planificación del proyecto
Para conectar los componentes de la aplicación con los datos del servidor se utiliza
peticiones al servidor bajo el protocolo HTTP 34. Los endpoints que proporciona el
servidor para estas tareas son:
Login protectora
URL /login/protectora
Método GET
Parámetros URL -
Parámetros Query -
Parámetros en el Body
34
https://developer.mozilla.org/es/docs/Web/HTTP/Methods
105
Planificación del proyecto
Componente Drag & Drop & Crop - Subir imagen principal de una protectora a AWS S3
URL /protectora/:id/imagen
Método PUT
Parámetros Query -
:imagen
Parámetros en el Body
Code: 200
Respuesta satisfactoria
Content: empty
Code: 400 - BAD REQUEST
Content1: Array de parámetros erróneos
Content2: IMAGEN_REQUERIDA
106
Planificación del proyecto
Componente Drag & Drop & Crop - Subir imagen principal de un animal a AWS S3
URL /animal/:id/imagen
Método PUT
Parámetros Query -
:imagen
Parámetros en el Body
Code: 200
Content: empty
Respuesta satisfactoria
Code: 201
Content: {_id: animal._id}
Code: 400 - BAD REQUEST
Content1: Array de parámetros erróneos
Content2: IMAGEN_REQUERIDA
107
Planificación del proyecto
Componentes
Los componentes que se han diseñado e implementado para estas historias de usuario
son:
● Componentes de formulario para login de protectora en el sistema:
108
Planificación del proyecto
Sprint Review
109
Planificación del proyecto
HU12 Obtener imagen principal protectora / T12_01 Crear componente para cargar imágenes
Esfuerzo 13
Tiempo estimado 12
Tiempo dedicado 10
Comentarios
HU12 Obtener imagen principal protectora / T12_02 Incorporar componente para cargar
imágenes en el componente de información de una protectora
Esfuerzo 5
Tiempo estimado 5
Tiempo dedicado 4
Comentarios
HU12 Obtener imagen principal protectora / T12_03 Conectar cliente con servidor para cargar
imagen principal de la protectora
Esfuerzo 3
Tiempo estimado 2
Tiempo dedicado 2
Comentarios
110
Planificación del proyecto
HU24 Obtener imagen principal animal / T24_01 Incorporar componente para cargar
imágenes en el componente de información de animal
Esfuerzo 5
Tiempo estimado 5
Tiempo dedicado 4
Comentarios
HU24 Obtener imagen principal animal / T24_02 Conectar cliente con servidor para cargar
imagen principal de un animal
Esfuerzo 3
Tiempo estimado 2
Tiempo dedicado 2
Comentarios
HU28 Envío de email a protectora/ T28_01 Crear componente para contactar vía email
Esfuerzo 3
Tiempo estimado 2
Tiempo dedicado 2
Comentarios
HU28 Envío de email a protectora/ T28_02 Conectar cliente con servidor para envio de email
a protectora
Esfuerzo 3
Tiempo estimado 2
Tiempo dedicado 2
Comentarios
111
Planificación del proyecto
Para conectar los componentes de la aplicación con los datos del servidor se utiliza
peticiones al servidor bajo el protocolo HTTP 35. Los endpoints que proporciona el
servidor para estas tareas son:
URL /protectora/:id/imagen
Método GET
Parámetros Query -
Parámetros en el Body
35
https://developer.mozilla.org/es/docs/Web/HTTP/Methods
112
Planificación del proyecto
Code: 200
Content:
{
"logo": {
Respuesta satisfactoria data: <IMAGEN_CODIFICADA_EN_BASE64>,
contentType: <ContentType>
}
}
URL /animal/:id/imagen
Método GET
Parámetros Query -
Parámetros en el Body
113
Planificación del proyecto
Code: 200
Content:
{
"logo": {
Respuesta satisfactoria data: <IMAGEN_CODIFICADA_EN_BASE64>,
contentType: <ContentType>
}
}
URL /utils/enviarEmail
Método POST
Parámetros URL -
Parámetros Query -
● Required:
○ fromEmail -> [Email] Email origen
Parámetros en el Body ○ tipoEmail -> [String] Tipo email que se va a enviar
○ protectora -> [MongoID] ID de la protectora a la que
se le manda email
114
Planificación del proyecto
Componentes
Los componentes que se han diseñado e implementado para estas historias de usuario
son:
● Componente para cargar imagen principal:
115
Planificación del proyecto
Sprint Review
116
Planificación del proyecto
En este sprint se incluye el contacto con una protectora por whatsapp y se crea la lógica
para verificar que la cuenta con la que se registra una protectora es válida y la pertenece.
HU17 Gestión de whastapp de una protectora/ T17_01 Crear componente para habilitar
whatsapp en un móvil de protectora
Esfuerzo 13
Tiempo estimado 10
Tiempo dedicado 10
Comentarios
HU17 Gestión de whastapp de una protectora / T17_02 Conectar cliente con servido para
comunicar que móvil tiene habilitado whatsapp
Esfuerzo 5
Tiempo estimado 3
Tiempo dedicado 3
Comentarios
HU17 Gestión de whatsapp de una protectora / T17_03 Crear componente para que un
usuario pueda contactar con la protectora vía whatsapp
Esfuerzo 21
Tiempo estimado 13
Tiempo dedicado 13
Comentarios
117
Planificación del proyecto
HU17 Gestión de whatsapp de una protectora / T17_03 Crear conexión con la api de whatsapp
Esfuerzo 13
Tiempo estimado 12
Tiempo dedicado 12
Comentarios
HU08 Verificar cuenta protectora / T08_01 Crear un email para verificar una cuenta de una
protectora
Esfuerzo 13
Tiempo estimado 8
Tiempo dedicado 8
Comentarios
118
Planificación del proyecto
Para conectar los componentes de la aplicación con los datos del servidor se utiliza
peticiones al servidor bajo el protocolo HTTP 36. Los endpoints que proporciona el
servidor para estas tareas son:
URL /protectora/:id/whatsapp
Método GET
Parámetros Query -
-
Parámetros en el Body
Code: 200
Content:
{
"totalRecord": <NUMERO DE WHATSAPP ACTIVOS>,
"result": {
"_id": <ID PROTECTORA>,
"telefonos": [
{
Respuesta satisfactoria
"telefono": "676736397",
"WhatsApp": true,
"_id": "5b22f2f93284b110015a29b5"
}
]
}
}
36
https://developer.mozilla.org/es/docs/Web/HTTP/Methods
119
Planificación del proyecto
URL /protectora/verificar/:id/:token
Método PUT
id=[MongoID]
Parámetros URL
token=[string 16byte base64]
Parámetros Query -
-
Parámetros en el Body
Code: 200
Respuesta satisfactoria
Content: OK
Code: 400 - BAD REQUEST
Content1: Array de parámetros erróneos
Respuesta de error
Code: 404 - NOT FOUND
120
Planificación del proyecto
Componentes
Los componentes que se han diseñado e implementado para estas historias de usuario
son:
● Contacto vía whatsapp:
Sprint Review
● En este último Sprint Review se revisa que todas las historias de usuario estén
implementadas.
121
4. CONCLUSIONES Y POSIBLES AMPLIACIONES
Conclusiones y posibles ampliaciones
En este apartado se analizan las conclusiones a las que se ha llegado desarrollando este
proyecto y los posibles trabajos futuros a realizar.
4.1. Conclusiones
37
https://es.wikipedia.org/wiki/Servicio_de_mensajes_cortos
123
Conclusiones y posibles ampliaciones
● Mejorar el listado de animales para que sea una lista virtualizada y mejorar la
experiencia de usuario.
38
https://es.reactjs.org/docs/hooks-intro.html
124
5. BIBLIOGRAFÍA
Bibliografía
126
Bibliografía
[13] R. Borillo, «Da potencia y flexibilidad a tus tests con Jest», Genbeta, 27-jun-2018.
[En línea]. Disponible en: https://www.genbeta.com/desarrollo/da-potencia-
flexibilidad-tus-tests-jest. [Accedido: 25-jun-2019].
[14] «Jest · 🃏 Delightful JavaScript Testing». [En línea]. Disponible en: https://jestjs.io/.
[Accedido: 25-jun-2019].
[15] «REST», Documentación web de MDN. [En línea]. Disponible en:
https://developer.mozilla.org/es/docs/Glossary/REST. [Accedido: 26-may-2019].
[16] «Express Web Framework (Node.js/JavaScript)», Documentación web de MDN. [En
línea]. Disponible en: https://developer.mozilla.org/es/docs/Learn/Server-
side/Express_Nodejs. [Accedido: 26-may-2019].
[17] «Express - Infraestructura de aplicaciones web Node.js». [En línea]. Disponible en:
https://expressjs.com/es/. [Accedido: 26-may-2019].
[18] yANyZx Rock, «MongoDB: ¿qué es, cómo funciona?», yANyZx Rock, 06-jul-2017. .
[19] «Cross-domain Ajax with Cross-Origin Resource Sharing - Human Who Codes». [En
línea]. Disponible en: https://humanwhocodes.com/blog/2010/05/25/cross-
domain-ajax-with-cross-origin-resource-sharing/. [Accedido: 03-jun-2019].
[20] «cross-site xmlhttprequest with CORS – Mozilla Hacks - the Web developer blog»,
Mozilla Hacks – the Web developer blog. [En línea]. Disponible en:
https://hacks.mozilla.org/2009/07/cross-site-xmlhttprequest-with-cors.
[Accedido: 03-jun-2019].
[21] «Qué es SCRUM», Proyectos Ágiles, 04-ago-2008. .
[22] A. Mammut, «Empezar proyectos agiles “Agile Inception”», Agile Mammut, 08-
ago-2017. .
[23] «El manifiesto ágil - Scrum Manager BoK». [En línea]. Disponible en:
https://www.scrummanager.net/bok/index.php?title=El_manifiesto_%C3%A1gil.
[Accedido: 09-jun-2019].
[24] s|ngular, «¿Trabajas con Scrum? ¿Te suena “Inception Deck”?» [En línea].
Disponible en: http://blog.sngular.team/trabajas-con-scrum-te-suena-inception-
deck. [Accedido: 09-jun-2019].
[25] «The Agile Inception Deck», The Agile Warrior, 06-nov-2010. .
127
ANEXO A. GUÍA DE ESTILO
Anexo A: guía de estilo
129
Anexo A: guía de estilo
130
Anexo A: guía de estilo
131
Anexo A: guía de estilo
132
Anexo A: guía de estilo
133
Anexo A: guía de estilo
134
Anexo A: guía de estilo
135
Anexo A: guía de estilo
136