Giter Club home page Giter Club logo

desafio-promobit's Introduction

Desafio Promobit (Teste Prático)

Requisitos

Docker e Docker compose instalados (a forma de instalar varia de sistema para sistema).

Docker

Instalação em ambiente Windows, ative o WSL2 para ter acesso a um ambiente Docker mais proximo do Linux e Mac.

Instalação em ambiente macOS.

Instalação em ambiente Linux, escolha a distribuição correta antes de instalar.

Docker Compose

Documentação Oficial.

Como rodar?

Utilize o meu repositório docker lamp na branch master-mysql (esta branch possui apenas o container do MySQL).

Após clonar o docker lamp, clone o atual repositório dentro da pasta src.

Na raiz da pasta do docker, rode o seguinte comando para subir o ambiente: docker-compose up -d este comando pode levar alguns minutos para ser concluído dependendo da velocidade da conexão com a internet.

Com tudo rodando, entre no container do apache utilizando o comando docker exec -it apache /bin/bash.

Acesse a pasta do projeto com cd Desafio-Promobit.

Digite chmod +x configurar.sh e finalmente ./configurar.sh. Este script sera responsável por algumas configurações do projeto e realizar o download das dependências.

Abra o MySQL Workbench e crie uma nova database com o nome de promobit. Ele já vai pegar os dados do container do MySQL automaticamente, caso não o faça, crie uma conexão com o usuário e senha como root e crie a database normalmente.

Por fim não esqueça de configurar o arquivo de host do seu sistema operacional. Basicamente nesse arquivo você deve adicionar o IP do Docker seguido da URL de test do projeto http://promobit.test.


SQL de extração de relatório de relevancia de produtos

O código abaixo é responsavel pela função geradora do relatório e pode ser encontrada no controller Product.php.

    public function report()
    {
        if(isset($_SESSION['loggedin']) && $_SESSION['loggedin'])
        {
            $model_tag = new TagModel();
            $model_product = new ProductModel();
            $model_product_tag = new ProductTagModel();
            
            $builder_product = $model_product->builder();
            $builder_tag = $model_tag->builder();
            $builder_product_tag = $model_product_tag->builder();

            $products_list = $builder_product->get()->getResultArray();

            foreach($products_list as $key => $produto)
            {
                $relationship = $builder_product_tag->getWhere(['product_id' => $produto['id']])->getResultArray();
                
                foreach($relationship as $key_2 => $relation)
                {
                    $tag_name = $builder_tag->getWhere(['id' => $relation['tag_id']])->getResultArray();
                    $products_list[$key]['tag'][$key_2] = $tag_name[0]['name'];
                }        
            }

            echo view('Templates/beginning');
            echo view('Product/report', ['data' => $products_list]);
            echo view('Templates/ending');
        }
        else
        {
            echo view('Templates/beginning');
            echo view('login');
            echo view('Templates/ending');
        }
    }

Como foram utilizadas diversas funções de database do CodeIgniter, como o Forge Database e o Query Builder, irei explicar os trechos onde são feitas as consultas.

O trecho abaixo instancia, em três variáveis, os respectivos Models para serem usados posteriormente em operações de banco de dados. Observação: Nesse momento foi utilizado o Forge Database

    $model_tag = new TagModel();
    $model_product = new ProductModel();
    $model_product_tag = new ProductTagModel();

Abaixo também são instanciados, em três variáveis, os respectivos Models. Entretanto, dessa vez foi utilizado o Query Builder.

    $builder_product = $model_product->builder();
    $builder_tag = $model_tag->builder();
    $builder_product_tag = $model_product_tag->builder();

O motivo da utilização de ambas formas para se relacionar com o banco de dados foi a facilidade em se fazer algumas operações e, por isso, foi intercalado ambos modos de relacionamento.

A linha abaixo atribui a uma variável todos os dados de produtos que estão gravados na tabela Product. O comando abaixo seria equivalente ao classico SELECT * FROM products

$products_list = $builder_product->get()->getResultArray();

Em seguida é feito um loop percorrendo toda a lista de produtos para poder fazer o manuseio dos dados individuais de cada produto.

Em seguida é atribuído os dados a variável relationship, que é responsável por fazer uma pesquisa na tabela de relação entre produtos/tags, em busca de todas as linhas onde existam dados desse produto em especifico. Isso é feito para poder pesquisar posteriormente as tags deste produto em especifico e adiciona-las no array. Este comando seria similar ao SELECT * FROM product_tag WHERE product_id = $produto['id'].

Após esta atribuição é feita um outro loop, dessa vez percorrendo a lista da relação. No interior desse loop é feita uma outra consulta, dessa vez na tabela de tags para pegar o nome da tag, pois tinha-se apenas a id, e assim atribuir a variável tag_name. Este comando seria similar ao SELECT * FROM tag WHERE id = $relation['tag_id'].

Finalmente é montado o array com os dados, juntando os dados do produto (id e nome) com as tags (que são adicionadas em outro array, dentro da chave tags, que por sua vez está localizada no array principal, o products_list).

    foreach($products_list as $key => $produto)
    {
        $relationship = $builder_product_tag->getWhere(['product_id' => $produto['id']])->getResultArray();
        
        foreach($relationship as $key_2 => $relation)
        {
            $tag_name = $builder_tag->getWhere(['id' => $relation['tag_id']])->getResultArray();
            $products_list[$key]['tag'][$key_2] = $tag_name[0]['name'];
        }        
    }

O restante da função é apenas a impressão das views.

desafio-promobit's People

Contributors

dancarvalhodev avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.