# Geospatial Map Provider Automated Testing Interface (v0.2.3)

Esta interface é implementada para fornecer ao `uss_qualifier` (e possivelmente a outros clientes semelhantes) a capacidade de simular um usuário interagindo com o mapa geoespacial do USS (UAS Service Supplier) para avaliar potenciais planos de voo.

A suíte de testes automatizados pode chamar esta interface para carregar dados de teste no USS e, em seguida, realizar consultas virtuais no mapa geoespacial para avaliar o processamento e a interpretação de dados de *Geo-Awareness*.

## Segurança (Autenticação)

- **Tipo:** OAuth2 (Client Credentials)
- **Escopos Necessários:**
    
    
    - `interuss.geospatial_map.direct_automated_test`: Permite determinar a prontidão do USS para teste e instruir o administrador a carregar fontes de dados geoespaciais (agindo como diretor de testes).
    - `interuss.geospatial_map.query`: Permite ler informações do mapa geoespacial do USS como seriam vistas por um usuário normal.
- **Descrição:** O token JWT deve ser enviado no header `Authorization: Bearer <token>`.

## Endpoints

### 1. Consultar Status da Interface

**Rota:** `GET /status`

Obtém o status desta interface de testes automatizados.

- **Escopo Exigido:** `interuss.geospatial_map.direct_automated_test`
- **Respostas Esperadas:**
    
    
    - **200 OK:** Interface disponível. Retorna `Starting` ou `Ready`.
    - **404 Not Found:** A interface não está disponível.

### 2. Listar Fontes de Dados Geoespaciais

**Rota:** `GET /geospatial_data_sources`

Lista todas as fontes de dados geoespaciais carregadas pelo administrador do USS a pedido do diretor de testes.

- **Escopo Exigido:** `interuss.geospatial_map.direct_automated_test`
- **Respostas Esperadas:**
    
    
    - **200 OK:** Retorna o schema `ListGeospatialDataSourcesResponse` (lista de fontes e seus respectivos status).

### 3. Importar e Ativar Fonte de Dados

**Rota:** `PUT /geospatial_data_sources/{geospatial_data_source_id}`

Instrui o administrador do USS a importar e ativar dados geoespaciais da fonte especificada (como um link HTTPS para um JSON ED-269).

- **Parâmetros de Rota:** `geospatial_data_source_id` (obrigatório, formato UUID v4).
- **Corpo da Requisição:** `CreateGeospatialDataSourceRequest`.
- **Respostas Esperadas:**
    
    
    - **200 OK:** O USS foi instruído a importar e ativar os dados. Retorna `GeospatialDataSourceResponse`.
    - **409 Conflict:** Um pedido com este ID já foi feito para carregar uma fonte de dados diferente.

### 4. Consultar Status de uma Fonte de Dados

**Rota:** `GET /geospatial_data_sources/{geospatial_data_source_id}`

Obtém o status de processamento/ativação de uma fonte de dados específica no USS.

- **Respostas Esperadas:**
    
    
    - **200 OK:** Retorna status (`Activating`, `Ready`, `Error`, etc).
    - **404 Not Found:** A fonte de dados foi desativada com sucesso ou não existe.

### 5. Desativar Fonte de Dados

**Rota:** `DELETE /geospatial_data_sources/{geospatial_data_source_id}`

Instrui o administrador do USS a desativar e excluir a fonte de dados geoespaciais.

- **Respostas Esperadas:**
    
    
    - **200 OK:** Requisição processada. O status da deleção pode ser checado via GET (até retornar 404).

### 6. Consultar Mapa Geoespacial (Queries)

**Rota:** `POST /map/queries`

Verifica se uma ou múltiplas características geoespaciais (Geozones/Features) se aplicam a uma posição de interesse para um período de tempo especificado ou condições operacionais (Simulação de clique/consulta no mapa).

- **Escopo Exigido:** `interuss.geospatial_map.query`
- **Corpo da Requisição:** `GeospatialMapQueryRequest` (contendo filtros de volume 4D, tempo, regra de operação, etc).
- **Respostas Esperadas:**
    
    
    - **200 OK:** Consulta realizada. Retorna se há intersecção/presença de características geoespaciais (schema `GeospatialMapQueryReply` com status `Present`, `Absent`, etc).

## Payloads de Exemplo (JSON)

### Exemplo de Criação de Fonte de Dados (`PUT`)

<div _ngcontent-ng-c2141869219="" class="code-block ng-tns-c2141869219-93 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiB9JTg8o6VAxUAAAAAHQAAAAAQ2gQ" decode-data-ved="1" id="bkmrk-json" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_dd236159cc21ef80","c_c96b9eb05b5ddc8a",null,"rc_9dbf0b06ba74bb89",null,null,"pt",null,1,null,null,1,0]]"><div _ngcontent-ng-c2141869219="" class="formatted-code-block-internal-container ng-tns-c2141869219-93"><div _ngcontent-ng-c2141869219="" class="animated-opacity ng-tns-c2141869219-93"><div _ngcontent-ng-c2141869219="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2141869219-93 ng-star-inserted"><span class="ng-tns-c2141869219-93">JSON</span><div _ngcontent-ng-c2141869219="" class="buttons ng-tns-c2141869219-93 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-93 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiB9JTg8o6VAxUAAAAAHQAAAAAQ2gQ" decode-data-ved="1" id="bkmrk--1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_dd236159cc21ef80","c_c96b9eb05b5ddc8a",null,"rc_9dbf0b06ba74bb89",null,null,"pt",null,1,null,null,1,0]]"><div _ngcontent-ng-c2141869219="" class="formatted-code-block-internal-container ng-tns-c2141869219-93"><div _ngcontent-ng-c2141869219="" class="animated-opacity ng-tns-c2141869219-93"></div></div></div>### Exemplo de Resposta de Status da Fonte

<div _ngcontent-ng-c2141869219="" class="code-block ng-tns-c2141869219-94 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiB9JTg8o6VAxUAAAAAHQAAAAAQ2wQ" decode-data-ved="1" id="bkmrk-json-1" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_dd236159cc21ef80","c_c96b9eb05b5ddc8a",null,"rc_9dbf0b06ba74bb89",null,null,"pt",null,1,null,null,1,0]]"><div _ngcontent-ng-c2141869219="" class="formatted-code-block-internal-container ng-tns-c2141869219-94"><div _ngcontent-ng-c2141869219="" class="animated-opacity ng-tns-c2141869219-94"><div _ngcontent-ng-c2141869219="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2141869219-94 ng-star-inserted"><span class="ng-tns-c2141869219-94">JSON</span><div _ngcontent-ng-c2141869219="" class="buttons ng-tns-c2141869219-94 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>```
{
  "data_source": {
    "id": "32ef0162-30c4-4e56-9ce0-b204155ef93d",
    "status": "Ready"
  }
}

```

<div _ngcontent-ng-c2141869219="" class="code-block ng-tns-c2141869219-94 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiB9JTg8o6VAxUAAAAAHQAAAAAQ2wQ" decode-data-ved="1" id="bkmrk--4" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_dd236159cc21ef80","c_c96b9eb05b5ddc8a",null,"rc_9dbf0b06ba74bb89",null,null,"pt",null,1,null,null,1,0]]"><div _ngcontent-ng-c2141869219="" class="formatted-code-block-internal-container ng-tns-c2141869219-94"><div _ngcontent-ng-c2141869219="" class="animated-opacity ng-tns-c2141869219-94"></div></div></div>### Exemplo de Consulta no Mapa (`POST /map/queries`)

<div _ngcontent-ng-c2141869219="" class="code-block ng-tns-c2141869219-95 ng-animate-disabled ng-trigger ng-trigger-codeBlockRevealAnimation" data-hveid="0" data-ved="0CAAQhtANahgKEwiB9JTg8o6VAxUAAAAAHQAAAAAQ3AQ" decode-data-ved="1" id="bkmrk-json-2" jslog="223238;track:impression,attention;BardVeMetadataKey:[["r_dd236159cc21ef80","c_c96b9eb05b5ddc8a",null,"rc_9dbf0b06ba74bb89",null,null,"pt",null,1,null,null,1,0]]"><div _ngcontent-ng-c2141869219="" class="formatted-code-block-internal-container ng-tns-c2141869219-95"><div _ngcontent-ng-c2141869219="" class="animated-opacity ng-tns-c2141869219-95"><div _ngcontent-ng-c2141869219="" class="code-block-decoration header-formatted gds-emphasized-body-m ng-tns-c2141869219-95 ng-star-inserted"><span class="ng-tns-c2141869219-95">JSON</span><div _ngcontent-ng-c2141869219="" class="buttons ng-tns-c2141869219-95 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": [
    {
      "filter_sets": [
        {
          "position": {
            "location": { "lat": -23.179, "lng": -45.887 },
            "altitude": { "value": 100, "reference": "W84", "units": "M" }
          },
          "operation_rule_set": "Part107",
          "resulting_operational_impact": "BlockOrAdvise",
          "ed269": {
            "u_space_class": "EUROCONTROL"
          }
        }
      ]
    }
  ]
}
```