API rede social simples para demonstração
459
Exemplo de Aplicação Web que funciona como Rede social.
Github: https://github.com/erickweil/social-network
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:
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:
Exemplos de senhas aceitas (Mas agora que todo mundo sabe são fracas):
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)
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 [email protected] que é criado pelo seed
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.
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.
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/
No caso de postagens onde é possível pesquisar hashtags, outro procedimento é realizado: no momento que a postagem é criada, as hashtags 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 hashtags. Ao pesquisar por com hashtag, 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 hashtags esta exata hashtag.
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:
Porém não serão removidos as suas postagens/respostas. Apenas ficará o autor da postagem como [deletado]
Também as postagens que você curtiu continuarão com a sua curtida registrada
Deletar Postagem
Deletar uma postagem irá apagar todo seu conteúdo e imagens, porém continuará na listagem caso seja uma resposta a outra postagem.
Uma postagem deletada não é exibida mais na pesquisa de postagens do usuário nem na página 'For You', porém caso o usuário possua o link da postagem ainda será possível visualizar que ela existe e que usuário foi o autor, porém sem conteúdo nem as imagens( Não é possível acessar as imagens nem mesmo com o link original pois estarão deletadas). Respostas a esta postagem porém irão ser visíveis e podem ser encontradas na pesquisa de respostas de um usuário.
Deletar a postagem que é resposta a outra não modifica a contagem de respostas dela.
Para executar esta API localmente, é possível utilizar Docker ou então executando via node direto.
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 ./backend/.env.example ./backend/.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.
Caso não queira utilizar o Docker compose nem fazer build da imagem, há disponível no Docker Hub a imagem deste projeto, erickweil/social-network, é necessário iniciar dois containers, o container do banco de dados MongoDB e o container da api NodeJS.
docker network create social-network
docker rm -f mongo
docker run -d \
--network social-network \
-p 27017:27017 \
-v vol-db:/data/db \
--name mongo \
mongo:6.0.7
docker run -d \
--network social-network \
-p 3000:3000 \
-e DB_URL=mongodb://mongo:27017 \
-e SUBPATH=/ \
-e DISABLE_AUTH=false \
--name nodejs \
erickweil/social-network
No primeiro início é necessário rodar o seed
docker exec nodejs sh -c "npm run seed"
Para rodar este projeto com nodejs localmente, primeiro é necessário configurar o .env, instalar as dependências, e então iniciar o projeto
cd ./backend
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
O arquivo .env.example possui os valores necessários. porém aqui vai um detalhamento:
./backend/.env.example
PORT=3000
SUBPATH="/"
IMG_PATH="."
DB_URL="mongodb://127.0.0.1:27017"
DISABLE_AUTH="false"
SECRET="insiraoseusecretaqui"
EXPIREIN="2h"
DEBUGLOG="true"
Content type
Image
Digest
sha256:13e3e0e4b…
Size
91.7 MB
Last updated
over 3 years ago
docker pull erickweil/social-network