---
# System prepended metadata

title: 'Estrutura da aplicação:'

---

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