O Twitter Clone API é uma API RESTful que simula o funcionamento do Twitter, podendo ser usada para criar usuários, posts e comentários para os posts.
O projeto foi desenvolvido utilizando as seguintes tecnologias:
O primeiro passo para rodar o projeto é ter certeza que você tem todas as ferramentas disponíveis no seu computador. Sendo assim, tenha certeza de seguir todos os passos corretamente.
ATENÇÃO: Os seguintes passos são para configurações em ambiente Linux. Se você possui outro SO, basta fazer algumas simples buscas na internet de como seguir os mesmos passos que irá funcionar (deixarei também algumas dicas por aqui, caso precise).
Toda a documentação (incluindo o guia de instalação para Windows pode ser encontrada no repositório oficial do NVM).
Abra seu terminal e digite:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash
Aguarde a instalação terminar antes de prosseguir.
No mesmo terminal, digite:
nvm install v12.17.0
E depois:
nvm use v12.17.0
Esses comandos vão fazer seu computador baixar o Node.js na sua útima versão LTS (que é a atual versão LTS, mas você pode checar por mudanças no site oficial do NodeJS) e usar ela.
Yarn é o gerenciador de pacotes que vai ser usado para baixar todas as dependências e executar o projeto. Caso você prefira utilizar o próprio gerenciador de pacotes do NodeJS (NPM), pule esta etapa.
Para baixar, nós temos duas opções:
-
Ir ao site oficial do Yarn e ver por conta própria como baixar;
-
Rodar este comando no terminal:
npm install -g yarn
Agora temos tudo que precisamos para executar o projeto!
Para isso, também há duas opções:
-
Simplesmente baixar através do botão verde no canto superior direito dessa atual página;
-
Usar o Git Bash:
# faça o clone do repositório
git clone https://github.com/danilo-vieira/twitter-clone-API.git
# entre na pasta baixada
cd twitter-clone-API
Agora, abra este diretório com sua IDE (recomendo o Visual Studio Code)
Se você baixou o Yarn, com o terminal da IDE aberto, rode:
yarn
Se você está utilizando o NPM, rode:
npm install
Isso vai instalar todas as dependências necessárias. Tire uma pausa e tome um café enquanto espera ☕😋.
O projeto utiliza o banco Postgres. Certifique-se de tê-lo em sua máquina.
Após isso, crie, na raiz do projeto, um arquivo chamado ormconfig.json
. Tenha certeza de colocar o nome exato, pois esse arquivo será lido pela CLI do TypeORM para fazer a conexão com o Banco de Dados.
Dentro desse arquivo, você irá colocar as configurações de conexão com o banco. Siga esse exemplo, substituindo APENAS o que estiver em caixa alta:
{
"name": "default",
"type": "postgres",
"host": "HOST_DO_BANCO",
"port": PORTA_DE_CONEXÃO,
"username": "USUÁRIO",
"password": "SENHA",
"database": "NOME_DA_DATABASE",
"entities": [
"./src/modules/**/infra/typeorm/entities/*.ts"
],
"migrations": [
"./src/shared/infra/typeorm/migrations/*.ts"
],
"cli": {
"migrationsDir": "./src/shared/infra/typeorm/migrations"
}
}
Com a conexão do Banco já configurada, rode no terminal da IDE:
yarn typeorm migration:run
Isso irá subir as tabelas para o banco.
Para isso, basta rodar:
yarn dev:server
Lembre-se de manter o terminal em execução para que o projeto continue rodando.
Nessa API, temos três principais entidades que serão descritas por ordem e tipo de rota (GET, POST, PUT, PATCH ou DELETE):
- Rotas para usuários;
- Rotas para posts;
- Rotas para comentários.
A URL base a ser usada como exemplo será uma variável base_url
. Considere que ela armazene o valor http://localhost:3333
.
-
Motivo
- Foi informado um token inválido no cabeçalho da requisição.
-
Reposta desse erro
-
{ "status": "error", "message": "Invalid JWT token" }
- Status code:
401
-
-
Motivo
- Não foi informado um token no cabeçalho da requisição
-
Reposta desse erro
-
{ "status": "error", "message": "Token was not provided." }
- Status code:
401
-
- HEADER
-
key: authorization
-
value: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiSm9obiBEb2UiLCJpYXQiOjE1OTA2NjMyMTksImV4cCI6MTU5MDc0OTYxOSwic3ViIjoiOTBkMDAyZmItOTljMy00ODY4LTgzYjItOGFlMzkwZTM2ZTBiIn0.Hepb43TqjQe5ba8nnNJ-iBaaMBMSVi3rraAA0nATLT4
-
Rota
- POST -
base_url/users
Descrição
Essa rota realiza o cadastro de um usuário a partir do nome, email e senha.
Parâmetros
- BODY
-
{ "name": "John Doe", "email": "johndoe@example.com", "password": "123456" }
-
Resposta
{
"name": "John Doe",
"email": "johndoe@example.com",
"id": "90d002fb-99c3-4868-83b2-8ae390e36e0b",
"created_at": "2020-05-28T13:52:51.342Z",
"updated_at": "2020-05-28T13:52:51.342Z"
}
Status code: 201
Possíveis erros
-
Motivo
- O email já está sendo utilizado por outro usuário.
-
Reposta desse erro
-
{ "status": "error", "message": "E-mail address already used" }
- Status code:
400
-
Rota
- POST -
base_url/sessions
Descrição
Essa rota realiza a autenticação de um usuário cadastrado
Parâmetros
- BODY
-
{ "email": "johndoe@example.com", "password": "123456" }
-
Resposta
{
"user": {
"id": "90d002fb-99c3-4868-83b2-8ae390e36e0b",
"name": "John Doe",
"email": "johndoe@example.com",
"created_at": "2020-05-28T13:52:51.342Z",
"updated_at": "2020-05-28T13:52:51.342Z"
},
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJuYW1lIjoiSm9obiBEb2UiLCJpYXQiOjE1OTA2NjMyMTksImV4cCI6MTU5MDc0OTYxOSwic3ViIjoiOTBkMDAyZmItOTljMy00ODY4LTgzYjItOGFlMzkwZTM2ZTBiIn0.Hepb43TqjQe5ba8nnNJ-iBaaMBMSVi3rraAA0nATLT4"
}
Status code: 200
Possíveis erros
-
Motivo
- O email ou senha informados não bate com um usuário cadastrado
-
Reposta desse erro
-
{ "status": "error", "message": "Incorrect e-mail/password combination" }
- Status code:
400
-
Rota
- PUT -
base_url/profile/update
Descrição
Essa rota realiza a alteração das informações cadastrais de um usuário como nome, email e senha, sendo a senha opicional.
Para isso, é necessário que o usuário esteja autenticado, enviando o token pelo header da requisição.
Parâmetros
-
BODY
-Podem haver duas possibilides: Com os dados para troca de senha ou sem.
-
{ "name": "John", "email": "johndoe@example.com", "old_password": "123456", "password": "1234567", "password_confirmation": "1234567" }
-
{ "name": "John", "email": "johndoe@example.com" }
-
-
HEADER
Resposta
{
"id": "90d002fb-99c3-4868-83b2-8ae390e36e0b",
"name": "John",
"email": "johndoe@example.com",
"created_at": "2020-05-28T13:52:51.342Z",
"updated_at": "2020-05-28T13:55:42.981Z"
}
Status code: 200
Possíveis erros
- Motivo
-
Motivo
- Email informado para atualização já está sendo utilizado por outro usuário.
-
Reposta desse erro
-
{ "status": "error", "message": "E-mail address already used" }
- Status code:
400
-
-
Motivo
- Foi informada a antiga senha mas não a nova senha/confirmação de senha.
-
Reposta desse erro
-
{ "status": "error", "message": "You need to inform the password field to set a new password" }
- Status code:
400
-
-
Motivo
- A senha e a confirmação da senha não batem.
-
Reposta desse erro
-
{ "statusCode": 400, "error": "Bad Request", "message": "\"password_confirmation\" must be [ref:password]", "validation": { "source": "body", "keys": [ "password_confirmation" ] } }
- Status code:
400
- Erro de validação do Celebrate
-
Rota
- DELETE -
base_url/profile/delete
Descrição
Essa rota realiza a remoção de uma conta de usuário do banco e junto dela, todos os posts e comentários da mesma.
Parâmetros
- HEADER
Resposta
Status code: 204
Possíveis erros
- Motivo
Rota
- GET -
base_url/profile
Descrição
Essa rota mostra as informações do cadastro de um usuário
Parâmetros
Resposta
Status code: 200
Possíveis erros
- Motivo
Rota
- POST -
base_url/posts
Descrição
Essa rota realiza a criação de um post.
Parâmetros
- BODY
-
{ "content": "Hello World!" }
-
- HEADER
Resposta
{
"id": "756db6fc-2635-49fd-9888-965eebf807d2",
"user_id": "ee0c2b52-142e-4ee0-9369-41e4decc113e",
"content": "Hello World!",
"likes": 0,
"comments": [],
"created_at": "2020-05-28T17:44:57.250Z",
"updated_at": "2020-05-28T17:44:57.250Z"
}
Status code: 200
Possíveis erros
- Motivo
- Motivo
- Erros de validação do Celebrate caso o conteúdo do corpo não exista, possua menos que 1 caractere ou possua mais que 280 caracteres
Rota
- PUT -
base_url/posts/:postId
Descrição
Essa rota realiza a alteração no conteúdo de um post.
Parâmetros
- BODY
-
{ "content": "Post Changed!" }
-
- PARAMS
-
756db6fc-2635-49fd-9888-965eebf807d2
-
- HEADER
Resposta
{
"id": "e686c337-9974-4242-9430-17fc958abffb",
"user_id": "322dac61-b42d-4e0c-abb0-7dfbda6fd40c",
"comment_id": null,
"content": "Post Changed!",
"likes": 0,
"created_at": "2020-05-30T11:50:12.661Z",
"updated_at": "2020-05-30T11:52:16.794Z",
"user": {
"id": "322dac61-b42d-4e0c-abb0-7dfbda6fd40c",
"name": "John Doe",
"email": "johndoe@example.com",
"created_at": "2020-05-30T11:50:02.728Z",
"updated_at": "2020-05-30T11:50:02.728Z"
},
"comments": []
}
Status code: 200
Possíveis erros
-
Motivo
-
Motivo
- Erros de validação do Celebrate caso o conteúdo do corpo não exista, se o
content
possuir menos que 1 caractere, possuir mais que 280 caracteres ou se o ID informado não for do tipo UUIDv4.
- Erros de validação do Celebrate caso o conteúdo do corpo não exista, se o
-
Motivo
- O post não foi encontrado
-
Resposta desse erro:
-
{ "status": "error", "message": "Post not found" }
- Status code:
400
-
Rota
- PATCH -
base_url/posts/likes/:postId
Descrição
Essa rota permite dar like em um post. Atenção: Apenas é permitido um like por usuário. Caso um usuário que já tenha dado like realize uma requisição à essa mesma rota, a ação será de deslike.
Parâmetros
- HEADER
- PARAMS
-
e686c337-9974-4242-9430-17fc958abffb
-
Resposta
{
"id": "e686c337-9974-4242-9430-17fc958abffb",
"user_id": "322dac61-b42d-4e0c-abb0-7dfbda6fd40c",
"comment_id": null,
"content": "Post Changed!",
"likes": 1,
"created_at": "2020-05-30T11:50:12.661Z",
"updated_at": "2020-05-30T11:52:16.794Z",
"user": {
"id": "322dac61-b42d-4e0c-abb0-7dfbda6fd40c",
"name": "John Doe",
"email": "johndoe@example.com",
"created_at": "2020-05-30T11:50:02.728Z",
"updated_at": "2020-05-30T11:50:02.728Z"
},
"comments": []
}
Status code: 200
Possíveis erros
-
Motivo
-
Motivo
- Erros de validação do Celebrate caso o ID passado no parâmetro não seja do tipo UUIDv4.
-
Motivo
- Usuário não encontrado
-
Resposta desse erro:
{ "status": "error", "message": "User not found.", }
- Status code:
400
- Status code:
-
Motivo
- Post não encontrado
-
Resposta desse erro:
{ "status": "error", "message": "Post not found.", }
- Status code:
400
- Status code:
Rota
- DELETE -
base_url/posts/:postId
Descrição
Essa rota realiza a remoção de um post do banco de dados.
Parâmetros
- PARAMS
-
756db6fc-2635-49fd-9888-965eebf807d2
-
- HEADER
Resposta
Status code: 204
Possíveis erros
-
Motivo
-
Motivo
- Erro de validação do Celebrate caso o ID informado não for do tipo UUIDv4.
-
Motivo
- O post não foi encontrado
-
Resposta desse erro:
-
{ "status": "error", "message": "Post not found" }
- Status code:
400
-
Rota
- GET -
base_url/posts
Descrição
Essa rota realiza a listagem de todos os posts de todos os usuários ordenados por data do mais recente para o mais antigo (timeline).
Parâmetros
- Não possui
Resposta
[
{
"id": "e686c337-9974-4242-9430-17fc958abffb",
"user_id": "322dac61-b42d-4e0c-abb0-7dfbda6fd40c",
"comment_id": null,
"content": "Post Changed!",
"likes": 1,
"created_at": "2020-05-30T11:50:12.661Z",
"updated_at": "2020-05-30T11:52:16.794Z",
"user": {
"id": "322dac61-b42d-4e0c-abb0-7dfbda6fd40c",
"name": "John Doe",
"email": "johndoe@example.com",
"created_at": "2020-05-30T11:50:02.728Z",
"updated_at": "2020-05-30T11:50:02.728Z"
},
"comments": []
}
]
Status code: 200
Possíveis erros
- Não possui
Rota
- GET -
base_url/posts/:userId
Descrição
Essa rota realiza a listagem de todos os posts de um determinado usuário a partir do id dele.
Parâmetros
- PARAMS
-
ee0c2b52-142e-4ee0-9369-41e4decc113e
-
Resposta
[
{
"id": "e686c337-9974-4242-9430-17fc958abffb",
"user_id": "322dac61-b42d-4e0c-abb0-7dfbda6fd40c",
"comment_id": null,
"content": "Post Changed!",
"likes": 1,
"created_at": "2020-05-30T11:50:12.661Z",
"updated_at": "2020-05-30T11:52:16.794Z",
"user": {
"id": "322dac61-b42d-4e0c-abb0-7dfbda6fd40c",
"name": "John Doe",
"email": "johndoe@example.com",
"created_at": "2020-05-30T11:50:02.728Z",
"updated_at": "2020-05-30T11:50:02.728Z"
},
"comments": []
}
]
Status code: 200
Possíveis erros
-
Motivo
-
Motivo
- Erro de validação do Celebrate caso o ID informado não for do tipo UUIDv4.
-
Motivo
- O usuário não foi encontrado
-
Resposta desse erro:
-
{ "status": "error", "message": "User not found" }
- Status code:
400
-
Rota
- GET -
base_url/posts/:postId/:userId
Descrição
Essa rota mostra um post de um determinado usuário a partir do id do post e do usuário.
Parâmetros
- PARAMS
-
fc53f681-82b5-4089-b2c1-d12002b38ed3
-
ee0c2b52-142e-4ee0-9369-41e4decc113e
-
Resposta
{
"id": "fc53f681-82b5-4089-b2c1-d12002b38ed3",
"user_id": "ee0c2b52-142e-4ee0-9369-41e4decc113e",
"comment_id": null,
"content": "Post Changed!",
"created_at": "2020-05-28T18:16:53.420Z",
"updated_at": "2020-05-28T18:16:53.420Z",
"user": {
"id": "ee0c2b52-142e-4ee0-9369-41e4decc113e",
"name": "John",
"email": "johndoe@example.com",
"created_at": "2020-05-28T16:51:20.606Z",
"updated_at": "2020-05-28T16:54:45.734Z"
},
"comment": []
}
Status code: 200
Possíveis erros
-
Motivo
-
Motivo
- Erro de validação do Celebrate caso os IDs informados não forem do tipo UUIDv4.
-
Motivo
- O usuário não foi encontrado
-
Resposta desse erro:
-
{ "status": "error", "message": "User not found" }
- Status code:
400
-
-
Motivo
- O post não foi encontrado
-
Resposta desse erro:
-
{ "status": "error", "message": "Post not found" }
- Status code:
400
-
Rota
- POST -
base_url/comments/:postId
Descrição
Essa rota realiza a criação de um comentário.
Parâmetros
- BODY
-
{ "content": "This is a comment!" }
-
- PARAMS
-
756db6fc-2635-49fd-9888-965eebf807d2
-
- HEADER
Resposta
{
"post_id": "fc53f681-82b5-4089-b2c1-d12002b38ed3",
"user_id": "ee0c2b52-142e-4ee0-9369-41e4decc113e",
"likes": 0,
"content": "This is a comment!",
"id": "6422bdc6-c6b5-448a-9e77-e8ecd6e672df",
"created_at": "2020-05-28T18:28:48.706Z",
"updated_at": "2020-05-28T18:28:48.706Z"
}
Status code: 200
Possíveis erros
-
Motivo
-
Motivo
- Erro de validação do Celebrate caso o ID informado não for do tipo UUIDv4.
-
Motivo
- O post não foi encontrado
-
Resposta desse erro:
-
{ "status": "error", "message": "Post not found" }
- Status code:
400
-
Rota
- PUT -
base_url/comments/:commentId
Descrição
Essa rota realiza a edição de um comentário a partir do seu ID.
Parâmetros
- BODY
-
{ "content": "Comment ALTERED" }
-
- PARAMS
-
6422bdc6-c6b5-448a-9e77-e8ecd6e672df
-
- HEADER
Resposta
{
"id": "6422bdc6-c6b5-448a-9e77-e8ecd6e672df",
"post_id": "fc53f681-82b5-4089-b2c1-d12002b38ed3",
"user_id": "ee0c2b52-142e-4ee0-9369-41e4decc113e",
"likes": 0,
"content": "Comment ALTERED",
"created_at": "2020-05-28T18:28:48.706Z",
"updated_at": "2020-05-28T18:33:16.886Z"
}
Status code: 200
Possíveis erros
-
Motivo
-
Motivo
- Erro de validação do Celebrate caso o ID informado não for do tipo UUIDv4.
-
Motivo
- O comentário não foi encontrado
-
Resposta desse erro:
-
{ "status": "error", "message": "Comment not found" }
- Status code:
400
-
Rota
- PATCH -
base_url/comments/likes/:commentId
Descrição
Essa rota permite dar like em um comentário. Atenção: Apenas é permitido um like por usuário. Caso um usuário que já tenha dado like realize uma requisição à essa mesma rota, a ação será de deslike.
Parâmetros
- HEADER
- PARAMS
-
6422bdc6-c6b5-448a-9e77-e8ecd6e672df
-
Resposta
{
"id": "6422bdc6-c6b5-448a-9e77-e8ecd6e672df",
"post_id": "e686c337-9974-4242-9430-17fc958abffb",
"user_id": "322dac61-b42d-4e0c-abb0-7dfbda6fd40c",
"likes": 1,
"content": "Comment ALTERED",
"created_at": "2020-05-30T11:51:13.587Z",
"updated_at": "2020-05-30T11:52:41.408Z"
}
Status code: 200
Possíveis erros
-
Motivo
-
Motivo
- Erros de validação do Celebrate caso o ID passado no parâmetro não seja do tipo UUIDv4.
-
Motivo
- Usuário não encontrado
-
Resposta desse erro:
{ "status": "error", "message": "User not found.", }
- Status code:
400
- Status code:
-
Motivo
- Comentário não encontrado
-
Resposta desse erro:
{ "status": "error", "message": "Comment not found.", }
- Status code:
400
- Status code:
Rota
- DELETE -
base_url/comments/:commentId
Descrição
Essa rota realiza a remoção de um comentário do banco de dados a partir do seu ID. Aqui há uma regra de negócio mais específica que é o seguinte:
O dono de uma publicação pode apagar qualquer comentário dessa publicação mesmo que não tenha sido escrito por ele.
Já o autor de um comentário em uma publicação que não é dele, pode apagar somente o seu comentário.
Parâmetros
- PARAMS
-
6422bdc6-c6b5-448a-9e77-e8ecd6e672df
-
- HEADER
Resposta
Status code: 204
Possíveis erros
-
Motivo
-
Motivo
- Erro de validação do Celebrate caso o ID informado não for do tipo UUIDv4.
-
Motivo
- O comentário não foi encontrado
-
Resposta desse erro:
-
{ "status": "error", "message": "Comment not found" }
- Status code:
400
-
-
Motivo
- O comentário não pode ser apagado por alguém que não é o autor do comentário ou da publicação ao qual esse comentário pertence.
-
Resposta desse erro:
-
{ "status": "error", "message": "Unable to delete this comment" }
- Status code:
400
-
Rota
- GET -
base_url/comments/:postId
Descrição
Essa rota realiza a listagem de todos os comentários de um post a partir do ID de um post.
Parâmetros
- PARAMS
-
fc53f681-82b5-4089-b2c1-d12002b38ed3
-
Resposta
[
{
"id": "6422bdc6-c6b5-448a-9e77-e8ecd6e672df",
"post_id": "fc53f681-82b5-4089-b2c1-d12002b38ed3",
"user_id": "ee0c2b52-142e-4ee0-9369-41e4decc113e",
"content": "Comment ALTERED",
"created_at": "2020-05-28T18:39:57.899Z",
"updated_at": "2020-05-28T18:39:57.899Z"
}
]
Status code: 200
Possíveis erros
-
Motivo
- Erro de validação do Celebrate caso o ID informado não for do tipo UUIDv4.
-
Motivo
- O post não foi encontrado
-
Resposta desse erro:
-
{ "status": "error", "message": "Post not found" }
- Status code:
400
-
Rota
- GET -
base_url/comments/:postId/:commentId
Descrição
Essa rota mostra um comentário específico de um post a partir do ID de um post e do ID de um comentário.
Parâmetros
- PARAMS
-
fc53f681-82b5-4089-b2c1-d12002b38ed3
-
6422bdc6-c6b5-448a-9e77-e8ecd6e672df
-
Resposta
{
"id": "6422bdc6-c6b5-448a-9e77-e8ecd6e672df",
"post_id": "fc53f681-82b5-4089-b2c1-d12002b38ed3",
"user_id": "ee0c2b52-142e-4ee0-9369-41e4decc113e",
"content": "Comment ALTERED",
"created_at": "2020-05-28T18:39:57.899Z",
"updated_at": "2020-05-28T18:39:57.899Z"
}
Status code: 200
Possíveis erros
-
Motivo
- Erro de validação do Celebrate caso os IDs informados não forem do tipo UUIDv4.
-
Motivo
- O post não foi encontrado
-
Resposta desse erro:
-
{ "status": "error", "message": "Post not found" }
- Status code:
400
-
-
Motivo
- O comentário não foi encontrado
-
Resposta desse erro:
-
{ "status": "error", "message": "Comment not found" }
- Status code:
400
-
Desenvolvido com ❤ por Danilo Vieira