Neste teste, irás desenvolver uma aplicação para dar suporte à gestão da lista de equipes do Projeto de Engenharia Informática do corrente ano letivo (PEI2020).
Na área de recursos, em cima, tens um dataset em JSON com uma lista com várias dezenas de equipes (o dataset foi gerado aleatoriamente).
Descarrega-o e analisa-o.
Com base neste dataset desenvolve agora as seguintes alíneas que constituem esta prova de avaliação:
- [1 val.] Importa o dataset numa base de dados em MongoDB, denominada "PEI2020", e para um coleção denominada "teams";
- Sobre esta base de dados especifica as seguintes queries (coloca-as num ficheiro de texto que enviarás como resolução):
- [1 val.] Quantas equipes existem na base de dados? (resultado = inteiro)
- [1 val.] Quais as equipes? (lista com os nomes das equipes ordenada alfabeticamente)
- [1 val.] Quantos alunos existem catalogados na base de dados? (resultado = inteiro)
- [1 val.] Quais os alunos? (lista de pares com os números de identificação e nomes dos alunos ordenada alfabeticamente por nome)
- [0.5 val.] Quantos alunos do MIEI existem catalogados na base de dados? (resultado = inteiro)
- [0.5 val.] Quantos membros tem cada equipe? (resultado = lista de pares, nome da equipe e número de elementos na equipe,
ordenada alfabeticamente por nome da equipe )
- Sobre a base de dados implementa uma API de dados que responda aos seguintes pedidos em JSON:
- [1 val.] GET /api/teams - Devolve a lista de equipes, com os campos: _id, team, pitch1, pitch2, techPitch, businessReport, techReport,
e nmembers (número de membros da equipe);
- [1 val.] GET /api/teams/:id - Devolve toda a informação de uma equipe (o registo completo em JSON);
- [1 val.] GET /api/teams/:id/members/:idMember - Devolve a informação de um membro da equipe (o registo em JSON);
- [1 val.] POST /api/teams - Insere uma equipe na base de dados (o registo é fornecido em JSON no body);
- [0.5 val.] POST /api/teams/:id/members - Insere um novo membro numa determinada equipe (o registo do novo membro é fornecido
em JSON no body);
- [1 val.] DELETE /api/teams/:id - Apaga uma equipe, devolve um booleano como resultado;
- [0.5 val.] DELETE /api/teams/:id/members/:idMember - Apaga um membro duma equipe, devolve um booleano
como resultado;
- No mesmo servidor (neste caso separa as rotas da api e da interface em dois roteadores), ou num novo servidor, cria uma interface web para a API de dados com os seguintes requisitos:
- [1 val.] Na página inicial, deve aparecer uma tabela com todas as equipes: _id, team, pitch1, pitch2, techPitch, businessReport, techReport,
e nmembers (número de membros da equipe);
- [1 val.] Clicando numa das linhas da tabela deve-se navegar para a página da equipe correpondente. Nessa página, deve
ser mostrada a informação duma equipe e deverá ter um botão para voltar ao início;
- [1 val.] 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 equipe. No fim da submissão devemos voltar à página inicial, agora com mais uma equipe inserida;
- [1 val.] Na página da equipe, acrescenta um botão "Adicionar" que quando clicado abre um formulário para acrescentar mais um
membro a essa equipe. Após a submissão devemos voltar à página da equipe;
- [1 val.] Na página inicial, acrescenta um botão "Remover". Após um clique neste botão, a correspondente equipe
é apagada e a página inicial passa a refletir isso;
Na página da equipe, acrescenta um botão "Remover" à frente de cada membro que quando clicado apaga
esse membro da lista.
- Vais agora proteger a tua API de dados com tokens temporais. Nesse sentido implementa as seguintes funcionalidades:
- [1 val.] Na parte da API, implementa o seguinte pedido: GET /api/token - devolve um token gerado no momento com o segredo "DAW-PRI-2020-recurso" e com o
payload {"sub":"Exame", "data": "dataDoSistema"};
- [1 val.] Na parte da interface, acrescenta o middleware que pede um token e o guarda nos cookies;
- [1 val.] 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.