Skip to content

🐶 Find A Friend is a platform that connects adoption organizations with people looking to adopt pets, allowing organizations to manage pets and users to search and view adoption details.

License

Notifications You must be signed in to change notification settings

joschonarth/find-a-friend-api

Repository files navigation

🐶 Find A Friend

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.

🛠️ Tecnologias Utilizadas

  • 🟢 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.

⚙️ Funcionalidades

Organizaçõ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.

Pets

  • 🐕 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.

Adoção

  • 📱 Contatar via WhatsApp: Permite que os adotantes entrem em contato com a organização responsável pelo pet via WhatsApp.

🔧 Como Executar o Projeto

  1. Clone o repositório:

    git clone https://github.com/joschonarth/find-a-friend-api.git
  2. 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.

  3. Instale as dependências:

    npm install
  4. Inicie o banco de dados PostgreSQL utilizando o container Docker com a imagem bitnami/postgresql:

    docker-compose up -d
  5. Execute as migrações do banco de dados:

    npx prisma migrate dev
  6. Inicie a API:

    npm run dev

    A aplicação estará disponível em http://localhost:3333.

🔗 Endpoints

🏢 Criar Organização

  • 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
    }

🔐 Autenticar Organização

  • 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..."
    }

📍 Buscar Organizações Próximas

  • 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"
            }
        ]
    }

🐕 Criar Pet

  • 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"
      }

🔍 Buscar Pets

  • 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"
              }
          ]
      }

🦮 Buscar Informações de um Pet

  • 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"
      }

🛠️ Testando as Rotas com REST Client

Para testar as rotas da API diretamente no VSCode, você pode utilizar a extensão REST Client. Siga os passos abaixo para começar:

Passos para testar as rotas

  1. 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.
  2. Abra o arquivo de rotas:

    • No projeto, abra o arquivo routes.http, que contém as requisições para testar as rotas da API.
  3. 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!

🔐 Autenticação

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.

Como se autenticar

  1. 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"
    }
  2. 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.

🧪 Testes

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

⚙️ GitHub Actions

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

Contribuições são bem-vindas! Sinta-se à vontade para abrir issues ou pull requests com melhorias ou correções. 🚀

📝 Licença

Este projeto está licenciado sob a MIT License.

📞 Contato

LinkedIn Gmail

About

🐶 Find A Friend is a platform that connects adoption organizations with people looking to adopt pets, allowing organizations to manage pets and users to search and view adoption details.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published