https://github.com/andrepfdev/api-codeigniter4
Prova Técnica da L5 Networks para a vaga de Dev Júnior Codeigniter 4
https://github.com/andrepfdev/api-codeigniter4
api api-rest backend codeigniter4 mysql php restful restful-api
Last synced: about 2 months ago
JSON representation
Prova Técnica da L5 Networks para a vaga de Dev Júnior Codeigniter 4
- Host: GitHub
- URL: https://github.com/andrepfdev/api-codeigniter4
- Owner: andrepfdev
- License: mit
- Created: 2025-03-01T14:20:50.000Z (over 1 year ago)
- Default Branch: main
- Last Pushed: 2025-03-01T17:41:05.000Z (over 1 year ago)
- Last Synced: 2025-03-01T18:22:10.201Z (over 1 year ago)
- Topics: api, api-rest, backend, codeigniter4, mysql, php, restful, restful-api
- Language: PHP
- Homepage:
- Size: 89.8 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# API de Teste Back-end PHP - CodeIgniter 4
Uma API REST com endpoints de clientes, produtos e pedidos desenvolvida com CodeIgniter 4 e MySQL.



## Nota Pessoal
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.
## Sobre o Projeto
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:
### Desafio 1 (Caráter eliminatório)
- CRUD de Clientes (CPF/CNPJ, Nome/Razão Social);
- CRUD de Produtos;
- CRUD de Pedidos de compra com status (Em Aberto, Pago, Cancelado).
### Desafio 2 (Caráter não eliminatório)
- Implementar paginação e filtro de dados nos endpoints;
- Implementar autenticação JWT com data de expiração.
## Tecnologias Utilizadas
- **PHP 8.1**
- **CodeIgniter 4.6**
- **MySQL 8.0**
- **JWT para autenticação**
- **Docker para ambiente de desenvolvimento**
## Instalação e Configuração
### Usando Docker
1. **Clone o repositório**
```bash
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:
https://github.com/user-attachments/assets/762cbf89-5897-4643-ab3a-c2bfd8d2903e
### Método A:
2. **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):**
```bash
chmod +x ./install.sh
```
Depois:
```bash
./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):**
```bash
chmod +x ./install-wls.sh
```
Depois:
```bash
./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.
### Método B:
**Execute o Método B apenas se o A não estiver funcionado corretamente.**
2. **Instale as dependências**
```bash
composer install
```
Ou, se for o caso:
```bash
composer update
```
3. **Copie e configure o ambiente**
```bash
cp env .env
```
Edite o arquivo `.env` com as configurações do banco de dados:
```ini
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:
```ini
CI_ENVIRONMENT = development
```
Não pode esquecer da chave par o JWT que também vai no **.env**:
```ini
JWT_SECRET = "minha_vaga_backend"
```
4. **Suba os containers**
```bash
docker-compose up -d
```
5. **Acesse o container do PHP**
```bash
docker-compose exec app bash
```
6. **Execute as migrations**
```bash
php spark migrate
```
7. **Execute os seeders (dados iniciais)**
- Para avitar erros devidos aos relacionamentos das tabelas, execute exatamente nesta ordem:
```bash
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`.
## Observação
Para rodar qualquer comando `php spark`, é necessário primeiro acessar o container do Docker:
```bash
docker-compose exec app bash
```
## Autenticação JWT
- Para acessar os endpoints protegidos, é necessário incluir o token JWT no header:
```http
Authorization: Bearer {seu_token}
```
## Endpoints
### Autenticação
| Método | Endpoint | Descrição |
|--------|----------|-----------|
| POST | /api/registrar | Registra novo usuário |
| POST | /api/validar | Valida e gera token de autencicação |
### Clientes
| 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 |
### Produtos
| 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 |
### Pedidos
| 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 |
### Itens Pedidos
| 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 |
### Usuários
| Método | Endpoint | Descrição |
|--------|----------|-----------|
| GET | /api/usuarios | Lista todos os usuários cadastrados |
### Diagrama do Banco de Dados

## Paginação e Filtros
### Paginação
Para utilizar a paginação nos endpoints de listagem, utilize o parâmetro `page` na query string:
```http
GET localhost:8080/api/clientes?nome_razao_social=Carlos
```
### Filtros
Os dados podem ser filtrados por qualquer campo. Para isso, passe os parâmetros desejados na query string. Exemplo:
```http
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`).
## Vídeo - Testando os Endpoints
Com Swagger
https://github.com/user-attachments/assets/35083f7a-997a-4f34-b9c7-e753e53938f5
Com Postmam
https://github.com/user-attachments/assets/93f46c69-a23a-4d51-a3ee-4ba5f1011b18
### Consultar os endpoints
Para testar os endpoints da API, você pode utilizar ferramentas como [Postman](https://www.postman.com/) ou [Insomnia](https://insomnia.rest/).
### Exemplos de Requisições e Respostas
#### Formato Padrão
##### Requisição
```json
{
"parametros": {
"campo1": "valor1",
"campo2": "valor2"
}
}
```
##### Resposta
```json
{
"cabecalho": {
"status": 200,
"mensagem": "Dados retornados com sucesso"
},
"retorno": {
// dados solicitados
}
}
```
#### Exemplos por Endpoint
##### Clientes (`/api/clientes`)
- **GET**: Lista clientes (com paginação)
```http
GET /api/clientes?page=1&nome_razao_social=Carlos
Authorization: Bearer {seu_token}
```
```json
{
"cabecalho": {
"status": 200,
"mensagem": "Clientes listados com sucesso"
},
"retorno": [
{"id": 1, "nome_razao_social": "Carlos Silva", "cpf_cnpj": "12345678901"}
]
}
```
##### Produtos (`/api/produtos`)
- **POST**: Cria produto
```http
POST /api/produtos
Authorization: Bearer {seu_token}
```
```json
// Enviar
{
"parametros": {
"nome": "Produto X",
"preco": 15.00
}
}
```
##### Pedidos (`/api/pedidos`)
- **GET**: Lista pedidos filtrados
```http
GET /api/pedidos?status=Em%20Aberto
Authorization: Bearer {seu_token}
```
```json
{
"cabecalho": {
"status": 200,
"mensagem": "Pedidos listados com sucesso"
},
"retorno": [
{"id": 1, "cliente_id": 1, "status": "Em Aberto"}
]
}
```
##### Itens Pedido (`/api/itens-pedido`)
- **POST**: Adiciona item
```http
POST /api/itens-pedido
Authorization: Bearer {seu_token}
```
```json
// Enviar
{
"parametros": {
"pedido_id": 1,
"produto_id": 1,
"quantidade": 2
}
}
```
#### Como Testar
1. Use Postman ou Insomnia
2. Endpoint base: `http://localhost:8080/api`
3. Headers padrão:
```
accept: application/json
Content-Type: application/json
```
4. Para filtros, use query params:
```
/api/clientes?nome_razao_social=Carlos
/api/produtos?preco=15
/api/pedidos?status=Pago
```
## Autor
André Pereira - [LinkedIn](https://www.linkedin.com/in/andrepf7/)
## Licença
Este projeto está licenciado sob a licença MIT - veja o arquivo [LICENSE](LICENSE) para mais detalhes.