Skip to content

Prova Técnica da L5 Networks para a vaga de Dev Júnior Codeigniter 4

License

Notifications You must be signed in to change notification settings

andrepfdev/api-codeigniter4

Repository files navigation

API de Teste Back-end PHP - CodeIgniter 4

Uma API REST com endpoints de clientes, produtos e pedidos desenvolvida com CodeIgniter 4 e MySQL.

Badge Badge Badge

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

Método A:

  1. 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.

Método B:

Execute o Método B apenas se o A não estiver funcionado corretamente.

  1. Instale as dependências

    composer install

    Ou, se for o caso:

    composer update
  2. 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"
  3. Suba os containers

    docker-compose up -d
  4. Acesse o container do PHP

    docker-compose exec app bash
  5. Execute as migrations

    php spark migrate
  6. 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.

Observação

Para rodar qualquer comando php spark, é necessário primeiro acessar o container do Docker:

   docker-compose exec app bash

Autenticação JWT

  • Para acessar os endpoints protegidos, é necessário incluir o token JWT no header:
    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

Image

Paginação e Filtros

Paginação

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

Filtros

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).

Vídeo - Testando os Endpoints

Com Swagger

Testando.API.CodeIgniter.4.com.Swagger.mp4

Com Postmam

Teste.API.CodeIgniter.4.com.Postmam.mp4

Consultar os endpoints

Para testar os endpoints da API, você pode utilizar ferramentas como Postman ou Insomnia.

Exemplos de Requisições e Respostas

Formato Padrão

Requisição
{
   "parametros": {
      "campo1": "valor1",
      "campo2": "valor2"
   }
}
Resposta
{
   "cabecalho": {
      "status": 200,
      "mensagem": "Dados retornados com sucesso"
   },
   "retorno": {
      // dados solicitados
   }
}

Exemplos por Endpoint

Clientes (/api/clientes)
  • 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"}
   ]
}
Produtos (/api/produtos)
  • POST: Cria produto
POST /api/produtos
Authorization: Bearer {seu_token}
// Enviar
{
   "parametros": {
      "nome": "Produto X",
      "preco": 15.00
   }
}
Pedidos (/api/pedidos)
  • 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"}
   ]
}
Itens Pedido (/api/itens-pedido)
  • POST: Adiciona item
POST /api/itens-pedido
Authorization: Bearer {seu_token}
// 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

Licença

Este projeto está licenciado sob a licença MIT - veja o arquivo LICENSE para mais detalhes.