Passer au contenu principal
La couche de données d’une application Twenty correspond aux données que votre application ajoute à un espace de travail — les nouveaux types d’enregistrements qu’elle déclare, les colonnes qu’elle ajoute aux objets existants et la manière dont ces enregistrements sont reliés les uns aux autres.
┌──────────────────────────────────────────────────┐
│ 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    │
└──────────────────────────────────────────────────┘

Dans cette section

Objets

defineObject — déclarez de nouveaux types d’enregistrements avec leurs propres champs.

Extension des objets

defineField — ajoutez des champs aux objets standard ou à ceux d’autres applications.

Relations

Connexions bidirectionnelles MANY_TO_ONE / ONE_TO_MANY entre objets.

Aperçu des entités

EntitéObjectifDéfini avec
ObjetUn nouveau type d’enregistrement personnalisé (par ex. PostCard, Invoice) avec ses propres champsdefineObject()
ChampUne colonne d’un objet. Les champs autonomes peuvent étendre des objets que vous n’avez pas créés (par ex. ajouter loyaltyTier à Company)defineField()
RelationUn lien bidirectionnel entre deux objets — les deux côtés étant déclarés comme des champsdefineField() avec FieldType.RELATION
IndexUn index de base de données pour accélérer une requête récurrente sur l’un de vos objetsdefineIndex()
Le SDK les détecte via une analyse AST au moment de la compilation, donc l’organisation des fichiers vous appartient — la convention est src/objects/, src/fields/ et src/indexes/. Des UUID universalIdentifier stables relient tout d’un déploiement à l’autre.

Index (optionnels)

Les applications peuvent fournir des index avec leurs objets pour que les requêtes récurrentes restent rapides. Le cas le plus courant est une colonne de statut ou de clé étrangère que vous lisez fréquemment.
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,
    },
  ],
});

Index uniques

defineIndex accepte isUnique: true pour l’unicité sur une ou plusieurs colonnes. C’est la primitive recommandée — defineField({ isUnique: true }) est obsolète et sera supprimé dans une future version.
defineIndex({
  universalIdentifier: '…',
  objectUniversalIdentifier: PERSON_UNIVERSAL_IDENTIFIER,
  isUnique: true,
  fields: [{ universalIdentifier: '…', fieldUniversalIdentifier: EMAIL_FIELD_UNIVERSAL_IDENTIFIER }],
});

Autres contraintes

  • Les clauses WHERE partielles restent sous le contrôle de l’administrateur — les applications ne peuvent pas les déclarer.
  • Chaque objet est limité à 10 index personnalisés (les index propres au framework ne comptent pas).
Ordonnez le tableau fields dans l’ordre dans lequel Postgres doit l’utiliser — colonne la plus à gauche en premier, comme dans un annuaire téléphonique. Les index ne sont pas gratuits : chaque écriture dans la table les met à jour. Ajoutez-en un uniquement lorsque vous avez une requête qui en a besoin.
Vous cherchez Application Config ou Roles & Permissions ? Ces éléments décrivent l’application elle-même plutôt que les données qu’elle ajoute — ils se trouvent sous Config. Vous cherchez Connections (Linear, GitHub, Slack OAuth) ? Ceux-ci existent pour être appelés depuis des fonctions logiques et se trouvent sous Logic.