Find A Friend é uma plataforma que facilita a adoção de pets, conectando organizações de adoção com pessoas que desejam adotar animais. O sistema permite criar organizações, autenticar-se como uma organização, cadastrar pets, buscar por pets e visualizar detalhes sobre os animais disponíveis para adoção.
- 🟢 Node.js: Plataforma para execução do JavaScript no servidor.
- 🟦 TypeScript: Superset do JavaScript com tipagem estática.
- ⚡ Fastify: Framework web de alta performance para Node.js.
- 🗄️ PostgreSQL: Banco de dados relacional utilizado para armazenar informações.
- 🛢️ Prisma: ORM moderno para interações com o banco de dados.
- 🐳 Docker: Containerização para ambiente de desenvolvimento.
- 💎 Zod: Validação de esquemas e dados.
- 🛡️ JWT: Json Web Tokens para autenticação.
- 🧪 Vitest: Framework de testes.
- 🕷️ Supertest: Biblioteca para testar APIs de forma simples e eficaz.
- ⚙️ ESLint: Linter para garantir a qualidade do código.
- 🔒 Bcrypt: Biblioteca para hashing de senhas.
- 🌱 Dotenv: Gerenciamento de variáveis de ambiente.
- ⚙️ GitHub Actions: Ferramenta de CI que automatiza o processo de testes e implantações.
- 🏢 Criar organização: Cria uma nova organização na plataforma.
- 🔐 Autenticar organização: Realiza o login de uma organização existente.
- 📍 Buscar organizações próximas: Localiza organizações com base na localização.
- 🐕 Criar pet: Cadastra um novo pet para adoção.
- 🔍 Buscar pets: Realiza uma busca por pets disponíveis para adoção.
- 📝 Visualizar detalhes do pet: Exibe as informações detalhadas de um pet.
- 📱 Contatar via WhatsApp: Permite que os adotantes entrem em contato com a organização responsável pelo pet via WhatsApp.
-
Clone o repositório:
git clone https://github.com/joschonarth/find-a-friend-api.git
-
Crie um arquivo
.env
a partir do exemplo:cp .env.example .env
Edite o arquivo
.env
para configurar as variáveis de ambiente necessárias. -
Instale as dependências:
npm install
-
Inicie o banco de dados PostgreSQL utilizando o container Docker com a imagem
bitnami/postgresql
:docker-compose up -d
-
Execute as migrações do banco de dados:
npx prisma migrate dev
-
Inicie a API:
npm run dev
A aplicação estará disponível em http://localhost:3333.
-
Descrição: Cria uma nova organização para cadastro de pets.
-
Método:
POST
-
URL:
/orgs
-
Corpo da Requisição:
{ "name": "Pet Love", "owner": "John Doe", "email": "john.doe@example.com", "whatsapp": "1234567890", "password": "123456", "cep": "12345-678", "state": "SP", "city": "São Paulo", "neighborhood": "Downtown", "street": "123 Some Street", "latitude": -23.6814346, "longitude": -46.9249675 }
-
Descrição: Realiza o login de uma organização existente.
-
Método:
POST
-
URL:
/orgs/auth
-
Corpo da Requisição:
{ "email": "john.doe@example.com", "password": "123456" }
-
Exemplo de Resposta:
{ "token": "eyJhbGciOiJIUzI1NiIsInR..." }
-
Descrição: Localiza organizações com base na localização.
-
Método:
GET
-
URL:
/orgs/nearby
-
Parâmetros de Consulta (Query Params):
latitude
(number, required) - Latitude atual do usuário (deve estar entre -90 e 90).longitude
(number, required) - Longitude atual do usuário (deve estar entre -180 e 180).
-
Exemplo de Requisição:
GET /orgs/nearby?latitude=-23.6814346&longitude=-46.9249675
-
Exemplo de Resposta:
{ "orgs": [ { "id": "d317448a-393c-4250-b37b-0151afabe25c", "name": "Example Organization", "owner": "John Doe", "email": "john.doe@example.com", "whatsapp": "1234567890", "cep": "12345-678", "state": "SP", "city": "São Paulo", "neighborhood": "Downtown", "street": "123 Some Street", "latitude": "-23.6814346", "longitude": "-46.9249675" }, { "id": "d3da8e0c-943f-443a-8124-927f436e6540", "name": "Some Org", "owner": "John Doe", "email": "john.doe@org.com", "whatsapp": "1234567890", "cep": "12345-678", "state": "SP", "city": "São Paulo", "neighborhood": "Downtown", "street": "123 Some Street", "latitude": "-23.6814346", "longitude": "-46.9249675" } ] }
-
Descrição: Cadastra um novo pet para adoção.
-
Método:
POST
-
URL:
/orgs/pets
-
Corpo da Requisição:
{ "name": "Buddy", "about": "Friendly and energetic dog looking for a home.", "age": "young", "size": "medium", "species": "dog", "environment": "indoor", "energy_level": "high", "independence_level": "low" }
-
Descrição: Realiza uma busca por pets disponíveis para adoção.
-
Método:
GET
-
URL:
/orgs/pets
-
Parâmetros de Consulta (Query Params):
city
(string, required): Cidade onde o pet está disponível para adoção.age
(string, optional): Faixa etária do pet para filtrar (ex: filhote, jovem, adulto).size
(string, optional): Tamanho do pet para filtrar (ex: pequeno, médio, grande).species
(string, optional): Espécie do pet (ex: cachorro, gato).environment
(string, optional): Ambiente em que o pet se adapta (ex: interno, externo)energy_level
(string, optional): Nível de energia do pet (ex: baixo, médio, alto).independence_level
(string, optional): Nível de independência do pet (ex: baixo, médio, alto).
-
Exemplo de Requisição:
GET /pets/search?city=São Paulo
-
Exemplo de Resposta:
{ "pets": [ { "id": "2cd95dfe-2a11-458d-acff-f2dd0d4f1f66", "name": "Buddy", "about": "Friendly and energetic dog looking for a home.", "age": "young", "size": "medium", "species": "dog", "environment": "indoor", "energy_level": "high", "independence_level": "low", "org_id": "d317448a-393c-4250-b37b-0151afabe25c" } ] }
-
Descrição: Exibe informações detalhadas sobre um pet específico.
-
Método:
GET
-
URL:
/orgs/pets/:petId
-
Exemplo de Resposta:
{ "id": "2cd95dfe-2a11-458d-acff-f2dd0d4f1f66", "name": "Buddy", "about": "Friendly and energetic dog looking for a home.", "age": "young", "size": "medium", "species": "dog", "environment": "indoor", "energy_level": "high", "independence_level": "low", "org_id": "d317448a-393c-4250-b37b-0151afabe25c" }
Para testar as rotas da API diretamente no VSCode, você pode utilizar a extensão REST Client. Siga os passos abaixo para começar:
-
Instale a extensão REST Client:
- Abra o Visual Studio Code.
- Vá para a aba Extensões (
Ctrl+Shift+X
). - Pesquise por REST Client e clique em Instalar.
-
Abra o arquivo de rotas:
- No projeto, abra o arquivo routes.http, que contém as requisições para testar as rotas da API.
-
Execute as rotas:
- Clique no botão Run Request que aparece acima de cada bloco de requisição para testar as rotas da API.
- Veja a resposta da requisição na parte lateral ou inferior da tela.
Com esses passos, você pode testar todas as rotas da API de forma prática e rápida sem sair do VSCode!
As rotas da API estão protegidas por autenticação JWT (JSON Web Token). Para acessar as rotas que requerem autenticação, é necessário obter um token de acesso.
-
Faça a autenticação com suas credenciais (whatsapp e senha) na rota
/orgs/auth
para obter um token JWT:- Método:
POST
- URL:
/orgs/auth
- Corpo da Requisição:
{ "email": "john.doe@example.com", "password": "123456" }
- Resposta:
{ "token": "your_token" }
- Método:
-
Utilize o token nas requisições às rotas protegidas, incluindo-o no Postman (ou outro API Client) da seguinte forma:
- No Postman, vá até a aba Authorization.
- Selecione o tipo Bearer Token.
- No campo Token, adicione o valor do token recebido.
Este projeto inclui testes unitários e testes E2E (end-to-end) para garantir a confiabilidade e o funcionamento correto dos recursos implementados. Para executar os testes, utilize os seguintes comandos:
-
Executar testes unitários:
npm run test
-
Executar testes unitários em modo de observação:
npm run test:watch
-
Preparar o ambiente do Prisma antes dos testes E2E:
npm run pretest:e2e
-
Executar testes E2E:
npm run test:e2e
-
Executar testes E2E em modo de observação:
npm run test:e2e:watch
-
Executar testes com cobertura:
npm run test:coverage
-
Executar a interface do usuário do Vitest:
npm run test:ui
O projeto utiliza o GitHub Actions para automação de testes, garantindo qualidade contínua no desenvolvimento. Os testes unitários são executados automaticamente a cada push
para o repositório, enquanto os testes E2E são acionados em cada pull request
. Essa configuração assegura que todas as alterações sejam validadas, promovendo um fluxo de trabalho eficiente e livre de erros.
Contribuições são bem-vindas! Sinta-se à vontade para abrir issues ou pull requests com melhorias ou correções. 🚀
Este projeto está licenciado sob a MIT License.