Ficha DAW2021-recurso

Avaliação: Desenvolvimento de Aplicações Web

Desenvolvimento de Aplicações Web

O objetivo desta ficha é testar os conhecimentos adquiridos ao longo do semestre sobre desenvolvimento de aplicações web.

Os resultados finais deverão ser enviados ao docente da seguinte forma:

  • Enviar por email para: jcr@di.uminho.pt
  • Colocar no subject/assunto: DAW2020::ExameRecurso::Axxxxx
  • Em que Axxxxx corresponde ao número do aluno;
  • Enviar ao docente um link do github para um repositório novo criado especificamente para o exame com o seguinte conteúdo (esta preparação poderá valer 1 valor do exame):
    • O repositório no GitHub deverá chamar-se "DAW2020-ExameRecurso";
    • Dentro do repositório deverá haver um ficheiro, "PR.xml", contendo uma descrição de como fez a persistência de dados, do setup de bases de dados (como importou os registos ...), respostas textuais pedidas, instruções de como executar as aplicações desenvolvidas, etc...

Os exercícios que envolvam criação de rotas serão testados com as rotas no enunciado, qualquer rota que seja diferente da pedida será avaliada com 0.

Recursos:

Recursos disponíveis para a realização da ficha:

Exercícios:

  1. Vamos às compras...

Neste teste, irás desenvolver uma aplicação para dar suporte à gestão de listas de compras.

Na área de recursos, em cima, tens um exemplo de um registo JSON de uma lista de compras. Descarrega-o e analisa-o.

Tendo analisado a estrutura de um registo, desenvolve agora as seguintes alíneas:

  1. Cria mais 2 registos de listas de compras: à mão, com um gerador, ...
  2. Importa os 3 registos (os que criaste mas o que foi fornecido) numa base de dados em MongoDB, denominada "listaCompras";
  3. Sobre esta base de dados especifica as seguintes queries (coloca-as num ficheiro de texto que enviarás como resolução):
    • Quantas listas de compras existem na base de dados? (resultado = inteiro)
    • Em quantas listas se compram "Nabos"? (resultado = inteiro)
    • Que categorias existem referenciadas na base de dados? (resultado = lista ordenada alfabeticamente de categorias)
    • Qual o produto mais comprado da categoria "Frutas e Legumes"? (resultado = {"nomeProduto", quantidade})
    • Em toda a base de dados, quantos produtos de cada categoria são comprados (as repetições contam)? (resultado = {"nomeCategoria", quantidadeProdutos})
  4. Sobre a base de dados implementa uma API de dados que responda aos seguintes pedidos em JSON:
    • GET /api/listas - Devolve a lista de listas de compras, com os campos: _id, data, designacao e quant (número de produtos que se pretendem comprar em cada lista);
    • GET /api/listas/:id - Devolve toda a informação de uma lista de compras (o registo completo em JSON);
    • GET /api/categorias - Devolve uma lista de categorias (lista de strings em formato JSON);
    • GET /api/categorias/:id/produtos - Devolve uma lista de produtos da categoria identificada, todos os produtos que foram comprados nalguma lista de compras, sem repetições (resultado = {"categoria": "designacaoCategoria, "produtos": [... lista de strings sem repetições... ]});
    • POST /api/listas - Insere uma lista de compras na base de dados (o registo é fornecido em JSON no body);
    • POST /api/listas/:id - Insere um novo produto numa determinada lista de compras (o registo do produto é fornecido em JSON no body);
    • DELETE /api/listas/:id - Apaga uma lista de compras, devolve um booleano como resultado;
    • DELETE /api/listas/:id/produtos/:id - Apaga um produto duma lista de compras, devolve um booleano como resultado;
  5. No mesmo servidor, ou num novo servidor, cria uma interface web para a API de dados com os seguintes requisitos:
    • Na página inicial, deve aparecer uma tabela com todas as listas de compras: data, designacao e quant (número de produtos que se pretendem comprar em cada lista);
    • Clicando numa das linhas da tabela deve-se navegar para a página da lista de compras correpondente. Nessa página, deve ser mostrada a informação duma lista de compras e deverá ter um botão para voltar ao início;
    • Na página inicial, acrescenta um botão "Adicionar". Ao clicar neste botão, devemos ir para um formulário que nos vai permitir inserir uma lista de compras. No fim da submissão devemos voltar à página inicial, agora com mais uma lista inserida;
    • Na página da lista de compras, acrescenta um botão "Adicionar" que quando clicado abre um formulário para acrescentar mais um produto a essa lista de compras. Após a submissão devemos voltar à página da lista de compras;
    • Na página inicial, acrescenta um botão "Remover". Após um clique neste botão, a correspondente lista de compras é apagada e a página inicial passa a refletir isso;
    Na página da lista de compras, acrescenta um botão "Remover" à frente de cada produto que quando clicado apaga esse produto da lista.
  6. Vais agora proteger a tua API de dados com tokens temporais. Nesse sentido implementa as seguintes funcionalidades:
    • Na parte da API, implementa o seguinte pedido: GET /api/token - devolve um token gerado no momento com o segredo "DAW2020-recurso" e com o payload {"sub":"Exame", "data": "dataDoSistema"};
    • Na parte da interface, acrescenta o middleware que pede um token e o guarda nos cookies;
    • Na parte da API, acrescenta um middleware que verifica se os pedidos chegam com um token válido. A única exceção é o pedido do token, referido em cima, que não precisa de estar protegido por motivos óbvios.