{"id":25898094,"url":"https://github.com/joschonarth/find-a-friend-api","last_synced_at":"2026-04-12T13:02:39.282Z","repository":{"id":280311760,"uuid":"938946045","full_name":"joschonarth/find-a-friend-api","owner":"joschonarth","description":"🐶 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.","archived":false,"fork":false,"pushed_at":"2025-03-02T16:40:45.000Z","size":353,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-02T17:32:29.219Z","etag":null,"topics":["bcrypt","docker","dotenv","eslint","fastify","github-actions","jwt","nodejs","postgresql","prisma","supertest","typescript","vitest","zod"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/joschonarth.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-25T18:42:31.000Z","updated_at":"2025-03-02T16:43:08.000Z","dependencies_parsed_at":"2025-03-02T17:42:42.202Z","dependency_job_id":null,"html_url":"https://github.com/joschonarth/find-a-friend-api","commit_stats":null,"previous_names":["joschonarth/find-a-friend-api"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joschonarth%2Ffind-a-friend-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joschonarth%2Ffind-a-friend-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joschonarth%2Ffind-a-friend-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/joschonarth%2Ffind-a-friend-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/joschonarth","download_url":"https://codeload.github.com/joschonarth/find-a-friend-api/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241587843,"owners_count":19986628,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bcrypt","docker","dotenv","eslint","fastify","github-actions","jwt","nodejs","postgresql","prisma","supertest","typescript","vitest","zod"],"created_at":"2025-03-03T00:16:50.733Z","updated_at":"2026-04-12T13:02:39.276Z","avatar_url":"https://github.com/joschonarth.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e🐶 Find A Friend API\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\u003ci\u003e🐾 API que conecta organizações de adoção com pessoas que desejam adotar animais de estimação. 🐾\u003c/i\u003e\n  \u003cbr/\u003e\u003cbr/\u003e\n  \u003cimg src=\"https://img.shields.io/github/last-commit/joschonarth/find-a-friend-api?style=default\u0026logo=git\u0026logoColor=white\u0026color=0080ff\u0026labelColor=2f363d\" alt=\"last-commit\"\u003e\n\t\u003cimg src=\"https://img.shields.io/github/languages/top/joschonarth/find-a-friend-api?style=default\u0026color=0080ff\u0026labelColor=2f363d\" alt=\"repo-top-language\"\u003e\n\t\u003cimg src=\"https://img.shields.io/github/languages/count/joschonarth/find-a-friend-api?style=default\u0026color=0080ff\u0026labelColor=2f363d\" alt=\"repo-language-count\"\u003e\n\t\u003cimg src=\"https://img.shields.io/github/license/joschonarth/find-a-friend-api?style=default\u0026color=0080ff\u0026labelColor=2f363d\" alt=\"repo-license\"\u003e\n  \u003cimg src=\"https://github.com/joschonarth/find-a-friend-api/actions/workflows/run-unit-tests.yml/badge.svg?style=for-the-badge\u0026color=a277ff\u0026labelColor=1C1E26\" alt=\"unit-tests\"\u003e\n  \u003cimg src=\"https://github.com/joschonarth/find-a-friend-api/actions/workflows/run-e2e-tests.yml/badge.svg?style=for-the-badge\u0026color=a277ff\u0026labelColor=1C1E26\" alt=\"e2e-tests\"\u003e\n\u003c/p\u003e\n\n## 📑 Índice\n\n- [👀 Visão Geral](#-visão-geral)\n- [🛠️ Tecnologias Utilizadas](#️-tecnologias-utilizadas)\n- [⚙️ Funcionalidades](#️-funcionalidades)\n- [🚀 Como Executar o Projeto](#-como-executar-o-projeto)\n- [🔗 Endpoints](#-endpoints)\n- [🔐 Autenticação](#-autenticação)\n- [🧪 Testes](#-testes)\n- [⚙️ GitHub Actions](#️-github-actions)\n- [🤝 Contribuições](#-contribuições)\n- [⭐ Apoie este Projeto](#-apoie-este-projeto)\n- [📝 Licença](#-licença)\n- [📞 Contato](#-contato)\n\n## 👀 Visão Geral\n\nA **Find A Friend API** é uma API RESTful 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.\n\n## 🛠️ Tecnologias Utilizadas\n\n- 🟢 **Node.js**: Plataforma para execução do JavaScript no servidor.\n- 🟦 **TypeScript**: Superset do JavaScript com tipagem estática.\n- ⚡ **Fastify**: Framework web de alta performance para Node.js.\n- 🗄️ **PostgreSQL**: Banco de dados relacional utilizado para armazenar informações.\n- 🛢️ **Prisma**: ORM moderno para interações com o banco de dados.\n- 🐳 **Docker**: Containerização para ambiente de desenvolvimento.\n- 💎 **Zod**: Validação de esquemas e dados.\n- 🛡️ **JWT**: Json Web Tokens para autenticação.\n- 🧪 **Vitest**: Framework de testes.\n- 🕷️ **Supertest**: Biblioteca para testar APIs de forma simples e eficaz.\n- ⚙️ **ESLint**: Linter para garantir a qualidade do código.\n- 🔒 **Bcrypt**: Biblioteca para hashing de senhas.\n- 🌱 **Dotenv**: Gerenciamento de variáveis de ambiente.\n- ⚙️ **GitHub Actions**: Ferramenta de CI que automatiza o processo de testes e implantações.\n\n## ⚙️ Funcionalidades\n\n### Organizações\n\n- 🏢 **Criar organização**: Cria uma nova organização na plataforma.\n- 🔐 **Autenticar organização**: Realiza o login de uma organização existente.\n- 📍 **Buscar organizações próximas**: Localiza organizações com base na localização.\n\n### Pets\n\n- 🐕 **Criar pet**: Cadastra um novo pet para adoção.\n- 🔍 **Buscar pets**: Realiza uma busca por pets disponíveis para adoção.\n- 📝 **Visualizar detalhes do pet**: Exibe as informações detalhadas de um pet.\n\n### Adoção\n\n- 📱 **Contatar via WhatsApp**: Permite que os adotantes entrem em contato com a organização responsável pelo pet via WhatsApp.\n\n## 🚀 Como Executar o Projeto\n\n1. **Clone o repositório:**\n\n   ```bash\n   git clone https://github.com/joschonarth/find-a-friend-api.git\n   ```\n\n2. **Crie um arquivo `.env` a partir do exemplo:**\n\n    ```bash\n    cp .env.example .env\n    ```\n\n    Edite o arquivo `.env` para configurar as variáveis de ambiente necessárias.\n\n3. **Instale as dependências:**\n\n    ```bash\n    npm install\n    ```\n\n4. Inicie o banco de dados **PostgreSQL** utilizando o container **Docker** com a imagem ``bitnami/postgresql``:\n\n   ```bash\n   docker-compose up -d\n   ```\n\n5. **Execute as migrações do banco de dados:**\n\n   ```bash\n   npx prisma migrate dev\n   ```\n\n6. **Inicie a API:**\n\n   ```bash\n   npm run dev\n   ```\n\n   A aplicação estará disponível em [http://localhost:3333](http://localhost:3333).\n\n## 🔗 Endpoints\n\n### 🏢 Criar Organização\n\n- **Descrição:** Cria uma nova organização para cadastro de pets.\n- **Método:** `POST`\n- **URL:** `/orgs`\n- **Corpo da Requisição:**  \n\n  ```json\n  {\n    \"name\": \"Pet Love\",\n    \"owner\": \"John Doe\",\n    \"email\": \"john.doe@example.com\",\n    \"whatsapp\": \"1234567890\",\n    \"password\": \"123456\",\n    \"cep\": \"12345-678\",\n    \"state\": \"SP\",\n    \"city\": \"São Paulo\",\n    \"neighborhood\": \"Downtown\",\n    \"street\": \"123 Some Street\",\n    \"latitude\": -23.6814346,\n    \"longitude\": -46.9249675\n  }\n  ```\n\n### 🔐 Autenticar Organização\n\n- **Descrição:** Realiza o login de uma organização existente.\n- **Método:** `POST`\n- **URL:** `/orgs/auth`\n- **Corpo da Requisição:**\n\n  ```json\n  {\n    \"email\": \"john.doe@example.com\",\n    \"password\": \"123456\"\n  }\n  ```\n\n- **Exemplo de Resposta:**  \n\n  ```json\n  {\n    \"token\": \"eyJhbGciOiJIUzI1NiIsInR...\"\n  }\n  ```\n\n### 📍 Buscar Organizações Próximas\n\n- **Descrição:** Localiza organizações com base na localização.\n- **Método:** `GET`\n- **URL:** `/orgs/nearby`\n\n- **Parâmetros de Consulta (Query Params):**\n    - `latitude` (number, required) - Latitude atual do usuário (deve estar entre -90 e 90).\n    - `longitude` (number, required) - Longitude atual do usuário (deve estar entre -180 e 180).\n\n- **Exemplo de Requisição:**\n\n    ```http\n    GET /orgs/nearby?latitude=-23.6814346\u0026longitude=-46.9249675\n    ```\n\n- **Exemplo de Resposta:**\n\n    ```json\n    {\n        \"orgs\": [\n            {\n                \"id\": \"d317448a-393c-4250-b37b-0151afabe25c\",\n                \"name\": \"Example Organization\",\n                \"owner\": \"John Doe\",\n                \"email\": \"john.doe@example.com\",\n                \"whatsapp\": \"1234567890\",\n                \"cep\": \"12345-678\",\n                \"state\": \"SP\",\n                \"city\": \"São Paulo\",\n                \"neighborhood\": \"Downtown\",\n                \"street\": \"123 Some Street\",\n                \"latitude\": \"-23.6814346\",\n                \"longitude\": \"-46.9249675\"\n            },\n            {\n                \"id\": \"d3da8e0c-943f-443a-8124-927f436e6540\",\n                \"name\": \"Some Org\",\n                \"owner\": \"John Doe\",\n                \"email\": \"john.doe@org.com\",\n                \"whatsapp\": \"1234567890\",\n                \"cep\": \"12345-678\",\n                \"state\": \"SP\",\n                \"city\": \"São Paulo\",\n                \"neighborhood\": \"Downtown\",\n                \"street\": \"123 Some Street\",\n                \"latitude\": \"-23.6814346\",\n                \"longitude\": \"-46.9249675\"\n            }\n        ]\n    }\n    ```\n\n### 🐕 Criar Pet\n\n- **Descrição:** Cadastra um novo pet para adoção.\n- **Método:** `POST`\n- **URL:** `/orgs/pets`\n- **Corpo da Requisição:**  \n\n  ```json\n    {\n        \"name\": \"Buddy\",\n        \"about\": \"Friendly and energetic dog looking for a home.\",\n        \"age\": \"young\",\n        \"size\": \"medium\",\n        \"species\": \"dog\",\n        \"environment\": \"indoor\",\n        \"energy_level\": \"high\",\n        \"independence_level\": \"low\"\n    }\n  ```\n\n### 🔍 Buscar Pets\n\n- **Descrição:** Realiza uma busca por pets disponíveis para adoção.\n- **Método:** `GET`\n- **URL:** `/orgs/pets`\n- **Parâmetros de Consulta (Query Params):**\n  - `city` (string, required): Cidade onde o pet está disponível para adoção.\n  - `age` (string, optional): Faixa etária do pet para filtrar (ex: filhote, jovem, adulto).\n  - `size` (string, optional): Tamanho do pet para filtrar (ex: pequeno, médio, grande).\n  - `species` (string, optional): Espécie do pet (ex: cachorro, gato).\n  - `environment` (string, optional): Ambiente em que o pet se adapta (ex: interno, externo)\n  - `energy_level` (string, optional): Nível de energia do pet (ex: baixo, médio, alto).\n  - `independence_level` (string, optional): Nível de independência do pet (ex: baixo, médio, alto).\n\n- **Exemplo de Requisição:**\n\n  ```http\n  GET /pets/search?city=São Paulo\n  ```\n\n- **Exemplo de Resposta:**  \n\n  ```json\n    {\n        \"pets\": [\n            {\n                \"id\": \"2cd95dfe-2a11-458d-acff-f2dd0d4f1f66\",\n                \"name\": \"Buddy\",\n                \"about\": \"Friendly and energetic dog looking for a home.\",\n                \"age\": \"young\",\n                \"size\": \"medium\",\n                \"species\": \"dog\",\n                \"environment\": \"indoor\",\n                \"energy_level\": \"high\",\n                \"independence_level\": \"low\",\n                \"org_id\": \"d317448a-393c-4250-b37b-0151afabe25c\"\n            }\n        ]\n    }\n  ```\n\n### 🦮 Buscar Informações de um Pet\n\n- **Descrição:** Exibe informações detalhadas sobre um pet específico.\n- **Método:** `GET`\n- **URL:** `/orgs/pets/:petId`\n\n- **Exemplo de Resposta:**  \n\n  ```json\n    {\n        \"id\": \"2cd95dfe-2a11-458d-acff-f2dd0d4f1f66\",\n        \"name\": \"Buddy\",\n        \"about\": \"Friendly and energetic dog looking for a home.\",\n        \"age\": \"young\",\n        \"size\": \"medium\",\n        \"species\": \"dog\",\n        \"environment\": \"indoor\",\n        \"energy_level\": \"high\",\n        \"independence_level\": \"low\",\n        \"org_id\": \"d317448a-393c-4250-b37b-0151afabe25c\"\n    }\n  ```\n\n## 🔐 Autenticação\n\nAs 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.\n\n### Como se autenticar\n\n1. **Faça a autenticação** com suas credenciais (whatsapp e senha) na rota `/orgs/auth` para obter um token JWT:\n\n    - **Método**: `POST`\n    - **URL**: `/orgs/auth`\n    - **Corpo da Requisição:**\n\n    ```json\n    {\n        \"email\": \"john.doe@example.com\",\n        \"password\": \"123456\"\n    }\n    ```\n\n    - **Resposta**:\n\n    ```json\n    {\n        \"token\": \"your_token\"\n    }\n    ```\n\n2. **Utilize o token** nas requisições às rotas protegidas, incluindo-o no Postman (ou outro API Client) da seguinte forma:\n\n    - No Postman, vá até a aba **Authorization**.\n    - Selecione o tipo **Bearer Token**.\n    - No campo **Token**, adicione o valor do token recebido.\n\n## 🧪 Testes\n\nEste 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:\n\n- **Executar testes unitários:**\n\n  ```bash\n  npm run test\n  ```\n\n- **Executar testes unitários em modo de observação:**\n\n  ```bash\n  npm run test:watch\n  ```\n\n- **Preparar o ambiente do Prisma antes dos testes E2E:**\n\n  ```bash\n  npm run pretest:e2e\n  ```\n\n- **Executar testes E2E:**\n\n  ```bash\n  npm run test:e2e\n  ```\n\n- **Executar testes E2E em modo de observação:**\n\n  ```bash\n  npm run test:e2e:watch\n  ```\n\n- **Executar testes com cobertura:**\n\n  ```bash\n  npm run test:coverage\n  ```\n\n- **Executar a interface do usuário do Vitest:**\n\n  ```bash\n  npm run test:ui\n  ```\n\n## ⚙️ GitHub Actions\n\nO 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.\n\n## 🤝 Contribuições\n\nContribuições são bem-vindas! Sinta-se à vontade para abrir issues ou pull requests com melhorias ou correções. ✨\n\n## ⭐ Apoie este Projeto\n\nSe este projeto te ajudou ou te inspirou de alguma forma, não esqueça de deixar uma ⭐ no repositório! Isso faz toda a diferença! 🚀\n\n## 📝 Licença\n\nEste projeto está licenciado sob a [MIT License](LICENSE).\n\n## 📞 Contato\n\n[![LinkedIn](https://img.shields.io/badge/LinkedIn-0077B5?style=for-the-badge\u0026logo=linkedin\u0026logoColor=white)](https://www.linkedin.com/in/joschonarth/)\n[![Gmail](https://img.shields.io/badge/Gmail-D14836?style=for-the-badge\u0026logo=gmail\u0026logoColor=white)](mailto:joschonarth@gmail.com)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoschonarth%2Ffind-a-friend-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fjoschonarth%2Ffind-a-friend-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fjoschonarth%2Ffind-a-friend-api/lists"}