twenty-sdk package provides defineEntity functions to declare your app’s data model. Abyste umožnili SDK detekovat vaše entity, musíte použít export default defineEntity({...}). Tyto funkce validují vaši konfiguraci v době sestavení a poskytují automatické doplňování v IDE a typovou bezpečnost.
Uspořádání souborů je na vás.
Detekce entit je založená na AST — SDK najde volání
export default defineEntity(...) bez ohledu na to, kde se soubor nachází. Seskupování souborů podle typu (např. logic-functions/, roles/) je pouze konvence, nikoli požadavek.defineRole
Konfigurace oprávnění rolí a přístupu k objektům
defineRole
Konfigurace oprávnění rolí a přístupu k objektům
Role zapouzdřují oprávnění k objektům a akcím ve vašem pracovním prostoru.
restricted-company-role.ts
defineApplication
Nakonfigurujte metadata aplikace (povinné, jedno na aplikaci)
defineApplication
Nakonfigurujte metadata aplikace (povinné, jedno na aplikaci)
Každá aplikace musí mít právě jedno volání Poznámky:
Na
defineApplication, které popisuje:- Identita: identifikátory, zobrazovaný název a popis.
- Oprávnění: jakou roli používají její funkce a frontendové komponenty.
- (Volitelné) proměnné: dvojice klíč–hodnota zpřístupněné vašim funkcím jako proměnné prostředí.
- (Volitelné) předinstalační / postinstalační funkce: logické funkce, které se spouštějí před nebo po instalaci.
src/application-config.ts
- Pole
universalIdentifierjsou deterministické identifikátory, které vlastníte. Vygenerujte je jednou a zachovejte je stabilní napříč synchronizacemi. applicationVariablesse stanou proměnnými prostředí pro vaše funkce a frontendové komponenty (napříkladDEFAULT_RECIPIENT_NAMEje dostupné jakoprocess.env.DEFAULT_RECIPIENT_NAME).defaultRoleUniversalIdentifiermusí odkazovat na roli definovanou pomocídefineRole()(viz výše).- Předinstalační a postinstalační funkce jsou při sestavení manifestu detekovány automaticky — není třeba na ně odkazovat v
defineApplication().
Metadata tržiště
Pokud plánujete zveřejnit svou aplikaci, tato volitelná pole určují, jak se vaše aplikace zobrazuje v tržišti:| Pole | Popis |
|---|---|
author | Jméno autora nebo název společnosti |
category | Kategorie aplikace pro filtrování v tržišti |
logoUrl | Cesta k logu vaší aplikace (např. public/logo.png) |
screenshots | Pole cest ke snímkům obrazovky (např. public/screenshot-1.png) |
aboutDescription | Delší popis v Markdownu pro kartu “O aplikaci”. Pokud je vynecháno, tržiště použije README.md balíčku z npm |
websiteUrl | Odkaz na váš web |
termsUrl | Odkaz na podmínky služby |
emailSupport | E-mailová adresa podpory |
issueReportUrl | Odkaz na nástroj pro sledování problémů |
Role a oprávnění
PoledefaultRoleUniversalIdentifier v application-config.ts určuje výchozí roli používanou logickými funkcemi a frontendovými komponentami vaší aplikace. Podrobnosti viz výše u defineRole.- Běhový token vložený jako
TWENTY_APP_ACCESS_TOKENje odvozen z této role. - Typovaný klient bude omezen oprávněními udělenými této roli.
- Dodržujte princip nejmenších oprávnění: vytvořte vyhrazenou roli pouze s oprávněními, která vaše funkce potřebují.
Výchozí role funkce
Když vygenerujete novou aplikaci, CLI vytvoří výchozí soubor role:src/roles/default-role.ts
universalIdentifier této role se v application-config.ts odkazuje jako na defaultRoleUniversalIdentifier:- *.role.ts definuje, co daná role může dělat.
- application-config.ts ukazuje na tuto roli, aby vaše funkce zdědily její oprávnění.
- Začněte vygenerovanou rolí a postupně ji omezujte podle principu nejmenších oprávnění.
- Nahraďte
objectPermissionsafieldPermissionsobjekty a poli, které vaše funkce skutečně potřebují. permissionFlagsřídí přístup k schopnostem na úrovni platformy. Udržujte je co nejmenší.- Podívejte se na funkční příklad:
hello-world/src/roles/function-role.ts.
defineObject
Definice vlastních objektů s poli
defineObject
Definice vlastních objektů s poli
Vlastní objekty popisují jak schéma, tak chování záznamů ve vašem pracovním prostoru. K definování objektů s vestavěnou validací použijte Hlavní body:
defineObject():postCard.object.ts
- Použijte
defineObject()pro vestavěnou validaci a lepší podporu v IDE. - Hodnota
universalIdentifiermusí být jedinečná a stabilní napříč nasazeními. - Každé pole vyžaduje
name,type,labela svůj vlastní stabilníuniversalIdentifier. - Pole
fieldsje volitelné — objekty můžete definovat i bez vlastních polí. - Nové objekty můžete vygenerovat pomocí
yarn twenty add, který vás provede pojmenováním, poli a vztahy.
Základní pole jsou vytvořena automaticky. Když definujete vlastní objekt, Twenty automaticky přidá standardní pole
jako
id, name, createdAt, updatedAt, createdBy, updatedBy a deletedAt.
Nemusíte je definovat v poli fields — přidejte pouze svá vlastní pole.
Výchozí pole můžete přepsat definováním pole se stejným názvem v poli fields,
ale to se nedoporučuje.defineField — Standardní pole
Rozšiřte existující objekty o další pole
defineField — Standardní pole
Rozšiřte existující objekty o další pole
Pomocí Hlavní body:
defineField() přidejte pole k objektům, které nevlastníte — například ke standardním objektům Twenty (Person, Company atd.). nebo k objektům z jiných aplikací. Na rozdíl od inline polí v defineObject() vyžadují samostatná pole objectUniversalIdentifier k určení, který objekt rozšiřují:src/fields/company-loyalty-tier.field.ts
objectUniversalIdentifieridentifikuje cílový objekt. Pro standardní objekty použijteSTANDARD_OBJECT_UNIVERSAL_IDENTIFIERSexportovaný ztwenty-sdk.- Při definování polí inline v
defineObject()objectUniversalIdentifiernepotřebujete — dědí se z nadřazeného objektu. defineField()je jediný způsob, jak přidat pole k objektům, které jste nevytvořili pomocídefineObject().
defineField — Relační pole
Propojte objekty obousměrnými relacemi
defineField — Relační pole
Propojte objekty obousměrnými relacemi
Relace propojují objekty. Ve Twenty jsou relace vždy obousměrné — definujete obě strany a každá strana odkazuje na tu druhou.Existují dva typy relací:
Krok 2: Definujte stranu MANY_TO_ONE na PostCardRecipient (strana “many” — drží cizí klíč):
| Typ vztahu | Popis | Má cizí klíč? |
|---|---|---|
MANY_TO_ONE | Mnoho záznamů tohoto objektu ukazuje na jeden záznam cílového objektu | Ano (joinColumnName) |
ONE_TO_MANY | Jeden záznam tohoto objektu má mnoho záznamů cílového objektu | Ne (inverzní strana) |
Jak fungují relace
Každá relace vyžaduje dvě pole, která na sebe vzájemně odkazují:- Strana MANY_TO_ONE — je na objektu, který drží cizí klíč
- Strana ONE_TO_MANY — je na objektu, který vlastní kolekci
FieldType.RELATION a vzájemně se odkazují prostřednictvím relationTargetFieldMetadataUniversalIdentifier.Příklad: Pohlednice má mnoho příjemců
Předpokládejme, žePostCard lze odeslat mnoha záznamům PostCardRecipient. Každý příjemce náleží přesně jedné pohlednici.Krok 1: Definujte stranu ONE_TO_MANY na PostCard (strana “one”):src/fields/post-card-recipients-on-post-card.field.ts
src/fields/post-card-on-post-card-recipient.field.ts
Cyklické importy: Obě relační pole odkazují na
universalIdentifier toho druhého. Abyste předešli problémům s cyklickými importy, exportujte ID polí jako pojmenované konstanty z každého souboru a v druhém souboru je importujte. Build systém je vyřeší v době kompilace.Vazby na standardní objekty
Chcete-li vytvořit relaci s vestavěným objektem Twenty (Person, Company atd.), použijteSTANDARD_OBJECT_UNIVERSAL_IDENTIFIERS:src/fields/person-on-self-hosting-user.field.ts
Vlastnosti relačních polí
| Vlastnost | Povinné | Popis |
|---|---|---|
type | Ano | Musí být FieldType.RELATION |
relationTargetObjectMetadataUniversalIdentifier | Ano | universalIdentifier cílového objektu |
relationTargetFieldMetadataUniversalIdentifier | Ano | universalIdentifier odpovídajícího pole na cílovém objektu |
universalSettings.relationType | Ano | RelationType.MANY_TO_ONE nebo RelationType.ONE_TO_MANY |
universalSettings.onDelete | Pouze MANY_TO_ONE | Co se stane, když je smazán odkazovaný záznam: CASCADE, SET_NULL, RESTRICT nebo NO_ACTION |
universalSettings.joinColumnName | Pouze MANY_TO_ONE | Název databázového sloupce pro cizí klíč (např. postCardId) |
Vložená relační pole v defineObject
Relační pole můžete také definovat přímo uvnitřdefineObject(). V takovém případě vynechejte objectUniversalIdentifier — dědí se z nadřazeného objektu:Generování entit pomocí yarn twenty add
Místo ručního vytváření souborů entit můžete použít interaktivní generátor:
universalIdentifier a správným voláním defineEntity().
Můžete také předat typ entity přímo a přeskočit první dotaz:
Dostupné typy entit
| Typ entity | Příkaz | Vygenerovaný soubor |
|---|---|---|
| Objekt | yarn twenty add object | src/objects/\<name>.ts |
| Pole | yarn twenty add field | src/fields/\<name>.ts |
| Logická funkce | yarn twenty add logicFunction | src/logic-functions/\<name>.ts |
| Frontendová komponenta | yarn twenty add frontComponent | src/front-components/\<name>.tsx |
| Role | yarn twenty add role | src/roles/\<name>.ts |
| Dovednost | yarn twenty add skill | src/skills/\<name>.ts |
| Agent | yarn twenty add agent | src/agents/\<name>.ts |
| Pohled | yarn twenty add view | src/views/\<name>.ts |
| Položka navigační nabídky | yarn twenty add navigationMenuItem | src/navigation-menu-items/\<name>.ts |
| Rozvržení stránky | yarn twenty add pageLayout | src/page-layouts/\<name>.ts |
Co generátor vytváří
Každý typ entity má vlastní šablonu. Napříkladyarn twenty add object se zeptá na:
- Název (jednotné číslo) — např.
invoice - Název (množné číslo) — např.
invoices - Štítek (jednotné číslo) — automaticky doplněn z názvu (např.
Invoice) - Štítek (množné číslo) — automaticky doplněn (např.
Invoices) - Vytvořit zobrazení a položku navigace? — pokud odpovíte ano, generátor také vytvoří odpovídající zobrazení a odkaz v postranním panelu pro nový objekt.
field je podrobnější: ptá se na název pole, štítek, typ (ze seznamu všech dostupných typů polí jako TEXT, NUMBER, SELECT, RELATION atd.) a universalIdentifier cílového objektu.
Vlastní výstupní cesta
Pomocí příznaku--path umístíte vygenerovaný soubor do vlastního umístění: