Um webapp de anotações com a possibilidade de menção de usuários e de outras anotações, comentário e compartilhamento em comunidade. Essa aplicação possuirá um mecanismo de pesquisa eficiente para facilitar a localização de anotações, os filtros pooderam ser feitas por data de publicação, autor, conteúdo, título, menção e comunidade, separados ou ao mesmo tempo.
- Daniel Henrique Toledo Santos: Backend
- Julio Cesar de Paula Ferreira: Frontend
- Samuel Henrique Miranda Alves: Full-Stack
- React
- Go
- PostgreSQL
- Elasticsearch
- Docker
Para rodar o sistema será necessário que você tenha instalado docker em sua máquina.
Com o docker instalado basta na pasta root (../ANote/
) do projeto rodar o comando docker compose up -d
para inicializar o projeto (Frontend + Backend + Elasticsearch + PostgreSQL + Ferramentas de interação com as bases de dados). O frontend pode ser acessado em localhost:3000.
OBS: Isso pode demorar um bom tempo na primeira vez.
A arquitetura consiste em um client e um server monolítico. A comunicação entre o client e o server é feita via HTTP.
Para a funcionalidade de pesquisa foi utilizado elasticsearch (ES), para replicar os dados do banco de dados PostgreSQL (PG) para o elasticsearch foi desenvolvido um componente chamado es_replicate.
Este componente se conecta ao PostgreSQL e se inscreve no tópico de notificação "es_replicate" criado no próprio PosgreSQL, esse tópico recebe notificações toda vez que tabelas de interesse sofrem alterações no PostgreSQL, isto é feito por meio do uso de triggers.
Quando uma notificação é recebida o componente "es_replicate" busca no banco de dados as mudanças desde sua última atualização, isto é possível devido ao mecanismo de replication slot disponível neste SGBD que possibilita o acesso ao WAL (Write Ahead Log) em formato json, o que torna fácil seu consumo.
Write Ahead Log em uma visão simplificada é um componente do PostgreSQL que guarda todas as mudanças feitas no banco de dados.
Uma forma mais fácil de visualizar essa interação pode ser vista a seguir:
- Server escreve no banco
- Antes mesmo da escrita de Server a escrita é persistida no WAL
- Ao finalizar a escrita de Server o trigger é ativado e o componente "es_replicate" é notificado
- "es_replicate" busca as mudanças no WAL
- "es_replicate" interpreta as mudanças de acordo com a tabela onde foi feita a mudança e replica essa mudança nos documentos
A arquitetura que norteou o desenvolvimento da aplicação foi a arquitetura hexagonal. Um diagrama simplificado desta arquitetura pode ser visto a seguir:
- Por que o sistema está adotando essa arquitetura?
Essa arquitetura foi adotada com o objetivo de aumentar a manutenibilidade do sistema, ao enfatizar o desacoplamento do sistema de dependências externas.
- Quais são as portas e adaptadores? Qual o objetivo deles?
As portas são Elasticsearch, PostgreSQL e bibliteca JWT. E os adapters são Elasticsearch, PostgreSQL e biblioteca JWT. O objetivo dessas abstrações é tornar o domínio da aplicação disvinculado do mundo externo.
- Como usuário, quero me cadastrar no sistema
- Como usuário cadastrado, quero me logar no sistema
- Como usuário cadastrado, quero recuperar minha senha
- Como usuário cadastrado logado, quero atualizar minha senha
- Como usuário cadastrado logado, quero atualizar meu email
- Como usuário, quero me logar usando minha conta Google ou Facebook
- Como usuário logado, quero criar comunidades
- Como usuário logado, quero editar comunidades (Nome, Privado/Público)
- Como usuário logado, quero excluir comunidades sem membros ou posts
- Como usuário logado, quero criar novas anotações
- Como usuário, quero ter acesso a anotações em comunidades públicas
- Como usuário, quero filtrar as anotações baseado em data de publicação, autor, conteúdo, título, menção e comunidade
- Como usuário logado, quero acessar minhas anotações privadas
- Como usuário logado, quero editar anotações das quais sou dono
- Como usuário logado, quero excluir anotações das quais sou dono
- Como usuário logado, quero seguir outros usuários
- Como usuário logado, quero compartilhar uma anotação pública
- Como usuário logado, quero comentar anotações
- Como usuário logado, quero curtir anotações
- Como usuário, quero me cadastrar no sistema - IMPLEMENTADO
- Instalar tecnologias (React, PostgreSQL, Docker) [Daniel];
- Criar tabelas relacionadas ao usuário no banco e configurá-las no sistema [Samuel];
- Criar e testar rota que implementa a tela de cadastro do usuário [Samuel];
- Implementar no backend a lógica de cadastrar usuário [Daniel];
- Criar tela de cadastrar usuário [Julio];
- Como usuário, quero me logar usando minha conta Google ou Facebook - NÂO IMPLEMENTADO (Apenas faz a requisição e recebe o token da Google)
- Criar tabelas da história no banco e configurá-las no sistema [Samuel];
- Criar e testar rota que implementa a tela de logar usuário cadastrado [Samuel];
- Criar e testar rota que implementa a tela de logar usuário pelo Google ou Facebook [Samuel];
- Implementar no backend a lógica de logar usuário cadastrado [Daniel];
- Implementar no backend a lógica de logar usuário pelo Google ou Facebook [Daniel];
- Criar tela de logar usuário cadastrado [Julio];
- Criar tela de logar usuário pelo Google ou Facebook [Julio];
- Como usuário cadastrado, quero recuperar minha senha - IMPLEMENTADO PARCIALMENTE (apenas no backend. No frontend as telas estão parcialmente completas, mas não há integração)
- Criar e testar rota que recupera a senha do usuário [Samuel];
- Implementar no backend a lógica de recuperar senha do usuário [Daniel];
- Criar tela de recuperar senha do usuário [Julio];
- Como usuário logado, quero criar, editar ou excluir anotações - IMPLEMENTADO (Com exceção da edição de anotações, que está apenas no backend)
- Criar tabelas relacionadas às anotações no banco e configurá-las no sistema [Samuel];
- Criar e testar rotas que cria, edita e exclui anotações [Samuel];
- Implementar no backend a lógica de cadastrar, editar e excluir usuário [Daniel];
- Criar tela inicial de criar, editar ou excluir anotações [Julio];
- Como usuário, quero filtrar as anotações baseado em data de publicação, autor, conteúdo, título, menção e comunidade - IMPLEMENTADO
- Criar e testar rota que filtra anotações [Samuel];
- Implementar no backend a lógica de filtrar anotações [Daniel];
- Criar tela de filtrar anotações [Julio];
- Como usuário logado, quero criar, edtiar ou excluir comunidades - IMPLEMENTADO PARCIALMENTE (É possível criar a comunidade e dar follow/unfollow, mas não faria muito sentido para o sistema acabar com a comunidade. O edit de foto da comunidade está implementado apenas no backend)
Tarefas e Responsáveis:
- Criar tabelas relacionadas às comunidades no banco e configurá-las no sistema [Samuel];
- Criar e testar rotas que implementam a criação, edição e exclusão de comunidades [Samuel];
- Implementar no backend a lógica de criar, editar e excluir comunidades [Daniel];
- Criar tela de cadastrar, editar e excluir comunidades [Julio];
- Como usuário logado, quero compartilhar uma anotação pública - IMPLEMENTADO (Apenas para comunidades, o sistema de controle de amigos e perfil não estava no escopo do sprint 1)
Tarefas e Responsáveis:
- Criar tabelas da história no banco e configurá-las no sistema [Samuel];
- Criar e testar rota que implementa o compartilhamento de anotações [Samuel];
- Implementar no backend a lógica de compartilhar anotações [Daniel];
- Criar tela de compartilhar anotações [Julio];
- Como usuário logado, quero curtir/comentar anotações - IMPLEMENTADO
Tarefas e Responsáveis:
- Criar tabelas da história no banco e configurá-las no sistema [Samuel];
- Criar e testar rotas responsáveis por curtir e comentar anotações [Samuel];
- Implementar no backend a lógica de curtir e comentar anotações [Daniel];
- Criar tela de curtir e comentar anotações [Julio];