---
# System prepended metadata

title: Relatório

---

# Relatório

## Estrutura da Aplicação
A aplicação ***Borga*** é constituída por 6 módulos principais: **atlas-data.js, borga-data-es.js, borga-server.js, borga-services.js, borga-web-api.js e borga-web-site.js**.

Os módulos **borga-server.js, borga-web-api.js, borga-services.js** constituem a *API*
que vai aceder e manipular os dados presentes na base de dados implementada nos módulos **borga-data-es.js e borga-data-mem.js**. No módulo **borga-web-api.js** as rotas da *API* e por consequência as suas funcionalidades são definidas e também é realizada a verificação dos dados introduzidos pelo cliente. A inicialização do servidor e de todas as dependências da aplicação é feita no módulo **borga-server.js**.

No módulo **borga-web-site.js** são definidas todas as rotas de funcionamento da aplicação *web*. Ambos utilizam o módulo **borga-services.js** e os ficheiros ***.hbs*** presentes na diretoria ***/views***, este último de forma a renderizar as componentes gráficas da aplicação. O módulo **borga-web-site.js** é responsável por tratar das questões de *login, signup e logout*.

O módulo **borga-services.js** corresponde aos serviços da aplicação. Os serviços têm recurso aos módulos **atlas-data.js e borga-data-es.js** e ambos representam, respetivamente, o acesso a dados provenientes da ***Board Game Atlas API*** e a dados guardados na base de dados *elasticsearch*.

## Estrutura de dados no ElasticSearch
Para os dados foi decidido utilizar uma entidade user, em que esta tem um *id* (*uuid gerado pêlo módulo crypto*), o seu *username*, *password* (*também encriptada pelo módulo crypto*), e os seus grupos. Os grupos também vão possuir um *id*, um nome e uma descrição, também possuem uma coleção de jogos. Os jogos vão possuir toda a informação necessária para o *site* conseguir representar o mesmo. Para cada entidade previamente descrita foi implementado um módulo em javascript que vai associar as entidades presentes na base de dados a objectos, estes depois podem ser manipulados e actualizados com facilidade.

Seguindo a lógica previamente descrita, foi decidido utilizar um *document* do ***elasticsearch*** para representar cada *user*, em que o *id* do *user* é o *id* do *document*.Desta maneira é possível realizar *requests* simples ao *API* do ***elasticsearch*** e ir buscar toda a informação de um *user*.
Por outro lado, para certos comandos, é pedido mais informação do que seria necessário, ocupando assim mais memória.



## Signup e Login
De modo a ter acesso total às funcionalidades da aplicação *web* **BORGA**, é necessário fazer *signup*.
* **Com a aplicação a correr, selecione a opção *SignIn*. Insira um *username* e *password* à escolha e selecione *Signup***
* **Com o *signup* realizado, o *login* foi feito automaticamente.**

Caso já tenha realizado *signup* previamente, basta seguir o 2º passo, mas selecionar *Login* ao invés de *Signup*.


## Instruções para correr a aplicação

Para iniciar a *app*, primeiro é necessário fazer *download* do *Node.js* em https://nodejs.org/en/, e do *elasticsearch*, em https://www.elastic.co/pt/downloads/elasticsearch e assegurar que este corre no *port* 9200.
Precisa também de abrir uma janela de comandos na diretoria do projeto e executar os seguintes comandos:
```
npm install
node borga-server.js
```
Após isso, iniciar o *elasticsearch*, através do ficheiro ***.bat*** na sua diretoria, e executar o seguinte comando *cURL*, para criar o índice para a aplicação *DB*:
    ```
    curl -X PUT localhost:9200/borga
    ```
Depois, iniciar a aplicação *BORGA* e deverá estar pronto para começar a gerir os grupos e jogos.
Pode acessar o *website* através do seguinte *link*: https://localhost:4004/ 

## Instruções para correr os testes

Para iniciar os testes deve iniciar o *elasticsearch*, tal como foi explicado anteriormente. Depois, estará pronto para realizar os testes, após instalar os módulos necessários:
```
npm install jest
npm install supertest
```
Após fazer a instalação dos módulos, poderá correr os testes de diferentes formas:
* Testes aos serviços:
```
npm run test service.test.js
```
* Testes à API:
```
npm run test api.test.js
```
* Ambos os testes:
```
npm run test
```



