Um aplicativo de serviço de API simples para consumir vouchers do pool. Isto é para fins de demonstração e criado para demonstrar habilidades de arquitetura e programação.
Abaixo estão os principais pontos do design e como eles foram tratados e implementados.
O Composer é usado para gerenciar todas as dependências do aplicativo. Todos os pacotes/bibliotecas necessários são declarados no arquivo composer.json
. E pode ser instalado usando o comando composer install
.
A entrada do aplicativo é apontada para o diretório public
, que contém apenas o arquivo index.php
e também pode conter arquivos de ativos que podem ser acessados publicamente. Fora isso, nenhum código ou arquivo fora desta pasta pode ser acessado diretamente. A ideia é proteger todos os arquivos fora deste diretório.
Todas as solicitações e como elas precisam ser tratadas estão definidas em routes/api.php
.
Para interagir com o MySQL, usamos o Illuminate Database, também conhecido como "Eloquent". Ele nos permite interagir com nosso banco de dados através do Mapeamento Relacional de Objetos "ORM".
Para migrar e propagar o banco de dados, usamos o pacote independente de estrutura Phinx. Com o passar do tempo, o código do aplicativo evolui e o banco de dados também evolui com ele. Para acompanhar as alterações no código, usamos ferramentas de controle de versão de origem, como o git. Com os scripts de migração também podemos acompanhar as alterações do banco de dados. Especialmente útil ao trabalhar em um ambiente de equipe. Quando os colegas de equipe fazem suas alterações, se virem os scripts de migração, eles podem simplesmente executá-los com o comando simples para atualizar as alterações no esquema do banco de dados local.
Para gerenciar dependências de classe e realizar injeção de dependência, usamos SlimFramwork Container
. Com isso podemos inverter o controle das dependências da aplicação para a classe daí o padrão “Inversão de Controle”.
Para lidar com as definições de configuração do aplicativo, usamos o Illuminate Config. Todas as configurações são armazenadas no diretório config
. Também usei Symfony Dotenv para carregar as variáveis definidas no arquivo .env
e acessá-las através da função getenv(). Isso é útil para ter configurações diferentes para cada ambiente, ou seja, desenvolvimento, teste, produção.
Para entender o que está acontecendo em nosso aplicativo, usamos a biblioteca Monolog, que fornece serviços de registro robustos que permitem registrar mensagens.
Para validar os dados de solicitação HTTP recebidos do seu aplicativo, usamos o Illuminate Validation, que fornece uma variedade de regras de validação poderosas.
Para fornecer uma saída padrão e consistente de dados de resposta da API, usamos League Fractal, para que possamos ter uma camada de apresentação e transformação para nossos dados de saída. Todas as classes de transformação são armazenadas no diretório app/Transformers
.
Quando uma nova oferta especial é criada, não geramos vouchers para todos os destinatários do nosso sistema. Em vez disso, estamos usando HashIds para gerar e validar vouchers para cada destinatário. Podemos codificar e decodificar usando uma combinação de [{recipient_id}, {offer_id}]
. Sempre produz um código de voucher de exatos 8 caracteres que também pode ser atualizado em config/hashids.php
Para testar nosso serviço de aplicativo, usamos Codeception. Pronto para uso, ele nos permite ter todos os três tipos de testes, ou seja, testes unitários, funcionais e de aceitação em uma estrutura unificada. Em nosso caso, testamos a unidade dos principais objetos de negócios em AppServices
, também escrevemos testes de aceitação para verificar a integração e funcionalidade de todos os endpoints da API. Todos os casos de teste são armazenados no diretório tests
. e pode ser executado pelo seguinte comando:
$ php vendor/bin/codecept run --steps
Para manter os padrões de codificação de toda a equipe criei o arquivo phpcs.xml
, no qual estão definidos todos os padrões de codificação. e todos os arquivos de código podem ser verificados de acordo com este arquivo executando o seguinte comando:
$ php vendor/bin/phpcs
Requisitos do ambiente de desenvolvimento:
Configurando seu ambiente de desenvolvimento em sua máquina local usando script de configuração (para MAC/LINUX) :
git clone https://github.com/ahsanatiq/voucher-pool-api.git
cd voucher-pool-api
./setup.sh
Configuração manual (para Windows) :
git clone https://github.com/ahsanatiq/voucher-pool-api.git
cd voucher-pool-api
cp .env.dev .env
docker-compose up -d
docker exec -it voucher-pool-php-fpm composer install
docker exec -it voucher-pool-mysql mysql -u root -pnewsletter2go -e " create database newsletter2go_testing; GRANT ALL PRIVILEGES ON *.* TO 'newsletter2go'@'%' IDENTIFIED BY 'newsletter2go'; " ;
docker exec -it voucher-pool-php-fpm php vendor/bin/phinx migrate
docker exec -it voucher-pool-php-fpm php vendor/bin/phinx seed:run
Agora você pode acessar o aplicativo via http://localhost:8080.
Execute os testes de unidade e testes de aceitação no contêiner de serviço PHP-FPM:
docker exec -it voucher-pool-php-fpm php vendor/bin/codecept run --steps
Você pode acessar a documentação pública da API em Postman. Para importar e executar todas as API's, clique em "Run In Postman" na barra superior, após instalar e importar você verá a nova coleção como "Newsletter2Go - Voucher API".