Script
Script é um endpoint de backend declarativo que um frontend chama por HTTP. Em vez de escrever código de servidor, você declara "o que fazer" como JSON e o motor da WEEGLOO o executa por você. O objetivo é substituir, com um único Script, o encanamento de backend típico que dá suporte a um frontend (um BFF, Backend-for-Frontend): a autenticação, a verificação de condições (guard), o CRUD encadeado, as chamadas a APIs externas e a transformação de valores.
Este conjunto de documentos é a referência da sintaxe de Script. Os detalhes de cada parte da sintaxe são divididos entre as páginas em Documentos deste grupo abaixo.
Criar e gerenciar um Script (criar, consultar, atualizar e excluir) é feito na CMA (https://cma.weegloo.com/v1). A execução fica a cargo do caminho de execução do host dedicado de Script (https://script.weegloo.com/v1). Esse único caminho de execução aceita os dois: um token de Weegloo User e o token de um membro que se cadastrou no produto (um ServiceUser). A ACMA não tem a API de Script, e as APIs de entrega somente leitura (CDA, ACDA) também não.
Modelo mental
- Um Script é um endpoint HTTP. O método de chamada (
method) determina qual Script é executado. - O corpo é um array
statements. Eles são executados sequencialmente, de cima para baixo. É como o corpo de uma função na programação comum. - É declaração, não código. Você não incorpora código arbitrário (FaaS); você compõe tipos de statement predefinidos. Foi projetado menos para ser escrito à mão por uma pessoa e mais para ser gerado por um agente de IA via MCP.
- Os valores fluem por templates de JSON Pointer. Você referencia o resultado de uma etapa anterior, o payload de entrada ou uma variável com
{ /pointer }e o passa para a próxima etapa. Quando precisa de uma condição ou de um cálculo, você usa operadores JsonLogic. As regras completas são abordadas em Expressões de valor.
Estrutura de nível superior (ScriptDefinition)
Um único Script é definido pela seguinte estrutura ScriptDefinition.
{
"method": "Post", // Get | Post | Put | Patch | Delete. Método HTTP correspondido na chamada (obrigatório)
"payloadSchema": { /* ... */ }, // (opcional) JSON Schema. Se presente, valida o payload da requisição antes da execução
"statements": [ /* Statement[]. Executado de cima para baixo (obrigatório, 1 ou mais) */ ]
}| Campo | Obrigatório | Descrição |
|---|---|---|
method | Obrigatório | O método HTTP usado para chamar este Script. As chamadas são correspondidas por este valor. |
payloadSchema | Opcional | Um JSON Schema. Se especificado, o corpo da requisição (payload) é validado contra este schema antes da execução e, se a validação falhar, a requisição é rejeitada sem ser executada. |
statements | Obrigatório | Um array ordenado de statements a executar. No mínimo 1. |
O payload aceita apenas um objeto JSON. O corpo da chamada é acessado pela raiz de contexto /payload ({ /payload/... }) e, se você precisar da string original antes do parse, por /rawPayload (nos casos em que o cálculo é feito sobre os bytes enviados, como na verificação de assinatura). Os cabeçalhos HTTP da requisição da chamada são referenciados pela raiz /headers ({ /headers/... }, com chaves em minúsculas). O instante em que a execução começou está na raiz /now. O conjunto completo de raízes de contexto é abordado em Expressões de valor.
Requisição e resposta
No final, um Script retorna o valor de seu statement Return ao chamador. O formato da resposta é o seguinte.
{
"requestId": "…", // Identificador de execução
"durationMs": 1234, // Tempo de execução (ms)
"statusCode": 200, // O statusCode do Return alcançado (padrão 200)
"return": <value> // Apenas quando Return.isError é false. Se o valor for null, ""
// "error": <value> // Quando Return.isError é true, ou quando a execução falhou (neste caso "return" está ausente). Se o valor for null, ""
}requestIdé o identificador desta execução. O mesmo valor entra nosys.requestIddo ScriptLog que aquela execução deixou, portanto ele é a chave para localizar esta execução nos logs.returneerrornunca aparecem juntos. OisErrordo statementReturndecide qual dos dois é.- Se o Script terminar sem alcançar um statement
Return,returneerrorestão ambos ausentes e ostatusCodeé o padrão (200). - Quando a execução falha, o
erroré preenchido mesmo sem umReturn. Se a falha tem origem no lado do chamador, como um payload inválido, e nenhumTrya captura, o motivo da falha entra emerrore ostatusCodepassa a ser o código correspondente àquela falha (um payload inválido dá 4xx; se uma chamada externa ou um envio de e-mail falha,502). Na prática, é esta a forma de resposta de erro que você encontra com mais frequência. Uma execução que ultrapassa o orçamento de tempo responde com408, e não com o envelope. - Se um valor for
null, esse campo é emitido como uma string vazia"".
Você controla o corpo da resposta e o código de status com o value, o isError e o statusCode do Return. Os detalhes são abordados em Return no Catálogo de statements.
O tempo concedido a uma execução
Um Script é executado inline, no caminho que processa a requisição da chamada. Não existe um fluxo que o transfira para segundo plano nem que devolva antes uma resposta de aceite: o corpo da resposta da chamada é o próprio resultado da execução. Também não existe um caminho de polling para buscar o resultado mais tarde.
O tempo concedido a uma execução é definido por uma única fórmula: min(30 segundos + soma dos tempos declarados pelos statements, 180 segundos).
- O orçamento base é de 30 segundos. A ele soma-se o tempo que cada statement declarou.
- Um statement sem declaração vale 0 segundo. O tempo que ele de fato consome sai do orçamento base de 30 segundos.
- Se a soma passar de 180 segundos, o salvamento não é recusado: o orçamento é cortado em 180 segundos.
O resumo das regras de declaração por statement:
| Statement | Tempo declarado |
|---|---|
Http | (timeoutMs; 30 segundos se ausente) × (1 + retry) |
EmailSend | timeoutMs; 10 segundos se ausente |
Loop | soma dos statements do body × (maxIterations; 10.000 se ausente) |
ResourceForEach | soma dos statements de onEach × (limit; 10.000 se ausente) |
If | o maior valor entre o lado then e o lado else |
Parallel | o maior valor entre os branches |
- A iteração é multiplicação.
LoopeResourceForEachmultiplicam o tempo declarado pelo body (onEach) pelo limite máximo de iterações. - Em uma iteração sem chamada externa, o tempo declarado do body é 0, portanto o orçamento base de 30 segundos é o limite efetivo.
As regras detalhadas por statement e os limites de plano são abordados em Semântica de execução, restrições e segurança.
Exemplo mínimo
Cria um Content de postagem a partir do título e do corpo no payload da requisição, publica-o imediatamente e, em seguida, retorna o sys.id criado.
{
"method": "Post",
"statements": [
{ "type": "ResourceCreate", "resource": "Content",
"contentType": { "sys": { "id": "ct_post" } },
"fields": {
"title": { "en-US": "{ /payload/fields/title }" },
"body": { "en-US": "{ /payload/fields/body }" }
},
"publish": true,
"name": "post" },
{ "type": "Return", "value": { "id": "{ /post/sys/id }" }, "statusCode": 201 }
]
}ResourceCreatecria o Content e vincula o resultado ao nomepost.Returnretorna{ "id": <novo Content id> }com201.- Por que os valores de
fieldsde um Content são mapas de locale ({ "en-US": ... }) é abordado em Mapas de locale em Expressões de valor.
Você encontrará cenários mais variados no Cookbook.
Documentos deste grupo
- Expressões de valor: aborda referências
{ /pointer }, literais, operações e condições JsonLogic, raízes de contexto e mapas de locale. É o núcleo da sintaxe. - Catálogo de statements: aborda os campos e resultados dos 25 tipos de statement (CRUD e leitura de recursos,
Http,EmailSend,SetVar,Cache,ParseJson,Signature,Hash,Regex,If,Loop,Parallel,Try,Return). - Semântica de execução, restrições e segurança: aborda a ordem de execução, os guards, a compensação, o bloqueio otimista, os erros, as restrições estáticas e os limites de plano, e o modelo de segurança.
- Cookbook: aborda exemplos completos como upsert, um guard de crédito, um proxy de LLM, a paginação, a execução paralela, uma saga de pagamento e a verificação de assinatura de webhook.
- Recurso e endpoints de Script: aborda a estrutura
sysdo recursoScript, a especificação dos endpoints HTTP de autoria e de execução (/execute) e o log de execução ScriptLog.
Se esta é a sua primeira vez, recomendamos ler a partir desta página na ordem Expressões de valor e depois Catálogo de statements. O Cookbook também vale a pena percorrer inteiro.
