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:
- Cria mais 2 registos de listas de compras: à mão, com um gerador, ...
- Importa os 3 registos (os que criaste mas o que foi fornecido) numa base de dados em MongoDB,
denominada "listaCompras";
- 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})
- 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;
- 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.
- 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.