# 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 ```