Servidor de exercícios JS

Este é o servidor de exercícios de JavaScript desenvolvido para a disciplina Tecnologias Web.

Não existe uma página para visualizar nem submeter os exercícios. Na verdade, você está vendo a única página do servidor de exercícios (ou quase isso, mas eu vou deixar você descobrir por conta própria).

Consideramos aqui uma página como "um documento que pode ser mostrado em um navegador web".

Além das páginas, existem diversos outros dados sendo transmitidos pela web. Um dos objetivos deste servidor, além de treinar JavaScript, é deixar isso claro. Por isso, todo o processo será realizado sem a necessidade de uma página para visualizar a informação. Claro que você pode desenvolver uma página para esse fim, o que pode facilitar muito a sua vida, mas isso não é necessário.

Utilize esta página como guia para realizar os exercícios.

1. Configurando o cliente

Agora sim, siga os passos a seguir para começar executar o código JavaScript:

  1. Crie uma pasta para guardar as suas respostas (é um bom momento para já colocar tudo no git em um repositório privado);
  2. "Instale o NodeJS" para poder executar código JavaScript pelo terminal
  3. Instale o axios para fazer requisições pelo JavaScript:
    $ npm install axios
  4. Dentro dessa pasta, crie um arquivo chamado client.js (na verdade pode ter qualquer nome);
  5. Nesse arquivo, adicione o seguinte conteúdo:
    const axios = require("axios");
    axios
      .get("https://catfact.ninja/fact")
      .then((response) => console.log(response.data.fact));
  6. Para executar esse arquivo, utilize o comando:
    $ node client.js
  7. Se o código já estiver no git, não se esqueça de colocar um .gitignore para projetos NodeJS;
  8. Muito bem, está tudo pronto para começar os exercícios!

Se preferir, você pode criar uma página HTML e carregar o JavaScript em uma tag script. Uma vantagem dessa abordagem é que você pode utilizar a página para visualizar informações úteis, como o resultado das submissões. Fique à vontade para implementar como preferir.

2. Obtendo um token de acesso

Para enviar suas soluções para o servidor é necessário obter um token de acesso. Esse token permite que o servidor te identifique como o autor das requisições.

O token tem validade de 1 minuto. Submissões realizadas com o mesmo token após esse tempo serão ignoradas. Para tentar novamente basta obter um novo token de acesso e reenviar as suas submissões. O servidor considerará apenas as submissões realizadas com o último token utilizado.

A solução de cada exercício será feita por uma submissão separada dentro desse período de 1 minuto. Portanto será necessário armazenar o token recebido em uma variável. Você até pode correr para fazer todas as submissões manualmente, mas, como bom programador(a), eu sei que você vai fazer tudo programaticamente ;-)

Para obter o token de acesso, siga os passos a seguir:

  1. No seu arquivo client.js, realize uma requisição POST para https://servidor-exercicios-js.vercel.app/token (este post sobre como usar o axios pode ser útil) enviando o seguinte conteúdo no formato JSON: {username: "NOME DE USUÁRIO"} (utilize o seu nome de usuário Insper);
  2. A requisição deve definir obrigatoriamente os headers Content-Type e Accept como "application/json" (veja como enviar um cabeçalho customizado aqui);
  3. Se estiver tudo certo, a resposta será um objeto JSON contendo uma string na chave accessToken. Essa string é o seu token de acesso. Agora está tudo pronto para obter a lista de exercícios (que já é por si só o primeiro exercício :-)

3. Listando os exercícios

Os exercícios podem ser obtidos fazendo uma requisição GET para https://servidor-exercicios-js.vercel.app/exercicio. Não se esqueça de definir o Content-Type e o Accept como "application/json" e o Authorization com a string "Bearer TOKEN", substituindo TOKEN pelo accessToken recebido no passo anterior, em todas as suas requisições para o servidor a partir deste ponto.

A lista de exercícios é representada por um objeto (pode ser usado como o dicionário do Python) no qual as chaves são a slug do exercício e o valor é um objeto (dicionário) com as chaves:

Exemplo:

{
  multiplicacao: {
    titulo: 'Multiplicação de valores',
    descricao: 'Qual é o resultado de m * n?',
    entrada: { m: 142, n: 745 },
    pontuacao: 0.5
  },
  dobro: {
    titulo: 'Dobro do número',
    descricao: 'Qual é o dobro de a?',
    entrada: { a: 14 },
    pontuacao: 0.5
  },
}

4. Resolvendo os exercícios

Agora que você tem a lista de exercícios, você pode resolvê-los como preferir. Alguns deles são como quebra-cabeças. Você vai precisar fazer requisições adicionais para descobrir o resultado final.

Os valores de entrada sempre mudam (a cada novo token gerado). Por esse motivo, o seu código deve funcionar para entradas aleatórias, não apenas a que você recebeu nesse momento. Como você vai implementar isso? Vou deixar você decidir ;-)

5. Enviando suas submissões

Para submeter a resposta de uma questão, você deve fazer uma requisição POST para https://servidor-exercicios-js.vercel.app/exercicio/SLUG, onde SLUG é o slug do exercício para o qual você deseja enviar a solução. Nessa requisição, você deve enviar a resposta da questão em um dicionário JSON com a chave resposta.

Por exemplo, para o exemplo da multiplicação acima, você deveria fazer um POST para https://servidor-exercicios-js.vercel.app/exercicio/multiplicacao com o JSON { "resposta": 105790 }. Novamente, não se esqueça dos cabeçalhos Content-Type, Accept e Authorization.

6. Verificando os resultados

A requisição POST com a submissão da resposta de um dado exercício será respondida com um JSON contendo um valor booleano na chave sucesso. Se esse valor for verdadeiro, você acertou a resposta e a pontuação dela será considerada na sua nota.

Você também pode verificar a sua situação atual no servidor consultando https://servidor-exercicios-js.vercel.app/?username=SEU_USUARIO, substituindo SEU_USUARIO pelo seu nome de usuário Insper.

7. Entrega

O seu código (apenas um arquivo .js) deve ser entregue via Blackboard. Nenhum outro formato será aceito. Qualquer formato diferente de .js receberá nota zero. A única biblioteca externa permitida é o axios.

Obter o token e a lista de exercícios já são exercícios por si só e valem, cada um, 0,5 ponto.