Coder Social home page Coder Social logo

avaliacao_zpt's Introduction

Avaliação ZPT Digital

Obrigado por dedicar seu tempo à avaliação da ZPT Digital!

O intuito deste teste é termos uma amostra do seu trabalho nos mais diferentes níveis. Faça-o como se você já tivesse sido contratado pela ZPT Digital e estas fossem suas primeiras tarefas nos nossos repositórios. Use esta avaliação para mostrar o melhor de si!

Questões

Faça as questões em ordem.

Algumas questões podem parecer enigmáticas e pouco detalhadas. Isso é intencional.

Crie uma branch para cada questão e mescle para a master.

Ao concluir o teste, compacte e devolva o repositório com suas alterações.


DDL (MySQL)

CREATE TABLE `user` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(20) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

CREATE TABLE `department` (
  `id` int unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(50) NOT NULL,
  `employees` int unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB;

CREATE TABLE `user_department` (
  `user` int unsigned NOT NULL,
  `department` int unsigned NOT NULL,
  PRIMARY KEY (`user`,`department`),
  CONSTRAINT `FK_department` FOREIGN KEY (`department`) REFERENCES `department` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
  CONSTRAINT `FK_user` FOREIGN KEY (`user`) REFERENCES `user` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE=InnoDB;

  1. Desenhe o MER.
  • Levantei um container de mariadb
  • docker-compose up
  • Separei a estrutura em um arquivo sql dentro de bin
  • Criei a estrutura com o comando do executavel create_database
  • Extrai com DBeaver o modelo lógico
  1. O método em /src/User.php#L7-L15 está muito lento. Deixe-o mais rápido. Esse método é em pseudocódigo PHP, isto é, não é possível executá-lo de fato. Sua solução pode ser em pseudocódigo também.
  • Ao ver o código um problema obvio é estar fazendo a query dentro de um looping, fazendo ir e voltar do banco de dados varias vezes
  • Removi o loop e adicionei para a query ser feita com o where usando "id IN (id, id...)"
  1. Ainda referente ao método da questão anterior, melhore o nome dele.
  • normalmente quando usamos um framework, o metodo find do orm leva um unico id para retornar um registro
  • utilizar find_many com um array de ids me parece ser a alternativa mais legivel
  1. Tomando por base o pseudocódigo que já existe, implemente um método que retorne o maior departamento (o que tiver mais employees) de cada usuário, isto é, de todos os usuários de uma vez, sem qualquer filtro.
  • optei por implementar um metodo estatico na classe Departamento que realiza essa query em especifico retornando o departamento
    • porem nessa questão me vêm a duvida, há um contador de employees em cada registro de departamento. Meu primeiro pensamento era de fazer um agrupamento na tabela user_department
    • o termo user pode ser uma entidade diferente de employee, os users do departamento de marketing poderiam muito be ser clientes que o marketing atende, nessa questão seria necessario exclarecer essa duvida para prosseguir com segurança
    • o prazo é amanhã e a questão pede especificamente para utilizar a coluna employees, mas no dia dia de trabalho eu com certeza tentaria entender melhor essa diferença de terminologia
    • Department::largest() supostamente retornaria o maior
  1. O que pode ser feito para deixar a query abaixo mais rápida?
SELECT dept.id FROM user
INNER JOIN user_department u_d ON u_d.user = user.id
INNER JOIN department dept ON u_d.department = dept.id
WHERE user.username = 'zpt'
  • nessa query acredito que estavamos fazendo varios joins e depois filtrando
  • mas a filtragem não depende do resultado desses joins, somente da tabela user
    • considerar no join todos os usuarios da tabela pode ser desnecessario já que literalmente só queremos o zpt
  • a minha solução seria filtrar primeiro a tabela user e utilizar esse resultado para fazer o join
SELECT dept.id FROM (SELECT id FROM `user` WHERE username = 'joao') as user_q
INNER JOIN user_department u_d ON u_d.user = user_q.id
INNER JOIN department dept ON u_d.department = dept.id
  1. A classe User tem o método setDb() que recebe uma conexão com o banco de dados. As classes Company e Department precisam ter esse mesmo método, idêntico. Implemente.
  • criado a classe abstrata BaseClass que serve para possibilitar que outras classes acessem o bando de dados e metodos em comun
  • o attributo db foi de private para protected para poder ser usado na herança
  1. Esta função permite atribuir uma conexão em estilo procedural. Faça a função aceitar instâncias de Company e Department também.
  • Na questão anterior foi adicionado a classe abstrata BaseClass
  • trocando \User\User por \BaseClass podemos fazer com que a função aceite agora também Company e Department
  1. Utilize a API https://ipinfo.io/json via JavaScript para consultar o IP do usuário e exibir na lacuna designada em ./src/index.html.
  • simples fetch e append no elemento de ID 'ip'
  • adblocks como ublock origin bloqueiam a requisição e fazem o navegador retornar erro de cors.
    • caso o ip não apareça verifique as extensões
  1. Crie a classe CompanyClient, que é uma Company que, além do id, tem um número chamado registration. A saudação deve exibir o id e o registration.
  • foi criado a classe CompanyClient que é uma company
    • passa pela função quando function requiresCompany(Company $company){}
  • modificado id para ser protected e acessivel para a classes que herdam Company
  • adicionado registration e novo metodo com mesma assinatura de greetings
  1. Qual commit introduziu este erro? Explique e corrija o erro.
  •   b72835e5 zpt (2023-09-12 22:25):                                               │
      feat(department): get ready to allow operations on User from inside Department
    
  • eu não sei exatamente o seria para retornar nesse user, mas o problema dessa linha mais óbvio é que se esta tentando referenciar a class User a partir do namespace Department, se é necessario começar do inicio com \User\User ou dar um "use User\User" no inicio do arquivo

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.