Ficha daw-2021-normal

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

Desenvolvimento de Aplicações Web (MIEI e MEI)

O objectivo principal desta ficha é testar os conhecimentos obtidos durante as aulas no desenvolvimento de aplicações Web e outras tarefas afins.

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::Teste::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-Teste";
    • 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, respostas textuais pedidas, instruções de como executar as aplicações desenvolvidas, etc...
    • Dentro do repositório deverão existir duas pastas: "ex1", onde colocarão a aplicação desenvolvida para responder ao primeiro exercício e, "ex2", onde colocarão a aplicação desenvolvida para responder ao segundo exercício.

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.


Considere o dataset constituído pelo ficheiro JSON disponibilizado em cima.

Neste exercício, realiza as seguintes tarefas:

  1. "Data cleansing": antes de avançares verifica se o ficheiro JSON disponibilizado está correto e se o seu formato é o ideal para o que se pede. És livre de fazer as alterações que entenderes além das que são pedidas:
    • Acrescenta um campo _id e coloca lá como conteúdo a ref mas substituindo as '/' por '_';
    • Mantem na mesma o campo ref;
    • Acrescenta um campo pai com o nome do pai do indivíduo batizado;
    • Acrescenta um campo mae com o nome da mae do indivíduo batizado;
    • Mantem o campo title como estava originalmente.
    Na resposta a esta alínea explica as alterações que fizeste ao ficheiro para poderes prosseguir.
  2. Caso não consigas realizar a alínea anterior descarrega o ficheiro batismos-fixed.json , e faz as alíneas seguintes com o seu conteúdo. Na resposta a esta alínea, indica que vais avançar com este ficheiro.
  3. Cria uma BD em MongoDB para onde importarás o conteúdo do ficheiro JSON disponibilizado;
  4. Cria um servidor nodejs que dê suporte à seguinte API de dados (note que não é necessário qualquer interface web):
    • GET /api/batismos - Devolve a lista dos batismos, com os campos: _id, date, title e ref;
    • GET /api/batismos/:id - Devolve a informação completa de um batismo;
    • GET /api/batismos/batisado - Devolve apenas uma lista com os nomes dos indivíduos batizados ordenada alfabeticamente;
    • GET /api/batismos/progenitores - Devolve uma lista de triplos em que cada triplo tem a seguinte estrutura: {_id: "identificador do registo original", pai: "nome do pai do indivíduo que foi batizado", mae: "nome da mae do indivíduo que foi batizado"}; Esta alínea poderá ser resolvida de várias maneira e irá depender da forma como resolveste as primeiras.
    • GET /api/batismos?ano=YYYY - Devolve a lista de batismos realizados no ano YYYY;
    • GET /api/batismos/stats - Devolve uma lista de pares, ano e número de batismos nesse ano.

A CLAV é uma plataforma em desenvolvimento no DI/UM em parceria e sob encomenda da Direção Geral do Livro, Arquivos e Bibliotecas (DGLAB) que visa a classificação e a avaliação de toda a documentação circulante na administração pública portuguesa.

Uma das faces visíveis do projeto é o catálogo dos processos da administração pública portuguesa, designado por Lista Consolidada.

Já se encontra disponível para consulta online: site de teste .

A API de dados documentada em Swagger encontra-se disponível em: API de teste .

A API de dados encontra-se protegida por JWT. Um token JWT pode ser gerado em dois contextos, como uma apiKey gerada num pedido de registo, ou como um token num POST em '/users/login' com um par de credenciais válidas.

Para este teste foi criado um utilizador com as seguintes credenciais: (username: "daw2020@teste.uminho.pt", password="232"). No desenvolvimento do exercício, deverás usar estas credenciais para obter um token com o qual deverás assinar todos os pedidos que vais fazer à API.

É sobre este catálogo que irás desenvolver este exercício.

A API de dados disponível contem entre outras as seguintes possibilidades:

  • POST http://clav-api.di.uminho.pt/v2/users/login (com as credenciais no body) - Devolve um objeto em JSON com a informação do utilizador, um dos campos é o token que poderá ser usado nos outros pedidos que o requerem;
  • GET http://clav-api.di.uminho.pt/v2/classes?token=... - Devolve uma estratura hierárquica em JSON com a informação base de todas as classes/processos da Lista Consolidada. Note que, os níveis 1 e 2 correspondem a funções e subfunções da Administração Pública, existem essencialmente para arrumar a case e facilitar o acesso aos processo, o nível 3 corresponde ao processo e o nível 4 a uma divisão do processo quando, por determinado motivo partes da documentação desse processo têm conservações e destinos diferentes;
  • GET http://clav-api.di.uminho.pt/v2/classes?nivel=3&token=... - Devolve uma lista em JSON com a informação base de todos os processos;
  • GET http://clav-api.di.uminho.pt/v2/classes?nivel=1&token=... - Devolve uma lista em JSON dos primeiros níveis, funções da AP;
  • GET http://clav-api.di.uminho.pt/v2/classes?nivel=2&token=... - Devolve uma lista em JSON dos segundos níveis, subfunções da AP;
  • GET http://clav-api.di.uminho.pt/v2/classes?estrutura=lista&token=... - Devolve uma lista em JSON de todas as classes (linearização da árvore inicial);
  • GET http://clav-api.di.uminho.pt/v2/classes/c100.10.001?token=... - Devolve em JSON a informação completa da classe com código: c100.10.001. Nesta informação está presente uma lista de termos de índice (termosInd) que funcionam como palavras-chave para acesso aos processos ou classes de nível 3;
  • GET http://clav-api.di.uminho.pt/v2/classes/c100.20/descendencia?token=... - Devolve uma lista em JSON das classes filhas da classe passada no pedido, neste caso, C100.20;
  • GET http://clav-api.di.uminho.pt/v2/termosIndice?token=... - Devolve uma lista em JSON com toda a informação dos termos de índice;

Desenvolve então as seguintes alíneas:

  1. Testa a API de dados com o Postman e dá resposta às seguintes questões:
    • Quantos processos (nível 3) e quais são (obtem uma lista em JSON; podes concatenar sublistas invocando várias queries), pertencentes à descendência da classe 900?
    • Quantas entidades estão catalogadas?
    • Quantos processos (classes de nível 3) se encontram na descendência de 900.10?
    • Quantos processos (classes de nível 3) estão relacionados com 900.10.505?

Depois deste "aquecimento", desenvolve uma aplicação em nodejs que permita navegar nesta estrutura de classes. :

  1. Vais precisar de um token de autorização para realizar os pedidos à API de dados. Podes obtê-lo fazendo o pedido descrito em cima. Esta parte poderá estar dentro da tua App ou podes fazê-la externamente e colocar o token no teu código. Será mais valorizada a solução em que o pedido para a geração do token é feito no arranque da tua App;
  2. Na página inicial, para além de um título e outra informação de contexto, deverão aparecer dois links: Classes e Termos de índice;
  3. O primeiro dá acesso a uma página onde deverá aparecer a lista de classes de nível 1 (código e título);
  4. Todos os campos de informação com códigos de classes devem ser transformados em links que realizam pedidos à tua aplicação de nova página;
  5. Na página de cada classe, deve ser mostrada a informação base da classe, uma lista dos seus descendentes caso existam e, se a classe for de nível 3 uma lista dos seus termos de índice (cada termo deverá ser uma ligação à página que lista os termos de índice);
  6. O segundo link, dá acesso a uma página onde são listados, numa tabela, todos os termos de índice com os seus campos de informação: termo, id da classe a que pertence e título da classe (o id e o título devem ser um link para a página da classe);
  7. Em todas as páginas deverá haver um link para voltar à página inicial;
  8. Usa a tua imaginação e criatividade...