Aplica operações JSON Patch (RFC 6902) no assunto, sem exigir o reenvio do form ou do config completos. O servidor lê o estado atual, aplica as operações e persiste — se qualquer operação falhar, nada é escrito.
Use operações test como precondição: elas comparam o valor atual com o que você leu no GET e devolvem 409 se o assunto já mudou.
⚠️ Isso estreita a janela de sobrescrita, não a elimina. A aplicação é read-modify-write no servidor, então dois
PATCHconcorrentes podem passar ambos osteste ambos gravar. Atomicidade real exigiria escrita por caminho no types service.
Escopo do path: só /config..., /form... e /step... são editáveis — as demais raízes o types service descarta em silêncio, então a rota recusa com 400 antes de gravar. Para substituir uma raiz inteira, use PATCH /hub-api/type/edit/{typeId}.
Limites: no máximo 50 operações por request (lote maior é replace de raiz disfarçado) e profundidade de ponteiro de até 30 níveis. O corpo aceita até 10 MB, alinhado com o type/edit.
Só as raízes efetivamente mutadas vão no commit — test é precondição, não escrita.
Assunto no formato legado (raiz gravada como string de JSON, ex. config): a rota responde 400 nomeando o caso — não há caminho para endereçar dentro de um escalar. Normalize a raiz inteira antes, com PATCH /hub-api/type/edit/{typeId}.
Operações JSON Patch, aplicadas em ordem e de forma atômica (tudo ou nada)
curl -i -X PATCH \
https://api.producao.aprova.com.br/hub-api/type/patch/69aae29b8f070e4432a63036 \
-H 'Content-Type: application/json' \
-H 'x-api-key: YOUR_API_KEY_HERE' \
-d '{
"from": "ticket-solver:movidesk-259147: renomeia label da área construída",
"ops": [
{
"op": "test",
"path": "/form/0/fieldGroup/5/templateOptions/label",
"value": "Área construída"
},
{
"op": "replace",
"path": "/form/0/fieldGroup/5/templateOptions/label",
"value": "Área construída (m²)"
}
]
}'{ "_id": "69aae29b8f070e4432a63036", "config": {}, "form": [ {} ], "step": {} }