Uma API REST com endpoints de clientes, produtos e pedidos desenvolvida com CodeIgniter 4 e MySQL.
Gostei 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.
Esta 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:
- CRUD de Clientes (CPF/CNPJ, Nome/Razão Social);
- CRUD de Produtos;
- CRUD de Pedidos de compra com status (Em Aberto, Pago, Cancelado).
- Implementar paginação e filtro de dados nos endpoints;
- Implementar autenticação JWT com data de expiração.
- PHP 8.1
- CodeIgniter 4.6
- MySQL 8.0
- JWT para autenticação
- Docker para ambiente de desenvolvimento
- Clone o repositório
git clone https://github.com/andrepfdev/api-codeigniter4.git cd api-codeigniter4
Abaixo você vai encontrar o passo a passo para realizar a instalação usando Docker. Isso pode ajudar:
Instalacao.Docker.Usando.Script.mp4
- Rode o script de instalação:
-
Se para rodar o docker você usa o comando docker compose, sem espaço, use:
Na dúvida? Digite o comando docker compose version.
No Linux (docker compose):
chmod +x ./install.sh
Depois:
./install.sh
-
Mas, se para rodar você usa o comando docker-compose, tudo junto, use:
Na dúvida? Digite o comando docker-compose version.
No Windows (docker-compose):
chmod +x ./install-wls.sh
Depois:
./install-wsl.sh
Pronto! Se tudo der certinho, você não precisará executar o Método B.
Apenas siga as instruções geradas pelo script no seu terminal.
Execute o Método B apenas se o A não estiver funcionado corretamente.
-
Instale as dependências
composer install
Ou, se for o caso:
composer update
-
Copie e configure o ambiente
cp env .env
Edite o arquivo
.env
com as configurações do banco de dados:database.default.hostname = db database.default.database = ci4 database.default.username = ci4user database.default.password = ci4pass database.default.DBDriver = MySQLi database.tests.DBPrefix = database.default.port = 3306
Também deve alterar o modo de produção para:
CI_ENVIRONMENT = development
Não pode esquecer da chave par o JWT que também vai no .env:
JWT_SECRET = "minha_vaga_backend"
-
Suba os containers
docker-compose up -d
-
Acesse o container do PHP
docker-compose exec app bash
-
Execute as migrations
php spark migrate
-
Execute os seeders (dados iniciais)
- Para avitar erros devidos aos relacionamentos das tabelas, execute exatamente nesta ordem:
php spark db:seed ProdutoSeeder php spark db:seed ClienteSeeder php spark db:seed PedidoSeeder php spark db:seed ItemPedidoSeeder
A API estará disponível em http://localhost:8080
.
Para rodar qualquer comando php spark
, é necessário primeiro acessar o container do Docker:
docker-compose exec app bash
- Para acessar os endpoints protegidos, é necessário incluir o token JWT no header:
Authorization: Bearer {seu_token}
Método | Endpoint | Descrição |
---|---|---|
POST | /api/registrar | Registra novo usuário |
POST | /api/validar | Valida e gera token de autencicação |
Método | Endpoint | Descrição |
---|---|---|
GET | /api/clientes | Lista todos os clientes |
GET | /api/clientes/{id} | Obtém um cliente específico |
POST | /api/clientes | Cria um novo cliente |
PUT | /api/clientes/{id} | Atualiza um cliente existente |
DELETE | /api/clientes/{id} | Remove um cliente |
Método | Endpoint | Descrição |
---|---|---|
GET | /api/produtos | Lista todos os produtos |
GET | /api/produtos/{id} | Obtém um produto específico |
POST | /api/produtos | Cria um novo produto |
PUT | /api/produtos/{id} | Atualiza um produto existente |
DELETE | /api/produtos/{id} | Remove um produto |
Método | Endpoint | Descrição |
---|---|---|
GET | /api/pedidos | Lista todos os pedidos |
GET | /api/pedidos/{id} | Obtém um pedido específico |
POST | /api/pedidos | Cria um novo pedido |
PUT | /api/pedidos/{id} | Atualiza um pedido existente |
DELETE | /api/pedidos/{id} | Remove um pedido |
Método | Endpoint | Descrição |
---|---|---|
GET | /api/itens-pedido | Lista todos os itens-pedido |
GET | /api/itens-pedido/{id} | Obtém um itens-pedido específico |
POST | /api/itens-pedido | Cria um novo itens-pedido |
PUT | /api/itens-pedido/{id} | Atualiza um itens-pedido existente |
DELETE | /api/itens-pedido/{id} | Remove um itens-pedido |
Método | Endpoint | Descrição |
---|---|---|
GET | /api/usuarios | Lista todos os usuários cadastrados |
Para utilizar a paginação nos endpoints de listagem, utilize o parâmetro page
na query string:
GET localhost:8080/api/clientes?nome_razao_social=Carlos
Os dados podem ser filtrados por qualquer campo. Para isso, passe os parâmetros desejados na query string. Exemplo:
GET localhost:8080/api/produtos?preco=15
Parâmetros comuns de filtro:
nome_razao_social
(filtra pelo nome do produto ou cliente);cpf_cnpj
(filtra clientes por CPF/CNPJ);preco
(filtra produtos por preço);status
(filtra pedidos por status:Em Aberto
,Pago
,Cancelado
).
Com Swagger
Testando.API.CodeIgniter.4.com.Swagger.mp4
Com Postmam
Teste.API.CodeIgniter.4.com.Postmam.mp4
Para testar os endpoints da API, você pode utilizar ferramentas como Postman ou Insomnia.
{
"parametros": {
"campo1": "valor1",
"campo2": "valor2"
}
}
{
"cabecalho": {
"status": 200,
"mensagem": "Dados retornados com sucesso"
},
"retorno": {
// dados solicitados
}
}
- GET: Lista clientes (com paginação)
GET /api/clientes?page=1&nome_razao_social=Carlos
Authorization: Bearer {seu_token}
{
"cabecalho": {
"status": 200,
"mensagem": "Clientes listados com sucesso"
},
"retorno": [
{"id": 1, "nome_razao_social": "Carlos Silva", "cpf_cnpj": "12345678901"}
]
}
- POST: Cria produto
POST /api/produtos
Authorization: Bearer {seu_token}
// Enviar
{
"parametros": {
"nome": "Produto X",
"preco": 15.00
}
}
- GET: Lista pedidos filtrados
GET /api/pedidos?status=Em%20Aberto
Authorization: Bearer {seu_token}
{
"cabecalho": {
"status": 200,
"mensagem": "Pedidos listados com sucesso"
},
"retorno": [
{"id": 1, "cliente_id": 1, "status": "Em Aberto"}
]
}
- POST: Adiciona item
POST /api/itens-pedido
Authorization: Bearer {seu_token}
// Enviar
{
"parametros": {
"pedido_id": 1,
"produto_id": 1,
"quantidade": 2
}
}
- Use Postman ou Insomnia
- Endpoint base:
http://localhost:8080/api
- Headers padrão:
accept: application/json Content-Type: application/json
- Para filtros, use query params:
/api/clientes?nome_razao_social=Carlos /api/produtos?preco=15 /api/pedidos?status=Pago
André Pereira - LinkedIn
Este projeto está licenciado sob a licença MIT - veja o arquivo LICENSE para mais detalhes.