Referência de steps
Gerado a partir dos atributos [Step("...")] encontrados por reflection e da documentação
de cada step em docs-site/data/steps/ — nunca escrito à mão. Regenere com
dotnet run --project tools/docs-reference-generator depois de um
dotnet build pipevine.slnx -c Release. Um step sem arquivo de documentação (ou um arquivo
sem step correspondente) falha a geração — as duas fontes não conseguem divergir em silêncio.
Cobre só os steps registrados como IStepFactory — não os seis de controle de fluxo
(branch, switch, foreach, parallel, try, group), que o PipelineBuilder
trata como sintaxe estrutural do próprio motor. Ver
Controle de fluxo.
Visão geral
type: |
Publica | Provider(s) | O que faz |
|---|---|---|---|
cache.get |
steps.<id>.result |
caches (qualquer) | Lê uma chave do cache e publica o valor (ou null no miss). |
cache.invalidate |
— | caches (qualquer) | Remove do cache por chave ou por tag. |
cache.set |
— | caches (qualquer) | Grava uma chave no cache, com TTL e tags. |
cassandra.persist |
— | cassandra | Escrita no Cassandra com ttl, consistency e ifNotExists. |
cassandra.query |
steps.<id>.result |
cassandra | Consulta no Cassandra com consistency e paginação por cursor nativa. |
db.delete |
— | dataSources (qualquer) | Remove o registro casado pela chave declarada da entidade. |
db.exists |
steps.<id>.result |
dataSources (qualquer) | Booleano indicando se existe registro casando where. |
db.find |
steps.<id>.result |
dataSources (qualquer) | Uma entidade casando where, ou null. |
db.persist |
— | dataSources (qualquer) | Insere (ou faz upsert) o objeto produzido por data na entidade. |
db.query |
steps.<id>.result |
dataSources (qualquer) | Lista de registros casando where, com ordenação e paginação opcionais. |
db.sql |
— | dataSources (qualquer) | Escape hatch para SQL que os steps db.* estruturados não expressam. |
db.update |
— | dataSources (qualquer) | Atualização parcial, casando pela chave declarada da entidade. |
dynamo.persist |
— | dynamodb | Escrita no DynamoDB com condition (ConditionExpression). |
dynamo.query |
steps.<id>.result |
dynamodb | Consulta no DynamoDB com índice explícito e cursor nativo. |
fail |
— | — | Interrompe o pipeline com um erro estruturado. |
grpc.call |
steps.<id>.result |
integração | Chama uma integração gRPC declarada em spec.integrations. |
http.call |
steps.<id>.result |
integração | Chama uma integração HTTP declarada em spec.integrations. |
log |
— | — | Emite uma linha de log estruturada. |
map |
— | — | Avalia uma expressão JSONata e grava o resultado sob vars. |
noop |
— | — | Não faz nada. |
publish |
— | brokers (qualquer) | Publica um evento declarado em spec.events. |
return |
— | — | Interrompe o pipeline com sucesso, definindo output. |
set |
— | — | Atribui um valor literal a um caminho sob vars. |
storage.delete |
— | storages (qualquer) | Remove um objeto por chave. |
storage.get |
steps.<id>.result |
storages (qualquer) | Transmite o objeto direto na resposta HTTP, em streaming. |
storage.list |
steps.<id>.result |
storages (qualquer) | Lista objetos por prefixo de chave. |
storage.presignDownload |
steps.<id>.result |
storages (qualquer) | Gera uma URL para o cliente baixar o arquivo direto do backend. |
storage.presignUpload |
steps.<id>.result |
storages (qualquer) | Gera uma URL para o cliente subir o arquivo direto no backend. |
storage.put |
steps.<id>.result |
storages (qualquer) | Grava o corpo da requisição HTTP direto no backend, em streaming. |
storage.stat |
steps.<id>.result |
storages (qualquer) | Metadados de um objeto, sem baixar o conteúdo. |
validate |
— | — | Valida a forma (JSON Schema) e/ou as regras de negócio (JSONata) da entrada. |
Detalhes por step
cache.get
Classe: Pipevine.Caching.Abstractions.Steps.GetStepFactory · Pacote: Pipevine.Caching.Abstractions
Provider(s): Qualquer provider registrado em spec.caches que implemente ICacheProvider, ver ICacheProvider.
Lê key do cache declarado e publica o valor encontrado.
Um miss não é falha: publica null e o pipeline segue — inclusive o miss produzido pelo
comportamento fail-open, quando o backend de cache está indisponível. Do ponto de vista do
pipeline, cache frio e cache fora do ar são a mesma coisa, de propósito.
- { type: cache.get, id: cached, cache: redis-main, key: "'order:' & input.route.orderId" }
Publica em steps.<id>.result: O valor cacheado, ou null no miss.
id: é obrigatório neste step — sem ele o build falha.
Falhas:
code |
Quando | status |
details |
|---|---|---|---|
cache_get_failed |
A expressão key falhou ao ser avaliada. (Indisponibilidade do backend vira miss, não falha.) |
500 | — |
cache.invalidate
Classe: Pipevine.Caching.Abstractions.Steps.InvalidateStepFactory · Pacote: Pipevine.Caching.Abstractions
Provider(s): Qualquer provider registrado em spec.caches que implemente ICacheProvider, ver ICacheProvider.
Remove por key (uma expressão JSONata) ou por tag (uma string literal) — exatamente um dos
dois, nunca os dois juntos.
Invalidar por tag apaga todas as entradas gravadas com aquela tag, o que é a forma de expirar um grupo inteiro depois de uma escrita.
- { type: cache.invalidate, cache: redis-main, tag: orders }
Não publica resultado. Declarar id: neste step é aceito e não tem efeito nenhum.
Falhas:
code |
Quando | status |
details |
|---|---|---|---|
cache_invalidate_failed |
A expressão key falhou ao ser avaliada. |
500 | — |
cache.set
Classe: Pipevine.Caching.Abstractions.Steps.SetStepFactory · Pacote: Pipevine.Caching.Abstractions
Provider(s): Qualquer provider registrado em spec.caches que implemente ICacheProvider, ver ICacheProvider.
Grava value sob key. ttl é a expiração absoluta e slidingTtl reinicia a cada acesso —
ambos opcionais. As tags são o que permite invalidar um grupo inteiro depois, com o
cache.invalidate.
Não publica resultado.
- type: cache.set
cache: redis-main
key: "'order:' & vars.order.id"
value: vars.order
ttl: 5m
tags: [orders]
Não publica resultado. Declarar id: neste step é aceito e não tem efeito nenhum.
Falhas:
code |
Quando | status |
details |
|---|---|---|---|
cache_set_failed |
A expressão key ou value falhou ao ser avaliada. |
500 | — |
cassandra.persist
Classe: Pipevine.Data.Cassandra.Steps.CassandraPersistStepFactory · Pacote: Pipevine.Data.Cassandra
Provider(s): Específico do(s) provider(s) cassandra — não roda contra nenhum outro.
Tudo que o db.persist não expressa para Cassandra: expiração ttl nativa por linha, nível de
consistency por escrita, e ifNotExists — uma lightweight transaction
(INSERT ... IF NOT EXISTS), que é a única forma de fazer valer unicidade neste provider.
Se você precisa de unicidade no Cassandra, é este step, não o db.persist com onConflict — que
ali não tem efeito.
- type: cassandra.persist
entity: OrderEvent
data: vars.order
ttl: "3600"
consistency: local_quorum
ifNotExists: true
Não publica resultado. Declarar id: neste step é aceito e não tem efeito nenhum.
Falhas:
code |
Quando | status |
details |
|---|---|---|---|
cassandra_persist_failed |
A expressão data avaliou para null. |
500 | — |
cassandra_persist_failed |
A escrita falhou no Cassandra. | 500 | — |
cassandra.query
Classe: Pipevine.Data.Cassandra.Steps.CassandraQueryStepFactory · Pacote: Pipevine.Data.Cassandra
Provider(s): Específico do(s) provider(s) cassandra — não roda contra nenhum outro.
Tudo que o db.query não expressa para Cassandra: nível de consistency por consulta, paginação
nativa por cursor (pageSize/pageState — nunca skip:, que este provider não suporta) e um
allowFiltering explícito no próprio step, independente do que a entidade declara.
Publica um objeto estruturado, não um array puro, porque tem uma segunda coisa a reportar que o
db.query não tem: o cursor da próxima página.
- type: cassandra.query
id: events
entity: OrderEvent
where: { customerId: "input.route.id" }
sort: ["-createdAt"]
consistency: local_quorum
pageSize: 50
pageState: "input.query.cursor"
allowFiltering: false
Publica em steps.<id>.result: { items: [...], pageState: "<cursor ou null>" } — pageState é null na última página.
id: é obrigatório neste step — sem ele o build falha.
Falhas:
code |
Quando | status |
details |
|---|---|---|---|
cassandra_query_failed |
A consulta falhou no Cassandra. | 500 | — |
db.delete
Classe: Pipevine.Data.Abstractions.Steps.DeleteStepFactory · Pacote: Pipevine.Data.Abstractions
Provider(s): Qualquer provider registrado em spec.dataSources que implemente IDataProvider — o suporte a cada capacidade (paginação por cursor, upsert, etc.) varia por provider, ver IDataProvider e a tabela de Capabilities.
Remove o registro localizado pela chave declarada da entidade, cujo valor vem da expressão em
key. Como no db.update, não há where:.
Remover uma chave inexistente não é erro — o step continua normalmente.
- type: db.delete
entity: order
key: input.route.id
Não publica resultado. Declarar id: neste step é aceito e não tem efeito nenhum.
Falhas:
code |
Quando | status |
details |
|---|---|---|---|
db_delete_failed |
A remoção falhou no banco. | 500 | — |
db.exists
Classe: Pipevine.Data.Abstractions.Steps.ExistsStepFactory · Pacote: Pipevine.Data.Abstractions
Provider(s): Qualquer provider registrado em spec.dataSources que implemente IDataProvider — o suporte a cada capacidade (paginação por cursor, upsert, etc.) varia por provider, ver IDataProvider e a tabela de Capabilities.
Publica true/false conforme exista ou não um registro casando where. Mais barato que um
db.find quando você só precisa saber se existe — não traz o registro.
- { type: db.exists, id: dup, entity: Order, where: { id: "input.body.id" } }
Publica em steps.<id>.result: Um booleano.
id: é obrigatório neste step — sem ele o build falha.
Falhas:
code |
Quando | status |
details |
|---|---|---|---|
db_exists_failed |
A consulta falhou no banco. | 500 | — |
db.find
Classe: Pipevine.Data.Abstractions.Steps.FindStepFactory · Pacote: Pipevine.Data.Abstractions
Provider(s): Qualquer provider registrado em spec.dataSources que implemente IDataProvider — o suporte a cada capacidade (paginação por cursor, upsert, etc.) varia por provider, ver IDataProvider e a tabela de Capabilities.
Busca um registro pelos campos de where (sempre igualdade por campo) e publica o resultado.
Não encontrar não é falha: publica null e o pipeline segue. O padrão para transformar isso
num 404 é o step seguinte — { type: fail, when: "steps.<id>.result = null", status: 404, ... }.
- { type: db.find, id: customer, entity: Customer, where: { id: "input.body.customerId" } }
Publica em steps.<id>.result: O registro encontrado, ou null quando nada casa.
id: é obrigatório neste step — sem ele o build falha.
Falhas:
code |
Quando | status |
details |
|---|---|---|---|
db_find_failed |
A consulta falhou no banco. | 500 | — |
db.persist
Classe: Pipevine.Data.Abstractions.Steps.PersistStepFactory · Pacote: Pipevine.Data.Abstractions
Provider(s): Qualquer provider registrado em spec.dataSources que implemente IDataProvider — o suporte a cada capacidade (paginação por cursor, upsert, etc.) varia por provider, ver IDataProvider e a tabela de Capabilities.
Insere o objeto que data produzir na tabela/coleção da entidade. Com onConflict declarado,
vira um upsert pelas colunas indicadas.
Não publica resultado: se você precisa do registro gravado adiante no pipeline, use o próprio
vars.<algo> que alimentou o data.
- type: db.persist
entity: order
data: vars.order
onConflict: { columns: [id] } # opcional — sem isso é um insert puro
Não publica resultado. Declarar id: neste step é aceito e não tem efeito nenhum.
Falhas:
code |
Quando | status |
details |
|---|---|---|---|
db_persist_failed |
A expressão data avaliou para null. |
500 | — |
db_persist_failed |
A escrita no banco falhou. | 500 | — |
db.query
Classe: Pipevine.Data.Abstractions.Steps.QueryStepFactory · Pacote: Pipevine.Data.Abstractions
Provider(s): Qualquer provider registrado em spec.dataSources que implemente IDataProvider — o suporte a cada capacidade (paginação por cursor, upsert, etc.) varia por provider, ver IDataProvider e a tabela de Capabilities.
Lista os registros que casam where, com sort opcional (nomes de campo, prefixados por - para
descendente) e skip/take — que são expressões JSONata, então a paginação pode vir da própria
requisição.
skip: exige que o provider declare a capacidade OffsetPaging. Providers cursor-only (Cassandra,
DynamoDB) falham o build nomeando a limitação e apontando para o step de paginação próprio deles
(cassandra.query, dynamo.query) — não é um erro que aparece só em produção.
Publica sempre um array; nenhum resultado é um array vazio, não null.
- type: db.query
id: list
entity: Order
where: { customerId: "input.query.customerId" }
sort: [ "-createdAt" ]
skip: "input.query.skip"
take: "input.query.take"
Publica em steps.<id>.result: Um array dos registros casados — vazio quando nada casa.
id: é obrigatório neste step — sem ele o build falha.
Falhas:
code |
Quando | status |
details |
|---|---|---|---|
db_query_failed |
A consulta falhou no banco. | 500 | — |
db.sql
Classe: Pipevine.Data.Abstractions.Steps.SqlStepFactory · Pacote: Pipevine.Data.Abstractions
Provider(s): Qualquer provider registrado em spec.dataSources que implemente IDataProvider — o suporte a cada capacidade (paginação por cursor, upsert, etc.) varia por provider, ver IDataProvider e a tabela de Capabilities.
Aponta para um dataSource (não para uma entity) e executa o SQL declarado.
Os valores de params são expressões JSONata, compiladas no build e avaliadas por requisição —
e ligadas como parâmetros ADO.NET reais pelo provider, nunca interpoladas no texto do SQL. É
isso que faz um valor como '; DROP TABLE orders; -- ser dado comum em vez de injeção: o texto do
SQL é fixo desde o build e jamais toca os valores avaliados.
Só existe para providers que declaram a capacidade RawStatements — num provider sem dialeto SQL
(MongoDB, por exemplo) o build falha nomeando a limitação, em vez de quebrar em runtime.
Não publica resultado.
- type: db.sql
dataSource: main
sql: "DELETE FROM legacy_orders WHERE customer_id = @customerId"
params:
customerId: input.body.customerId
Não publica resultado. Declarar id: neste step é aceito e não tem efeito nenhum.
Falhas:
code |
Quando | status |
details |
|---|---|---|---|
db_sql_failed |
A execução do comando falhou no banco. | 500 | — |
db.update
Classe: Pipevine.Data.Abstractions.Steps.UpdateStepFactory · Pacote: Pipevine.Data.Abstractions
Provider(s): Qualquer provider registrado em spec.dataSources que implemente IDataProvider — o suporte a cada capacidade (paginação por cursor, upsert, etc.) varia por provider, ver IDataProvider e a tabela de Capabilities.
Faz merge de patch com o registro existente, localizado pela chave declarada da entidade —
cujo valor vem da expressão em key. Não existe where: neste step: quem filtra por outros
campos é o db.query.
- type: db.update
entity: order
key: input.route.id
patch: vars.patch
Não publica resultado. Declarar id: neste step é aceito e não tem efeito nenhum.
Falhas:
code |
Quando | status |
details |
|---|---|---|---|
db_update_failed |
A expressão patch avaliou para null. |
500 | — |
db_update_failed |
A escrita no banco falhou. | 500 | — |
dynamo.persist
Classe: Pipevine.Data.DynamoDb.Steps.DynamoPersistStepFactory · Pacote: Pipevine.Data.DynamoDb
Provider(s): Específico do(s) provider(s) dynamodb — não roda contra nenhum outro.
Tudo que o db.persist não expressa para DynamoDB: condition, uma ConditionExpression crua,
que é como se faz concorrência otimista e unicidade real neste provider
(attribute_not_exists(id)).
Uma condição não satisfeita levanta ConditionalCheckFailedException no commit — este step não
esconde isso. Se você quer tratar a colisão como regra de negócio, envolva num try/catch.
- type: dynamo.persist
entity: OrderEvent
data: vars.order
condition: "attribute_not_exists(id)"
Não publica resultado. Declarar id: neste step é aceito e não tem efeito nenhum.
Falhas:
code |
Quando | status |
details |
|---|---|---|---|
dynamo_persist_failed |
A expressão data avaliou para null. |
500 | — |
dynamo_persist_failed |
A escrita falhou no DynamoDB. | 500 | — |
dynamo.query
Classe: Pipevine.Data.DynamoDb.Steps.DynamoQueryStepFactory · Pacote: Pipevine.Data.DynamoDb
Provider(s): Específico do(s) provider(s) dynamodb — não roda contra nenhum outro.
Tudo que o db.query não expressa para DynamoDB: um GSI/LSI explícito (index: — nunca inferido),
consistentRead, projeção de atributos, e cursor nativo
(exclusiveStartKey/lastEvaluatedKey) no lugar de skip:.
É sempre um Query, nunca um Scan: o sentido deste step é que quem chama já sabe qual índice
quer atingir.
Como o cassandra.query, publica um objeto estruturado por causa do cursor.
- type: dynamo.query
id: events
entity: OrderEvent
index: byStatus
where: { status: "input.query.status" }
sort: ["-createdAt"]
consistentRead: false
projection: ["id", "status", "createdAt"]
exclusiveStartKey: "input.query.cursor"
take: "50"
Publica em steps.<id>.result: { items: [...], lastEvaluatedKey: "<cursor ou null>" } — null na última página.
id: é obrigatório neste step — sem ele o build falha.
Falhas:
code |
Quando | status |
details |
|---|---|---|---|
dynamo_query_failed |
A consulta falhou no DynamoDB. | 500 | — |
fail
Classe: Pipevine.Core.Steps.FailStepFactory · Pacote: Pipevine.Core
Provider(s): Não aplicável — step do motor de pipeline (Pipevine.Core), não depende de nenhum provider.
Interrompe a execução com um erro que você mesmo define. É como se expressa uma regra de negócio
que impede continuar — tipicamente combinado com when.
code é obrigatório e é o valor que a tabela errors: da rota casa. message assume o próprio
code quando omitido. status é opcional, mas omiti-lo não significa "deixa o framework
escolher": sem status aqui e sem uma entrada em errors: que case, a resposta é 500.
- type: fail
when: "steps.customer.result = null"
status: 404
code: CUSTOMER_NOT_FOUND
message: "cliente não encontrado"
Não publica resultado. Declarar id: neste step é aceito e não tem efeito nenhum.
Falhas:
code |
Quando | status |
details |
|---|---|---|---|
<definido por você em code:> |
Sempre que o step executa — é o propósito dele. | O valor de status:; sem ele, 500. |
O conteúdo de details:, quando declarado. |
grpc.call
Classe: Pipevine.Integrations.Grpc.Steps.GrpcCallStepFactory · Pacote: Pipevine.Integrations.Grpc
Provider(s): Não é um step de provider de dados — chama a integração declarada em spec.integrations, com a política de resiliência dela.
Mesma forma e mesmo contrato de fallback do http.call, sobre uma integração de
kind: grpc.
mode: typed usa o cliente gerado do .proto (via clientType); mode: dynamic monta a chamada
a partir de requestType/responseType. O default é typed.
Como no http.call: um status OK publica o corpo em steps.<id>.result e só se id: existir;
um status não-OK que sobreviveu à resiliência aciona resilience.fallback quando declarado.
- type: grpc.call
id: quote
integration: pricing-grpc
mode: typed # typed | dynamic (default: typed)
service: pricing.PricingService
method: GetQuote
clientType: "Pricing.PricingService+PricingServiceClient, PricingContracts" # modo typed
request: "{ 'sku': vars.sku }"
Publica em steps.<id>.result: O corpo da resposta num status OK, ou o valor de resilience.fallback.expr quando o fallback por expressão rodou. Um fallback em sub-pipeline não publica aqui.
Sem id: o resultado é descartado em silêncio — nenhum erro avisa.
Falhas:
code |
Quando | status |
details |
|---|---|---|---|
grpc_call_failed |
A chamada retornou um status gRPC não-OK que sobreviveu à resiliência, sem fallback. |
502 | — |
grpc_call_failed |
Timeout, circuito aberto ou falha de transporte, sem fallback declarado. |
502 | — |
grpc_call_failed |
A expressão request falhou ao ser avaliada. |
500 | — |
grpc_call_fallback_failed |
A expressão do próprio resilience.fallback falhou ao ser avaliada. |
500 | — |
http.call
Classe: Pipevine.Integrations.Http.Steps.HttpCallStepFactory · Pacote: Pipevine.Integrations.Http
Provider(s): Não é um step de provider de dados — chama a integração declarada em spec.integrations, com a política de resiliência dela.
Chama a integração nomeada em integration, com method/path, e um body/headers produzidos
por expressões JSONata.
Onde o resultado fica depende do que aconteceu, e os três casos não são o mesmo lugar:
- 2xx — publica em
steps.<id>.result, e o que é publicado é apenas o corpo da resposta: não há status nem headers ali. Se você não declararid:, a resposta é descartada em silêncio. - 4xx — não publica nada. O step falha com
http_call_failed, carregando o status do upstream, e o corpo da resposta vai para osdetailsda falha — que sai nodetailsda respostaProblemDetails, não emsteps.<id>.result. Um 4xx nunca é retentado nem acionafallback: significa que a requisição foi rejeitada, não que a integração está doente. - ≥500, ou falha de transporte (timeout, circuito aberto) — se a integração declarar
resilience.fallback, ele roda. Comfallback.expr, o valor da expressão é publicado emsteps.<id>.result, como se fosse um sucesso. Comfallbackem sub-pipeline, nada é publicado emsteps.<id>.result— os steps de dentro gravam os próprios resultados. Semfallbackdeclarado, o step falha:502para falha de transporte, e o próprio status do upstream (503, 504, ...) quando foi ele quem respondeu 5xx.
Para a rota não devolver 500 nesses casos, veja
Tratamento de erros: ou um resilience.fallback na
integração, ou uma entrada errors: casando http_call_failed, ou um try/catch em volta.
- type: http.call
id: price
integration: pricing
method: POST
path: /quote
body: "{ 'items': vars.order.items }"
headers: { X-Correlation-Id: "input.headers.'x-correlation-id'" }
Publica em steps.<id>.result: Só o corpo da resposta (sem status, sem headers) num 2xx; ou o valor de resilience.fallback.expr quando o fallback por expressão rodou. Um fallback em sub-pipeline não publica aqui.
Sem id: o resultado é descartado em silêncio — nenhum erro avisa.
Falhas:
code |
Quando | status |
details |
|---|---|---|---|
http_call_failed |
O upstream respondeu 4xx (nunca aciona fallback). |
O status do upstream | O corpo da resposta |
http_call_failed |
O upstream respondeu 5xx e não havia fallback declarado. |
O status do upstream | O corpo da resposta |
http_call_failed |
Timeout, circuito aberto ou falha de transporte, sem fallback declarado. |
502 | — |
http_call_failed |
A expressão body ou de um header falhou ao ser avaliada. |
500 | — |
http_call_fallback_failed |
A expressão do próprio resilience.fallback falhou ao ser avaliada. |
500 | — |
log
Classe: Pipevine.Core.Steps.LogStepFactory · Pacote: Pipevine.Core
Provider(s): Não aplicável — step do motor de pipeline (Pipevine.Core), não depende de nenhum provider.
Registra message com os fields declarados, e sempre continua.
message e os valores de fields são literais: não são avaliados como JSONata. Escrever
message: "'erro: ' & error.message" não interpola nada — registra esse texto exatamente como
está. Não há como, hoje, incluir um valor do estado do pipeline numa linha de log.
- type: log
message: "processando pedido"
fields:
etapa: "validacao"
Não publica resultado. Declarar id: neste step é aceito e não tem efeito nenhum.
map
Classe: Pipevine.Core.Steps.MapStepFactory · Pacote: Pipevine.Core
Provider(s): Não aplicável — step do motor de pipeline (Pipevine.Core), não depende de nenhum provider.
Avalia expr sobre o estado atual do pipeline e grava o resultado em to. É o step de
transformação: converte o payload recebido no formato que a persistência, a resposta ou o evento
publicado precisam.
to precisa começar com vars. — qualquer outro destino é recusado no build.
- type: map
to: vars.order
expr: |
{ "id": $uuid(), "total": $sum(input.body.items.(price * quantity)) }
Não publica resultado. Declarar id: neste step é aceito e não tem efeito nenhum.
Falhas:
code |
Quando | status |
details |
|---|---|---|---|
map_failed |
A expressão falhou ao ser avaliada em runtime. | 500 | — |
noop
Classe: Pipevine.Core.Steps.NoopStepFactory · Pacote: Pipevine.Core
Provider(s): Não aplicável — step do motor de pipeline (Pipevine.Core), não depende de nenhum provider.
Não faz nada e sempre continua. Útil como placeholder ao montar um pipeline aos poucos, e em testes que precisam de um step sem efeito colateral.
Não publica resultado. Declarar id: neste step é aceito e não tem efeito nenhum.
publish
Classe: Pipevine.Messaging.Abstractions.Steps.PublishStepFactory · Pacote: Pipevine.Messaging.Abstractions
Provider(s): Qualquer provider registrado em spec.brokers que implemente IMessageProvider, ver IMessageProvider.
Publica o evento nomeado em event (uma entrada de spec.events), com o corpo produzido pela
expressão payload.
mode: direct publica no broker de forma síncrona. mode: outbox grava a mensagem de forma
durável dentro da mesma transação da rota, e um despachante em segundo plano entrega depois,
pelo menos uma vez — o que exige transaction: required na rota/consumer. Sem isso, o build falha
nomeando a exigência; não é um erro que aparece só em produção.
Não publica resultado no estado do pipeline.
- type: publish
event: OrderCreated
payload: vars.order
mode: outbox # direct | outbox
Não publica resultado. Declarar id: neste step é aceito e não tem efeito nenhum.
Falhas:
code |
Quando | status |
details |
|---|---|---|---|
publish_failed |
A expressão payload avaliou para null. |
500 | — |
publish_failed |
A publicação no broker falhou. | 500 | — |
return
Classe: Pipevine.Core.Steps.ReturnStepFactory · Pacote: Pipevine.Core
Provider(s): Não aplicável — step do motor de pipeline (Pipevine.Core), não depende de nenhum provider.
Encerra o pipeline com sucesso, gravando output como resultado da execução — o que vira o
corpo da resposta HTTP (ou a mensagem, num consumer). Os steps seguintes não rodam.
Diferente do fail, não é uma condição de erro: a rota responde normalmente, com o status de
sucesso declarado em response.status.
- type: return
output:
total: 42
Não publica resultado. Declarar id: neste step é aceito e não tem efeito nenhum.
set
Classe: Pipevine.Core.Steps.SetStepFactory · Pacote: Pipevine.Core
Provider(s): Não aplicável — step do motor de pipeline (Pipevine.Core), não depende de nenhum provider.
Grava um valor literal — não uma expressão — em target. Para calcular o valor a partir do
estado do pipeline, use o map.
O valor é clonado a cada execução, então uma estrutura declarada aqui nunca é compartilhada entre requisições concorrentes.
- type: set
target: vars.total
value: 12
Não publica resultado. Declarar id: neste step é aceito e não tem efeito nenhum.
storage.delete
Classe: Pipevine.Storage.Abstractions.Steps.DeleteStepFactory · Pacote: Pipevine.Storage.Abstractions
Provider(s): Qualquer provider registrado em spec.storages que implemente IStorageProvider, ver IStorageProvider.
Remove o objeto sob key. Remover uma chave inexistente não é erro.
Sem fail-open: uma indisponibilidade do backend derruba a requisição, ao contrário do cache. Storage é dado, não otimização.
- { type: storage.delete, storage: docs, key: input.route.key }
Não publica resultado. Declarar id: neste step é aceito e não tem efeito nenhum.
Falhas:
code |
Quando | status |
details |
|---|---|---|---|
storage_delete_failed |
A expressão key falhou, ou a remoção falhou no backend. |
500 | — |
storage.get
Classe: Pipevine.Storage.Abstractions.Steps.GetStepFactory · Pacote: Pipevine.Storage.Abstractions
Provider(s): Qualquer provider registrado em spec.storages que implemente IStorageProvider, ver IStorageProvider.
Transmite o conteúdo do objeto direto para o corpo da resposta HTTP, sem nunca materializá-lo como
JsonNode. O que vai para steps.<id>.result são só os metadados — o conteúdo não passa pelo
estado do pipeline.
Objeto inexistente não é falha: publica null, e o padrão para virar 404 é o mesmo do
db.find — um fail com when no step seguinte.
Só existe em spec.type: api, pelo mesmo motivo do storage.put.
- { type: storage.get, id: get, storage: docs, key: input.route.key }
Publica em steps.<id>.result: Os metadados do objeto (key, size, contentType, etag, lastModified), ou null se não existe.
id: é obrigatório neste step — sem ele o build falha.
Falhas:
code |
Quando | status |
details |
|---|---|---|---|
storage_get_failed |
A expressão key falhou, ou a leitura falhou no backend. |
500 | — |
storage.list
Classe: Pipevine.Storage.Abstractions.Steps.ListStepFactory · Pacote: Pipevine.Storage.Abstractions
Provider(s): Qualquer provider registrado em spec.storages que implemente IStorageProvider, ver IStorageProvider.
Lista os objetos cuja chave começa com prefix, paginando internamente quando o backend limita a
quantidade por chamada — o pipeline recebe a lista completa, não a primeira página.
- { type: storage.list, id: files, storage: docs, prefix: "'docs/'" }
Publica em steps.<id>.result: Um array de { key, size, lastModified } — vazio quando nada casa o prefixo.
id: é obrigatório neste step — sem ele o build falha.
Falhas:
code |
Quando | status |
details |
|---|---|---|---|
storage_list_failed |
A expressão prefix falhou, ou a listagem falhou no backend. |
500 | — |
storage.presignDownload
Classe: Pipevine.Storage.Abstractions.Steps.PresignDownloadStepFactory · Pacote: Pipevine.Storage.Abstractions
Provider(s): Qualquer provider registrado em spec.storages que implemente IStorageProvider, ver IStorageProvider.
O espelho do storage.presignUpload: gera uma URL temporária com a qual o cliente baixa direto do
backend, sem o corpo passar pela sua API.
ttl é obrigatório. Gerar a URL não verifica se o objeto existe — use storage.stat antes se
precisar dessa garantia.
- { type: storage.presignDownload, id: download, storage: docs, key: input.route.key, ttl: 5m }
Publica em steps.<id>.result: { key, url, expiresAt } — expiresAt é uma string ISO-8601.
id: é obrigatório neste step — sem ele o build falha.
Falhas:
code |
Quando | status |
details |
|---|---|---|---|
storage_presign_download_failed |
A expressão key falhou, ou o backend não gerou a URL. |
500 | — |
storage.presignUpload
Classe: Pipevine.Storage.Abstractions.Steps.PresignUploadStepFactory · Pacote: Pipevine.Storage.Abstractions
Provider(s): Qualquer provider registrado em spec.storages que implemente IStorageProvider, ver IStorageProvider.
Gera uma URL temporária com a qual o cliente faz o upload direto no backend — o corpo do
arquivo nunca passa pela sua API. É a alternativa ao storage.put quando você não quer o tráfego
atravessando o processo.
ttl é obrigatório e define por quanto tempo a URL vale. Funciona em qualquer tipo de aplicação
(é operação de metadata), inclusive num consumer.
- { type: storage.presignUpload, id: upload, storage: docs, key: "'docs/' & $uuid()", ttl: 5m, contentType: input.body.contentType }
Publica em steps.<id>.result: { key, url, expiresAt } — expiresAt é uma string ISO-8601.
id: é obrigatório neste step — sem ele o build falha.
Falhas:
code |
Quando | status |
details |
|---|---|---|---|
storage_presign_upload_failed |
A expressão key falhou, ou o backend não gerou a URL. |
500 | — |
storage.put
Classe: Pipevine.Storage.Abstractions.Steps.PutStepFactory · Pacote: Pipevine.Storage.Abstractions
Provider(s): Qualquer provider registrado em spec.storages que implemente IStorageProvider, ver IStorageProvider.
Transmite o corpo da requisição HTTP direto para o storage, sem nunca materializá-lo como
JsonNode — é assim que um upload grande não passa pela memória do processo.
Só existe em spec.type: api. Dentro do pipeline de um consumer é recusado no build, porque
ali não existe corpo de requisição HTTP para transmitir.
- { type: storage.put, id: put, storage: docs, key: input.route.key }
Publica em steps.<id>.result: { key, size, etag } do objeto gravado.
id: é obrigatório neste step — sem ele o build falha.
Falhas:
code |
Quando | status |
details |
|---|---|---|---|
storage_put_failed |
A expressão key falhou, ou a gravação falhou no backend. |
500 | — |
storage.stat
Classe: Pipevine.Storage.Abstractions.Steps.StatStepFactory · Pacote: Pipevine.Storage.Abstractions
Provider(s): Qualquer provider registrado em spec.storages que implemente IStorageProvider, ver IStorageProvider.
Lê os metadados do objeto sob key sem transferir o conteúdo — é a forma barata de checar
existência e tamanho, tipicamente depois de um upload por URL pré-assinada.
Objeto inexistente publica null, não falha.
- { type: storage.stat, id: meta, storage: docs, key: input.route.key }
Publica em steps.<id>.result: Os metadados do objeto (key, size, contentType, etag, lastModified), ou null se não existe.
id: é obrigatório neste step — sem ele o build falha.
Falhas:
code |
Quando | status |
details |
|---|---|---|---|
storage_stat_failed |
A expressão key falhou, ou a leitura falhou no backend. |
500 | — |
validate
Classe: Pipevine.Core.Steps.ValidateStepFactory · Pacote: Pipevine.Core
Provider(s): Não aplicável — step do motor de pipeline (Pipevine.Core), não depende de nenhum provider.
schema valida a forma do dado; rules valida regra de negócio. Os dois são opcionais,
mas pelo menos um precisa existir — e não se usa os dois para a mesma preocupação.
mode é obrigatório: collect avalia todas as regras e reporta todas as violações de uma vez;
failFast para na primeira. Não há default — omitir mode falha o build.
- type: validate
mode: collect # collect | failFast
schema: { type: object, required: [customerId] }
rules:
- { expr: "$count(input.body.items) > 0", code: EMPTY_ORDER, path: /items, message: "pedido sem itens" }
Não publica resultado. Declarar id: neste step é aceito e não tem efeito nenhum.
Falhas:
code |
Quando | status |
details |
|---|---|---|---|
validation_failed |
Alguma regra ou o schema foi violado. | 400 | Uma lista de { code, path, message }, uma entrada por violação. A camada HTTP a converte num ValidationProblemDetails agrupado por path. |
Catálogo de códigos de erro
Todo código que uma execução de pipeline pode produzir. É por estes valores que a tabela
errors: de uma rota faz o casamento — { code: <um destes>, status: ..., title: ... }.
Ver Tratamento de erros para como usá-los.
Uma entrada de
errors:que casa sempre impõe o própriostatus:, e omiti-lo vale500— o status da coluna abaixo é o que a falha carrega quando nenhuma entrada casa.
code |
Origem | Quando | status |
Remapeável por errors: |
|---|---|---|---|---|
<definido por você em code:> |
fail |
Sempre que o step executa — é o propósito dele. | O valor de status:; sem ele, 500. |
sim |
binding_failed |
binding da requisição | Header ou parâmetro de query obrigatório ausente, ou corpo JSON malformado. Acontece antes do pipeline, então nenhum step chega a rodar. | 400 | não |
branch_failed |
branch |
A expressão when do próprio branch falhou ao ser avaliada. |
500 | sim |
cache_get_failed |
cache.get |
A expressão key falhou ao ser avaliada. (Indisponibilidade do backend vira miss, não falha.) |
500 | sim |
cache_invalidate_failed |
cache.invalidate |
A expressão key falhou ao ser avaliada. |
500 | sim |
cache_set_failed |
cache.set |
A expressão key ou value falhou ao ser avaliada. |
500 | sim |
cassandra_persist_failed |
cassandra.persist |
A expressão data avaliou para null. |
500 | sim |
cassandra_persist_failed |
cassandra.persist |
A escrita falhou no Cassandra. | 500 | sim |
cassandra_query_failed |
cassandra.query |
A consulta falhou no Cassandra. | 500 | sim |
db_delete_failed |
db.delete |
A remoção falhou no banco. | 500 | sim |
db_exists_failed |
db.exists |
A consulta falhou no banco. | 500 | sim |
db_find_failed |
db.find |
A consulta falhou no banco. | 500 | sim |
db_persist_failed |
db.persist |
A expressão data avaliou para null. |
500 | sim |
db_persist_failed |
db.persist |
A escrita no banco falhou. | 500 | sim |
db_query_failed |
db.query |
A consulta falhou no banco. | 500 | sim |
db_sql_failed |
db.sql |
A execução do comando falhou no banco. | 500 | sim |
db_update_failed |
db.update |
A expressão patch avaliou para null. |
500 | sim |
db_update_failed |
db.update |
A escrita no banco falhou. | 500 | sim |
dynamo_persist_failed |
dynamo.persist |
A expressão data avaliou para null. |
500 | sim |
dynamo_persist_failed |
dynamo.persist |
A escrita falhou no DynamoDB. | 500 | sim |
dynamo_query_failed |
dynamo.query |
A consulta falhou no DynamoDB. | 500 | sim |
forbidden |
autorização | Autenticado, mas sem o escopo/papel/claim exigido, ou o authorize.expr avaliou falso. |
403 | não |
foreach_failed |
foreach |
A expressão in (ou a de collect.select) falhou ao ser avaliada. |
500 | sim |
grpc_call_failed |
grpc.call |
A chamada retornou um status gRPC não-OK que sobreviveu à resiliência, sem fallback. |
502 | sim |
grpc_call_failed |
grpc.call |
Timeout, circuito aberto ou falha de transporte, sem fallback declarado. |
502 | sim |
grpc_call_failed |
grpc.call |
A expressão request falhou ao ser avaliada. |
500 | sim |
grpc_call_fallback_failed |
grpc.call |
A expressão do próprio resilience.fallback falhou ao ser avaliada. |
500 | sim |
http_call_failed |
http.call |
O upstream respondeu 4xx (nunca aciona fallback). |
O status do upstream | sim |
http_call_failed |
http.call |
O upstream respondeu 5xx e não havia fallback declarado. |
O status do upstream | sim |
http_call_failed |
http.call |
Timeout, circuito aberto ou falha de transporte, sem fallback declarado. |
502 | sim |
http_call_failed |
http.call |
A expressão body ou de um header falhou ao ser avaliada. |
500 | sim |
http_call_fallback_failed |
http.call |
A expressão do próprio resilience.fallback falhou ao ser avaliada. |
500 | sim |
map_failed |
map |
A expressão falhou ao ser avaliada em runtime. | 500 | sim |
publish_failed |
publish |
A expressão payload avaliou para null. |
500 | sim |
publish_failed |
publish |
A publicação no broker falhou. | 500 | sim |
storage_delete_failed |
storage.delete |
A expressão key falhou, ou a remoção falhou no backend. |
500 | sim |
storage_get_failed |
storage.get |
A expressão key falhou, ou a leitura falhou no backend. |
500 | sim |
storage_list_failed |
storage.list |
A expressão prefix falhou, ou a listagem falhou no backend. |
500 | sim |
storage_presign_download_failed |
storage.presignDownload |
A expressão key falhou, ou o backend não gerou a URL. |
500 | sim |
storage_presign_upload_failed |
storage.presignUpload |
A expressão key falhou, ou o backend não gerou a URL. |
500 | sim |
storage_put_failed |
storage.put |
A expressão key falhou, ou a gravação falhou no backend. |
500 | sim |
storage_stat_failed |
storage.stat |
A expressão key falhou, ou a leitura falhou no backend. |
500 | sim |
switch_failed |
switch |
A expressão when de um case falhou ao ser avaliada. |
500 | sim |
unauthorized |
autenticação | Token ausente, expirado, ou com issuer/audience/assinatura inválidos. | 401 | não |
validation_failed |
validate |
Alguma regra ou o schema foi violado. | 400 | sim |
when_failed |
when universal |
A expressão when de qualquer step falhou ao ser avaliada. |
500 | sim |