jueves, 23 de mayo de 2013

Programando un foro para FirefoxOS (I)

Este artículo es el comienzo de una serie que mostrará el desarrollo de una plataforma de comunicación destinada a recibir feedback de los usuarios directamente desde las aplicaciones móviles. Es decir, en la propia aplicación un usuario podrá escribir un mensaje proponiendo mejoras o dando sugerencias, y otros podrán responder con su propia opinión.

Es un proyecto complejo, y de hecho se usará en varias aplicaciones reales comenzando por algunas que he programado para Android (ej: Hiragana Learn Experiment), pero en estos artículos nos centraremos sobre todo en su diseño e integración en FirefoxOS, aunque se hablará también de otras partes del desarrollo, incluyendo la programación del servidor y su implementación en Android u otras plataformas.

En este primer artículo nos centraremos en el diseño de la plataforma, que como se verá no es tan simple como pudiera parecer en un primer momento. Los datos concretos no tienen importancia, pero espero que el concepto general de diseño os sirva si vais a trabajar en vuestras propias aplicaciones.

Definiendo los requisitos

Empezando por lo básico, el programa permitirá varias acciones al usuario:
  • Ver lista de temas
  • Crear un tema nuevo
  • Ver tema
  • Responder a tema
  • Votar mensaje
  • Permitir a los usuarios escoger que nombre de usuario mostrar a los demás
  • Destacar los mensajes y temas del desarrollador
  • Indicar cuando un tema ha sido leído por el usuario y cuando tiene mensajes nuevos
Esta es la funcionalidad necesaria, y en un mundo ideal nuestros requisitos acabarían aquí. Pero la realidad es que aquí empiezan nuestros problemas. Para empezar ¿que ocurre cuando no tengamos conexión a internet? Podríamos dar una versión sin conexión, pero empecemos por algo más simple:
  • Si no hay Internet, tan solo mostraremos un mensaje indicándolo
¿Y que ocurre si se meten demasiados contenidos: temas, mensajes textos? Habrá que limitar la información que se muestra:
  • En el foro se mostrarán solo los últimos 30 temas actualizados
  • En cada tema los mensajes se mostrarán de 30 en 30, divididos en páginas
  • Los títulos de los temas tendrán un máximo de 100 caracteres
  • Los textos de los mensajes tendrán un máximo de 400 caracteres
¿Pero y si un usuario se pone a enviar demasiados mensajes? Necesitaremos nuevos límites para evitar que llene todo el foro tan solo con sus mensajes:
  • No se permitirá crear mas de un tema al día a cada usuario
  • No se permitirá mandar más de dos mensajes seguidos en un mismo tema a un mismo usuario, en menos de dos horas
Esto es solo una muestra de los requisitos, que probablemente se vaya ampliando con el tiempo, pero que nos permitirá comenzar a definir el resto de la "aplicación".

Diseñando la base de datos

La base de datos es donde se almacena la información que crean o modifican los usuarios. Se organiza en elementos de diferentes tipos (como usuarios, temas,...) cada uno con sus propios campos (nombre, título, fecha,...). En nuestro caso tendremos los siguientes tipos de elementos, en principio:


Cada "caja" es un tipo de elemento y las flechas entre ellas indican relaciones. El sentido de la flecha indica dependencias, así un foro tiene temas, y un tema tiene mensajes. Un usuario puede haber iniciado o leído varios temas, y haber escrito o votado varios mensajes. A continuación detallo los campos para cada tipo de elemento:
  • Usuario: Nombre, tipo (0=normal, 1=desarrollador), clave_producto
  • Aplicación: Nombre, usuario (propietario de la app), clave_producto
  • Foro: Aplicación, nombre, orden
  • Tema: Foro, título, usuario (quien lo creó), fecha (en que se insertó el último mensaje)
  • Mensaje: Tema, usuario (que lo escribió), fecha (en que se escribió), texto
  • Leído: Tema (leído), usuario (que lo leyó), fecha (de la última lectura)
  • Voto: Mensaje (que se vota), usuario (que lo vota)
Normalmente las bases de datos se representan como conjunto de tablas en las que cada tipo de elemento es una tabla, y sus campos son columnas de dicha tabla, mientras que por cada elemento se inserta una fila (usuario, tema, mensaje,...).

Realizar el diseño de la base de datos suele ser sencillo, pero a la vez es importante para tener clara la organización de la información y las operaciones a realizar en cada actividad.

Diseño de navegación

El diseño de navegación consiste en diseñar un esquema con las diferentes pantallas de la aplicación y unirlas con flechas indicando como se puede navegar entre ellas. En nuestro caso:



  • Temas: Muestra la lista de temas ordenados por fecha de último mensaje. Un botón permitirá crear nuevos temas
  • Nuevo tema: Formulario en el que se podrán escribir un título y un primer mensaje para el nuevo tema
  • Mensajes: Muestra la lista de mensajes de un tema, ordenados por fecha, con los últimos al final. Un botón permitirá escribir un nuevo mensaje.
  • Permitirá escribir un nuevo mensaje en el tema.
Se podría entrar en mas detalle con la descripción del interfaz, pero dado que probablemente lo acabemos cambiando de aquí al final, no es problema mantenerlo sencillo de momento.

Diseño del servicio web

Este es un paso que vosotros no tendréis que hacer habitualmente. Pero dado que en esta ocasión el foro lo usarán varios usuarios, los mensajes deben de encontrarse en un lugar común, en Internet, y por tanto hemos de definir un servicio web que permita acceder a dichas funciones.

Un servicio web no es mas que un conjunto de direcciones web que permiten modificar contenidos
  • Obtener temas: Devolverá la lista de temas de un foro ordenados por fecha descendente
    • Parámetros: Foro, usuario, clave de aplicación
  • Obtener mensajes: Devolverá la lista de mensajes de un tema ordenados por fecha ascendente
    • Parámetros: Tema, usuario, clave de la aplicación, mensaje inicial, mensajes a devolver
  • Crear tema: Creará un nuevo tema en un foro
    • Parámetros: Foro, clave de aplicación, usuario, nombre, título del tema, texto del primer mensaje
  • Escribir mensaje: Creará un nuevo mensaje en el tema
    • Parámetros: Tema, clave de aplicación, usuario, nombre, texto del mensaje
  • Votar mensaje: Incrementará el número de votos del mensaje
    • Parámetros: Mensaje, clave de aplicación, usuario, nombre

Conclusiones

A lo largo del artículo hemos dado los primeros pasos para desarrollar una aplicación, o en este caso, mas bien un complemento para las aplicaciones. Esta es una tarea que puede hacer cualquiera, sin necesidad de saber programar, aunque la experiencia en desarrollo suele ser siempre positiva. En próximos artículos nos meteremos manos a la obra con las siguientes actividades:
  • Creación de la base de datos con SQL y PHPMyAdmin
  • Creación de los servicios web con PHP
  • Desarrollo de la aplicación de foros para FirefoxOS, que funcione a partir de dichos servicios.

2 comentarios:

  1. wow, y cómo podría hacer un listado de palabras spam?
    o banear trolls?

    ResponderEliminar
    Respuestas
    1. En primer lugar hay que entender que no existen medidas de seguridad perfectas, y que toda medida tiene sus contrapartidas. En ocasiones vale más dejar que a veces haya algún inconveniente, a limitar en exceso.

      Ahora bien, si hablamos de cuestión puramente técnica, la programación no es complicada. Para bannear tan solo tenemos que meter en la tabla de usuarios un campo más "banneado", que si activamos no guarde los mensajes del usuario. En cuanto a la lista de palabras spam, necesitaríamos una nueva tabla en la que almacenarlas. Luego comparamos el mensaje con la tabla y según nuestras preferencias impedimos la publicación del mensaje o no.

      De todas maneras hay que entender que todo sistema de seguridad se puede saltar con el esfuerzo suficiente. Lo importante es crear un sistema que el esfuerzo de saltarlo no compense a spammers o a trolls. En este caso el limitar el número de mensajes publicables limitará el daño que podrían hacer, y dado que la aplicación no tendrá un público excesivamente grande, no compensa el esfuerzo de saltarse la seguridad.

      Eliminar