Ficha pri-2021-normal

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

Processamento e Representação de Informação (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: PRI2020::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 "PRI2020-Teste";
    • Dentro do repositório deverá haver um ficheiro, "PR.xml", contendo uma descriçãode 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: acrescenta um campo _id e coloca lá como conteúdo a ref mas substituindo as '/' por '_'. 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 casamentos-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. Criar uma BD em MongoDB para onde importarás o conteúdo do ficheiro JSON disponibilizado. Na resposta a esta alínea explica os passos que realizaste para a resolver, indica que linhas de comando usaste, ...;
  4. Criar um servidor nodejs que dê suporte à seguinte API de dados (note que não é necessário qualquer interface web):
    • GET /api/casamentos - Devolve a lista dos casamentos, com os campos: date, title e ref;
    • GET /api/casamentos/:id - Devolve a informação completa de um casamento (nesta rota, considere para id o campo ref);
    • GET /api/casamentos?nome=X - Devolve apenas uma lista com os casamentos onde o nome X aparece incluído no título;
    • GET /api/casamentos?ano=YYYY - Devolve a lista de casamentos realizados no ano YYYY;
    • GET /api/casamentos?byAno=true - Devolve a lista de casamentos agrupadas por ano, ou seja, devolve uma lista de anos em que a cada ano está associada uma lista de casamentos (coloque apenas a ref e o title do casamento);
    • GET /api/casamentos/noivos - Devolve uma lista de nomes dos noivos, ordenada alfabeticamente, e o id do respetivo registo..

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' com um par de credenciais válidas.

Para este teste foi criado um utilizador com as seguintes credenciais: (username: "pri2020@teste.uminho.pt", password="123"). 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;
  • 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/classes/c150.10.702/procRel?token=... - Uma classe de nível 3 pode ter relações com outra classe de nível 3. Este pedido devolve uma lista dos processos (classes de nível 3) que têm relações com o processo 150.10.702. São devolvidos: o identificador, o código, o título e o código da relação (deste é possível extrair a designação da relação, a sua parte final);

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 750?
    • Quantos subprocessos existem no catálogo inteiro? (classes de nível 4)
    • Quantos processos (classes de nível 3) se encontram na descendência de 750.30?
    • Quantos processos (classes de nível 3) estão relacionados com 750.30.001?

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á aparecer a lista de classes de nível 1 (código e título);
  3. 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;
  4. 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 processos relacionados (cada um destes deve ser um link para o respetivo processo), apenas deves contemplar as relações: eCruzadoCom, eComplementarDe, eSuplementoDe e eSuplementoPara;
  5. Em todas as páginas deverá haver um link para voltar à página inicial e outro para a página anterior (nos casos em que justifique);
  6. Usa a tua imaginação e criatividade...