{"id":25866982,"url":"https://github.com/andrepfdev/api-codeigniter4","last_synced_at":"2026-05-03T11:31:27.131Z","repository":{"id":280166652,"uuid":"941113822","full_name":"andrepfdev/api-codeigniter4","owner":"andrepfdev","description":"Prova Técnica da L5 Networks para a vaga de Dev Júnior Codeigniter 4","archived":false,"fork":false,"pushed_at":"2025-03-01T17:41:05.000Z","size":92,"stargazers_count":0,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-03-01T18:22:10.201Z","etag":null,"topics":["api","api-rest","backend","codeigniter4","mysql","php","restful","restful-api"],"latest_commit_sha":null,"homepage":"","language":"PHP","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/andrepfdev.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-03-01T14:20:50.000Z","updated_at":"2025-03-01T17:41:08.000Z","dependencies_parsed_at":"2025-03-01T18:22:12.811Z","dependency_job_id":"e7a61fed-9edf-4318-b8a8-262a023ecc0e","html_url":"https://github.com/andrepfdev/api-codeigniter4","commit_stats":null,"previous_names":["andrepfdev/api-codeigniter4"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrepfdev%2Fapi-codeigniter4","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrepfdev%2Fapi-codeigniter4/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrepfdev%2Fapi-codeigniter4/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/andrepfdev%2Fapi-codeigniter4/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/andrepfdev","download_url":"https://codeload.github.com/andrepfdev/api-codeigniter4/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":241451767,"owners_count":19964914,"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":["api","api-rest","backend","codeigniter4","mysql","php","restful","restful-api"],"created_at":"2025-03-02T03:18:39.594Z","updated_at":"2026-05-03T11:31:27.125Z","avatar_url":"https://github.com/andrepfdev.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"# API de Teste Back-end PHP - CodeIgniter 4\n\nUma API REST com endpoints de clientes, produtos e pedidos desenvolvida com CodeIgniter 4 e MySQL.\n\n![Badge](https://img.shields.io/badge/PHP-8.1-blue)\n![Badge](https://img.shields.io/badge/CodeIgniter-4.3-red)\n![Badge](https://img.shields.io/badge/MySQL-8.0-orange)\n\n## Nota Pessoal\n\nGostei muito de desenvolver o projeto, assim pude conhecer a delicinha que é o Codeigniter 4, contúdo, lamento por não ter conseguido aproveitar a tempo estipulado para a realização do projeto. Passei mais tempo no hospital do que em casa. Fico feliz pela oportunidade e espero que gostem do resultado. Acabei deixando para implementar o JWT no finalzinho do tempo, priorizando as outras etapas do desenvolvimento.\n\n## Sobre o Projeto\n\nEsta API foi desenvolvida como parte de um desafio técnico para a posição de Programador Back-end Júnior. O sistema permite gerenciar clientes, produtos e pedidos de compra, seguindo os seguintes requisitos:\n\n### Desafio 1 (Caráter eliminatório)\n- CRUD de Clientes (CPF/CNPJ, Nome/Razão Social);\n- CRUD de Produtos;\n- CRUD de Pedidos de compra com status (Em Aberto, Pago, Cancelado).\n\n### Desafio 2 (Caráter não eliminatório)\n- Implementar paginação e filtro de dados nos endpoints;\n- Implementar autenticação JWT com data de expiração.\n\n## Tecnologias Utilizadas\n\n- **PHP 8.1**\n- **CodeIgniter 4.6**\n- **MySQL 8.0**\n- **JWT para autenticação**\n- **Docker para ambiente de desenvolvimento**\n\n## Instalação e Configuração\n\n### Usando Docker\n\n1. **Clone o repositório**\n   ```bash\n   git clone https://github.com/andrepfdev/api-codeigniter4.git\n   cd api-codeigniter4\n   ```\n### Abaixo você vai encontrar o passo a passo para realizar a instalação usando Docker. Isso pode ajudar:\n\nhttps://github.com/user-attachments/assets/762cbf89-5897-4643-ab3a-c2bfd8d2903e\n\n### Método A:\n\n2. **Rode o script de instalação:**\n\n - Se para rodar o docker você usa o comando **docker compose**, sem espaço, use:\n \n   Na dúvida? Digite o comando **docker compose version**. \n \n   **No Linux (docker compose):**\n   \n   ```bash\n   chmod +x ./install.sh\n   ```\n   Depois:\n\n   ```bash\n   ./install.sh\n   ```\n      \n- Mas, se para rodar você usa o comando **docker-compose**, tudo junto, use:\n   \n   Na dúvida? Digite o comando **docker-compose version**.\n\n   **No Windows (docker-compose):**\n\n   ```bash\n   chmod +x ./install-wls.sh\n   ```\n   Depois:\n\n   ```bash\n   ./install-wsl.sh\n   ```\n\n**Pronto! Se tudo der certinho, você não precisará executar o Método B.**\n\nApenas siga as instruções geradas pelo script no seu terminal. \n\n### Método B:\n\n**Execute o Método B apenas se o A não estiver funcionado corretamente.**\n\n2. **Instale as dependências**\n   ```bash\n   composer install\n   ```\n   Ou, se for o caso:\n\n   ```bash\n   composer update\n   ```\n\n3. **Copie e configure o ambiente**\n   ```bash\n   cp env .env\n   ```\n   Edite o arquivo `.env` com as configurações do banco de dados:\n   ```ini\n    database.default.hostname = db\n    database.default.database = ci4\n    database.default.username = ci4user\n    database.default.password = ci4pass\n    database.default.DBDriver = MySQLi\n    database.tests.DBPrefix =\n    database.default.port = 3306\n   ```\n   Também deve alterar o modo de produção para:\n    ```ini\n    CI_ENVIRONMENT = development\n   ```\n\n   Não pode esquecer da chave par o JWT que também vai no **.env**:\n\n   ```ini\n    JWT_SECRET = \"minha_vaga_backend\"\n   ```\n   \n4. **Suba os containers**\n   ```bash\n   docker-compose up -d\n   ```\n\n5. **Acesse o container do PHP**\n   ```bash\n   docker-compose exec app bash\n   ```\n\n6. **Execute as migrations**\n   ```bash\n   php spark migrate\n   ```\n\n7. **Execute os seeders (dados iniciais)**\n   - Para avitar erros devidos aos relacionamentos das tabelas, execute exatamente nesta ordem:\n\n   ```bash\n   php spark db:seed ProdutoSeeder\n   php spark db:seed ClienteSeeder\n   php spark db:seed PedidoSeeder\n   php spark db:seed ItemPedidoSeeder\n   ```\n\nA API estará disponível em `http://localhost:8080`.\n\n## Observação\n\nPara rodar qualquer comando `php spark`, é necessário primeiro acessar o container do Docker:\n```bash\n   docker-compose exec app bash\n```\n\n## Autenticação JWT\n\n- Para acessar os endpoints protegidos, é necessário incluir o token JWT no header:\n  ```http\n  Authorization: Bearer {seu_token}\n  ```\n\n## Endpoints\n\n### Autenticação\n| Método | Endpoint | Descrição |\n|--------|----------|-----------|\n| POST | /api/registrar | Registra novo usuário |\n| POST | /api/validar | Valida e gera token de autencicação |\n\n### Clientes\n| Método | Endpoint | Descrição |\n|--------|----------|-----------|\n| GET | /api/clientes | Lista todos os clientes |\n| GET | /api/clientes/{id} | Obtém um cliente específico |\n| POST | /api/clientes | Cria um novo cliente |\n| PUT | /api/clientes/{id} | Atualiza um cliente existente |\n| DELETE | /api/clientes/{id} | Remove um cliente |\n\n### Produtos\n| Método | Endpoint | Descrição |\n|--------|----------|-----------|\n| GET | /api/produtos | Lista todos os produtos |\n| GET | /api/produtos/{id} | Obtém um produto específico |\n| POST | /api/produtos | Cria um novo produto |\n| PUT | /api/produtos/{id} | Atualiza um produto existente |\n| DELETE | /api/produtos/{id} | Remove um produto |\n\n### Pedidos\n| Método | Endpoint | Descrição |\n|--------|----------|-----------|\n| GET | /api/pedidos | Lista todos os pedidos |\n| GET | /api/pedidos/{id} | Obtém um pedido específico |\n| POST | /api/pedidos | Cria um novo pedido |\n| PUT | /api/pedidos/{id} | Atualiza um pedido existente |\n| DELETE | /api/pedidos/{id} | Remove um pedido |\n\n### Itens Pedidos\n| Método | Endpoint | Descrição |\n|--------|----------|-----------|\n| GET | /api/itens-pedido | Lista todos os itens-pedido |\n| GET | /api/itens-pedido/{id} | Obtém um itens-pedido específico |\n| POST | /api/itens-pedido | Cria um novo itens-pedido |\n| PUT | /api/itens-pedido/{id} | Atualiza um itens-pedido existente |\n| DELETE | /api/itens-pedido/{id} | Remove um itens-pedido |\n\n### Usuários\n| Método | Endpoint | Descrição |\n|--------|----------|-----------|\n| GET | /api/usuarios | Lista todos os usuários cadastrados |\n\n\n### Diagrama do Banco de Dados\n\n![Image](https://github.com/user-attachments/assets/711de36c-8580-4530-b9dd-e2357e4046a3)\n\n## Paginação e Filtros\n\n### Paginação\nPara utilizar a paginação nos endpoints de listagem, utilize o parâmetro `page` na query string:\n```http\nGET localhost:8080/api/clientes?nome_razao_social=Carlos\n```\n\n### Filtros\nOs dados podem ser filtrados por qualquer campo. Para isso, passe os parâmetros desejados na query string. Exemplo:\n```http\nGET localhost:8080/api/produtos?preco=15\n```\nParâmetros comuns de filtro:\n- `nome_razao_social` (filtra pelo nome do produto ou cliente);\n- `cpf_cnpj` (filtra clientes por CPF/CNPJ);\n- `preco` (filtra produtos por preço);\n- `status` (filtra pedidos por status: `Em Aberto`, `Pago`, `Cancelado`).\n\n## Vídeo - Testando os Endpoints\n\nCom Swagger\n\nhttps://github.com/user-attachments/assets/35083f7a-997a-4f34-b9c7-e753e53938f5\n\nCom Postmam\n\nhttps://github.com/user-attachments/assets/93f46c69-a23a-4d51-a3ee-4ba5f1011b18\n\n### Consultar os endpoints\n\nPara testar os endpoints da API, você pode utilizar ferramentas como [Postman](https://www.postman.com/) ou [Insomnia](https://insomnia.rest/). \n\n### Exemplos de Requisições e Respostas\n\n#### Formato Padrão\n\n##### Requisição\n```json\n{\n   \"parametros\": {\n      \"campo1\": \"valor1\",\n      \"campo2\": \"valor2\"\n   }\n}\n```\n\n##### Resposta\n```json\n{\n   \"cabecalho\": {\n      \"status\": 200,\n      \"mensagem\": \"Dados retornados com sucesso\"\n   },\n   \"retorno\": {\n      // dados solicitados\n   }\n}\n```\n\n#### Exemplos por Endpoint\n\n##### Clientes (`/api/clientes`)\n- **GET**: Lista clientes (com paginação)\n```http\nGET /api/clientes?page=1\u0026nome_razao_social=Carlos\nAuthorization: Bearer {seu_token}\n```\n```json\n{\n   \"cabecalho\": {\n      \"status\": 200,\n      \"mensagem\": \"Clientes listados com sucesso\"\n   },\n   \"retorno\": [\n      {\"id\": 1, \"nome_razao_social\": \"Carlos Silva\", \"cpf_cnpj\": \"12345678901\"}\n   ]\n}\n```\n\n##### Produtos (`/api/produtos`)\n- **POST**: Cria produto\n```http\nPOST /api/produtos\nAuthorization: Bearer {seu_token}\n```\n```json\n// Enviar\n{\n   \"parametros\": {\n      \"nome\": \"Produto X\",\n      \"preco\": 15.00\n   }\n}\n```\n\n##### Pedidos (`/api/pedidos`)\n- **GET**: Lista pedidos filtrados\n```http\nGET /api/pedidos?status=Em%20Aberto\nAuthorization: Bearer {seu_token}\n```\n```json\n{\n   \"cabecalho\": {\n      \"status\": 200,\n      \"mensagem\": \"Pedidos listados com sucesso\"\n   },\n   \"retorno\": [\n      {\"id\": 1, \"cliente_id\": 1, \"status\": \"Em Aberto\"}\n   ]\n}\n```\n\n##### Itens Pedido (`/api/itens-pedido`)\n- **POST**: Adiciona item\n```http\nPOST /api/itens-pedido\nAuthorization: Bearer {seu_token}\n```\n```json\n// Enviar\n{\n   \"parametros\": {\n      \"pedido_id\": 1,\n      \"produto_id\": 1,\n      \"quantidade\": 2\n   }\n}\n```\n\n#### Como Testar\n\n1. Use Postman ou Insomnia\n2. Endpoint base: `http://localhost:8080/api`\n3. Headers padrão: \n   ```\n   accept: application/json\n   Content-Type: application/json\n   ```\n4. Para filtros, use query params:\n   ```\n   /api/clientes?nome_razao_social=Carlos\n   /api/produtos?preco=15\n   /api/pedidos?status=Pago\n   ```\n## Autor\n\nAndré Pereira - [LinkedIn](https://www.linkedin.com/in/andrepf7/)\n\n## Licença\n\nEste projeto está licenciado sob a licença MIT - veja o arquivo [LICENSE](LICENSE) para mais detalhes.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandrepfdev%2Fapi-codeigniter4","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fandrepfdev%2Fapi-codeigniter4","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fandrepfdev%2Fapi-codeigniter4/lists"}