Social-Network
Exemplo de Aplicação Web que funciona como Rede social.
Funcionalidades
- Usuário
- Criar conta - Possível criar conta utilizando email e senha
- Fazer Login - Antes de utilizar qualquer rota da api é necessário autenticar
- Deletar conta - Caso deseje, é possível deletar a sua própria conta (Deletar a conta não deleta discussões nem comentários realizados)
- Pesquisar usuários - Pesquise por uma lista de usuário pelo nome ou um usuário pelo id
- Atualizar perfil - Atualize seu nome e biografia, além da foto de perfil e capa
- Discussão
- Pesquisar discussões - É possível pesquisar discussões, pelo id, por palavras no título, pelos assuntos e discussões de um usuário
- Criar discussão - Permite criar uma nova discussão, que possui um título e um comentário inicial. É possível editar a discussão depois.
- Deletar discussão - Deletar uma discussão irá apagar ocultar seu título, porém seus comentários continuam, permitindo ainda criar novos comentários
- Comentário
- Pesquisar comentário - É possível pesquisar comentários pelo id, por palavras no conteúdo, por usuários citados, e por usuário
- Realizar comentário - Envie texto e até 8 imagens em seu comentário. Também pode citar outro comentário. É possível editar o comentário.
- Deletar comentário - Deletar um comentário irá ocultar seu conteúdo e imagens, porém continuará listado como um comentário da discussão
- Curtir
- Curtir comentários - Positive/Negative comentários
Criar Conta
Deve informar o nome, email e senha do usuário a ser criado
A força da senha da senha é calculada levando em contra o número de caracteres únicos, número de caracteres repetidos, se contém números, maiúsculas, minúsculas e símbolos
O cálculo é feito de forma que seja calculada uma nota da força da senha. Os pesos são:
- +2 para cada caractere único
- +1 para cada caractere repetido
- +10 se conter números
- +10 se conter maiúsculas
- +10 se conter minúsculas
- +15 se conter símbolos
A senha deve ter no mínimo 8 caracteres e a força da senha pelo menos 50
Exemplos de senhas não aceitas e suas forças calculadas:
- 123456789012345678901 41
- abcdefghijklmnopq 44
- QWERTYUqwerty 46
- ABCabc123 48
- 1!bcdBC <-- menos de 8 caracteres
Exemplos de senhas aceitas (Mas agora que todo mundo sabe são fracas):
- ABCDabcd1234
- deveserumtextoassimbemlongomesmo
- ComMaiusculasEMenor
- 0123abcd!
Basicamente, se sua senha contiver maiúsculas, minúsculas, números e símbolos se possuir pelo menos 8 caracteres já será aceita. Agora para cada característica que a senha não possuir o tamanho mínimo aceito será maior. (Veja que a senha contendo apenas letras minúsculas deve ser gigante para ser aceita)
Autenticação
A autenticação é feita utilizando JWT. faça login na rota /login e então guarde o token retornado, ele deve estar no header Authorization de todas as requisições para ser autorizado.
Exemplo:
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjY0YTYzMjIwOTg4NWQ4ZTgzNzhlZTU5MCIsIm5vbWUiOiJKb8OjbyBkYSBTaWx2YSIsImVtYWlsIjoiam9hb0BlbWFpbC5jb20iLCJpYXQiOjE2ODg4MjkzMTcsImV4cCI6MTY4ODgzNjUxN30.VPPzKImGQrcQdKz6wEq7MLgZ0OuMEgpaHtRCgZn7Tdc
Desativando Autenticação
É possível desativar a autenticação executando a API com a variável de ambiente DISABLE_AUTH=true
Isto fará com que você esteja logado com o usuário com email joao@email.com que é criado pelo seed
Upload De Imagens
Para enviar a imagem deve ela deve ser enviada por meio de formulário multipart/form-data Em cada rota há um nome esperado para o campo da imagem.
- foto_perfil no caso da foto do perfil do usuário
- foto_capa - Foto da capa do usuário
- fotos_postagem - Fotos da postagem (Até 8)
Os formatos aceitos são: jpeg, bmp, png e gif. Porém independente do formato enviado será salva novamente como um .jpg com 80% de qualidade. Devido à imagem ser salva novamente serão removidos quaisquer metadados possivelmente contidos na imagem (EXIF pode conter informações de GPS), além de mitigar problemas relacionados à esteganografia (Esconder mensagens na imagem). Por último imagens corrompidas, ou arquivos que se passando por imagens causam erro ao serem salvas e não são aceitas.
A resolução da imagem é limitada ao mínimo de 150x150 pixels e ao máximo de 1024x1024 pixels. Sendo redimensionada mantendo o aspect ratio quando necessário.
Caso a imagem seja muito estreita ou muito alta ela será cortada, sendo 21.0/9.0 (ultra wide screen) o mais largo que a imagem pode ser e 9.0/16.0 (wide screen de pé) o mais alto que a imagem pode ser
No caso da foto do perfil, a imagem ainda será cortada para ficar quadrada, ou seja, aspect ratio 1/1. E no caso da foto de capa prefere-se imagens em paisagem sendo 1/1 o mais alto que a imagem pode ser.
Pesquisa Por Texto
A pesquisa por texto é utilizada ao pesquisar usuários pelo nome e também ao pesquisar postagens. As regras abaixo valem para os dois casos.
Acentos, maiúsculas e minúsculas são ignorados, são equivalentes joao, Joao, João, JOAO
As palavras da pesquisa são ignoradas quanto à contrações de gênero, plural, etc... berto não encontra Alberto mas albertos, alberta, albertas e albert encontra.
Caso você pesquise por João Alberto Paulo (Sem aspas) irá encontrar todos os usuário que possuem João ou Alberto ou Paulo como uma das partes do nome Ex: Alberto Nogueira, João da Silva e Paula Silva
É possível pesquisar por um termo exato colocando aspas, "João da Silva" só encontraria um único resultado: João da Silva
Para mais informações, veja a documentação sobre o índice de texto do mongodb. Veja: https://www.mongodb.com/docs/manual/core/index-text/
Pesquisa por Assunto/Menções
No caso de discussões onde é possível pesquisar assuntos e comentários pesquisa por menções, outro procedimento é realizado: no momento que a postagem é criada, as assuntos são encontradas, processadas pelo any-ascii para remover todos os caracteres especiais e acentos e então convertida para minúsculas antes de finalmente serem salvas no registro da postagem como um array no campo assuntos. Ao pesquisar por com assunto, a pesquisa ignora acentos, maiúsculas e minúsculas pois a sua pesquisa será tratada da mesma forma antes de realizar uma busca por que postagens possuem no array de assuntos esta exata assunto.
Deletar Elementos
Nem todas as rotas que deletam realmente deletam por completo o que foi solicitado.
-
Atualizar imagem de Perfil e Capa
Ao atualizar a imagem de perfil e/ou capa de um usuário, a imagem anterior será deletada.
-
Deletar Usuário
Será deletado a sua entrada do usuário como também:
- As imagens de capa e perfil
Porém não serão removidos as suas discussões/comentários. Apenas ficará o autor como [deletado]
Também as postagens que você positivou/negativou continuarão com a sua curtida registrada
-
Editar Comentário
Para todos os efeitos, o comentário foi editado. será possível saber que o comentário foi editado e qual a data da última edição.
Internamente, um administrador ainda pode ter acesso a todo o histórico de edições de um comentário.
-
Deletar Comentário
Deletar um Comentário é como uma edição que remove seu conteúdo e imagens, além de ser marcado como deletado.
Um comentário deletado não é exibido mais na pesquisa de comentários do usuário, porém continua na listagem da discussão. Ainda será possível visualizar que ele existe e que usuário foi o autor, porém sem conteúdo nem as imagens. (Comentários que citaram antes de ser deletado continuarão com o conteúdo antigo).
Deletar o comentário não modifica a contagem de comentários da postagem.
Sistema de permissões
Cada usuário é limitado no que pode fazer baseado nos seguintes níveis (Cada nível possui todas as permissões do anterior):
- Usuário Visitante (Não logado): Apenas visualização.
- Criar nova conta
- Fazer login
- Pesquisar por discussões, comentários e usuários.
- Usuário Logado, não verificado e-mail: Além das permissões de usuário visitante pode:
- Atualizar o próprio perfil (nome, biografia, foto de perfil e capa)
- Positivar/Negativar comentários
- Usuário logado, e-mail verificado: Permissões normais
- Criar discussões, Editar a própria discussão, Trancar a própria Discussão, Deletar a própria discussão
- Realizar comentários, Editar o próprio comentários, Deletar o próprio comentário
- Usuário moderador:
- Visualizar histórico de edições de comentários, logs (auditoria, verificar o que um usuário fez e quando)
- Editar qualquer discussão, Trancar qualquer discussão, Deletar qualquer discussão
- Editar qualquer comentário, Deletar qualquer comentário
- Editar qualquer perfil de usuário, Banir qualquer usuário por algum período de tempo
- Administrador do sistema:
- Tornar qualquer usuário verificado um moderador ou não
Instalação
Para executar esta API localmente, é possível utilizar Docker ou então executando via node direto.
Docker-Compose
Para executar esta API via docker, basta clonar o repositório e na pasta raiz do projeto renomear o env exemplo e executar o docker compose:
cp .env.example .env
docker compose up
No primeiro início é necessário rodar o seed
docker ps
# Com o id/nome do container nodejs obtido pelo docker ps:
docker exec <NOME-DO-CONTAINER> sh -c "npm run seed"
Obs: Opcionalmente há o docker-compose-dev.yml que permite iniciar o projeto via docker porém é iniciado com nodemon e diretório local mapeado dentro do container, permitindo editar os arquivos e ver em tempo real as modificações.
Executando manualmente com node
Para rodar este projeto com nodejs localmente, primeiro é necessário configurar o .env, instalar as dependências, e então iniciar o projeto
cp .env.example .env
npm install
npm run seed
npm start
Obs: É necessário um banco de dados MongoDB configurado na variável de ambiente DB_URL
Configuração Variáveis de Ambiente:
O arquivo .env.example possui os valores necessários. porém aqui vai um detalhamento:
.env.example
PORT=3000
SUBPATH="/"
IMG_PATH="."
DB_URL="mongodb://127.0.0.1:27017"
DISABLE_AUTH="false"
SECRET="insiraoseusecretaqui"
EXPIREIN="2h"
DEBUGLOG="true"
- PORT - É a porta que o servidor irá escutar
- SUBPATH - O caminho ao qual o express irá considerar como o root do site, utilizado para hospedar o site em um subcaminho
- IMG_PATH - o caminho no qual as imagens serão salvas, útil ao utilizar containers para salvar as imagens em um volume. Deve ser relativo ao workdir onde o node está executando
- DB_URL - url de conexão com banco MongoDB
- DISABLE_AUTH - se for true desativa a autenticação, fazendo com que você já esteja automaticamente autenticado com o Usuário Teste "João da Silva" que é criado pelo seed
- SECRET - Utilizado pelo JWT para gerar o token, deve ser mantido de forma segura
- EXPIREIN - O tempo de expiração do token JWT
- DEBUGLOG - se for true irá realizar logs das rotas acessadas e outras informações
Bibliotecas e Frameworks
- Formidable https://github.com/node-formidable/formidable - Lidar com upload de imagens via multipart/form-data
- Sharp https://github.com/lovell/sharp - Processamento de imagens
- Any-Ascii https://github.com/anyascii/anyascii - Remover acentos e caracteres especiais