sábado, junio 30, 2012

EasyFiles Mirror

Como sabrán los que me vienen siguiendo de hace tiempo, hasta hace un par de semanas estuve haciendo prácticas de programación en la Freie Universität Berlin como último módulo del ciclo formativo que estaba realizando. Allí me mandaron un proyecto bastante interesante que me gustaría describir aquí (siempre guardando la confidencialidad de los documentos de la universidad, los cuales no mostraré en ningún momento) ya que en un tiempo, probablemente, comience a distribuir dicho programa por internet, obviamente modificado (esta versión es muy específica para el trabajo que ellos realizaban) y mejorado.
Primero os pongo en situación: donde yo trabajaba, el servicio técnico de la universidad, se dedicaban a hacer de intermediarios entre los distintos departamentos de la universidad y las empresas que vendían productos informáticos tanto de hardware como de software. Esto provocaba que tuvieran una gran cantidad de documentos, todos con nombres largos y formados por largas cadenas de letras y números y, encima, que se parecían mucho entre ellos. Por supuesto, hacer una búsqueda entre tanto archivo parecido era un tanto complejo así que necesitaban un DMS (Data Management System) con capacidad de búsqueda que se encargara de simplificar el asunto. De este modo, el programa debía permitir subir archivos y separarlos por categorías, ya que dependiendo de qué tipo de archivo estuviéramos hablando necesitaríamos buscar distintos datos. No me preguntéis sobre qué significaban los distintos tipos de archivo porque realmente no llegué a entender nunca del todo cómo funcionaba ese sistema, y tampoco era algo que necesitara saber para llevar a cabo el proyecto, así que no me preocupé más de lo necesario.
En esta universidad generalmente trabajan con aplicaciones web para evitar tener problemas con los distintos sistemas operativos, de modo que la aplicación que hice fue hecha de dicha manera. De este modo, y para dar un par de datos técnicos antes de empezar a describir la aplicación, para llevarla a cabo usé los cinco lenguajes webs de licencia gratuita más habituales (HTML, CSS, JavaScript, PHP y MySQL), con algunas librerías y técnicas extra (sobre todo en JavaScript, al que le sumé JSON, Ajax y JQuery), todo sobre una arquitectura basada en un patrón Modelo-Vista-Controlador. Sé que muchos de lo que leáis esto entenderéis poco o nada de esto, pero ya acaba la parte "técnica".
Al estar basado en web, y aunque en un comienzo se supone que la aplicación la usará sólo el responsable de este proceso, en mi opinión me pareció interesante crear un sistema de usuarios por el que cualquier nuevo usuario que accediera al sistema debería crear una nueva cuenta y "loguearse" correctamente para acceder al sistema. De esta manera, pueden existir tres tipos de usuarios en la aplicación: los usuarios normales, los administradores y los "super usuarios". Como es evidente, un usuario nuevo que se registre sería en un comienzo un usuario normal, y los usuarios "con privilegios" serían los encargados de decidir a cuales de ellos promover, además de tener otros evidentes privilegios como acceso a todos los archivos del sistema (los cuales los usuarios normales sólo tendrían acceso a aquellos subidos por ellos mismos o a los que se les haya concedido permiso).
Cuando accedemos (en las capturas de pantalla estamos usando la cuenta "admin" que, en realidad, es un super usuario) vemos una estructura de carpetas que refleja exactamente la estructura de carpetas que hay en un directorio en particular en el servidor, de modo que cualquier cambio que hagamos en la estructura de la página (como vemos en las capturas podemos crear, subir, mover, eliminar o renombrar archivos o carpetas) se verán reflejados en dicho directorio del servidor, y viceversa, si alguien accede al servidor y cambia los archivos, estos se verán reflejados en la página, aunque para ello se necesitaría volver a sincronizar (lo cual ocurre automáticamente cuando un usuario se loguea, pero como no podemos contar siempre con que haya usuarios logueándose, hay un botón "Sincronizar" en esta página principal).
Hasta el momento la cosa es relatívamente fácil. Trabajosa, pero fácil. El mayor problema ocurrió a la hora de tener que leer la información de los archivos. El sistema trabaja sin problema con ficheros "pdf" y "txt", y en la última semana lo adapté para que funcionara también con "doc", "docx" y "rtf", aunque la falta de tiempo y recursos para hacer pruebas me impidió estar completamente seguro de que funcione perfecto con estos tipos de archivos. Lo cierto es que, si se añaden archivos de forma manual al directorio del servidor y luego se sincroniza, los archivos se registrarán cono sin categoría. Sin embargo, al subirlos a través del formulario de la aplicación podremos seleccionar la categoría a la que queremos que pertenezca. Esto, de todos modos, importa poco, ya que una vez dentro del programa podemos usar la opción "Cambiar categoría" que, como su nombre indica, cambiará la categoría del archivo.
De este modo, para cualquier archivo se pueden hacer búsquedas genéricas de cualquier texto que se encuentre en su interior, pero para aquellas que tengan unas categorías determinadas se pueden hacer búsquedas de distintos campos (aquellos que me especificó el encargado de este asunto). Además, en la búsqueda genérica, también por petición del encargado, podemos introducir un código especial de estos archivos para que los encuentre, a pesar de que el código no siempre aparecía de la misma manera en los archivos. Es un poco complejo de explicar sin revelar ningún dato de la universidad, pero de todos modos, todo lo que aparece en este párrafo desaparecerá de la versión que publique proximamente, ya que es la parte más específica de todo el asunto, y evidentemente fuera del contexto de esta universidad servirá de poco o nada esta búsqueda.
Lo cierto es que el sistema de búsqueda fue una de las cosas más complejas y que, de hecho, me ha llevado a plantearme cómo hacer un sistema de búsqueda preciso pero al mismo tiempo que valga para muchos tipos de aplicaciones. Tengo unas cuantas ideas, pero tendré que estudiar las posibilidades que hay. Sea como sea, sigo explicando cómo funciona este programa.
El resto de características del programa son bastante más genéricas. Por un lado tenemos un sistema de mensajería entre usuarios sin ninguna peculiaridad especial, pero que, aunque no era la primera vez que desarrollaba un sistema de mensajería en PHP (en proyectos de clase ya había tenido que hacer alguno), siempre sorprende ver cómo algo que parece tan simple es a la vez tan complejo de programar.
Por otro lado, está la sección de "Configuración", la cual mostrará 1, 3 ó 4 pestañas depende del tipo de usuario que seamos. El usuario básico sólo podrá modificar sus propias preferencias, pudiendo cambiar su contraseña, su e-mail, el idioma en el que desea ver la página (algo de lo cual también estoy bastante orgulloso, aunque intentaré dejarlo aún mejor para la versión final), opciones de visionado de la página, e incluso borrar su propia cuenta.
Los administradores además podrán hacer gestión de usuarios y grupos, pudiendo borrar usuarios, promoverlos a administradores, crear, renombrar y borrar grupos y cambiar a usuarios de un grupo a otro. Finalmente, el super usuario también puede promover a otros usuarios a super usuario y añadir categorías y nuevos idiomas.
Por supuesto, el programa tiene muchas más características para que los usuarios puedan compartir archivos o carpetas unos con otros, campos que se autorellenan para darnos pistas de nombres de usuarios, (si vamos a mandarles un mensaje o a compartir un archivo), de grupos (idem) o de carpetas (si vamos a mover un archivo de una carpeta a otro), control a la hora de borrar un usuario, posibilidad de hacer una recuperación de contraseña usando el e-mail introducido al registrarse, etc.
Resumiendo, una aplicación de la que estoy muy orgulloso, por la que me llevé muchas alabanzas por parte del encargado del sistema (casi me sonrojo con la encuesta de evaluación que tuvo que rellenar el último día) y la cual, como digo, pienso mejorar para, con el tiempo, publicar como mi primer trabajo profesional. Ya recibiréis noticias.

No hay comentarios: