# Estrutura da aplicação:
## Servidor:
* *lib*: Dentro desta pasta encontramos os módulos do CIBORG server que realizam pedidos à api de Board Games já existente (https://www.boardgameatlas.com/api/docs), sendo este o caso do `board-games-data.js`, ou pedidos de gestão de grupos de jogos ao elasticsearch, que é o caso do `ciborg-db.js`, também pode ser encontrado nesta pasta os mocks respetivos a cada bloco (`board-games-data-mock.js` e `ciborg-db-mock.js` ).
* *service*: Nesta pasta podemos encontrar o ficheiro javascript `ciborg-service.js`, este ficheiro junta os dois serviçoes prestados na pasta lib, criando funções que usam serviços de ambos os ficheiros da pasta lib.
* *authentication*: Aqui encontra-se o módulo `auth-service.js` que gere informações associadas a utilizadores autenticados diretamente no elasticsearch eo seu respetivo Mock, também se encontra o módulo `auth-web-api.js` onde se encontram todas as rotas necessárias para a autenticação de um utilizador e informação da sessão do mesmo.
* *root*: O ficheiro `ciborg-web-api.js` controla o comportamento a cada resposta HTTP relacionada com os ficheiros a cima referidos (`board-games-data.js` e `ciborg-db.js`), este ficheiro cria as rotas e define as respostas para cada pedido que possa ser realizado . O ficheiro `ciborg-server.js` tem como objetivo a inicialização de todos os servidores e os serviços a utilizar, juntando aqui a autenticação com o serviço a ser prestado.
* *test*: O `ciborg-service-test` contém todos os testes a realizar tanto quanto ao serviço relacionado com o elastic-search como com o serviço relacionado à api já existente .
## Cliente:
* *app*: Dentro desta pasta encontra-se o conteúdo que compõe a parte frontend do servidor CIBORG, o ficheiro de entrada `./entry.js` que inicia o ficheiro `./router.js` , onde são selecionadas as rotas e por conseguinte injectado o respectivo HTML e o respectivo controller coincidente com a rota selecionada. Desta forma sempre que o utilizador executa uma acção o router associa o devido controller e a devida view, onde o controller é responsável pelos pedidos à Web API e à base de dados e a view por afectar o HTML e produzir as alterações no browser. Os vários módulos Javascript e HTML/Handlebars, dentro da pasta `views`, foram criados para corresponder às diferentes ações que o utilizador poderá escolher em que cada view têm o seu próprio template. No ficheiro `./views/template.js` é compilado o ficheiro Handlebars associado a cada template que desta forma permite que seja utlizado no ficheiro `./views/views.js` e execuado no router.
# Chelas Internet Board Games API documentation
The base part of the URI path for the CIBORG API is `/ciborg/api`
The following sections describe each API endpoint.
## Signup
```http
POST /auth/signup
```
- Request:
- body : none
- Response:
- Success:
- Status code: 200
- Content-Type: application/json
- Body example:
```json
{
"_id": "5vEZCmgBHuOD0eGDHKEw"
"fullname": "José Belo",
"username": "nobita1904",
"password": "nobitaopele",
"groups": [],
}
```
---
## Login
```http
POST /auth/login
```
- Request:
- body : none
- Response:
- Success:
- Status code: 200
- Content-Type: application/json
- Body example:
```json
{
"_id": "5vEZCmgBHuOD0eGDHKEw"
}
```
---
## Logout
```http
POST /auth/logout
```
- Request:
- body : none
- Response:
- Success:
- Status code: 200
- Content-Type: text/plain
- Body example: `"User logout successfull."`
---
## Session
```http
GET /auth/session
```
- Request:
- body : none
- Response:
- Success:
- Status code: 200
- Content-Type: application/json
- Body example:
```json
{
"auth" : "True",
"fullname" : "José Belo"
}
```
---
## Obtain a list of the most popular games
```http
GET /popular
```
- Request:
- Body: none
- Response:
- Success:
- Status code: 200
- Content-Type: application/json
- Body example:
```json
{
"games": [
{
"id": "kPDxpJZ8PD",
"name": "Spirit Island",
"min_playtime": 90,
"max_playtime": 120,
},
{
"id": "RLlDWHh7hR",
"name": "Gloomhaven",
"min_playtime": 90,
"max_playtime": 120,
},
...
]
}
```
---
## Search game by name
```http
GET /games/:name
```
- Request:
- Path parameters:
- name - The game name
- Body: none
- Response:
- Success:
- Status code: 200
- Content-Type: application/json
- Body example:
```json
{
"games": [
{
"id": "OIXt3DmJU0",
"name": "Catan",
"min_playtime": 45,
"max_playtime": 90,
},
...
]
},
```
- Errors:
- 400 and 404 (see Common Error Handling section)
---
## Create a Group
```http
POST /groups
```
- Request:
- Content-Type: application/json
- Body example:
```json
{
"name": "Vintage Group",
"description": "..."
}
```
- Response:
- Success:
- Status code: 201
- Headers:
- Location: `/ciborg/groups`
- Content-Type: application/json
- Body example:
```json
{
"_id": "DHEWTJYKUYAEGRJS",
"result" : "created",
}
```
---
## Update a Group
```http
PUT /groups/:id
```
- Request:
- Path parameters:
- id - The group identifier
- Content-Type: application/json
- Body:
```json
{
"name": "Popular Games",
"description": "description of Popular Games"
},
```
- Response:
- Success:
- Status code: 200
- Content-Type: application/json
- Body example:
```json
{
"_id" : "DHEWTJYKUYAEGRJS",
"result": "updated",
}
```
- Errors:
- 400 and 404 (see Common Error Handling section)
---
## List all Groups
```http
GET /groups
```
- Request:
- Body: none
- Response:
- Success:
- Status code: 200
- Content-Type: application/json
- Body example:
```json
[
{
"_id": "J0yKRm4BBUiTlaI27xl1",
"_source": {
"name": "Group A",
"description": "Description of group A",
"games": [
{
"id": "OIXt3DmJU0",
"name": "Catan",
"min_playtime": 45,
"max_playtime": 90
}
]
}
},
{
"_id": "JkzHO24BBUiTlaI2RxlS",
"_source": {
"name": "Group B",
"description": "Description of group B",
"games": []
}
},
{
"_id": "KUymRm4BBUiTlaI2zxl9",
"_source": {
"name": "Group C",
"description": "Description of group C",
"games": [
{
"id": "6FmFeux5xH",
"name": "Pandemic",
"min_playtime": 45,
"max_playtime": 60
}
]
}
},
]
```
---
## Details From Group
```http
GET /groups/:id
```
- Request:
- Body: none
- Response:
- Success:
- Status code: 200
- Content-Type: application/json
- Body example:
```json
{
"_id": "J0yKRm4BBUiTlaI27xl1",
"_source": {
"name": "Group B",
"description": "Description of group B",
"games": [
{
"id": "OIXt3DmJU0",
"name": "Catan",
"min_playtime": 45,
"max_playtime": 90
}
]
}
}
```
---
## Insert Game on a Group
```http
PUT /groups/:id/games/:name
```
- Request:
- Path parameters:
- id - The Group identifier
- name - The name of the game
- Content-Type: application/json
- Body: none
- Response:
- Success:
- Status code: 200
- Content-Type: application/json
- Body example:
```json
{ "_id": "J0yKRm4BBUiTlaI27xl1",
"result": "added"
}
```
- Errors:
- 404 (see Common Error Handling section)
---
## Delete a Game
```http
DELETE /groups/:id/games/:name
```
- Request:
- Path parameters:
- id - The group identifier
- name - The name of the game
- Content-Type: application/json
- Body: none
- Response:
- Success:
- Status code: 200
- Content-Type: application/json
- Body example:
```json
{ "_id": "J0yKRm4BBUiTlaI27xl1",
"result": "removed"
}
```
- Errors:
- 404 (see Common Error Handling section)
---
## Getting all games on group between min and max durations
```http
GET /groups/:id/durations/min/:minduration/max/:maxduration
```
- Request:
- Path parameters:
- id - The group identifier
- minduration - Minimum game duration
- maxduration - Maximum game duration
- Content-Type: application/json
- Body: none
- Response:
- Success:
- Status code: 200
- Content-Type: application/json
- Body example:
```json
[
{
"id": "6FmFeux5xH",
"name": "Pandemic",
"min_playtime": 45,
"max_playtime": 60
},
{
"id": "i5Oqu5VZgP",
"name": "Azul",
"min_playtime": 30,
"max_playtime": 60
},
{
"id": "OIXt3DmJU0",
"name": "Catan",
"min_playtime": 45,
"max_playtime": 90
}
]
```
---
# Instalação:
Abra um cmd numa pasta à sua escolha e execute o comando `git clone https://github.com/lcpiteira/PI-1920i-LEIRT51D-G12.git`, após executar o comando anterior realize `cd PI-1920i-LEIRT51D-G12`, nesta diretoria execute `npm install` após a conclusão deste comando execute `npm run packrun` e inicie o seu executável `elasticsearch.bat` , se todos os passos anteriores foram executados com successo pode agora utilizar o CIBORG server abrindo o link http://localhost:3000 no seu browser de preferência!
# Testes:
Dentro da pasta designada por `test` irá encontrar um ficheiro `CIBORG.postman_collection` que deverá ser importado para a sua aplicação Postman e executado, este teste em particular foi feito para verificar o CIBORG server na sua totalidade. O ficheiro de teste `ciborg-service-test.js` deverá ser executado abrindo um cmd na mesma pasta onde o ficheiro se encontra e executando o comando `mocha ciborg-service-test`, este teste foi feito somente para verificar o ficheiro com as funcionalidades núcleo do CIBORG server `ciborg-service.js`.