Logo Studenta

lrosalesc

¡Este material tiene más páginas!

Vista previa del material en texto

TREBALL FINAL DE GRAU 
 
 
 
 
 
Resumen
En estos días, donde todo el mundo intenta encontrar la manera de obtener beneficios ofreciendo
un servicio, las entidades bancarias son una pieza importante de la rueda.
Estas necesitan herramientas para que sus gestores puedan ofrecer el producto o la contratación
adecuada al cliente, gracias a un perfilado y a un conocimiento previo de sus finanzas.
Se ha tenido la suerte de poder trabajar con una plataforma SPA (Single Page Application)
orientada a widgets a nivel profesional basada en AngularJS 1.2 y se ha podido comprobar de
primera mano como funcionan los portales web en las entidades bancarias.
Aunque el framework utilizado sea una potente herramienta de trabajo, ya hace más de seis años
que salio al mercado y tras la constante evolución de las tecnologías web, este framework ya co-
mienza a quedarse obsoleto.
Dada la actual situación de esta plataforma, este proyecto se enfocará en actualizar el portal a la
última versión de los frameworks SPA más conocidos, en concreto, se utilizará la última versión
de Angular para ver como ha evolucionado el framework ya que aunque su nombre sea el mismo,
este framework ha sido reescrito de cero en Typescript y gracias a su nuevo sistema de inyección
de dependencias jerárquico y su modelo orientado a objetos hace que su rendimiento sea superior
a AngularJS.
Tras la implementación de la nueva SPA, se observa que Angular en su última version se adapta
totalmente a las necesidades de una plataforma de estas características, logrando así una inter-
faz mucho más ágil, con una comunicación entre los widgets casi instantánea y de fácil acceso al
usuario.
Agradecimientos
Una de las partes más importantes de para la realización de este proyecto reside en el apoyo que
he ido recibiendo a lo largo de mis estudios en la Universidad de Lleida.
Para empezar, he de agradecer a mi familia y amigos el apoyo tanto económico como emocio-
nal que me han dado desde el primer momento en el que me embarqué en este desafio en el cual
depositaron en mí esa confianza necesaria para saber que todo iría bien. Otra persona a la que me
gustaría agradecer es a mi novia Denise que siempre ha sabido sacarme sonrisas en los momentos
más difíciles de la carrera.
También me gustaría agradecer a mis compañeros de clase Radu y Lluis por las innumerables
horas riéndonos y construyendo código juntos. Gracias a ello he descubierto la pasión por esta
profesión.
Por último y no menos importante, me gustaría agradecer a Roberto ya que ha sabido ayudarme y
encaminarme cuando he tenido cualquier duda en el transcurso de este proyecto y sin él no habría
sido posible la realización de este trabajo.
Índice
1. Introducción 1
1.1. Objetivos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.2. Motivación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
1.3. Planificación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.4. Presupuesto . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2. Estado del arte 4
2.1. Conocimientos previos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.2. Tecnología Frontend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
2.3. Tecnología Backend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
3. Metodología 9
3.1. SCRUM Hands-on . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
4. Requisitos 12
4.1. Widget framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
4.1.1. Elección del Widget Framework . . . . . . . . . . . . . . . . . . . . . . . . . 13
4.2. Análisis de requisitos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4.2.1. Requisitos funcionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4.2.2. Requisitos no funcionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
5. Diseño 16
5.1. Diseño del Backend . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
5.1.1. Schemes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
5.1.2. Métodos HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
5.2. Diseño del Front-end . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.2.1. Prototipo Inicial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.2.2. Diseño Portal X . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
5.2.3. Diseño Portal MyBank . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
5.2.4. Adaptación de los Widgets . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
5.2.5. Otras consideraciones del diseño . . . . . . . . . . . . . . . . . . . . . . . . 26
6. Implementación 28
6.1. Desarrollo Back-end . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
6.1.1. Consideraciones Técnicas Back-end . . . . . . . . . . . . . . . . . . . . . . . 28
6.1.2. Aspectos importantes del Back-end . . . . . . . . . . . . . . . . . . . . . . . 29
6.2. Desarrollo Front-end . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
6.2.1. Consideraciones Técnicas Front-end . . . . . . . . . . . . . . . . . . . . . . 32
6.2.2. Esquema General del Portal MyBank . . . . . . . . . . . . . . . . . . . . . 34
6.2.3. Construcción de Framework propio para la creación de Widgets . . . . . . . 34
6.2.4. Estados del Widget . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
6.2.5. Generación del Gráfico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
6.2.6. Construcción de la Autenticación . . . . . . . . . . . . . . . . . . . . . . . . 40
6.2.7. Guards, protección de las rutas internas . . . . . . . . . . . . . . . . . . . . 41
6.2.8. Interceptor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
6.2.9. Despliegue del Portal MyBank . . . . . . . . . . . . . . . . . . . . . . . . . 44
7. Instalación 46
7.1. Requisitos técnicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
7.2. Procedimiento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
8. Conclusiones generales 48
8.1. Conclusiones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
8.2. Trabajo futuro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
9. Referencias 50
9.1. Bibliografía . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
Lista de Imágenes
2.1. Backbase portal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
2.2. Liferay Portal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
3.1. Metodología SCRUM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
5.1. Prototipos Iniciales del Portal Web . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
5.2. Widget Portal real para la gestión de clientes . . . . . . . . . . . . . . . . . . . . . 20
5.3. Widget Portal MyBank para la gestión de clientes . . . . . . . . . . . . . . . . . . 21
5.4. Widget Informacion del Cliente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
5.5. Widget Gráfico de Gastos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
5.6. Widget Relaciones con MyBank . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
5.7. Widget Información Comercial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
5.8. Widget Posición Global . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
5.9. Diseño del Login . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
5.10. Diseño de Gestión de Gestores y Administradores . . . . . . . . . . . . . . . . . . . 26
5.11. Diseño de Gestión de Clientes . . . . . . . . . . . . . . . . . . . . . .. . . . . . . . 27
6.1. Arquitectura de Portales web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
6.2. Estructura API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
6.3. Contenedor del Widget . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
6.4. Construcción de los contenedores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
6.5. Construcción del Widget, Maquetación. . . . . . . . . . . . . . . . . . . . . . . . . 35
6.6. Fases del Widget . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
6.7. Widget de Movimientos, Look and Feel . . . . . . . . . . . . . . . . . . . . . . . . . 40
6.8. Conexión con la API con JWT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
6.9. Heroku, automatización del despliegue gracias a Github . . . . . . . . . . . . . . . 44
6.10. Estructura Portal MyBank . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
8.1. Diferente gestión de los widgets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
Lista de Tablas
1.1. Planificación de Tareas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2. Tiempo estimado con la plataforma Backbase . . . . . . . . . . . . . . . . . . . . . 3
1.3. Presupuesto estimado del proyecto . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
2.1. Ventajas e Inconvenientes de ReactJS . . . . . . . . . . . . . . . . . . . . . . . . . 6
2.2. Ventajas e Inconvenientes de VueJS . . . . . . . . . . . . . . . . . . . . . . . . . . 7
2.3. Ventajas e Inconvenientes de Angular . . . . . . . . . . . . . . . . . . . . . . . . . 7
3.1. Backlog . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
4.1. Requisitos Funcionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
4.2. Requisitos no funcionales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
5.1. Scheme Usuario Autenticado . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
5.2. Scheme Oficina . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
5.3. Scheme Cliente . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
5.4. Métodos HTTP Back-end . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18
Capítulo 1
Introducción
¿Nunca os ha pasado que vuestro banco os llama para ofreceros un préstamo o algún producto de
inversión?
Esto es posible gracias a que las entidades bancarias tienen una plataforma encargada de registrar
y perfilar cada cliente a medida, de tal manera que sus gestores puedan conocer en todo momento
cuando sus clientes puedan necesitar desde un préstamo hasta un producto de inversión.
El proyecto consiste primeramente en explorar la actualización de la plataforma con tecnologías
más actuales, una vez escogida dicha tecnología, nos centraremos en el diseño e implementación
de la plataforma. Para empezar, realizaremos una primera búsqueda para analizar el estado del
arte actual y las tecnologías actuales en cuanto a portales SPA y el diseño Front-end que conlleva,
seguidamente, se seleccionará la opción que más se adapta a nuestra necesitad y a continuación se
empezará con la construcción.
Dicha construcción presentará una interfaz de fácil acceso para el gestor, con una autenticación
de los usuarios basada en web Token y securización de los accesos basada en roles, adaptable a
cualquier navegador con soporte ES5 y capacidad de recuperación de datos gracias a herramientas
de gestión en la nube.
1.1. Objetivos
Los objetivos principales de este trabajo son conseguir diseñar y desarrollar una aplicación web
encargada de mostrar el proceso que se sigue en las entidades bancarias para ofrecer contrataciones
y productos de interés a sus clientes.
A partir de su perfil financiero, el gestor podrá ofrecerle productos que se acercaran más o menos
a sus necesidades, toda esta plataforma vendrá enriquecida en un entorno familiar para el usuario
como son los Widgets, hoy en día, han ganado bastante terreno en el mundo de las aplicaciones
web y los podemos observar en prácticamente cualquier página web o aplicación móvil.
Para conseguir esto, investigaremos los principales frameworks y librerías que tenemos al abas-
to ya sean propietarios o de libre distribución y así poder observar cual es la que más se adapta a
nuestras necesidades.
Una vez la plataforma web sea funcional gracias a una sencilla API (Application Programming
Interface), esta será desplegada en la nube.
1.2. Motivación
La principal motivación de este trabajo de fin de grado nace el día en el que comencé a trabajar en
un proyecto Front-end en la empresa GFT, sin tener previa experiencia antes en el sector laboral,
fui a parar al mundo de los portales bancarios, en concreto, en una herramienta personalizada de
1
soporte para que los gestores puedan conocer el detalle financiero de sus clientes, tras los primeros
meses de aprendizaje, descubrí que había poca o nula documentación referente al core del portal,
llamado Backbase, un potente framework para la creación de portales basados en widgets, ya que,
esta información siempre te venia heredada por otros miembros del equipo de desarrolladores más
veteranos, que a la vez, ellos también habían heredado estos conocimientos.
Entonces pensé, "¿Habría la posibilidad de implementar un portal Single-page Widget-based con
un framework o librerías con más documentación?, quizás, en un entorno más fácil de empezar.
Comenté esta idea con los integrantes del equipo de desarrolladores y ellos me comentaron que ya
que voy a comenzar este proyecto, pueda establecer un primer contacto con los nuevos frameworks
y librerías de Javascript (Ya que en el proyecto actualmente se utiliza AngularJS y MustacheJS
para definir la lógica de cada Widget), así poder estudiar una posible actualización del portal, sacar
conclusiones y ver cual es la opción que más se adapta a nuestro portal y en caso de plantear una
migración a otro framework, estudiar este proyecto y así poder comenzar desde un punto de vista.
1.3. Planificación
En la tabla 1.1 podemos observar la planificación final del proyecto.
Como podemos observar, el mayor coste viene del diseño y desarrollo de la plataforma, se podría
haber reducido el coste de horas si en la etapa de Decisiones de Tecnologías se hubiese invertido
más tiempo en buscar la tecnología más eficiente para manipular los eventos entre widgets, ya
que este paso, supuso un agujero de horas que se podrían haber ahorrado de detectarse a tiempo.
También cabe recalcar que al escoger todos los frameworks sin un previo conocimiento, esto ha
generado una curva de aprendizaje al principio mayor de la esperada.
Tabla 1.1: Planificación de Tareas
Al principio se decidió explorar un poco el framework propietario Backbase ya que me había pre-
viamente informado gracias a mis compañeros que existía una demo que utilizaba como motor
TypeScript y capaz de adaptarse a las necesidades de este proyecto.
Poco después de instalar la demo, se necesitaba solicitar unas credenciales de acceso a los re-
positorios privados de Maven de la compañía, para así tener las dependencias cubiertas.
2
Tras intercambiar un par de correos con la compañía, esta demo estaba únicamente estaba dis-
ponible para empresas, por lo que decidí cortar aquí mi experiencia con Backbase y continuar
investigando cual sería la tecnología a escoger.
En la tabla 1.2 podemos ver el time-box invertido en intentar configurar dicha demo.
Tabla 1.2: Tiempo estimado con la plataforma Backbase
1.4. Presupuesto
El presupuesto a continuación contempla los gastos desde el día cero que se comenzó la plataforma,
se ha considerado la cuantía de veinte euros base como el sueldo básico de un desarrollador por
hora trabajada y a esto se han aplicado las horas que se especifican en la tabla 1.2.
También se han valorado económicamente software, despliegue, hosting y los gastos del entorno de
trabajo.En la tabla 1.3 podemos observar el presupuesto resultante del proyecto.
Tabla 1.3: Presupuesto estimado del proyecto
3
Capítulo 2
Estado del arte
Actualmente, en el mundo de los portales web basados en widgets, existen dos opciones a la hora
de construirlos, nos podemos decantar o bien por sistemas ya construidos y adaptarlos a nuestras
necesidades como vendrían a ser Backbase, Liferay, nCino, etc; el primero de ellos como ya recor-
damos propietario.
Muchos de estos sistemas tienen un problema, al ser PaaS (Platform as a Service) el desarro-
llo es bastante limitado y el desarrollador únicamente se encarga a renombrar widgets o ubicarlos
y dotarlos de un mínimo de comportamiento y quizás no es lo que se busca, ya que al pretender
una actualización de la plataforma, necesitamos una solución más adaptable para el cliente y no
una simple parametrización de los widgets, por lo que se ha comenzado a estudiar los frameworks
actuales y lo que ofrece cada uno de ellos.
En las siguientes imágenes 5.3, 2.2 se pueden apreciar las PaaS dedicadas a la construcción de
widgets.
Imagen 2.1: Backbase portal
Imagen 2.2: Liferay Portal
4
Por otro lado tenemos una infinidad de librerías y frameworks de Javascript que seria la opción
más recomendable para construir la plataforma, ya que, no tenemos restricciones para implementar
cualquier tecnología web basada en MVC(Model View Controller).
La principal necesidad a cubrir a la hora de seleccionar el framework, es tener en mente el ni-
vel de adaptabilidad que se necesita en un portal de estas características, ya que pueden haber
situaciones en las que se requiera alguna librería especifica y con una PaaS esta necesidad quizás
no se pueda cubrir.
Sin embargo, también se tiene en cuenta que al no tener previo contacto con estas tecnologías,
la curva de aprendizaje al principio será más empinada y dificil de superar.
Para este proyecto, se ha propuesto comenzar de cero, es decir, no utilizar ninguna plataforma
ya creada como punto de partida y en vez de esto estudiar los distintos frameworks y librerías más
actuales del mercado Client-side y así poder elegir la que más se adapte a nuestras necesidades.
Entre las más novedosas y escuchadas del mercado podemos encontrar:
1. Angular v7.4
2. Vue JS v2.6
3. React JS v16
2.1. Conocimientos previos
Como conocimientos previos cabe recalcar el amplio abanico de tecnologías utilizadas en el Grado
de Ingeniería Informática y gracias a esto no supondrá dificultad a la hora de adaptarse nuevamente
a un nuevo lenguaje.
En el ámbito de Front-end, se ha estado trabajando profesionalmente este último año con Javas-
cript y su framework AngularJS 1.2, que aunque es la primera versión de este potente framework,
es suficiente para comprender los entresijos del MVC, por lo que la elección de core de nuestra
plataforma vendrá en esta dirección.
2.2. Tecnología Frontend
En esta sección, enumeraremos las principales librerías así como el principal framework de JavaSs-
cript, estos tres son orientados a componentes y cualquiera de ellos nos servirá como core de la
plataforma.
React: Es una librería en JavaScript de código abierto
desarrollada y mantenida principalmente por Facebook, la
única función de React es encargarse de la interfaz de usua-
rio dinámica de la página. Para ello proporciona un API
sencilla y estable orientada a la creación de pequeños com-
ponentes con un alto grado de reusabilidad. React puede
ser completamente independiente del resto de tecnologías
que use el proyecto.
5
Vue: Es un framework en JavaScript de código abierto. Al
igual que en React, el core de Vue está centrado únicamen-
te en solucionar el pilar de la interfaz de usuario dinámica,
aunque como framework también tiene componentes para
resolver problemas como el enrutado, renderizado en servi-
dor, etc.
Angular: Es un framework de código abierto desarrollado
en TypeScript, creado y mantenido por Google. El objetivo
principal de Angular es el desarrollo de SPAs, por lo que tie-
ne un ecosistema completo de librerías para su construcción
que incluye el sistema de enrutado, como solución plantea
una arquitectura MVC y está orientado a componentes.
Tras informarnos un poco más en detalle acerca de estas tres grandes tecnologías se ha recopilado
la información necesaria para hacer una comparativa entre sus ventajas e inconvenientes.
En la tabla 2.1, podemos observar las ventajas e inconvenientes de ReactJS, este a primera vista
también parece otra apuesta segura ya que posee un rendimiento superior a Angular gracias a su
virtual DOM y parece que tiene una gran acogida por los desarrolladores ya que en poco tiempo
ha dado mucho que hablar, también gracias a su extensa documentación y que está escrito en
Javascript parece que su curva de aprendizaje es menos empinada que la de Angular.
Por otro lado, parece que no dispone de tantos recursos como Angular, ya que para aplicar di-
ferentes funcionalidades, como únicamente posee una fuerte capa de vista, se tiene que recurrir a
librerías de terceros.
Tabla 2.1: Ventajas e Inconvenientes de ReactJS
6
En la tabla 2.2, se observa al siguiente candidato de formar parte del stack de desarrollo de este
portal, a simple vista, parece que VueJS destaca por su modularización y es un buen candidato
para el desarrollo de aplicaciones SPA, aunque parece ser que al ser el más joven de los tres aún
falta un poco más de soporte y documentación para adaptarlo en grandes proyectos.
Sin duda es un gran framework que dará muchísimo que hablar en los años venideros ya que
su comunidad de desarrolladores apuesta fuerte por él, pero hoy en día no es quizás el más ade-
cuado para utilizar en grandes entornos de trabajo y más considerando que vendríamos de un gran
proyecto SPA basado en AngularJS
Tabla 2.2: Ventajas e Inconvenientes de VueJS
Al observar la tabla 2.3, en las ventajas de Angular podemos ver que tiene bastante reconocimiento
en el mercado y que es un buen candidato para nuestra plataforma ya que posee una gran esca
labilidad en entornos de desarrollos grandes, como vendría a ser el caso en una SPA y posee un
gran abanico de herramientas al ser un framework y no una librería, todo esto se apoya firmemente
en la cantidad de documentación que tiene esta tecnología por lo que parece una apuesta segura.
Por otro lado tiene la mayor curva de aprendizaje ya que al estar escrito en TypeScript, exige
aprender un lenguaje nuevo por lo que la utilización de esta tecnología al principio no será fácil.
Tras la siguiente comparativa, se ha optado por decantarse por Angular, ya que al venir de un
Tabla 2.3: Ventajas e Inconvenientes de Angular
entorno en AngularJS se ha decidido que la migración puede ser menos costosa por la innumerable
cantidad de blogs y foros de información donde se habla de los pasos para realizar migraciones
entre estas dos plataformas.
También, se ha decidido aceptar el reto de aprender un nuevo lenguaje de programación como
7
es TypeScript, al ser este orientado a objetos y gracias al buen background que se adquirió en el
Grado de Ingeniería Informática, no supondría mayor reto aprender esta tecnología.
Y en el ámbito personal, al haber estado en contacto con AngularJS en el pasado, podré ave-
riguar de primera mano que ha sido con el proyecto Angular en el presente y observar hacia donde
avanza esta tecnología.
2.3. Tecnología Backend
Para hacer la plataforma funcional, se ha decidido implementar una API Rest sencilla que atienda
a todas las peticiones del portal.
Para ello se han barajado las siguientes tecnologías:
Node: Nace del paradigma JavaScript-Everywhere destina-
do a la tecnología Back-end basado en el motor V8 de Ja-
vaScript del navegador Google Chrome y orientado a even-
tos, no bloqueante, lo que lo hace muy rápido a la hora de
crear servidores web y emplear tiempo real.
Firebase: Se trata de una plataforma móvil creada por
Google, cuya principal función es desarrollar y facilitar la
creación de apps, encargada del Back-end y con herramien-
tras automáticaspara la creación de bases de datos orien-
tadas a documentos, completamente adaptable a cualquier
entorno (iOS, Android y web).
Al contemplar estas dos posibilidades para implementar nuestro sencillo Back-end. Se ha opta-
do por NodeJS, por dos principales motivos:
El primero viene a ser por que se utilizará la PaaS de Firebase en el cuarto curso del Grado de
Ingeniería Informática, por lo que seguramente conoceremos los entresijos de esta plataforma y se
adquirirán los conocimientos suficientes para tener un dominio intermedio de la plataforma y por
este motivo se ha decidido escoger una herramienta que nos proporcione nuevos conocimientos tras
su implementación que de seguro nos servirá en el futuro.
Y el otro motivo viene a ser para comprobar de primera mano como es el desarrollo con Javascript
en un entorno diferente al Front-end, puesto que hace relativamente pocos años, Javascript era
famoso por ser una tecnología client-side, así se podrá descubrir personalmente si esta tecnología
tiene futuro en el Back-end, comprobar si su desarrollo es tan fácil como dicen los desarrolladores
y especular acerca de la evolución de Javascript en próximos años.
8
Capítulo 3
Metodología
La metodología que se utilizará dadas las características del proyecto será SCRUM.
SCRUM es una de las técnicas ágiles de desarrollo más conocidas en la actualidad. Se ha escogido
utilizar esta metodología debido a que personalmente he estado trabajando en más de diez sprints
en un equipo de siete desarrolladores sobre SCRUM. Ha sido una experiencia muy satisfactoria el
hecho de poder brindar esa flexibilidad al cliente y que en todo momento haya un feedback cons-
tante por parte de los Product Owners ya que produce un software de alta calidad y casi siempre
cumple con las expectativas del cliente.
A continuación podemos encontrar una serie de ventajas que ofrece trabajar con la metodología
ágil SCRUM:
1. Gestión regular de las expectativas del cliente basada en resultados tangibles.
2. Resultados anticipados (time to market).
3. Flexibilidad y adaptación respecto a las necesidades del cliente, cambios en el mercado, etc.
4. Gestión sistemática del Retorno de Inversión (ROI: Métrica usada para saber cuánto ganó la
empresa a través de sus inversiones).
5. Mitigación sistemática de los riesgos del proyecto. Productividad y calidad.
6. Alineamiento entre el cliente y el equipo de desarrollo.
7. Equipo motivado al estar constantemente implementando nuevos Features lo que hace un
cambio de perspectiva y evita el estancamiento.
El proyecto se dividirá en subtareas las cuales las categorizaremos en tres niveles de prioridad
(Bajo, Medio y Alto). Se intentará resolver las tareas en el tiempo estipulado (para este proyecto
cada tarea puede durar un máximo de tres días).
Imagen 3.1: Metodología SCRUM
Dado que este proyecto se desarrollará en medio del cuarto curso de carrera, se intentará seguir el
plan estipulado a excepción de semanas de exámenes, prácticas y compaginándolo con mi actual
trabajo como desarrollador. Supone un gran reto tanto personal como profesional y se abordará
gestionar el tiempo eficientemente para evitar solapamientos.
9
3.1. SCRUM Hands-on
No queda claro de donde salen estas features. Mejor después de los requerimientos y aclarando
que son para realizar una aplicación que pruebe las posibilidades de los frameworks seleccionados.
Además, se supone que en gran medida se intentarán satisfacer los requerimientos funcionales del
portal para gestores existentes.
A continuación, en la tabla 3.1 se describen las principales tareas a realizar en el proyecto. Así
como su prioridad en el Backlog, el siguiente Taskout se centra en la estrategia tomada para llevar
a cabo la actualización de la plataforma SPA de mi actual entorno laboral. Como podemos obser-
var, las primeras tareas son de investigación de las herramientas y frameworks disponibles para el
desarrollo que ha tomado prácticamente un mes entero.
Nos centramos ahora en la fase de diseño ya que investigamos los frameworks que se van a encargar
del lookfeel de la aplicación, así como la previa definición de la Api encargada de la persistencia
de datos de los clientes.
Mas adelante nos enfocamos en la implementación de la plataforma que, como podemos ver, es la
parte más extensa del trabajo, debido a que invertimos aproximadamente 3 - 4 meses.
Por último, dejamos los features adicionales así como los últimos matices gráficos de la plata-
forma.
Este backlog es orientativo y se intentará seguir en medida de lo posible para cumplir con los
requisitos de actualización de esta plataforma.
10
Tabla 3.1: Backlog
11
Capítulo 4
Requisitos
En este capítulo, recorreremos punto a punto la fase de recopilación de requisitos así como las
decisiones tomadas en todo momento antes de ponerse manos a la obra.
4.1. Widget framework
Para llevar a cabo esta actualización del portal existente a las nuevas tecnologías, se ha escogido
Angular como motor de nuestra capa de presentación. Para continuar es necesario introducirnos
en el mundo de los portales web SPA.
Un portal web, y en concreto los portales SPA son aplicaciones web que interactuan con el usuario
de manera dinámica sobre la misma página en lugar de dar la sensación de que se está accediendo
a otra página web. Gracias a ello, al usuario se le da la sensación de que tiene toda la información
disponible y le brinda esta sensación de facilidad que hoy en día es difícil de conseguir.
Tras tener claro lo que es un portal SPA, es muy importante introducir la definición de wid-
get.
La Wikipedia define widget como una pequeña aplicación o programa, usualmente presentado
en contenedores pequeños que son ejecutados por un motor de widgets o Widget Engine. Entre sus
objetivos están dar fácil acceso a funciones frecuentemente usadas y proveer de información visual.
Aunque no es condición indispensable, los widgets suelen ser utilizados para ser .empotrados.en otra
página web.
Esta definición se adapta completamente a la herramienta que necesitamos ya que brinda una
interfaz de fácil acceso para cualquier usuario sin un perfil técnico. Hoy en día, cualquier usuario
es capaz de relacionar el concepto de widget con el de herramienta útil y de fácil acceso. Por este
motivo los portales SPA y en concreto el portal de este proyecto utilizan los widgets como principal
herramienta de acceso a la información.
Tras tener estos conceptos claros, vamos a estudiar las diferentes opciones para modelarlos.
Gracias al soporte de Roberto y a una investigación profunda en el ámbito de portales SPA,
se han encontrado las siguientes librerías y frameworks para modelar widgets en este entorno.
12
jQWidgets: Es un framework creado en jQuery para crear
aplicaciones basadas en web que se ejecutan en PC, dis-
positivos táctiles y móviles. jQWidgets incluye más de 60
widgets de interfaz de usuario. Todos los widgets están dise-
ñados desde cero y se basan en un potente núcleo común. El
núcleo del marco proporciona capacidades fundamentales
como soporte para extensiones y herencia de widgets, con-
figuración de widgets, manejo y enrutamiento de eventos
internos, notificaciones de cambio de propiedad, detección
y ajustes de compatibilidad de dispositivos y navegadores.
Angular Material: También es un Framework que inte-
gra unos componentes de UI siguiendo las especificaciones
de diseño de Google (Material-Design). Este proyecto pro-
porciona un conjunto de componentes de UI reutilizables,
totalmente personalizables y listos para producción.
Bootstrap: Bootstrap es una biblioteca multiplataforma o
conjunto de herramientas de código abierto para diseño de
sitios y aplicaciones web. Contiene plantillas de diseño con
elementos de diseño basado en HTML y CSS, así como ex-
tensiones de JavaScript adicionales. A diferencia de muchos
frameworks web, solo se ocupa del desarrollo front-end.
4.1.1. Elección del Widget Framework
Tras comenzar con las primeras implementaciones con estos dos primeros frameworks y con unaexperiencia previa en Bootstrap gracias a mi entorno laboral, se ha observado que para estas tres
bibliotecas la documentación es extensa por lo que a primera vista no tendremos ningún inconve-
niente en poder utilizar cualquiera de estas tres potentes herramientas.
Se ha comprobado que jQWidgets está más adaptado para el flujo de datos mediante eventos
entre distintos widgets por lo que puede ser una buena opción si lo que buscamos es un framework
robusto y no empezar de cero con la infraestructura del widget. Cabe recalcar que una vez empiezas
a desarrollar con esta herramienta, si no eres un usuario experimentado en TypeScript, al principio
la curva de aprendizaje es más larga.
En cambio, Angular Material tiene una dificultad prácticamente nula si has trabajado anterior-
mente con librerías Front-end como Bootstrap. Este framework nos proporciona una cantidad
considerable de componentes (Form Controls, Layouts, Navigation, Indicators) y todos ellos adap-
tables a cualquier propósito.
Tras comprobar de primera mano el funcionamiento de estos frameworks, se ha decidido utili-
zar Angular Material.
Ya que se ha utilizado previamente en pasados desarrollos como librería en proyectos Android y
en proyectos web con AngularJS, no supondrá mayor reto debido a que en el primer contacto con
13
esta herramienta, se ha detectado un potente componente de Angular Material capaz de modelar
el contenedor de un widget y no supondrá excesivo trabajo la representación de ellos.
Tras una investigación previa para la implementación de los eventos entre widgets, se ha concluido
que se podría utilizar los Observables de Angular RXJS para modelar dicha comunicación de datos.
Más adelante entraremos en detalle de estas potentes herramientas.
4.2. Análisis de requisitos
Se detallarán mediante tablas todos los servicios que debe aportar el portal web. Estos servicios y
restricciones vienen categorizados en requisitos funcionales y requisitos no funcionales.
4.2.1. Requisitos funcionales
Los requisitos funcionales de un sistema son aquellos que describen cualquier actividad que éste
deba de realizar. En otras palabras, el comportamiento o función particular de un sistema o soft-
ware cuando se cumplen ciertas condiciones.
A continuación, en la tabla 4.1 observaremos los requisitos funcionales del portal web MyBank
Tabla 4.1: Requisitos Funcionales
R1.- El sistema debe permitir la inserción de usuarios administradores que tengan un control total
de la plataforma.
R2.- El sistema debe permitir la inserción de usuarios gestores que tengan un control parcial de
la administración del portal. Éstos únicamente deben tener acceso a sus propios clientes.
R3.- El sistema debe permitir la gestión de clientes desde los roles Administrador o Gestor.
R4.- La plataforma debe estar alojada en un servicio cloud para permitir una disponibilidad total.
R5.- El sistema debe permitir una interfaz gráfica para el perfilado del cliente desde la vista gestor
(si el cliente pertenece al gestor en cuestión) o desde la vista administrador.
R6.- El sistema ha de gestionar mecanismos de seguridad de información para que usuarios no
autorizados no tengan acceso a la información.
14
R7.- Debe quedar en todo momento constancia en un único repositorio de la creación del portal
web desde el día uno.
R8.- El sistema debe de poseer dos entornos para trabajar (Local y Producción).
R9.- El sistema debe imitar la funcionalidad del portal existente para poder comprobar los cambios
realizados más facilmente.
R10.- El sistema debe imitar la aspecto del portal existente para poder comprobar los cambios
realizados más facilmente.
4.2.2. Requisitos no funcionales
Los requisitos no funcionales son los que especifican criterios para evaluar la operación de un
servicio que ofrece el portal, en contraste con los requisitos funcionales que especifican comporta-
mientos especificos.
A continuación, en la tabla 4.2 observaremos los requisitos no funcionales del portal web MyBank
Tabla 4.2: Requisitos no funcionales
RN1.- El sistema debe estar blindado contra usuarios no autorizados. Únicamente tendrán acceso
al sistema usuarios Gestores y Administradores.
RN2.- El sistema ha de gestionar la posibilidad de evitar la entrada accidental de datos incorrectos.
RN3.- El sistema ha de gestionar mecanismos de recuperación de accesibilidad en caso de caída del
sistema.
RN4.- La plataforma debe diferenciar entre los dos roles del sistema ya que solo el usuario adminis-
trador tendrá acceso exclusivo a crear usuarios Gestores y Administradores.
RN5.- El sistema Back-end tendrá un mecanismo de seguridad de contraseñas basado en JSON Web
Tokens (JWT).
RN6.- La UI del portal web vendrá dotada de widgets para conseguir una presentación intuitiva,
simple y de fácil acceso para el usuario común.
RN7.- El sistema será capaz de ser ejecutado con sus máximas prestaciones en navegadores (Safari,
Google Chrome, Mozilla Firefox y Microsoft Edge).
RN8.- La persistencia de los datos vendrá implementada mediante una BBDD orientada a docu-
mentos.
15
Capítulo 5
Diseño
En esta sección describiremos el diseño final que se presentará de la plataforma desde el Back-end
hasta el Front-end.
5.1. Diseño del Backend
En este apartado se describirá el diseño del Back-end así como las decisiones tomadas para construir
una API REST.
Primero, vamos a mencionar una serie de características de las API REST que se adaptan total-
mente a nuestras necesidades:
1. Sin estado: Cada petición HTTP que realizamos a nuestra API contiene toda la información
necesaria para ejecutarla, lo que permite que ni cliente ni servidor necesiten recordar ningún
estado previo.
2. XML/JSON: Otra ventaja de las API REST es que se adaptan totalmente a los consumidores
que prefieren la representación de datos en formato XML o JSON.
3. Documentación: Existe innumerables artículos y blogs que tratan sobre la creación y mani-
pulación de APIs REST; desde tutoriales de creación de API en diez minutos hasta complejas
guías que ponen en marcha la arquitectura REST en un entorno corporativo.
Una vez repasadas las principales características de una API REST, nos centramos en el modelo
de datos puesto que utilizaremos NodeJS y MongoDB como core de nuestro sistema Back-end. No
se ha podido pensar otro sistema de representación de datos que no sea Mongoose.
Este framework tiene como principal ventaja la abstracción a objetos desde MongoDB, utilizan-
do entidades llamadas Schemes Gracias a estas entidades podemos implementar la validación y
otras muchas características para asegurarnos de que nuestro scheme sea consistente a la hora de
gestionar documentos dentro de las colecciones.
Mongoose: Permite definir objetos en un esquema fuerte-
mente tipado y ser asignados a un documento MongoDB.
Este framework de Javascript tiene una increíble cantidad
de funcionalidades para la gestion de esquemas (Schemes).
Al definir esta abstracción del modelo, facilita la gestión de
los datos, por lo que parece que se está trabajando única-
mente con objetos.
A continuación se ha definido con Mongoose los siguientes schemes para representar las estructuras
de datos de nuestra aplicación.
16
5.1.1. Schemes
En las siguientes tablas 5.1 5.2 5.3 se muestra la definición sencilla de nuestros modelos en la base
de datos.
Con estos modelos tendremos suficiente para dotar a la plataforma de persistencia de datos.
Tabla 5.1: Scheme Usuario Autenticado
Tabla 5.2: Scheme Oficina
Tabla 5.3: Scheme Cliente
17
5.1.2. Métodos HTTP
Una vez establecidos los esquemas, se presentarán los métodos HTTP accesibles desde client-side.
Como se puede observar en la tabla 5.4 encontramos los diferentes tipos de rutas relacionados
con los Schemes pertinentes.
Vemos que existen rutas dedicadas exclusivamente a la autenticación en el portal (register, lo-
gin, profile). La gestión de estas rutas viene centralizada desde un controlador específico dentro del
dominio del esquema User de la tabla 5.1. Gracias a estas rutas podemos completarlos requisitos
funcionales R1, R2 y R4 de la tabla 4.1
Todos los métodos que implican únicamente el perfilado y la gestión con los clientes apuntan
directamente al controlador del esquema Cliente de la tabla 5.3. De esta manera podemos cum-
plir los requisitos funcionales R3 y R5 de la tabla 4.1
Por último, se observan las rutas dedicadas a los gestores dentro de la plataforma. Al no tener
relación con los clientes, tienen un controlador en el cual está escrita la lógica de gestión.
Estos métodos, aunque sencillos, son los únicos que necesitamos para dotar al portal de una mínima
gestión de usuarios y poder demostrar la funcionalidad completa del portal.
Tabla 5.4: Métodos HTTP Back-end
18
5.2. Diseño del Front-end
En esta sección vamos a repasar los puntos que se han seguido para diseñar la plataforma.
5.2.1. Prototipo Inicial
En la fase inicial, se han construido tres prototipos que ayudarán a guiarnos en la creación. Cabe
recalcar que nos hemos inspirado en el diseño real de una entidad bancaria para el prototipo 5.1(b).
Éste ayudará a hacerse una idea de como funciona la gestión de los clientes en las oficinas y cual
es el aspecto real que tiene la plataforma puesta en producción.
Al imitar el portal real, se podrá facilitar la comparación y así poder ganar experiencia de ca-
ra a actualizar el existente en un futuro, por lo que se cumplirán los requisitos funcionales R9 y
R10 de la tabla 4.1
A partir de este momento, al portal de la entidad bancaria inspiradora le llamaremos Portal
X, ya que será mencionado más de una vez en este documento.
Para poder hacer este portal funcional, se ha requerido implementar UI dedicada especialmente a
la gestión de los usuarios. Por este motivo también se añadirá en el portal funcionalidad dedicada
a la gestión de usuarios autorizados 5.1(a), como también la gestión de nuevos clientes 5.1(c).
Para llevar a cabo este diseño, se seguirán los siguientes prototipos iniciales.
(a) Prototipo del Login (b) Prototipo del Home Page (c) Prototipo de Gestión de Clientes
Imagen 5.1: Prototipos Iniciales del Portal Web
Para el diseño de estos sencillos pero útiles prototipos se ha utilizado la herramienta online de
diseño Draw.io
19
http://www.draw.io
5.2.2. Diseño Portal X
El diseño Front-end que seguiremos será una aproximación de lo que es un portal de ventas real
de un banco.
Como se ha comentado previamente, al tener la suerte de trabajar en este entorno profesional, se
podrá presentar una aproximación bastante acotada del mundo de portales real utilizados en las
entidades bancarias.
A continuación, en la imagen 5.2 podemos apreciar un portal real, el cual será tomado como
inspiración en el proceso de diseño.
Imagen 5.2: Widget Portal real para la gestión de clientes
20
5.2.3. Diseño Portal MyBank
Primero vamos a dar un vistazo general al portal para ver si se han conseguido los objetivos en
cuanto a diseño.
Imagen 5.3: Widget Portal MyBank para la gestión de clientes
Se ha intentado seguir tanto la representación gráfica del portal como la funcional, manteniendo
la funcionalidad de cada widget lo más cercana al portal existente.
Para dar un poco más de contexto, vamos a repasar cada uno de los widgets, tanto su funcio-
nalidad como su adaptación en Portal X.
21
5.2.4. Adaptación de los Widgets
Información del Cliente
Para comenzar, en la imagen 5.4 se observa la representación del widget ’Información del cliente’
de Portal X a Portal MyBank.
El widget de la subimagen 5.4(a) corresponde al portal existente y el de la subimagen 5.5(b)
al desarrollado con las nuevas tecnologías.
(a) Información del cliente en Portal X
(b) Información del cliente en Portal MyBank
Imagen 5.4: Widget Informacion del Cliente
Este sencillo Widget únicamente nos informa de manera muy visual los datos personales del cliente.
Estos datos son recuperados gracias al buscador que se ha implementado en el mismo widget.
A continuación se comentarán los tres widgets centrales:
Gráfico de Gastos
En la imagen 5.5 se observa la representación del widget ’Evolución’ de Portal X a Portal MyBank.
El widget de la subimagen 5.5(a) corresponde al portal existente y el de la subimagen 5.5(b)
al desarrollado con las nuevas tecnologías.
(a) Evolución de carteras en Portal X (b) Gráfico de gastos en Portal MyBank
Imagen 5.5: Widget Gráfico de Gastos
Este sencillo widget nos informa de la situación económica del cliente, en concreto, los gastos que
ha realizado el mes actual agrupado por cuentas corrientes.
22
Relaciones con MyBank
El segundo de los tres widgets en la imagen 5.6 nos muestra la representación del widget ’Relacio-
nes’ de Portal X a Portal MyBank.
El widget de la subimagen 5.6(a) corresponde al portal existente y el de la subimagen 5.6(b)
al desarrollado con las nuevas tecnologías.
(a) Relaciones con Banco en Portal X (b) Relaciones con MyBank en Portal MyBank
Imagen 5.6: Widget Relaciones con MyBank
En este widget se informan una serie de cosas: en la parte superior; el gestor encargado de la gestión
del cliente, y en la parte central-inferior se informa de las relaciones del cliente.
El cliente puede tener relaciones de dos tipos:
1. Grupo Familiar: Familiares directos del cliente.
2. Grupo Económico: Personas relacionadas con el cliente en un entorno profesional (Trabajo,
Inversiones, Empresas)
Gracias a este widget 5.6 el gestor puede cerciorarse si hay algun miembro de estos dos grupos
que tiene gestiones pendientes con el banco ya sean tareas, campañas por finalizar o documentos
pendientes de firmar. Gracias a esto, el gestor podrá tomar acción y recordar a sus relacionados
las gestiones pendientes.
Ademas, este widget cuenta con un botón para crear gestiones tanto para el grupo económico o
familiar. Éste botón únicamente será accesible si se ha iniciado sesión como el gestor encargado de
su gestión o como administrador del portal.
23
Información Comercial
El tercero de los tres widgets en la imagen 5.7 nos muestra la representación del widget ’Informa-
ción comercial’ de Portal X a Portal MyBank.
El widget de la subimagen 5.7(a) corresponde al portal existente y el de la subimagen 5.7(b)
al desarrollado con las nuevas tecnologías.
(a) Información Comercial en Portal X (b) Información Comercial en Portal MyBank
Imagen 5.7: Widget Información Comercial
Este widget es el encargado de informar al gestor la oportunidad de venta con este cliente.
En la parte superior podemos observar la oficina a la que pertenece el cliente. Más abajo, en la
parte central, observamos dos indicadores:
1. Nivel de exposición a riesgo de blanqueo: Este indicador nos avisa de la probabilidad
que tiene el cliente de estar relacionado con el blanqueo de capitales. Viene informado con
tres niveles posibles:
a) Low: El cliente no tiene riesgo de blanquear dinero. (e.g. Personas de edad avanzada)
b) Medium: El cliente tiene un riesgo medio de blanquear dinero. (e.g. Estudiantes)
c) High: El cliente tiene un potencial riesgo de blanquear dinero. (e.g. Informático)
2. Revisión: Es un timestamp que indica última fecha en la que se reviso el nivel de riesgo de
blanqueo.
Para terminar con este widget en la parte inferior podemos observar un apartado denominado:
Perfil de Conveniencia: Conocimiento y Experiencia . Y, nuevamente, viene acompañado
de dos indicadores:
1. Estado Perfil: Este estado indica si el cliente ha tenido una perfilación previa y conocemos
al cliente a nivel financiero. Es decir, si éste ha trabajado previamente con productos de
inversión o derivados, si ha solicitado un prestamo anteriormente, etc. Este estado tiene tres
indicadores posibles:
a) No Empezado: No se ha perfilado nunca al cliente.
b) No Completado: Se ha perfilado parcialmente al cliente.
c) Completado: Se ha perfilado completamente al cliente.
2. Productos: Este indicador nos informa de un total de cinco productos que ofrece el banco,
y la cantidad de los cuales estaría potencialmente interesado.
24
Tras finalizar con los tres widgets centrales pasamos al widgetinferior.
Posición Global
El widget en la imagen 5.7 nos muestra la representación del widget ’Posicion Global’ de Portal X
a Portal MyBank.
El widget de la subimagen 5.8(b) corresponde al portal existente y el de la subimagen 5.8(b)
al desarrollado con las nuevas tecnologías.
(a) Posición Global en Portal X
(b) Posición Global en Portal MyBank
Imagen 5.8: Widget Posición Global
En este widget, se puede observar de manera sencilla las cuentas corrientes que tiene el cliente en
el banco, así como una pequeña descripción de sus gastos.
Como podemos ver, en la parte superior hay dos botones (Add movement, Add account). De esta
manera el gestor del cliente o el administrador podrán interactuar con las cuentas del usuario, ya
sea añadiendo nuevas cuentas corrientes o nuevos movimientos desde sus cuentas.
25
5.2.5. Otras consideraciones del diseño
En este apartado se dará una breve pincelada a la parte de la plataforma encargada de la creación
de gestores, gestión de clientes y autenticación.
Estas pantallas irán acompañadas de su prototipo inicial y una pequeña descripción de la funcio-
nalidad principal.
Inicio de Sesión
En la imagen 5.9 podemos ver como ha evolucionado el prototipo de Login; en esta página se
podrán registrar únicamente Gestores y Administradores. Como se puede apreciar no hay una
opción de ’Crear una cuenta’ debido a que únicamente el usuario de tipo Administrador puede
crear gestores y nuevos administradores.
(a) Prototipo del Login (b) Diseño Final del Login
Imagen 5.9: Diseño del Login
Gestión de Usuarios Gestores y Administradores
Dentro la imagen 5.10 podemos encontrar en la subimagen 5.10(a) el prototipo de un único widget
centrado para la gestión de usuarios y en la subimagen 5.10(b) el resultado final; un widget capaz
de crear cuentas de Gestores y Administradores.
Este widget únicamente sera visible para usuarios Administradores.
(a) Prototipo Gestión de Gestores y Adminis-
tradores
(b) Diseño Final Gestión de Gestores y Administradores
Imagen 5.10: Diseño de Gestión de Gestores y Administradores
26
Gestión de clientes
En la imagen 5.11 podemos ver como ha evolucionado el prototipo de Gestión de clientes. En esta
pantalla, tanto usuarios gestores como administradores podrán realizar las gestiones más comunes
con el usuario (añadir, eliminar y modificar).
Cabe recalcar que los clientes que se creen, pertenecerán al gestor que esté en ese momento regis-
trado, en caso de ser añadidos por un usuario administrador, éste podrá seleccionar el
gestor gracias a un ComboBox que recupera la lista de gestores directamente de la BBDD.
(a) Prototipo de la Gestión de Clientes
(b) Diseño Final de la Gestión de Clientes (Vista Administrador
Imagen 5.11: Diseño de Gestión de Clientes
27
Capítulo 6
Implementación
En esta sección describiremos como ha sido el camino para desarrollar la plataforma, tanto Back-
end como Front-end, así como las decisiones tomadas y las adversidades encontradas.
Tanto para el cliente como para el servidor se ha decidido separarlos en dos repositorios para tener
una mejor perspectiva a la hora de acudir a los recursos.
Ésta decisión viene tomada a causa de la arquitectura de portales web, ya que éstos pueden
consumir decenas de microservicios haciendo estos portales mucho más escalables. Así como hoy
en día se ha construido una única API, en un futuro dejamos la puerta abierta a poder escribir
diferentes microservicios; uno para cada necesidad.
Imagen 6.1: Arquitectura de Portales web
6.1. Desarrollo Back-end
Antes de comenzar a describir Task-out de lo que ha sido desarrollar el servicio encargado de dotar
al portal de persistencia, se debe conocer los siguientes frameworks y herramientas encargadas de
la securización y puesta en el cloud del portal.
6.1.1. Consideraciones Técnicas Back-end
1. Json Web Token permite la distinción de privilegios de acceso en nuestro portal. Gracias
a él vamos a poder diferenciar usuarios autenticados de los usuarios no autenticados.
2. Passport es el módulo encargado de simplificar el proceso del tratamiento de la autenticación
en Express. Está dotado de diferentes estrategias que permiten el acceso de forma fácil. Para
esta implementación se usará la estrategia local; utilizaremos el email almacenado en nuestra
BBDD para la verificación de las credenciales.
3. Express-JWT es la última herramienta que utilizaremos. Ésta se encarga de securizar cada
una de nuestras rutas y así protegerlas de peticiones desde el cliente no autenticadas.
28
4. mLab MongoDB Para dotar Portal MyBank de un servicio 24/7 se ha decidido posicionarlo
en la nube gracias a la PaaS conocida como Heroku. mLab es un servicio de BBDD en la
nube, la cual nos brinda la posibilidad de escalamiento, servicio de backups y recuperación
inmediata, además de un servicio de monitorización y alertas.
5. CORS Es un mecanismo que permite exponer los recursos de la API a consumidores que
se encuentran fuera del dominio. Es importante habilitar este mecanismo ya que como co-
mentamos anteriormente, nuestra API es externa al Portal y necesitamos permitir tráfico
proveniente de diferentes dominios.
Al elegir NodeJS como motor Back-end nos reduce considerablemente el desarrollo de una API
sencilla. De esta manera se ha definido la API REST en los siguientes sencillos pasos:
6.1.2. Aspectos importantes del Back-end
1. Instalación NodeJS y MongoDB
2. Primera configuración del fichero ’server.js’
a) Añadir puerto local
3. Creación de Modelos
4. Creación de Rutas
5. Creación de Controladores
6. Segunda configuración del fichero ’server.js’:
a) Conectar la BBDD añadiendo la URL a la instancia de Mongoose
b) Cargar los Modelos creados
c) Crear BodyParser en el Middleware para controlar las inconsistencias en la BBDD
(Error handler)
d) Registrar nuestras nuevas rutas.
7. Arrancar el servidor
1 $ node server.js
8. Test de la API con Postman
9. Instalación y configuración Json Web Token (JWT)
a) Instalación del módulo JWT
1 $ npm install jsonwebtoken --save
b) Creación del método generateJWT que se encargará de generar un token de acceso para
cada usuario que utilize la plataforma.
1 UserSchema.methods.generateJwt = function () {
2 let expiry = new Date();
3 expiry.setDate(expiry.getDate () + 7);
4
5 return jwt.sign({
6 _id: this._id ,
7 email: this.email ,
8 name: this.name ,
9 role: this.role ,
10 exp: parseInt(expiry.getTime () / 1000),
11 }, config.secret);
12 };
10. Instalación y configuración Passport
29
a) Instalación del modulo Passport
1 $ npm install passport --save
2 $ npm install passport -local --save
b) Configuración de Passport utilizando la estrategia local. Gracias al email, únicamente
necesitaremos escribir una query Mongoose; si ésta encuentra el usuario por el email,
verifica que su hash coincida y por consiguiente autentica el usuario.
1 passport.use(new LocalStrategy ({
2 usernameField: ’email ’
3 },
4 function(username , password , done) {
5 User.findOne ({ email: username }, function (err , user) {
6 if (err) { return done(err); }
7 // Return if user not found in database
8 if (!user) {
9 return done(null , false , {
10 message: ’User not found’
11 });
12 }
13 // Return if password is wrong
14 if (!user.validPassword(password)) {
15 return done(null , false , {
16 message: ’Password is wrong’
17 });
18 }
19 // If credentials are correct , return the user object
20 return done(null , user);
21 });
22 }
23 ));
c) Para finalizar con Passport, éste debe ser inicializado en el fichero ’server.js’ justo delante
de las rutas para que éstas puedan utilizarlo.
1 app.use(passport.initialize ());
2 app.use(’/api’, routesApi);
11. Instalación y configuración de Express-JWT
a) Instalación del modulo Express-JWT
1 npm install express -jwt --save
b) Declaración de JWT y securización de rutas.
1 var jwt = require(’express -jwt’);
2
3 var auth = jwt({
4 secret: config.secret ,
5 userProperty: ’payload ’
6 });
7 ...
8 //e.g. Bank account route securization
9 app.route(’/account /: customerId ’)10 .put(auth , customerOperations.insert_new_account)
11 .get(auth , customerOperations.get_accounts);
12. Subida al cloud Heroku
a) Create App en Heroku CLI
1 $ heroku create
2 Creating app... done , enigmatic -mountain -27495
3 Created http://enigmatic -mountain -27495. herokuapp.com/ | git@heroku.
com:enigmatic -mountain -27495. git
b) Añadir mLab a nuestro Heroku App
1 $ heroku addons:create mongolab
2 $ heroku addons:create mongolab:shared -cluster -1
30
c) Conseguir URI de mLab
1 $ heroku config:get MONGODB_URI
2 MONGODB_URI => mongodb:// heroku_l7t0z2hl:
rpihc5nokv98besvm18vh82sdh@ds211625.mlab.com :11625/ heroku_l7t0z2hl
d) Nueva configuración del fichero ’server.js’
1) Se añade el endpoint remoto para apuntar a esta nueva conexión de mLab en el
cloud.
1 var mongoose = require ("mongoose");
2 var theport = process.env.PORT || 5000;
3 ...
4 let uristring =
5 process.env.MONGOLAB_URI ||
6 process.env.MONGOHQ_URL ||
7 ’mongodb :// heroku_l7t0z2hl:rpihc5nokv98besvm18vh82sdh@ds211625.
mlab.com :11625/ heroku_l7t0z2hl ’;
8
9 mongoose.Promise = global.Promise;
10
11 mongoose.connect(uristring , function (err , res) {
12 if (err) {
13 console.log (’ERROR connecting to: ’ + uristring + ’. ’ + err);
14 } else {
15 console.log (’Succeeded connected to: ’ + uristring);
16 }
17 });
2) Para evitar problemas de CORS es necesario habilitar la recepción de peticiones
fuera del dominio.
1 app.use(cors());
2
3 // Add headers
4 app.use(function (req , res , next) {
5
6 // Website you wish to allow to connect
7 res.setHeader(’Access -Control -Allow -Origin ’, ’*’);
8
9 // Request methods you wish to allow
10 res.setHeader(’Access -Control -Allow -Methods ’, ’GET , POST , OPTIONS ,
PUT , PATCH , DELETE ’);
11
12 // Request headers you wish to allow
13 res.setHeader(’Access -Control -Allow -Headers ’, ’X-Requested -With ,
content -type’);
14
15 // Set to true if you need the website to include cookies in the
requests sent
16 // to the API (e.g. in case you use sessions)
17 res.setHeader(’Access -Control -Allow -Credentials ’, true);
18
19 // Pass to next layer of middleware
20 next();
21 });
Tras la finalización de estos pasos, conseguimos una API funcional, lista para proveer al portal
MyBank de una mínima securización, operatividad en la nube y los recursos suficientes para llevar
este proyecto a cabo.
31
En la imagen 6.3 podemos observar la estructura resultante de la API:
Imagen 6.2: Estructura API
6.2. Desarrollo Front-end
6.2.1. Consideraciones Técnicas Front-end
Antes de comenzar a describir el desarrollo del Front-end se deben aclarar los siguientes conceptos,
tanto internos como externos a Angular, así como la utilización de ellos en el proyecto.
1. Component; Angular integra los componentes para facilitar la construcción de bloques de
la UI. Las aplicaciones hechas con Angular se organizan en una estructura de árbol.
2. Router-Outlet; Directiva de Angular que es utilizada en la plantilla del controlador principal
como placeholder que marca dónde se mostrarán componentes dinámicamente.
3. Guards; pertenecen a la colección de Angular y son utilizados para proteger a nivel de Front
el acceso a rutas internas de Angular (e.g. los gestores no pueden acceder a la ruta de creación
de los mismos)
4. Observable; van de la mano de la programación reactiva, muy importante su presencia en
este proyecto ya que son utilizados como listeners de eventos entre widgets (más adelante
entraremos en detalle con este tema).
5. Programación Reactiva; Angular se apoya en RxJS para implementar la programación
reactiva. Hoy en día indispensable para aplicaciones Front-end. Gracias a este tipo de pro-
gramación, podemos tener una gestión óptima del flujo de datos asíncronos en la aplicación.
6. Async pipe; Es utilizado a nivel de plantilla junto con una variable. Cuando se necesita una
subscripción a un Observable o Promise, éste devuelve el último valor de la variable. Cuando
el valor no coincide con el último devuelto, notifica al componente que lo instancia de que su
fuente de datos ha cambiado.
7. Interceptor; utilizados en el proyecto para incrustar el JWT en cada petición desde el portal
a la API.
32
8. Service; también dentro de la colección interna de Angular. Utilizados como una buena
práctica para compartir información entre componentes o bien centralizar las llamadas a la
API en un único componente.
9. D3.js; Framework para la representación de datos de forma gráfica, ya que se necesitaba
implementar un diagrama de barras en el widget de Movimientos. Fue la primera elección
tras consultar informes existentes sobre herramientas para gráficas web. En la referencia 4t
podemos encontrar dichos informes.
Para el desarrollo del Front-end se ha comenzado analizando todos los elementos del framework An-
gular Material. De todos sus componentes se ha llegado a utilizar hasta el 70% de ellos en el Portal.
Uno de los mas importantes que ha jugado un papel fundamental en el desarrollo de este proyecto
ha sido los Cards.
Gracias a este componente se han podido modelar los contenedores de los widgets. Al ser un com-
ponente super adaptable y flexible, no se ha tenido problema en modelar las estructuras de widgets
que ya hemos visto en la Etapa de Diseño Front-end 5.2
Imagen 6.3: Contenedor del Widget
Para describir la implementación, se han obviado pasos recurrentes entre la creación de los widgets,
ya que todos siguen el mismo patrón.
Tampoco se mencionarán lógicas sencillas del procesamiento de los datos; únicamente haremos
hincapié en las decisiones de desarrollo desde el punto de vista de la implementación de un nuevo
framework para la creación de widgets además de los procesos interesantes que se han seguido para
la evolución del portal.
33
A continuación, vamos a definir los pasos necesarios para la creación del Portal MyBank, se inten-
tará enfatizar más los puntos clave de este desarrollo.
6.2.2. Esquema General del Portal MyBank
1. Gracias a los selectores de Angular podemos observar a grandes rasgos el esquema general
del portal.
1 //Top Navigation bar
2 <app -nav ></app -nav >
3 <section >
4 // Internal routes
5 <router -outlet ></router -outlet >
6 </section >
7 // Portal Footer
8 <app -footer ></app -footer >
2. Dentro de la directiva <router-outlet> pueden hacer instancia los siguientes componentes:
a) Home: Punto clave del portal; aquí es donde los gestores llevarán a cabo las tareas de
perfilamiento de los clientes a través de cada uno de los widgets descritos en la Etapa
de Diseño Front-end 5.2
b) Login: Encargado de gestionar el acceso mediante la autenticación del usuario.
c) Customer: Encargado de gestionar las cuentas de los clientes en la plataforma.
d) User: Componente desde donde se podrán crear las cuentas de Gestores y Administra-
dores.
6.2.3. Construcción de Framework propio para la creación de Widgets
1. Como primer punto, se empieza la maquetación de los contenedores.
Contenedor: Ubicación precisa en la UI donde el widget será alojado.
2. Dentro del componente Home se han construido los contenedores desde donde se irán ins-
tanciando cada uno de los widgets.
En el siguiente código se puede observar lo que sería la construcción de los contenedores para
los tres widgets centrales de Home:
1 [...]
2 <mat -card -content >
3 <mat -grid -list cols="3" rowHeight="120px">
4 // Graphic movements container
5 <mat -grid -tile class="mat -elevation -z4" [colspan ]="1" [rowspan ]="2"/>
6 // Relations with MyBank container
7 <mat -grid -tile class="mat -elevation -z4" [colspan ]="1" [rowspan ]="2"/>
8 // Commercial information container
9 <mat -grid -tile class="mat -elevation -z4" [colspan ]="1" [rowspan ]="2"/>
10 </mat -grid -list >
11 </mat -card -content >
12 [...]
La clase mat-elevation-z4 de Angular Material le da a cada contenedor la apariencia de
superposición en el plano; la comúnmente denominada overlapping.
34
3. Después de la creación de los contenedores, tendríamos una estructura de contenedores similar
a la siguiente:
Imagen 6.4:Construcción de los contenedores.
4. A continuación, una vez creados los contenedores, se seguirán los siguientes pasos para la
implementación de cada uno de los widgets:
Para la demostración se ha decidido seguir la implementación del widget de Información
Comercial.
a) Creación del componente que tendrá la logica del widget.
1 // e.g.
2 $ ng g c CommercialInformation -m app
b) Construcción de la plantilla personalizada para cada widget. Gracias al UI component
mat-list y mat-divider de Angular Material, nos será muy sencillo modelar pequeñas
listas para construir la siguiente estructura:
Imagen 6.5: Construcción del Widget, Maquetación.
c) Una vez tenemos construida la maqueta, tenemos que definir la estructura de datos de
entrada al Widget. Para cumplir con ello, se ha definido la siguiente Interface .
1 export interface CommercialInformationDataModel {
2 dni: string;
3 advisor: string;
4 customerRevisionDate: string;
5 customerRiskLaundering: string;
6 customerOffice: string;
7 derivatives: any;
8 }
d) Después de definir la Interface de datos, se tiene que definir el listener de los eventos
para este widget.
35
Para realizar parte de este trabajo, se ha decidido implementar una Interface de Angular
capaz de escuchar eventos desde otros componentes.
Gracias a la implementación OnChange de Angular podremos detectar cuándo en el
componente padre (HomeComponent) se produce una acción que implica un refresh del
widget.
Tras la implementación de la Interface, utilizamos la anotación @Input() de Angular.
En esta anotación es donde especificamos la variable que mapeará con la información
nueva proveniente del componente padre. Tras la detección de nueva información, ésta
acción es tratada en el método ngOnChanges().
1 class CommercialInformationComponent implements OnChanges {
2 @Input ()
3 data: CommercialInformationDataModel;
4
5 ngOnChanges(changes: SimpleChanges) {
6 this.initWidget ();
7 this.showWidget ();
8 }
9 }
e) Tras implementar la interface, en el componente contenedor (HomeComponent) se han
de realizar un par de acciones.
Primeramente se define un Observable de la Interface CommercialInformationDataMo-
del antes creada, que utilizaremos como conector de datos entre los dos componentes.
1 CIWidgetData: Observable <CommercialInformationDataModel >;
Por último, dentro del contenedor del Widget de Información Comercial, dentro de
la plantilla de HomeComponent, hemos de instanciar el selector del componente que
contendrá la lógica del widget.
1 [...]
2 <mat -grid -tile class="mat -elevation -z4" [colspan ]="1" [rowspan ]="2">
3 <app -commercial -information [CIWidgetData ]="CIWidgetData | async" ></
app -commercial -information >
4 </mat -grid -tile >
5 </mat -grid -list >
6 </mat -card -content >
Como podemos observar, dentro del selector hay un pipe que llama la atención. Eel
async pipe es utilizado ya que necesitamos que la vista se refresque cuando los datos del
Observable cambien.
f ) En el Portal, hay dos maneras de nutrir a estos widgets de nueva información, por
llamada asíncrona a la API y utilizando la función .subscribe
1 private refreshWidget (){
2 this.customerService.getCustomer(this.DRWidgetData.dni).subscribe ((
result: any) => {
3 if (result) {
4 // DRWidgetData is an Observable
5 this.DRWidgetData.familiar_group = result.investment_products.
familiar_group;
6 this.DRWidgetData.economical_group = result.
investment_products.economical_group;
7 this.showWidget ();
8 }
9 });
10 }
O bien construyendo un nuevo Observable a partir de la información recuperada en local.
1 private renderCommercialInformationWidget(result: any) {
2 this.CIWidgetData = new Observable(observer => {
36
3 observer.next(this.dataRefreshed(result));
4 observer.complete ();
5 });
6 }
6.2.4. Estados del Widget
1. De esta manera tendríamos un pequeño acercamiento a la gestión de Eventos en un entorno
de widgets, ya que como se han implementado Observables en las fuentes de datos, cada
widget podrá estar en tres estados diferentes.
a) Fase Inicial: El widget no tiene datos de los cuales nutrirse.
b) Fase de Carga: El widget esta subscrito a un evento asíncrono. Mientras éste se resuelve
se muestra un loading-spinner
c) Fase Final: El widget ha terminado de cargar. El subscribe del Observable ha detectado
cambios y por consiguiente la UI se ha actualizado.
(a) Fase Inicial del Widget (b) Fase de Carga del Widget (c) Fase Final del Widget
Imagen 6.6: Fases del Widget
6.2.5. Generación del Gráfico
Como se ha comentado previamente, para generar el gráfico se ha utilizado la herramienta D3.js
y se ha seguido la siguiente implementación:
1. Instalamos el framework D3.js
1 $ npm install d3
2. Tras haber especificado previamente que el motor de los widgets son los Observables de
Angular, nos colocaremos en el punto del desarrollo en el que la maqueta del widget ya ha
sido creada y está lista para ser rellenada de datos provenientes de un Observable.
1 export interface BarChartDataModel {
2 account_name: string;
3 total_movements: number;
4 }
5 [...]
6 CMWidgetData: Observable <BarChartDataModel >;
3. Una vez aquí, redefinimos el metodo onChange del widget Movimientos.
1 ngOnChanges (): void {
2 if (!this.CMWidgetData || !this.hasMovements(this.CMWidgetData)) {
3 this.showBarChart = false;
4 return;
5 }
6 this.getDates ();
7 this.createChart ();
8 }
37
En la definición anterior podemos observar que si los datos vienen vacíos (es decir que no hay
cuentas o bien estas cuentas no tienen movimientos) el widget no es mostrado. Posteriormente,
si pasa este control se ejecutan los dos métodos encargados de la UI del widget.
4. getDates(), es un sencillo método encargado de mostrar la fecha completa en el widget
mientras que el método createChart() es más complejo, así que dividiremos su estructura
para explicarlo con más detenimiento.
Primeramente este método en la línea (2) elimina el antiguo gráfico si éste existe, después
verificamos que la referencia al gráfico no sea nula y continuamos con la creación del gráfico.
De la línea (9-14) creamos un nuevo elemento ’svg’ y definimos la altura y la anchura del
contenedor del gráfico, más abajo definimos tambien la altura y anchura del gráfico.
1 private createChart (): void {
2 d3.select(’svg’).remove ();
3 const data = this.CMWidgetData;
4
5 if (this.chartContainer) {
6 const element = this.chartContainer.nativeElement;
7
8 const svg = d3.select(element).append(’svg’)
9 .attr(’width ’, element.offsetWidth)
10 .attr(’height ’, element.offsetHeight);
11
12 const contentWidth = element.offsetWidth - this.margin.left - this.margin.
right;
13 const contentHeight = element.offsetHeight - this.margin.top - this.margin
.bottom;
14
15 [...]
16 }
A continuación, se definen las propiedades gráficas para las dos axis del gráfico. Se puede
observar que el dominio de estas axis se adaptan a la cantidad de cuentas y movimientos del
modelo recibido BarChartDataModel.
De esta manera tenemos construidas cada una de las columnas (Cuentas) para su posterior
manipulación dentro del gráfico.
1 private createChart (): void {
2 [...]
3 const x = d3
4 .scaleBand ()
5 .rangeRound ([0, contentWidth ])
6 .padding (0.1)
7 .domain(data.map(d => d.account_name));
8
9 const y = d3
10 .scaleLinear ()
11 .rangeRound ([ contentHeight ,0])
12 .domain ([0,d3.max(data ,d => d.total_movements)]);
13 [...]
14 }
En el siguiente fragmento de código, se aplica al gráfico la distribución visual de las columnas.
El elemento ’g’ de D3.js es usado para agrupar todas las columnas que tenemos en el gráfico
y adicionalmente les proporciona estilo gracias a las clases definidas por D3.js.
1 private createChart (): void {
2 [...]
3 const g = svg.append(’g’)
4 .attr(’transform ’,’translate(’ + this.margin.left + ’,’ + this.margin.
top + ’)’);
5
6 g.append(’g’)
7 .attr(’class ’,’axis axis --x’)
8 .attr(’transform ’,’translate (0,’ + contentHeight + ’)’)
9 .call(d3.axisBottom(x));
10
11 g.append(’g’)
12 .attr(’class ’,’axis axis --y’)
38
13 .call(d3.axisLeft(y).ticks(4))
14 .append(’text’)
15 .attr(’transform ’,’rotate (-90)’)
16 .attr(’y’ ,6)
17 .attr(’dy’,’0.71em’)
18 .attr(’text -anchor ’,’end’)
19 .text(’Total ’);
20 [...]
21 }
Para finalizar, para cada una de las columnas ya preparadas se aplican los atributos fun-
cionales y se incrusta un tooltip encargado de informarnos de la cantidad de dinero gastado
agrupado por cuenta.
1 private createChart (): void {
2 [...]
3 g.selectAll(’.bar’)
4 .data(data)
5 .enter().append(’rect’)
6 .attr(’class ’,’bar’)
7 .attr(’x’,d => x(d.account_name))
8 .attr(’y’,d => y(d.total_movements))
9 .attr(’width ’,x.bandwidth ())
10 .attr(’height ’,d => contentHeight - y(d.total_movements))
11 .on(’mouseover ’,function(d) {
12 return tooltip.style(’visibility ’,’visible ’).text(d.total_movements
+ ’[U+FFFD]’);
13 })
14 .on(’mousemove ’,function(d) {
15 return tooltip.style(’top’,
16 (d3.event.pageY - 10) + ’px’).style(’left’,‘${d3.event.pageX + 10}
px ‘).text(d.total_movements + ’[U+FFFD]’);
17 })
18 .on(’mouseout ’,function () {
19 return tooltip.style(’visibility ’,’hidden ’);
20 });
21 }
39
Como podemos ver en las subimagenes de la imagen 6.7 tenemos los diferentes aspectos que pue-
den generar el widget de Movimientos. Al utilizar D3js permite ajustar muy bien el aspecto de las
columnas en un espacio tan reducido.
Cabe añadir que como identificadores de estas cuentas se ha utilizado las iniciales de cada cuenta,
ya que al tener un espacio corto y físicamente no escribir el nombre completo, se ha optado por un
identificador alfanumérico del estilo que podéis observar a continuación.
(a) Cliente sin movimientos el mes actual (b) Cliente con una cuenta con movimientos el
mes actual
(c) Cliente con cinco cuentas con movimientos
el mes actual
(d) Cliente con siete cuentas con movimientos
el mes actual
Imagen 6.7: Widget de Movimientos, Look and Feel
6.2.6. Construcción de la Autenticación
1. Generación los Componentes necesarios para construir el proceso de autenticación.
1 // e.g.
2 $ ng g c Login -m app
3 $ ng g c Register -m app
2. Generación de el Servicio de autenticación, encargado de gestionar las peticiones de auten-
ticación y enviarlas directamente contra la API.
1 // e.g.
2 $ ng g s Authentication -m app
3. A continuación, se expondrá la definición del servicio.
1 // Authentication operations
2 public register(user: TokenPayload): Observable <any >;
3 public login(user: TokenPayload): Observable <any >;
40
4 public logout (): void;
5
6 // User statuses operations
7 public isLoggedIn (): boolean;
8 public isAdmin (): boolean;
9 public getUserDetails (): UserDetails;
10
11 // Token handler operations
12 private getToken (): string;
13 private setToken(token: string): void;
14 private removeToken (): void
4. El último método de éste servicio lo vamos a ver con un poco más de detalle ya que con
éste método se centraliza la parte del login y del registro en una única operación. Si es una
operación de Login y el servicio responde con el Token que valida el acceso, se guarda el Token
para su uso en futuras peticiones al servicio y como resultado de la operación se devuelve un
Observable para controlar en todo momento la asincronía del método.
1 // Manage our requests to endpoint authentication routes
2 private request(type: ’login’ | ’register ’, user?: TokenPayload): Observable <
any > {
3 let base;
4 base = this.http.post(Environment.endPoint + ‘${type}‘,user);
5 return base.pipe(
6 map((data: TokenResponse) => {
7 if (data.token) {
8 if (type === ’login’) {
9 this.setToken(data.token);
10 }
11 }
12 return data;
13 })
14 );
15 }
5. Gracias a este servicio, únicamente desde los componentes involucrados en la gestión de la
sesión se harán las peticiones pertinentes para Iniciar/Cerrar la sesión.
Podemos ver un ejemplo de estas peticiones en LoginComponent.
1 public login (): void {
2 this.loggingInProgress = true;
3 this.authenticationService.login(this.credentials).subscribe (() => {
4 this.loggingInProgress = false;
5 this.router.navigateByUrl(’/’);
6 }, (err) => {
7 this.loggingInProgress = false;
8 this.openSnackBar(’Sorry , account not found :(’);
9 this.router.navigateByUrl(’/login’);
10 });
11 }
6.2.7. Guards, protección de las rutas internas
1. Como primer punto, comenzamos generando el Guard nuevamente gracias a la herramienta
Angular Cli
1 $ ng g g AuthGuard -m app
2. Después declaramos una instancia del AuthenticationService antes creado en el construc-
tor del Guard.
3. A continuación, escribimos un método sencillo que se encargará de decirnos si la ruta a la
que se intenta acceder esta permitida o no.
1 public canActivate ():boolean {
2 if (!this.authenticationService.isLoggedIn ()) {
3 this.router.navigateByUrl(’/login’);
4 return false;
5 }
6 return true;
7 }
41
4. Ahora nos dirigimos al enrutador interno de angular, situado en el src/app/app-routing-
module.ts y protegemos cada una de las rutas que no deban estar visibles para los usuarios
no autorizados.
1 import { AuthGuardService } from ’./ guards/auth -guard.service ’;
2
3 const routes: Routes = [
4 { path: ’’, component: HomeComponent , canActivate :[ AuthGuardService] },
[...]
5. De esta manera tenemos un sencillo control de acceso en el Portal para usuarios no autori-
zados.
6.2.8. Interceptor
1. Para realizar una conexión segura con la API se ha implementado un Interceptor. En cada
petición a la API, éste se encargará de añadir el JWT extraído de la API en la fase de Login.
De esta manera el servicio sabrá que es una conexión segura y así podrá exponer sus recursos
sin riesgo al filtrado de la información.
2. El primer paso ha sido generar un service
1 $ ng g s AuthInterceptor -m app
3. Este service implementará la Interface HTTPInterceptor y a su vez el método intercept con
la siguiente definición
1 intercept(req: HttpRequest <any >, next: HttpHandler): Observable <HttpEvent <any
>>;
4. Dentro de este método escribiremos la lógica capaz de añadir el JWT en los headers de cada
petición saliente desde el Portal a la API
1 let token = ‘Bearer ${this.auth.getToken ()}‘;
2 let newreq = req;
3 if (token) {
4 newreq = req.clone({
5 headers: req
6 .headers
7 .set(’Authorization ’, token)
8 });
9 }
10
11 return next.handle(newreq).do((event: HttpEvent <any >) => {
12 if (event instanceof HttpResponse) {
13 localStorage.setItem(’current_user ’, event.headers.get(’user’));
14 }
15 }, (err: any) => {
16 if (err instanceof HttpErrorResponse) {
17 if (err.status === 401) {
18 this.router.navigate ([’login ’]);
19 }
20 }
21 });
22 }
De esta manera podemos desautenticar al usuario si su token sufre alteraciones o ha caducado.
42
(a) Petición a la API con JWT añadido
(b) Respuesta de la API
Imagen 6.8: Conexión con la API con JWT
43
6.2.9. Despliegue del Portal MyBank
En éste punto del desarrollo tenemos el Portal completamente funcional y listo para gestionar
cliente pero lo tenemos en local y todavía falta un último paso por seguir. Como comentamos en
la planificación, el portal también debe estar operativo en la Nube por lo que a continuación se
explicará como se ha llevado el Portal a la PaaS Heroku.
1. Primeramente creamos una nueva aplicación en Heroku como creamos previamente para la
API.
1 $ heroku create clientside -appbank
2 Creating app... done , clientside -appbank
3 Created http://clientside -appbank.herokuapp.com/ | git@heroku.com:
clientside -appbank.git
2. Una vez creada la App, nos vamos a la plataforma heroku https://dashboard.heroku.
com/apps/. Una vez allí entramos en nuestra App y configuramos el repositorio de Github
por defecto que va a utilizar heroku para hacer los builds que se encargarán de ejecutar el
despliegue.
En la imagen 6.9 podemos observar como querdaría la configuración.
Imagen 6.9: Heroku, automatización del despliegue gracias a Github
3. Una vez tenemos la App creada en Heroku y configurado el repositorio donde se van a hacer
los deploys automáticos, seguimos una serie de instrucciones que nos ayudarán a tener nues-
tro portal en Heroku.
Añadimos en el package.json

Continuar navegando