# Geo-Awareness Automated Test Interfaces (v0.2.2)

Esta interface é implementada por cada USS (UAS Service Supplier) que deseja ser testado pelo framework de testes automatizados. A suíte de testes chama esta interface para carregar dados de teste no sistema do USS sob teste e ler informações de *Geo-Awareness* (Consciência Geográfica) para avaliar seu processamento e interpretação.

## Segurança (Autenticação)

- **Tipo:** OAuth2 (Client Credentials)
- **Escopo Necessário:** `geo-awareness.test`
- **Descrição:** Permite que o cliente instrua o USS sob teste a carregar dados de *Geozone* e ler informações de *Geo-Awareness*. O token JWT deve ser enviado no header `Authorization: Bearer <token>`.

## Endpoints

### 1. Consultar Status da Interface

**Rota:** `GET /status`

Obtém o status atual da interface de testes automatizados do USS.

- **Escopo Exigido:** `geo-awareness.test`
- **Respostas Esperadas:**
    
    
    - **200 OK:** Interface ativada. Retorna se está `Starting` (iniciando) ou `Ready` (pronta para receber testes).
    - **404 Not Found:** A interface de testes não está ativada.

### 2. Importar e Ativar Fonte de Geozone

**Rota:** `PUT /geozone_sources/{geozone_source_id}`

Instrui o USS a importar e ativar dados de *Geozone* a partir de uma fonte especificada (como um link HTTPS para um JSON).

- **Parâmetros de Rota:** `geozone_source_id` (obrigatório) - Um UUID v4 que identifica a fonte de dados.
- **Corpo da Requisição:** Requer o objeto `CreateGeozoneSourceRequest`.
- **Respostas Esperadas:**
    
    
    - **200 OK:** A requisição foi processada e o USS foi instruído a importar os dados. Retorna o schema `GeozoneSourceResponse`.

### 3. Consultar Status da Fonte de Geozone

**Rota:** `GET /geozone_sources/{geozone_source_id}`

Obtém o status de processamento da fonte de *Geozone* e de seus dados dentro do USS.

- **Respostas Esperadas:**
    
    
    - **200 OK:** A fonte existe. Retorna o status atual (`Activating`, `Ready`, `Deactivating`, `Unsupported`, `Rejected`, `Error`). Em caso de erro, uma mensagem de *debug* é incluída.
    - **404 Not Found:** A fonte de *Geozone* não existe ou já foi desativada com sucesso.

### 4. Desativar Fonte de Geozone

**Rota:** `DELETE /geozone_sources/{geozone_source_id}`

Instrui o USS a desativar e excluir a fonte de *Geozone* e todos os seus dados.

- **Respostas Esperadas:**
    
    
    - **200 OK:** Requisição processada e os dados serão deletados. O status da deleção deve ser verificado usando o método GET até que ele retorne 404.

### 5. Checar Geozones Aplicáveis (Check)

**Rota:** `POST /geozones/check`

Verifica se uma ou múltiplas *Geozones* são aplicáveis a uma posição de interesse, para um período de tempo e condições operacionais especificadas.

- **Corpo da Requisição:** `GeozonesCheckRequest` (lista de checagens contendo conjuntos de filtros).
- **Respostas Esperadas:**
    
    
    - **200 OK:** A checagem foi realizada com sucesso. Retorna `GeozonesCheckReply`, indicando se a *Geozone* está `Present`, `Absent`, `UnsupportedFilter` ou `Error` para cada filtro solicitado.

## Payloads de Exemplo (JSON)

### Exemplo de Importação de Fonte (`PUT`)

<div _ngcontent-ng-c2141869219="" class="code-block ng-tns-c2141869219-108 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiB9JTg8o6VAxUAAAAAHQAAAAAQ_AQ" decode-data-ved="1" id="bkmrk-json" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_04348dcbb07701ce","c_c96b9eb05b5ddc8a",null,"rc_d2e2c4bfe49f230c",null,null,"pt",null,1,null,null,1,0]]"><div _ngcontent-ng-c2141869219="" class="formatted-code-block-internal-container ng-tns-c2141869219-108"><div _ngcontent-ng-c2141869219="" class="animated-opacity ng-tns-c2141869219-108"><div _ngcontent-ng-c2141869219="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2141869219-108 ng-star-inserted"><span class="ng-tns-c2141869219-108">JSON</span><div _ngcontent-ng-c2141869219="" class="buttons ng-tns-c2141869219-108 ng-star-inserted"><button aria-label="Baixar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copiar o código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
{
  "https_source": {
    "url": "https://caa.example.com/geozones.json",
    "format": "ED-269"
  }
}

```

<div _ngcontent-ng-c2141869219="" class="code-block ng-tns-c2141869219-108 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiB9JTg8o6VAxUAAAAAHQAAAAAQ_AQ" decode-data-ved="1" id="bkmrk--1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_04348dcbb07701ce","c_c96b9eb05b5ddc8a",null,"rc_d2e2c4bfe49f230c",null,null,"pt",null,1,null,null,1,0]]"><div _ngcontent-ng-c2141869219="" class="formatted-code-block-internal-container ng-tns-c2141869219-108"><div _ngcontent-ng-c2141869219="" class="animated-opacity ng-tns-c2141869219-108"></div></div></div>### Exemplo de Resposta de Status (`GET /geozone_sources/...`)

<div _ngcontent-ng-c2141869219="" class="code-block ng-tns-c2141869219-109 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiB9JTg8o6VAxUAAAAAHQAAAAAQ_QQ" decode-data-ved="1" id="bkmrk-json-1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_04348dcbb07701ce","c_c96b9eb05b5ddc8a",null,"rc_d2e2c4bfe49f230c",null,null,"pt",null,1,null,null,1,0]]"><div _ngcontent-ng-c2141869219="" class="formatted-code-block-internal-container ng-tns-c2141869219-109"><div _ngcontent-ng-c2141869219="" class="animated-opacity ng-tns-c2141869219-109"><div _ngcontent-ng-c2141869219="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2141869219-109 ng-star-inserted"><span class="ng-tns-c2141869219-109">JSON</span><div _ngcontent-ng-c2141869219="" class="buttons ng-tns-c2141869219-109 ng-star-inserted"><button aria-label="Baixar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copiar o código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
{
  "result": "Ready"
}

```

<div _ngcontent-ng-c2141869219="" class="code-block ng-tns-c2141869219-109 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiB9JTg8o6VAxUAAAAAHQAAAAAQ_QQ" decode-data-ved="1" id="bkmrk--4" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_04348dcbb07701ce","c_c96b9eb05b5ddc8a",null,"rc_d2e2c4bfe49f230c",null,null,"pt",null,1,null,null,1,0]]"><div _ngcontent-ng-c2141869219="" class="formatted-code-block-internal-container ng-tns-c2141869219-109"><div _ngcontent-ng-c2141869219="" class="animated-opacity ng-tns-c2141869219-109"></div></div></div>### Exemplo de Checagem de Geozones (`POST /geozones/check`)

Formato esperado para simular a validação de uma posição contra o banco de dados de zonas:

<div _ngcontent-ng-c2141869219="" class="code-block ng-tns-c2141869219-110 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiB9JTg8o6VAxUAAAAAHQAAAAAQ_gQ" decode-data-ved="1" id="bkmrk-json-2" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_04348dcbb07701ce","c_c96b9eb05b5ddc8a",null,"rc_d2e2c4bfe49f230c",null,null,"pt",null,1,null,null,1,0]]"><div _ngcontent-ng-c2141869219="" class="formatted-code-block-internal-container ng-tns-c2141869219-110"><div _ngcontent-ng-c2141869219="" class="animated-opacity ng-tns-c2141869219-110"><div _ngcontent-ng-c2141869219="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2141869219-110 ng-star-inserted"><span class="ng-tns-c2141869219-110">JSON</span><div _ngcontent-ng-c2141869219="" class="buttons ng-tns-c2141869219-110 ng-star-inserted"><button aria-label="Baixar código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button><button aria-label="Copiar o código" class="mdc-icon-button mat-mdc-icon-button mat-mdc-button-base mat-badge mat-unthemed mat-badge-overlap mat-badge-above mat-badge-after mat-badge-small mat-badge-hidden ng-star-inserted"></button></div></div></div></div></div>```
{
  "checks": [
    {
      "filterSets": [
        {
          "position": {
            "uomDimensions": "M",
            "verticalReferenceType": "AGL",
            "height": 120.0,
            "longitude": -45.8872,
            "latitude": -23.1791
          },
          "after": "2024-04-22T16:30:00Z",
          "before": "2024-04-22T18:30:00Z",
          "ed269": {
            "uSpaceClass": "EUROCONTROL",
            "acceptableRestrictions": ["PROHIBITED", "REQ_AUTHORISATION"]
          }
        }
      ]
    }
  ]
}
```