Skip to content

dalissongabriel/php_cuco_client_api

Repository files navigation

CUCO Health | Client API

Author

Cadastre seus clientes e os gerencie através de uma interface simples e amigável.


Funcionalidades

  • Crie seus clientes, registrando seu E-mail, CPF e Telefone
  • Explore os dados registrados por meio de filtros e ordenações
  • Obtenha seus clientes no formato mais famoso para integrações: JSON

Tecnologias e técnicas

  • PHP 8
  • Symfony 5
  • Postgres 13
  • SQLite 3
  • Aplicado uso de cache para agilizar consultas
  • PHPUnit para realizar testes de integração e unitários ( todos passando :) )
  • Na infraestrutura, para banco de dados foi utilizado o ORM doctrine para operar os repositórios
  • Também foi utilizado Postman para testes das rotas
  • Para o repositório git, segui a convenção do framework Angular

Requerimentos

Instalação

Clone o repositório

git clone [email protected]:dalissongabriel/test_php_backend_cuco.git

Dentro da pasta do projeto, crie suas variáveis de ambiente baseado no exemplo: .env.example

cp .env.example .env

DATABASE_URL="postgresql://SEU_USUARIO:SUA_SENHA@HOST_DO_BANCO:PORTA_DO_BANCO/NOME_DO_BANCO?serverVersion=13&charset=utf8"

Baixe as dependências com o composer:

composer install

Crie o banco de dados

php bin/console doctrine:database:create

php bin/console doctrine:migrations:migrate

Popule o banco com as seeds

php bin/console doctrine:fixtures:load

Suba o servidor para rodar a aplicação:

php -S localhost:8081 -t public/

Testes

Execute o comando para criar a base de dados teste em SQLite 3:

php bin/console -e test doctrine:schema:create

Execute o comando para popular as seeds na base de testes:

php bin/console doctrine:fixtures:load --env=test

Em seguida, rode testes feitos em PHPUnit

php bin/phpunit

Testes passando!!! OK (24 tests, 47 assertions)

Histórias de usuário

  • Usuário deve poder criar um cliente informando: nome, e-mail, cpf. Opcionalmente, pode-se informar também o telefone.

  • Usuário deve poder deletar um cliente

  • Usuário deve poder editar um cliente

  • Usuário deve poder buscar um cliente pelo nome e/ou CPF

  • Todos os retornos da API devem ser em JSON, incluindo os erros tratados pela aplicação

BONUS

  • Cliente deverá se autenticar via token JWT para ter acesso as rotas

  • Cliente poderá filtrar os registros por email

  • Cliente deverá receber respostas com informações extras sobre os recursos consultados (HATEOAS)

  • Cliente poderá escolher a ordenação de sua busca

  • Cliente deverá receber respostas páginadas, e poderá escolher qual página gostaria de receber, assim como a quantidade de registros por página

  • Os campos CPF,Telefone e E-mail devem ser válidados para garantir a integridade do domínio

Documentação

Esta é um API RESTful com um contexto bem enxuto, todavia, para a construção da mesma, utilizei boas práticas de programação e teste unitários para entregar um ferramenta de fácil manutenção e evolução. Para facilitar ainda mais a utilização da mesma, disponibilizo abaixo uma relação completa de uso das rotas, e também uma coleção do postmam. Faça bom uso :)


Documentação completa para consumo da API:

  1. Obter Token de acesso (Rota não protegida)

    Esta rota autentica um usuário e retona um token JWT válido para utilizar nas demais requisições. Somente um usuário foi adicionado por meio de seeds (Fixtures)

    • Request

      POST http://localhost:8081/login 
    • Exemplos de um bom Body

      {
          "username": "my-valid-user-login",
          "password": "my-valid=password-login"
      }
    • Retornos possíveis

      Código Resposta
      200 (OK) Login processado com sucesso
      400 (Requisição inválida) A requisição realizada contém problemas de má formação
      401 (Não autorizado) Usuário ou senha incorretos
    • Response

        {
            "success": true,
            "data": {
                "access_token": "aqui estará seu token para acesso"
            }
        }
      {
          "success": false,
          "data": {
              "message": "Usuário ou senha inválidos"
      }
  2. Adicionar clientes (Rota protegida)

    Esta rota insere um novo registro na tabela client.

    • Request

      POST http://localhost:8081/clientes 
    • Header

      AUTHORIZATION {ACCESS_TOKEN 
    • Exemplos de um bom Body

      {
          "name": "Otavio Mota",
          "email": "[email protected]",
          "cpf": "123.456.789.9"
      }
      {
         "name": "Otavio Mota",
         "email": "[email protected]",
         "cpf": "123.456.789.9",
         "phone": "(40) 404044040"
      }
    • Retornos possíveis

      Código Resposta
      201 (Criado) Cliente cadastrado
      400 (Requisição inválida) A requisição realizada contém problemas de má formação
      401 (Não autorizado) Na requisição, não foi informado o cabeçalho de autorização
      412 (Pré-condição falhou) Os valores informados não são válidos.
  3. Buscar cliente (Rota protegida)

    Esta rota busca um registro na tabela client pelo ID.

    • Request

      GET http://localhost:8081/clientes/{id} 
    • Header

      AUTHORIZATION {ACCESS_TOKEN}
    • Retornos possíveis

      Código Resposta
      200 (Ok) Requisição processada com sucesso
      400 (Requisição inválida) A requisição realizada contém problemas de má formação
      401 (Não autorizado) Na requisição, não foi informado o cabeçalho de autorização
    • Exemplos

      • Request
           {
              "name":"Teste 3",
              "cpf":"278.128.110-77",
              "email":"[email protected]"
           }
      • Header
        AUTHORIZATION {ACCESS_TOKEN 
      • Response
         {
            "success": true,
            "data": {
                        "id": 20,
                        "name": "Teste 3",
                        "cpf": "278.128.110-77",
                        "email": "[email protected]"
                     }
         }
  4. Buscar todos os clientes (Rota protegida)

    Esta rota busca registros na tabela client, podendo realizar buscas personalizadas.

    • Request

      GET http://localhost:8081/clientes
    • Header

      AUTHORIZATION {ACCESS_TOKEN}
    • Filtros, ordenação e paginação:

      Opções Função
      /clientes?name=Teste 3 filtra por nome
      /clientes?cpf="123.456.789-9 filtra por cpf
      /clientes?name=Teste 3cpf=123.456.789-9 filtra por nome e cpf
      /clientes?sort[name]=ASC ordena em ascendente por nome
      /clientes?sort[name]=DESC ordena em descendente por nome
      /clientes?sort[name]=DESC&sort[id]=ASC ordena em descendente por nome e depois por ID em ascendente
      /clientes?page=2 retorna a 2ª página de dados
      /clientes?page=2&itemsPerPage=20 retorna a 2ª página de dados, exibindo 20 items
    • Retornos possíveis

      Código Resposta
      200 (Ok) Requisição processada com sucesso
      400 (Requisição inválida) A requisição realizada contém problemas de má formação
      401 (Não autorizado) Na requisição, não foi informado o cabeçalho de autorização
    • Response

      {
         "success": true,
         "currentPage": 1,
         "itemsPerPage": 5,
         "data": []
      }
      {
         "success": true,
         "currentPage": 1,
         "itemsPerPage": 5,
         "data": [
            {
                  "id": 17,
                  "name": "Client Test 1",
                  "cpf": "446.069.350-06",
                  "email": "[email protected]",
                  "phone": null
            },
            {
                  "id": 18,
                  "name": "Client Test 2",
                  "cpf": "949.487.580-00",
                  "email": "[email protected]",
                  "phone": null
            },
            {
                  "id": 19,
                  "name": "Teste 3",
                  "cpf": "278.128.110-77",
                  "email": "[email protected]",
                  "phone": null
            },
            {
                  "id": 20,
                  "name": "Teste 3",
                  "cpf": "278.128.110-77",
                  "email": "[email protected]",
                  "phone": null
            }
         ]
      }
  5. Atualizar dados de um cliente (Rota protegida)

    Esta rota atualiza um registro na tabela client pelo ID.

    • Request

      PUT http://localhost:8081/clientes/{id}
    • Header

      AUTHORIZATION {ACCESS_TOKEN}
    • Retornos possíveis

      Código Resposta
      200 (Atualizado) Cliente atualizado com sucesso
      400 (Requisição inválida) A requisição realizada contém problemas de má formação
      401 (Não autorizado) Na requisição, não foi informado o cabeçalho de autorização
      404 (Não encontrado) Recurso com o {id} não encontrado na base
      412 (Pré-condição falhou) Os valores informados não são válidos.
  6. Remover um cliente (Rota protegida)

    Esta rota remove um registro na tabela client pelo ID.

    • Request

      DELETE http://localhost:8081/clientes/{id}
    • Header

      AUTHORIZATION {ACCESS_TOKEN} 
    • Retornos possíveis

      Código Resposta
      204 (Nenhum conteúdo) Cliente apagado
      401 (Não autorizado) Na requisição, não foi informado o cabeçalho de autorização
      404 (Não encontrado) Recurso com o {id} não encontrado na base

Projeto concluído em 2021

Feito com carinho por Alisson Gabriel

About

API RESTful feita em Symfony para gerenciamento de clientes

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published