Saltar para o conteúdo principal
Objetos personalizados são novos tipos de registro que o seu app adiciona a um espaço de trabalho — cartão‑postal, fatura, assinatura, qualquer coisa específica do seu domínio. Cada objeto declara seu esquema (campos, relações, valores padrão) e um identificador universal estável que persiste entre sincronizações e implantações.
src/objects/post-card.object.ts
import { defineObject, FieldType } from 'twenty-sdk/define';

enum PostCardStatus {
  DRAFT = 'DRAFT',
  SENT = 'SENT',
  DELIVERED = 'DELIVERED',
  RETURNED = 'RETURNED',
}

export default defineObject({
  universalIdentifier: '54b589ca-eeed-4950-a176-358418b85c05',
  nameSingular: 'postCard',
  namePlural: 'postCards',
  labelSingular: 'Post Card',
  labelPlural: 'Post Cards',
  description: 'A post card object',
  icon: 'IconMail',
  fields: [
    {
      universalIdentifier: '58a0a314-d7ea-4865-9850-7fb84e72f30b',
      name: 'content',
      type: FieldType.TEXT,
      label: 'Content',
      description: "Postcard's content",
      icon: 'IconAbc',
    },
    {
      universalIdentifier: 'c6aa31f3-da76-4ac6-889f-475e226009ac',
      name: 'recipientName',
      type: FieldType.FULL_NAME,
      label: 'Recipient name',
      icon: 'IconUser',
    },
    {
      universalIdentifier: '95045777-a0ad-49ec-98f9-22f9fc0c8266',
      name: 'recipientAddress',
      type: FieldType.ADDRESS,
      label: 'Recipient address',
      icon: 'IconHome',
    },
    {
      universalIdentifier: '87b675b8-dd8c-4448-b4ca-20e5a2234a1e',
      name: 'status',
      type: FieldType.SELECT,
      label: 'Status',
      icon: 'IconSend',
      defaultValue: `'${PostCardStatus.DRAFT}'`,
      options: [
        { value: PostCardStatus.DRAFT, label: 'Draft', position: 0, color: 'gray' },
        { value: PostCardStatus.SENT, label: 'Sent', position: 1, color: 'orange' },
        { value: PostCardStatus.DELIVERED, label: 'Delivered', position: 2, color: 'green' },
        { value: PostCardStatus.RETURNED, label: 'Returned', position: 3, color: 'orange' },
      ],
    },
    {
      universalIdentifier: 'e06abe72-5b44-4e7f-93be-afc185a3c433',
      name: 'deliveredAt',
      type: FieldType.DATE_TIME,
      label: 'Delivered at',
      icon: 'IconCheck',
      isNullable: true,
      defaultValue: null,
    },
  ],
});

Pontos-chave

  • O universalIdentifier deve ser exclusivo e estável entre implantações.
  • Cada campo requer name, type, label e seu próprio universalIdentifier estável.
  • O array fields é opcional — você pode definir objetos sem campos personalizados.
  • Campos inline definidos aqui não precisam de objectUniversalIdentifier — ele é herdado do objeto pai. Use defineField() para adicionar campos a objetos que não pertencem a você.
  • Você pode criar novos objetos com yarn twenty dev:add object, que orienta você na definição de nomes, campos e relacionamentos. Veja Arquitetura → Scaffolding de entidades.
Os campos base são adicionados automaticamente. Quando você define um objeto personalizado, o Twenty cria campos padrão como id, name, createdAt, updatedAt, createdBy, updatedBy e deletedAt para você. Você não precisa declará‑los no seu array fields — apenas seus campos personalizados. Você pode substituir um campo padrão declarando um com o mesmo nome, mas isso raramente é uma boa ideia.

Valores padrão

Valores padrão de strings literais devem ser colocados entre aspas simples dentro da string — defaultValue: "'Draft'", não defaultValue: "Draft". É por isso que o campo status acima usa `'${PostCardStatus.DRAFT}'`. Strings sem aspas são reservadas para valores padrão computados, avaliados quando um registro é criado:
  • 'uuid' — gera um UUID (para campos UUID)
  • 'now' — o carimbo de data/hora atual (para campos DATE_TIME)
A mesma convenção se aplica a subcampos de string de valores padrão compostos (por exemplo, { source: "'MANUAL'" } em um campo ACTOR) e a valores de SELECT/MULTI_SELECT. Uma string literal padrão deixada sem aspas gera um aviso quando seu app é compilado.

O que vem depois