Exemplo de Aplicação Web que funciona como Rede social.
  • JavaScript 97.9%
  • HTML 1.9%
  • Dockerfile 0.2%
Find a file
Erick Weil b0db219b9b Merge branch 'develop' into 'main'
Merge: Agora permissões do usuário são populadas na resposta do /login

See merge request projeto-bncc/social-network!5
2023-11-17 15:38:22 +00:00
public Mantido apenas o essencial 2023-10-20 16:45:59 -04:00
src Agora permissões do usuário são populadas na resposta do /login e /login/check, bem como rotas que obtêm um único usuário por id 2023-11-17 11:34:10 -04:00
test Agora permissões do usuário são populadas na resposta do /login e /login/check, bem como rotas que obtêm um único usuário por id 2023-11-17 11:34:10 -04:00
.dockerignore Mantido apenas o essencial 2023-10-20 16:45:59 -04:00
.DS_Store Mantido apenas o essencial 2023-10-20 16:45:59 -04:00
.env.example Experimentando sanitização do HTML para sunEditor 2023-11-14 12:16:43 -04:00
.eslintignore Mantido apenas o essencial 2023-10-20 16:45:59 -04:00
.eslintrc.json Mantido apenas o essencial 2023-10-20 16:45:59 -04:00
.gitignore Organizado deploy para utilizar mongo autenticado 2023-11-01 11:02:12 -04:00
.gitlab-ci.yml Reorganizado testes, adicionado rota para pesquisar histórico por usuário, agora seed é configurável 2023-11-16 10:25:27 -04:00
deploy-mongo.yaml Organizado deploy para utilizar mongo autenticado 2023-11-01 11:02:12 -04:00
deployment.yaml Organizado deploy para utilizar mongo autenticado 2023-11-01 11:02:12 -04:00
docker-compose.yml Implementação inicial do sistema de permissões, agora cada rota/funcionalidade precisa de permissões específicas 2023-11-11 14:43:31 -04:00
Dockerfile Implementação inicial do sistema de permissões, agora cada rota/funcionalidade precisa de permissões específicas 2023-11-11 14:43:31 -04:00
LICENSE Initial commit 2023-06-29 07:55:27 -04:00
mongo-config.yaml.example Organizado deploy para utilizar mongo autenticado 2023-11-01 11:02:12 -04:00
package-lock.json corrigido espaços duplicados no texto extraído do HTML, Adicionado testes sanitizarHTML 2023-11-17 09:57:37 -04:00
package.json corrigido espaços duplicados no texto extraído do HTML, Adicionado testes sanitizarHTML 2023-11-17 09:57:37 -04:00
README.md sistema de historico nas models Comentario, Discussao e Usuario 2023-11-13 17:31:31 -04:00
server.js Mantido apenas o essencial 2023-10-20 16:45:59 -04:00

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

Role-based access control - RBAC https://tailscale.com/blog/rbac-like-it-was-meant-to-be/

Cada usuário é limitado no que pode fazer baseado nos seguintes papéis (Um usuário pode ter vários papéis):

  • VISITANTE: Apenas visualização.
    • Criar nova conta
    • Fazer login
    • Ver discussões, comentários e usuários.
  • USUARIO: Além das permissões de visitante pode:
    • Atualizar o próprio perfil (nome, biografia, foto de perfil e capa)
    • Deletar a própria conta
    • Redefinir a própria senha
  • PUBLICADOR: Permissões para publica discussões e comentários
    • 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ário, Deletar o próprio comentário
    • Positivar/Negativar comentários
  • 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, Deletar qualquer usuário
  • ADMINISTRADOR: Todas as permissões, além das acima pode:
    • Gerenciar permissões, criando e editando Papéis.
    • Atribuir um Papel a um usuário

Um usuário quando é cadastrado recebe o papel USUARIO, e uma vez que verificar o email, ganha também o papel PUBLICADOR.

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 exec bncc-api 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 com docker sem docker-compose

Para executar via docker manualmente

docker build -t bncc-api --build-arg NODE_ENV=development .
docker network create bncc-net
docker rm -f bncc-mongo && docker run -d --name bncc-mongo --network bncc-net -p 27017:27017 -v bncc_vol-db:/data/db mongo:6.0.7
docker rm -f bncc-api && docker run -d --name bncc-api --network bncc-net -e DB_URL=mongodb://bncc-mongo:27017 -p 3000:3000 bncc-api
docker exec bncc-api sh -c "npm run seed"

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"
DB_EXPOSE_PORT=27017
  • 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
  • DB_EXPOSE_PORT - Porta que será exposta o banco de dados

Bibliotecas e Frameworks