Introducción al código fuente de Diaspora

De Wiki Diaspora*
Saltar a: navegación, buscar

Framework y herramientas

Diaspora está escrita en Ruby on Rails, un framework de aplicaciones web, para el de programación Ruby. Si no estás familiarizado con un proyecto de Ruby, puedes revisar esta guía para comenzar.

Existen algunas herramientas que utilizamos, las cuales no están en todo proyecto de Rails:

  • Haml: Nuestras plantillas están creadas en HAML (un lenguaje de plantillas), en vez de la opción por defecto, que es ERB (HTML con código de Ruby). La documentación de HAML se encuentra aquí. Los archivos correspondientes en app/views.
  • Sass: Nuestro CSS está escrito en SASS, que genera el código CSS a través del Asset Pipeline de Ruby. La sintaxis está inspirada por CSS, y es bastante similar, pero ofrece características adicionales, como anidamiento y variables. Si deseas editar las hojas de estilo, busca en app/assets/stylesheets/.

Nota: Tanto HAML como SASS son sensibles a los espacios en blanco.

  • Backbone.js y Handlebars.js: La funcionalidad del lado del cliente se coordina principalmente con Backbone.js, que se comunica con REST completamente, con el servidor con JSON, y activa la renderización de las plantillas Handlebars.js. La lógica se encuentra en app/assets/javascripts/app y las plantillas Handlebars en app/assets/templates.

Pruebas

Nuestra meta es probar todo. Si encuentras un error, lo primero es exponerlo, creando un test que falle a causa del error. Únicamente después de esto debes comenzar a resolver el código en sí. Esto se conoce como desarrollo guiado por pruebas. Escribimos nuestras unidades de prueba para el código de Ruby en Rspec, las pruebas de JavaScript están en Jasmine, y las pruebas de integración en Cucumber. Los Specs se encuentran en spec, y las características de Cucumber en features. Para obtener más detalles, ve la página sobre el flujo de trabajo.

Los modelos

Nuestros modelos se encuentran en la carpeta app/models:

User: Obviamente usuarios, esto viene primero. Un objeto de usuario representa la información privada y las capacidades de dicho usuario en el servidor. El objeto de usuario es capaz de encontrar a otras personas, publicar actualizaciones, y publicar su perfil. Un usuario tiene a una persona.

Contacto: Un objeto «proxy» para cada persona a quien el usuario añade como amigo.

Persona: Una persona es un usuario visto desde el exterior. Cuando un usuario se hace amigo de otro, se está haciendo amigo del objeto de persona de ese usuario. Los objetos de personas son replicados entre servidores, y están donde se halla la llave pública de un usuario. Una persona tienen mucas publicaciones. Una persona tiene un perfil.

Perfil: Contiene la información sobre la persona. Actualmente, un perfil se ve igual, sin importar quién lo mire.

Petición: Este objeto es una solicitud de amistad que se envía a otra persona.

Aspecto: Contiene una lista de personas, y publicaciones hechas para ese aspecto. Los aspectos son privados para los usuarios, y podemos incrustar los documentos del aspecto en el documento del usuario.

Publicación: Una publicación que pertenece a una persona. Esta es una clase principal, para distintos tipos de publicaciones, contiene IDs de los comentarios y algunos otros atributos comunes a todas las publicaciones.

  • Mensajes de estado hereda de las publicaciones.
  • Álbum hereda de las publicaciones.
  • Fotos hereda de las publicaciones.

Comentario: Un comentario que pertenece a una publicación.

Retracción: Este objeto se envía cuando el creador de una publicación la elimina. No es un modelo, pero se serializa para su envío a otros servidores de Diaspora, de igual forma que se hace con nuestros modelos.

Publicar algo (app/models/user)

  1. Cuando un usuario hace una publicación, el/ella publica para uno o todos los aspectos.
  2. Asumiendo que la publicación sea válida, se crea y su ID se almacena en raw_visible_posts para ese usuario.
  3. El HTML para esta publicación se convierte en el servidor, y se envía al usuario a través del websocket.
  4. La publicación se serializa con XML, envuelta en un Salmon envelope, encriptada y firmada, y se publica para los destinatarios (http://pod.location/receive/users/:id%5Bperson_id%5D%E2%80%9D).

Recibir una publicación (app/controllers/publics_controller.rb & lib/diaspora/user/receiving.rb)

  1. El usuario recibe el Salmon, y desencripta los encabezados.
  2. Si la firma en la información del Salmon es de la persona que afirma haber enviado el mensaje, se crea un objeto y se guarda en la base de datos.
  3. Esa publicación es almacenada en las publicaciones visibles para el usuario destinatario, así como en las publicaciones para el aspecto donde se encuentra el remitente.

Aquí está la documentación autogenerada: https://en.wikipedia.org/wiki/Representational_state_transfer