Saltar para o conteúdo principal
A camada de dados de um app Twenty é o conjunto de dados que seu app adiciona a um workspace — os novos tipos de registros que ele declara, as colunas que adiciona a objetos existentes e como esses registros se conectam entre si.
┌──────────────────────────────────────────────────┐
│ Object — a record type, e.g. PostCard            │
│    ├─ Field     (name, type, label)              │
│    ├─ Field                                      │
│    └─ Relation  (link to another object)         │
└──────────────────────────────────────────────────┘

            ├── lives in your app, OR


┌──────────────────────────────────────────────────┐
│ Standard / other apps' objects                   │
│    └─ Field added by your app via defineField    │
└──────────────────────────────────────────────────┘

Nesta seção

Objetos

defineObject — declare novos tipos de registros com seus próprios campos.

Estendendo objetos

defineField — adicione campos a objetos padrão ou de outros apps.

Relações

Conexões bidirecionais MANY_TO_ONE / ONE_TO_MANY entre objetos.

Entidades em resumo

EntidadeFinalidadeDefinido com
ObjetoUm novo tipo de registro personalizado (por exemplo, PostCard, Invoice) com seus próprios camposdefineObject()
CampoUma coluna em um objeto. Campos independentes podem estender objetos que você não criou (por exemplo, adicionar loyaltyTier ao objeto Company)defineField()
RelaçãoUm vínculo bidirecional entre dois objetos — ambos os lados declarados como camposdefineField() com FieldType.RELATION
ÍndiceUm índice de banco de dados para acelerar uma consulta recorrente em um dos seus objetosdefineIndex()
O SDK detecta esses elementos por meio de análise de AST em tempo de build, então a organização dos arquivos fica a seu critério — a convenção é src/objects/, src/fields/ e src/indexes/. UUIDs universalIdentifier estáveis conectam tudo em implantações diferentes.

Índices (Opcional)

Os apps podem incluir índices junto com seus objetos para manter rápidas as consultas recorrentes. O caso mais comum é uma coluna de status ou de chave estrangeira que você lê com frequência.
src/indexes/post-card-status.index.ts
import { defineIndex } from 'twenty-sdk/define';

import {
  POST_CARD_UNIVERSAL_IDENTIFIER,
  STATUS_FIELD_UNIVERSAL_IDENTIFIER,
} from '../objects/post-card.object';

export default defineIndex({
  universalIdentifier: 'b6e9d2a1-5a4c-46ca-9d52-42c8f02d1ff0',
  objectUniversalIdentifier: POST_CARD_UNIVERSAL_IDENTIFIER,
  fields: [
    {
      universalIdentifier: 'b6e9d2a1-5a4c-46ca-9d52-42c8f02d1ff1',
      fieldUniversalIdentifier: STATUS_FIELD_UNIVERSAL_IDENTIFIER,
    },
  ],
});

Índices únicos

defineIndex aceita isUnique: true tanto para unicidade de uma única coluna quanto de múltiplas colunas. Este é o recurso recomendado — defineField({ isUnique: true }) está obsoleto e será removido em uma versão futura.
defineIndex({
  universalIdentifier: '…',
  objectUniversalIdentifier: PERSON_UNIVERSAL_IDENTIFIER,
  isUnique: true,
  fields: [{ universalIdentifier: '…', fieldUniversalIdentifier: EMAIL_FIELD_UNIVERSAL_IDENTIFIER }],
});

Outras restrições

  • Cláusulas WHERE parciais permanecem sob controle do administrador — os apps não podem declará-las.
  • Cada objeto é limitado a 10 índices personalizados (os índices do próprio framework não contam).
Ordene o array fields da forma como o Postgres deve usá-lo — coluna mais à esquerda primeiro, como em uma lista telefônica. Índices não são gratuitos: cada gravação na tabela os atualiza. Adicione um apenas quando você tiver uma consulta que precise dele.
Procurando por Application Config ou Roles & Permissions? Esses descrevem o próprio app em vez dos dados que ele adiciona — eles ficam em Config. Procurando por Connections (Linear, GitHub, Slack OAuth)? Essas existem para serem chamadas a partir de funções de lógica e ficam em Logic.