Después de casi un mes inactivo (por multiples razones de mayor prioridad), vuelvo con la última funcionalidad de este proyecto: Pick'em.
Esa funcionalidad que ven ahí que dice Request, era para permitir a los viewers también competir por premios; pero en todo este transcurso, Riot complicó/mejoró la forma de comprobar las cuentas y me tomaría mucho más tiempo implementar el flujo de autorización, queda para una próxima versión si todo sale bien.
Pick'em
Consiste en un sistema donde la audiencia vota por sus participantes favoritos, en este caso los viewers votarían por su streamer favorito.
Mi versión seria orientada a votar por los streamers en un listado y será:
- El usuario inicia sesión utilizando su cuenta de Twitch (comprobaré que su correo este verificado)
- Vota por sus streamers favoritos, tratando de predecir el resultado final del evento
- El usuario que consiga la mayor cantidad de puntos es el ganador de un premio
Las reglas lógicas para determinar quien gana puntos son:
- Si atina en la posición correcta son +2 puntos por cada streamer atinado
- Si está en el orden correcto son +3 puntos
- Si existe empates, se determina por el primero que votó
El tiempo limite debe ser la mitad del tiempo total de la competición, no me espero que muchas personas participen y así doy tiempo a que puedan participar.
Funcionalidad
Las reglas aplicadas para ponderar los votos se transforman en:
- Guardar un listado para cada usuario
- Un listado variable considerado como el correcto (el listado oficial)
- Ejecutar una función que revise cada listado contra el correcto al final del evento
Hay otros detalles como mostrar cuantos puntos se obtienen en tiempo real, pero eso es del lado del frontend y lo omitiré hasta que llegue el momento de programarlo.
Ajustes a la estructura
Para lograr aplicar la funcionalidad, debo tener una buena definición de cómo voy a guardar los usuarios y sus cuentas; ya que este proyecto igual lo estoy pensando expandir.
Esta es mi estructura actual de base de datos:
Como mencioné anteriormente, estoy utilizando las cuentas de Twitch principalmente para verificar el voto.
Si sigo el patrón, crearía una tabla nueva llamada Twitch Accounts; pero, ¿qué pasa si quisiera que el usuario inicie sesión utilizando su cuenta de Facebook, Google o incluso correo y contraseña? ¿Creo más tablas? No, gracias...
Por esta razón, rediseñé mi estructura de base de datos a lo siguiente:
Streamers
Se mantiene la misma estructura, pero con una referencia a la tabla de "Users"
Users
Es una abstracción de lo que representa un usuario para mí sistema, separandolo de las cuentas.
Además colocaré por defecto un username que proviene de la primera cuenta que se utiliza para iniciar sesión.
Accounts
Es la representación de cualquier cuenta utilizada para iniciar la sesión en el sistema.
Aprovechando que Firestore es una base de datos documental, puedo definir los perfiles directamente en la tabla (le digo tabla, pero realmente es un conjunto de documentos).
Revisando funcionalidades críticas
Hay funcionalidades sencillas como is Streamer Online o Clips que son consultas que no necesitan relación entre multiples tablas; pero hay otras que sí:
- Ranks: Utilizaba la tabla de Riot Accounts utilizando el ID de la cuenta para hacer un API Polling, el cambio debe ser buscar el tipo de cuenta 'Riot' en la tabla Accounts y por relación con Users, saber si es la cuenta de un Usuario Streamer
- Streamer vs Streamer: Utilizaba directamente la tabla Streamers para obtener el ID de la cuenta Riot, ahora debo saltar de la tabla Streamers, luego a la de Users, para finalmente encontrar la cuenta Riot
Esto provoca la inconveniencia de tener que saltar entre muchas tablas para obtener información sencilla, lo que me lleva a crear una relación entre Streamers y Accounts:
Esto simplifica mucho la lógica:
- Ranks: Reviso en Accounts por la referencia de la tabla Streamers y de ese modo determino que es una cuenta de un Streamer.
- Streamer vs Streamer: Para este caso necesitaba saber si el streamer estaba online y si estaba jugando, lo que me llevaba a depender de "isOnline" y el ID de la cuenta Riot; puedo hacerlo a la inversa y utilizar Accounts para saber las cuentas de streamers y finalmente saber si está en vivo por la relación directa..