# ApiOPE

`ApiOPE` es el conector externo de operaciones genericas de Gestiona. Expone
unicamente el contrato OPE 1.0 y consulta los datos en `ApiDenuncias`, que debe
permanecer en la red interna.

## Flujo

1. Gestiona consulta `GET /versions/current`.
2. Gestiona consulta `GET /` y obtiene el bookmark de la operacion generica.
3. Gestiona llama a `POST /genericoperations` con el numero de expediente
   (`53/2026`) en `FIELD_0`. Para pruebas tambien se admite el identificador de
   denuncia (`116`).
4. `ApiOPE` consulta el endpoint protegido correspondiente de `ApiDenuncias`.
5. `ApiOPE` transforma la respuesta interna al formato `FIELD_0`...`FIELD_9` y
   la devuelve a Gestiona.

Solo el puerto o FQDN de `ApiOPE` debe publicarse. `ApiDenuncias` debe quedar
limitada a la red interna o a localhost y sus endpoints OPE exigen, ademas, la
cabecera compartida `X-ApiOPE-Key`.

## Contrato externo

| Metodo | Ruta | Content-Type de respuesta |
| --- | --- | --- |
| GET | `/versions/current` | `application/vnd.version+json` |
| GET | `/` | `application/vnd.bookmark-list+json` |
| POST | `/genericoperations` | `application/vnd.generic-operation-response+json` |

Las tres peticiones requieren `X-Rest-Basic-Token`, `X-Organization-ID`,
`X-Organization-DIR3` y `X-Organization-CIF`. El JWT se valida con HS256,
incluyendo `client_token`, `resource`, `uuid`, `timestamp`, `version` cuando
corresponde y `transaction_id`. Las respuestas autenticadas incluyen la
cabecera `Signature` calculada con el algoritmo exigido por Gestiona.

Los errores de datos, elemento inexistente o fallo del conector se devuelven
como HTTP 412 con `application/vnd.generic-operation.error+json`. Una firma o
identidad de conector invalida devuelve HTTP 401 con causa `WRONG_SIGNATURE`.

## Configuracion de despliegue

Los secretos no deben escribirse en los ficheros versionados. Configurar estas
claves como variables de entorno del proceso, ajustes de IIS/App Service o
secretos equivalentes:

```text
Ope__ClientToken
Ope__SecretKey
Ope__PublicBaseUrl
Ope__OrganizationId
Ope__OrganizationDir3
Ope__OrganizationCif
Ope__TokenMaxAgeSeconds
Ope__ClockSkewSeconds
Ope__OutputFields__0 ... Ope__OutputFields__9

InternalApi__BaseUrl
InternalApi__ApiKey
InternalApi__ApiKeyHeaderName=X-ApiOPE-Key
InternalApi__TimeoutSeconds
```

En `ApiDenuncias`, configurar la misma clave interna:

```text
OpeBridge__ApiKey=<mismo valor que InternalApi__ApiKey>
OpeBridge__ApiKeyHeaderName=X-ApiOPE-Key
```

`Ope__PublicBaseUrl` debe ser la URL HTTPS publica completa del conector,
incluido cualquier path base. El bookmark se construye a partir de ese valor.

La aplicacion valida la configuracion al arrancar. Si faltan el secreto, los
datos de organizacion, la URL publica o el mapa de salida, no inicia para evitar
publicar un conector incompleto.

### Prueba temporal de preproduccion

Los perfiles IIS de `ApiOPE` y `ApiDenuncias` usan temporalmente el entorno
`PreproductionTest` para probar el conector directamente por IP y HTTP. Sus
credenciales se guardan en estos archivos locales:

```text
ApiOPE/appsettings.PreproductionTest.local.json
ApiDenuncias/appsettings.PreproductionTest.local.json
```

Ambos archivos estan excluidos de Git, pero se copian a los paquetes generados
en esta maquina. La clave `InternalApi__ApiKey` de `ApiOPE` debe coincidir con
`OpeBridge__ApiKey` de `ApiDenuncias`.

Este perfil no debe utilizarse como configuracion definitiva. Al crear el
conector real en Gestiona se deben configurar por un canal seguro su codigo,
su `Secret Key` y los datos reales de organizacion, publicar la URL HTTPS y
volver a usar un entorno de produccion.

## Campos de salida

La API interna ofrece estos 12 campos:

```text
fechaDenuncia
numeroDenunciaCanal
aQuienDenuncia
resumenDenuncia
fechaHechos
lugarHechos
ambitoCompetencias
solicitaProteccion
sexoDenunciante
autorizaRemisionDenuncia
autorizaNotificacionesViaSms
preferenciaNotificacionSeguimientoDenuncia
```

OPE 1.0 admite como maximo 10 campos por operacion. Antes de configurar PRE hay
que acordar cuales diez se publican o dividir la consulta en dos operaciones.
El orden de `Ope__OutputFields__N` determina la correspondencia con `FIELD_N`.

## Publicacion

1. Publicar `ApiDenuncias` con `OpeBridge__ApiKey` configurada.
2. Publicar `ApiOPE` con los valores anteriores y una clave interna distinta de
   `Ope__SecretKey`.
3. Permitir desde `ApiOPE` la conexion interna a `ApiDenuncias` y bloquear el
   acceso exterior directo a esta ultima.
4. Publicar exclusivamente `ApiOPE` mediante HTTPS y configurar su URL base en
   el conector de Gestiona.
5. Validar consecutivamente version, bookmarks y operacion generica, incluida
   la cabecera `Signature` de cada respuesta.

Los logs identifican fallos mediante `transaction_id`, pero nunca registran el
JWT, el secreto compartido, la clave interna ni el contenido de la denuncia.

## Simulacion desde Postman

En `Postman` se incluyen una coleccion y un entorno importables:

```text
Postman/ApiOPE-Simulacion-Gestiona.postman_collection.json
Postman/ApiOPE-PRE.postman_environment.json
```

1. Importar ambos ficheros en Postman y seleccionar el entorno `ApiOPE PRE`.
2. Rellenar sus siete variables con la misma URL, identidad y secreto que tenga
   el conector publicado. El expediente debe corresponder a datos del dia que
   aun no hayan sido purgados.
3. Ejecutar la coleccion completa con Runner para conservar un mismo
   `transaction_id` durante las tres peticiones.

La coleccion genera un `uuid` y un JWT HS256 nuevos en cada llamada. Tambien
comprueba automaticamente el status, el media type, el cuerpo y la cabecera
`Signature` devuelta por `ApiOPE`.
