API de conexões entre aplicações
Use estas rotas para consultar os recursos visíveis de uma organização, criar e remover conexões privadas entre aplicações e salvar a posição dos cartões do mapa. O layout é independente e não altera conexões, permissões nem configurações dos recursos.
Autenticação e autorização
Estas rotas exigem uma sessão de usuário válida. Chaves de API não são aceitas e retornam 401. Selecione a organização ativa: o valor do cabeçalho x-organization-id deve corresponder ao ID da organização na rota.
Authorization: Bearer <user-token>
x-organization-id: <organization-id>
Content-Type: application/jsonPara consultar o mapa, o usuário precisa poder ver os recursos da organização. Para criar ou remover uma conexão, são necessárias duas permissões:
| Permissão | Onde |
|---|---|
project.connections.outgoing.update | Aplicação de origem |
project.connections.incoming.update | Aplicação de destino |
O proprietário da organização tem todas as permissões. As respostas descrevem apenas recursos que o usuário pode consultar e não incluem credenciais nem detalhes de implementação.
URL base e rotas
https://api.zenifra.com/v1| Objetivo | Método e rota |
|---|---|
| Consultar recursos e conexões | GET /organizations/:id/connections |
| Criar uma conexão | PUT /organizations/:id/connections/:sourceId/:targetId |
| Remover uma conexão | DELETE /organizations/:id/connections/:sourceId/:targetId |
| Consultar o layout do mapa | GET /organizations/:id/connection-layout |
| Salvar o layout do mapa | PUT /organizations/:id/connection-layout |
Consultar o mapa
GET /v1/organizations/:id/connectionsA resposta usa o envelope { "data": ... } e contém nodes (recursos visíveis) e connections (conexões entre aplicações).
{
"data": {
"nodes": [
{
"id": "<application-id>",
"name": "Checkout API",
"kind": "application",
"status": "<resource-status>",
"eligible": true,
"sourceEligible": true,
"targetEligible": true,
"internalHostname": "checkout-api.6a11bedda78ad3108eb20e2c.zenifra.local"
},
{
"id": "<another-application-id>",
"name": "Orders worker",
"kind": "application",
"status": "<resource-status>",
"eligible": true,
"sourceEligible": true,
"targetEligible": true
},
{
"id": "<database-id>",
"name": "Orders PostgreSQL database",
"kind": "database",
"status": "<resource-status>",
"eligible": false,
"sourceEligible": false,
"targetEligible": false,
"reason": "<reason>"
}
],
"connections": [
{
"id": "<connection-id>",
"sourceId": "<another-application-id>",
"targetId": "<application-id>",
"status": "active"
}
]
}
}Recursos (nodes)
| Campo | Descrição |
|---|---|
id, name, status | Identificação e estado atual do recurso. |
kind | Família do recurso, como application, database ou managed_service. |
eligible | Indica se o recurso pode participar de conexões. |
sourceEligible | Indica se o recurso pode ser origem. |
targetEligible | Indica se o recurso pode ser destino. |
reason | Motivo, quando o recurso não é elegível. |
internalHostname | Endereço interno do projeto. Aparece depois que o projeto é destino de uma conexão pela primeira vez e permanece depois. |
Conexões (connections)
| Campo | Descrição |
|---|---|
id | Identificador da conexão. |
sourceId | Aplicação de origem (quem chama). |
targetId | Aplicação de destino (quem recebe). |
status | preparing, active, removing ou failed. |
failedAction | connect ou disconnect. Presente apenas quando status é failed. |
Uma conexão failed indica que a última operação não foi concluída. Repita a mesma chamada (PUT se failedAction é connect, DELETE se é disconnect) para tentar de novo.
Criar uma conexão
PUT /v1/organizations/:id/connections/:sourceId/:targetIdA requisição não tem corpo. A conexão vale somente de sourceId para targetId; para permitir o sentido oposto, crie outra conexão. A origem chama o destino em http://<projeto>.<id-da-organização>.zenifra.local, em HTTP na porta padrão; essa chamada trafega só dentro da rede privada da organização, e o tráfego público continua em HTTPS. O endereço usa o identificador da organização (24 caracteres hexadecimais) para ser único e não muda se o projeto ou a organização forem renomeados.
| Status | Significado |
|---|---|
201 | Conexão criada. |
200 | A conexão já estava ativa. |
A resposta contém { "status": "success", "data": <conexão> }, com a conexão no mesmo formato de um item de connections.
{
"status": "success",
"data": {
"id": "<connection-id>",
"sourceId": "<another-application-id>",
"targetId": "<application-id>",
"status": "active"
}
}A aplicação de origem pode ser reiniciada para aplicar a mudança. O endereço fica disponível em todas as instâncias dela depois que o reinício terminar.
Remover uma conexão
DELETE /v1/organizations/:id/connections/:sourceId/:targetIdResponde 204 e é idempotente: remover uma conexão que não existe também retorna 204. Novas conexões do par são bloqueadas na hora. Conexões já abertas não são interrompidas pelo desligamento em si, mas podem ser encerradas se a aplicação de origem for reiniciada para aplicar a mudança.
Erros
| Status | Quando |
|---|---|
401 | Sessão ausente ou inválida. Chaves de API não são aceitas nestas rotas. |
403 | Sem permissão na origem, no destino ou para consultar a organização. |
409 | O destino ainda não está pronto, ou já existe uma operação em andamento para o par. |
422 | Origem ou destino não é elegível, por exemplo por não ser uma aplicação HTTP da organização ou ser um preview. |
502 | A operação falhou. A conexão fica com status: "failed" e pode ser tentada de novo. |
Em 409 por operação em andamento ou destino ainda não pronto, aguarde e repita a chamada. Mensagens de erro são sanitizadas e não expõem detalhes de implementação.
Consultar e salvar o layout
GET /v1/organizations/:id/connection-layoutO layout é individual por usuário e organização e tem o formato abaixo:
{
"data": {
"positions": [
{ "projectId": "<resource-id>", "x": 160, "y": 80 },
{ "projectId": "<another-resource-id>", "x": 520, "y": 80 }
]
}
}Salve posições com PUT /v1/organizations/:id/connection-layout, enviando { "positions": [...] }. Cada item contém projectId, x e y. A lista pode ter até 5.000 posições; as coordenadas devem ser números finitos entre -100000 e 100000, e cada ID precisa pertencer a um recurso que o usuário pode consultar naquela organização.
Mover um cartão altera somente esse layout. Essa operação não cria nem remove conexões.
Próximos passos
- Leia o guia de conexões internas entre aplicações.
- Consulte a visão geral da API.
- Revise as regras de acesso a organizações.
Última atualização em