Obter, definir, excluir
Importekv de twenty-sdk/logic-function. Os valores podem ser quaisquer valores serializáveis em JSON.
src/logic-functions/sync-linear-issues.ts
Escopos
Cada registro tem um escopo, passado como uma opção em cada chamada. O padrão éWORKSPACE.
WORKSPACE(padrão) — o registro é privado para a instalação atual do seu app no workspace. Cada workspace que instala o app recebe seu próprio conjunto independente de chaves. É isso que você quer para caches, cursores e estado por workspace.SERVER— o registro é compartilhado entre todas as instalações do seu app no servidor. Registros de servidor se comportam como claims: o valor armazenado é sempre o workspaceId que reivindicou a chave (omitavalueemsetpara reivindicar a chave para o workspace atual), e somente esse workspace pode sobrescrevê-la ou excluí-la. Qualquer instalação pode ler o registro.
kv.set lança uma exceção quando a chave já foi reivindicada por outro workspace.
Use-o: armazenar em cache uma chamada cara
Um uso típico é armazenar em cache uma resposta lenta ou com limite de taxa de terceiros, para que execuções repetidas a reutilizem em vez de pagar o custo todas as vezes.src/logic-functions/getExchangeRate.logic-function.ts
Padrões e dicas
- Namespacing. Prefixe chaves para manter diferentes responsabilidades separadas —
sync-cursor:linear,cache:exchange-rate:USD:EUR,lock:nightly-report. - Expiração (TTL). O armazenamento não possui expiração integrada. Armazene um carimbo de data/hora dentro do valor (como no exemplo de cache) e verifique-o na leitura, ou limpe chaves obsoletas a partir de uma função acionada por cron.
- O que armazenar. Qualquer valor serializável em JSON — números, strings, arrays, objetos. Mantenha as entradas pequenas; isto é para coordenação e cache, não para blobs grandes ou arquivos. Para arquivos, use um campo
FILESeuploadFile. - Visibilidade. Os registros ficam no banco de dados da instância, não como registros de workspace — eles nunca aparecem na interface do workspace, não fazem parte do modelo de dados do seu app e não precisam de permissões de função ou de objeto.
Alternativa: um objeto de armazenamento consultável
O armazenamento interno é deliberadamente opaco: as entradas não são registros, então você não pode navegá-las na interface, relacioná-las a outros objetos ou filtrá-las com consultas de registros. Quando você precisar de qualquer uma dessas coisas — por exemplo, um log de sincronização visível ou estado por registro —, em vez disso defina um pequeno objeto técnico com um campokey exclusivo e um campo value RAW_JSON, e faça consultas por meio do cliente de API tipado. Veja Objects para a referência de defineObject e Data → Unique indexes para impor exclusividade de chaves.
- Definindo o escopo para um registro. Adicione uma relation do objeto de armazenamento para o objeto de destino em vez de codificar o id na chave.
- Visibilidade e permissões. As linhas vivem no banco de dados do workspace como qualquer outro registro, portanto podem ser consultadas pela API e respeitam a role do seu app. Para manter o armazenamento fora da interface principal, deixe-o de fora do seu menu de navegação.
Ao contrário do armazenamento interno, um objeto personalizado está sempre com escopo para um único workspace — ele não consegue compartilhar registros entre instalações como as chaves
SERVER fazem.