farcebook é um aplicativo web full-stack inspirado no Facebook, construído sobre uma estrutura Rails. farcebook usa um banco de dados PostgreSQL e React para a renderização de componentes frontend, com Redux sendo usado para gerenciamento de estado.
livro de farsa AO VIVO
Depois que um usuário se inscreve em uma conta, uma página de perfil é criada para ele. Cada perfil inclui um cabeçalho que armazena uma foto de perfil e uma foto de capa, uma seção de introdução, que exibe todas as informações dos usuários atuais, uma seção de amigos, que mostra os primeiros 9 amigos dos usuários, e um feed que mostra todas as postagens postadas por o usuário e postado no mural do usuário.
As fotos são hospedadas usando um bucket AWS S3 e carregadas e armazenadas no banco de dados usando a gema paperclip
.
Os usuários compartilham informações com outras pessoas por meio dos componentes Post
e Comment
. As postagens podem ser postadas diretamente no mural de outro usuário ou postadas em seu próprio mural (com as postagens receiver_id
sendo igual ao seu próprio id
). Os usuários também podem fazer upload de uma imagem para ser compartilhada junto com cada postagem.
Depois de criadas, as postagens podem ser editadas e excluídas. Um autor pode editar e excluir todas as suas postagens, enquanto o destinatário de uma postagem só pode excluí-las.
Para mostrar aprovação, os usuários podem optar por Like
uma postagem. As postagens mostram não apenas o número de curtidas recebidas, mas também a lista dos usuários que gostaram.
Os usuários também podem deixar comentários nas postagens. Os comentários são exibidos em ordem com base em quando foram criados. Os comentários também podem ser respondidos com outros comentários, com cada comentário mostrando todos os seus comentários aninhados. Os comentários são associados a outros comentários por meio de um parent_comment_id
opcional.
Os usuários também podem optar por Like
os comentários da mesma forma que as postagens. Isso é feito usando uma tabela por meio de uma associação polimórfica, que usa um likable_type
para armazenar que tipo de item está sendo apreciado.
Uma Notification
é criada e enviada a outro usuário quando qualquer usuário posta em seu mural ou qualquer uma de suas postagens/comentários é curtida/comentada. Isso é conseguido mais uma vez usando um associado polimórfico que rastreia qual item está sendo notificado.
Os usuários têm um indicador visual em sua barra de navegação que mostra sempre que há notificações novas e não vistas e um menu suspenso que mostra uma lista de todas as notificações recentes. Cada NotificationListItem
mostra o nome do outro usuário e a ação que ocorreu, bem como links para o item em questão quando clicado.
Utilizei carregamento antecipado usando ActiveRecord para otimizar minhas consultas de banco de dados e aumentar o desempenho. Ao buscar o feed de um usuário, todas as informações relevantes também são consultadas junto com cada postagem para uso posterior.
#posts_controller.rb
...
def feed
...
author_ids = @current_user . friend_ids + [ @current_user . id ]
@posts = Post . includes ( comments : [ { likes : :liker } , :child_comments ] , likes : :liker )
. where ( 'author_id IN (?) OR receiver_id = ?' , author_ids , @current_user . id )
. limit ( 10 )
. order ( updated_at : :desc )
. distinct
...
Para proteger os usuários, muitas funcionalidades para comentar e postar nos murais são protegidas por haver amizade entre os usuários. Isso é feito através do uso de renderização condicional no React, verificando se o usuário atual é amigo do autor do post ou proprietário do perfil ou se o usuário atual está tentando interagir com seus próprios posts/perfil.
// post_show.jsx
// Showing comment form on Posts
...
{ ( areFriends || isCurrentUser ) &&
< CommentForm postId = { id } / >
}
...
// post_form.jsx
// Showing Post form on user profiles
...
render ( ) {
if ( ! currentProfileFriends . includes ( currentUserId ) ) {
return null
}
...