Skip to content

celsodevelop/grx-challenge

Repository files navigation

DESAFIO GRX



Proposto por: GRX Soluções

Stack principal:

Typescript Docker Eslint

Frontend:

React ReactRouter ReactHookForm ReactQuery Axios Yup Bulma

Backend:

NodeJS ExpressJS AJV


Sobre o Projeto


InitialScreenshot ResponseScreenshot

O projeto a seguir, apresenta-se como uma solução de um sistema para:

  • coletar do usuário respostas às perguntas pré-cadastradas por meio de um cliente web;
  • analisar as respostas e por meio de um score dar o peso pras respostas;
  • escrever a resposta em um arquivo .txt no servidor.
  • exibir a pontuação das respostas para o usuário

Como diferencial, não há conteúdo estático no projeto fora dos JSONs de cliente e servidor. Logo, a edição dos arquivos JSON na pasta constants de cliente e servidor é o suficiente para cadastrar novas questões ou alterar/remover as existentes do lado do cliente, assim como, criar ou alterar novas pontuações baseadas nas respostas do lado do servidor.

Lembre-se: O projeto utilizou-se de uma estrutura monorepo para facilitar o desenvolvimento. O deploy deverá ser feito em ambientes separados para segurança (Dica: O docker já está configurado para rodar o ambiente de desenvolvimento, poucas alterações serão necessárias para o deploy da imagem em algum registry para posteriormente colocar em produção.)


Instalação

Ambiente desenvolvimento


Opção Docker:

  • Você pode rodar o comando docker-compose up na raiz. Na primeira execução, o comando vai fazer o build da imagem o que pode levar alguns minutos, após utilize apenas esse comando para rodar seu ambiente de desenvolvimento nas próximas;

Opção Local:

  • Faça o git clone do projeto
  • Rode na raiz do projeto o comando:

npm install && cd react_client && npm install

  • Rode o comando: npm run dev na raiz;
  • Acesse o app em: http://localhost:3000;


Uso do sistema


A função de edição das questões em formato JSON, você descobre abaixo como fazer. Essa abstração busca permitir edições rápidas nas questões apresentadas e igualmente alteração do score registrado pelo sistema. Nesse formato, mesmo a internacionalização(tradução) também poderá ser aplicada mais facilmente.

  • Cliente:

  react_client/src/constants/survey.json

Nesse arquivo devemos configurar como será a visualização da pesquisa, você poderá acrescentar perguntas, editar ou remover a seu critério sem precisar refazer um build quando em produção. Veja o padrão:

   {
    "survey": "Título da Pesquisa",
    "questions": {
      "question1": {
        "statement": "Enunciado",
        "type": "Tipo",
        "answers": ["respostas", "aceitas"],
        "error": "Mensagem de erro"
      },
    },
    "answers": {
      "respostas": "Respostas",
      "aceitas": "Aceitas",
      "pelo": "Pelo",
      "servidor": "Servidor",
    },
    "responses": {
      "positives": "Positiva",
    }
  }

Dessa forma, é possível acrescentar ou alterar questões.

Temos disponíveis as questões do tipo: "select", "textarea" e "radio"

Para sincronizar as novas questões com o backend veja a próxima seção. Ainda no frontend, para concluir a edição se houver validações a serem feitas você poderá configurar no arquivo:

react_client/src/constants/validation.ts

Utilizamos a popular lib yup para as validações.

Lembre-se de alterar também o arquivo src/types/types.ts que conterá guardiões de tipo. Caso necessário novo build esse passo é obrigatório, pois o compilador do Typescript está configurado em modo estrito com pouca permissividade.


  • Servidor:

  src/constants/pointsByAnswer.json

O JSON do servidor é configurado aninhando-se o número da questão, as classificações de respostas aceitas e finalmente a pontuação de cada resposta em seu grupo como no exemplo abaixo:

  {
  "question1": {
    "positives": {
      "yes": 1
    },
    "negatives": {
      "no": 1
    }
  }

Cadastramos a pontuação da questão e as possibilidades de resposta seguindo esse padrão.

Lembre-se de alterar também o arquivo src/types/types.ts que conterá guardiões de tipo para o backend. Caso necessário novo build esse passo é obrigatório, pois o compilador do Typescript está configurado em modo estrito com pouca permissividade.

O servidor API REST está configurado para rodar na porta 5000 por default no ambiente de desenvolvimento.

localhost:5000

Respondendo às requisições HTTP, esse servidor possui esquema de validação própria das entradas aceitas via lib Ajv. A validação do lado do backend pode ser encontrada no JSON

schemas/answer.json

Também deve ser editado após a compilação para acomodar a validação das novas questões ou mais possibilidades de respostas pra mesma questão.

Abaixo um exemplo do modelo do contrato encontrado nas rotas disponíveis:

  • Rota

    /answer
    
  • Request

    {
     "question1": "yes",
     "question2": "yes",
     "question3": "now",
     "question4": "I would like to improve my technical and softskill abilities at GRX"
    }
  • Response

    {
      "positives": 4,
      "negatives": 0,
      "not_avaliated": 0
    }

Etapa mais desafiadora

A integração das bibliotecas React Query e React-hook-forms foi bastante desafiadora a medida em que elas fazem o gerenciamento dos estados no formulário e requisição do servidor. Foi adicionado à proposta um botão de reset para a pessoa poder responder novamente. Houve um trabalho longo para orquestrar esses estados da biblioteca de forms, dos componentes com o react-query. Em tempo, o maior entendimento do código do react-hook-forms, pesquisa de issues no github e leitura do código fonte foi a fonte para conseguir fazer funcionar o reset.


O que faltou?

Seria interessante a criação de testes ao longo do processo de desenvolvimento, como não foi feito, deveria-se fazer no mínimo um teste de integração. O teste cobrindo os casos de envio e erro ajudariam muito no desenvolvimento de novas features posteriormente, como a inclusão de novos tipos de questões.


Feedback sobre a proposta

O desafio proposto embora pareça simples à primeira vista, ele é capaz de te desafiar. O desafio passa principalmente em relação às arquiteturas possíveis e seleção de ferramentas e tecnologias que você possa utilizar na solução. A abstração para modelos mais dinâmicos é compreendida em fase mais avançada do projeto e traz uma experiência importante na criação de softwares fullstack. Talvez eu pudesse sugerir um prazo maior pra realização do projeto em bom nível sem extrapolar o prazo.


License

  UNLICENSED yet.

Authors

Celso Oliva - celsodevelop


Acknowledgements


GRX Challenge - 2022 ©

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors