i18n - docs translations (#17502)

Created by Github action

---------

Co-authored-by: github-actions <github-actions@twenty.com>
This commit is contained in:
github-actions[bot]
2026-01-28 14:17:07 +01:00
committed by GitHub
parent f33b8e12f4
commit f7908de4c1
87 changed files with 551 additions and 551 deletions
@@ -9,12 +9,12 @@ description: أنشئ وأدِر تخصيصات Twenty على هيئة كود.
## ما هي التطبيقات؟
تتيح لك التطبيقات إنشاء وإدارة تخصيصات Twenty **ككود**. بدلًا من تكوين كل شيء عبر واجهة المستخدم، تُعرِّف نموذج بياناتك ووظائف بلا خادم في الكود — مما يجعل الإنشاء والصيانة والنشر إلى مساحات عمل متعددة أسرع.
تتيح لك التطبيقات إنشاء وإدارة تخصيصات Twenty **ككود**. بدلًا من تكوين كل شيء عبر واجهة المستخدم، تُعرِّف نموذج بياناتك ووظائف المنطق في الكود — مما يجعل البناء والصيانة والنشر إلى مساحات عمل متعددة أسرع.
**ما الذي يمكنك فعله اليوم:**
* عرِّف كائنات وحقولًا مخصصة على شكل كود (نموذج بيانات مُدار)
* أنشئ وظائف بلا خادم مع مشغلات مخصصة
* أنشئ وظائف منطقية مع مشغلات مخصصة
* انشر التطبيق نفسه عبر مساحات عمل متعددة
**قريبًا:**
@@ -156,23 +156,23 @@ src/
بشكل عام:
* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall`, and `auth:login` that delegate to the local `twenty` CLI.
* **package.json**: يصرّح باسم التطبيق والإصدار والمحرّكات (Node 24+، Yarn 4)، ويضيف `twenty-sdk` فضلًا عن نصوص مثل `app:dev` و`app:generate` و`entity:add` و`function:logs` و`function:execute` و`app:uninstall` و`auth:login` التي تفوِّض إلى `twenty` CLI المحلي.
* **.gitignore**: يتجاهل العناصر الشائعة مثل `node_modules` و`.yarn` و`generated/` (عميل مضبوط الأنواع) و`dist/` و`build/` ومجلدات التغطية وملفات السجلات وملفات `.env*`.
* **yarn.lock**، **.yarnrc.yml**، **.yarn/**: تقوم بقفل وتكوين حزمة أدوات Yarn 4 المستخدمة في المشروع.
* **.nvmrc**: يثبّت إصدار Node.js المتوقع للمشروع.
* **eslint.config.mjs** و**tsconfig.json**: يقدّمان إعدادات الفحص والتهيئة لـ TypeScript لمصادر TypeScript في تطبيقك.
* **README.md**: ملف README قصير في جذر التطبيق يتضمن تعليمات أساسية.
* **src/**: The main place where you define your application-as-code:
* **src/**: المكان الرئيسي حيث تعرّف تطبيقك ككود:
* `application.config.ts`: التكوين العام لتطبيقك (بيانات وصفية وربط وقت التشغيل). انظر "تكوين التطبيق" أدناه.
* `*.role.ts`: تعريفات الأدوار المستخدمة بواسطة وظائفك بلا خادم. انظر "الدور الافتراضي للوظيفة" أدناه.
* `*.role.ts`: تعريفات الأدوار المستخدمة بواسطة وظائفك المنطقية. انظر "الدور الافتراضي للوظيفة" أدناه.
* `*.object.ts`: تعريفات كائنات مخصصة.
* `*.function.ts`: تعريفات وظائف بلا خادم.
* `*.front-component.tsx`: Front component definitions.
* `*.function.ts`: تعريفات الوظائف المنطقية.
* `*.front-component.tsx`: تعريفات المكونات الواجهية.
ستضيف الأوامر اللاحقة مزيدًا من الملفات والمجلدات:
* `yarn app:generate` سيُنشئ مجلدًا `generated/` (عميل Twenty مضبوط الأنواع + أنواع مساحة العمل).
* `yarn entity:add` will add entity definition files under `src/` for your custom objects, functions, front components, or roles.
* `yarn entity:add` سيضيف ملفات تعريف الكيانات تحت `src/` لكائناتك المخصصة أو الوظائف أو المكونات الواجهية أو الأدوار.
## المصادقة
@@ -219,7 +219,7 @@ Once you've switched workspaces with `auth:switch`, all subsequent commands will
| ------------------ | ---------------------------------------- |
| `defineApp()` | تهيئة بيانات التطبيق الوصفية |
| `defineObject()` | تعريف كائنات مخصصة مع حقول |
| `defineFunction()` | تعريف وظائف بلا خادم مع معالجات |
| `defineFunction()` | تعريف وظائف منطقية مع معالجات |
| `defineRole()` | تهيئة صلاحيات الدور والوصول إلى الكائنات |
تتحقق هذه الدوال من تكوينك في وقت التشغيل وتوفر إكمالًا تلقائيًا أفضل في بيئة التطوير وأمان أنواع أعلى.
@@ -303,7 +303,7 @@ export default defineObject({
* `universalIdentifier` يجب أن يكون فريدًا وثابتًا عبر عمليات النشر.
* يتطلب كل حقل `name` و`type` و`label` ومعرّف `universalIdentifier` ثابتًا خاصًا به.
* المصفوفة `fields` اختيارية — يمكنك تعريف كائنات بدون حقول مخصصة.
* You can scaffold new objects using `yarn entity:add`, which guides you through naming, fields, and relationships.
* يمكنك إنشاء كائنات جديدة باستخدام `yarn entity:add`، والذي يرشدك خلال التسمية والحقول والعلاقات.
<Note>
**يتم إنشاء الحقول الأساسية تلقائيًا.** عند تعريف كائن مخصص، يضيف Twenty تلقائيًا حقولًا قياسية مثل `name` و`createdAt` و`updatedAt` و`createdBy` و`position` و`deletedAt`. لا تحتاج إلى تعريف هذه في مصفوفة `fields` — أضف فقط حقولك المخصصة.
@@ -349,7 +349,7 @@ export default defineApp({
#### الأدوار والصلاحيات
يمكن للتطبيقات تعريف أدوار تُغلّف الصلاحيات على كائنات وإجراءات مساحة العمل لديك. يعين الحقل `functionRoleUniversalIdentifier` في `application.config.ts` الدور الافتراضي الذي تستخدمه الوظائف بلا خادم في تطبيقك.
يمكن للتطبيقات تعريف أدوار تُغلّف الصلاحيات على كائنات وإجراءات مساحة العمل لديك. يعين الحقل `functionRoleUniversalIdentifier` في `application.config.ts` الدور الافتراضي الذي تستخدمه وظائف المنطق في تطبيقك.
* مفتاح واجهة البرمجة في وقت التشغيل المحقون باسم `TWENTY_API_KEY` مستمد من دور الوظيفة الافتراضي هذا.
* سيُقيَّد العميل مضبوط الأنواع بالأذونات الممنوحة لذلك الدور.
@@ -411,7 +411,7 @@ export default defineRole({
* `permissionFlags` تتحكم في الوصول إلى القدرات على مستوى المنصة. اجعلها في الحد الأدنى؛ أضف فقط ما تحتاجه.
* اطّلع على مثال عملي في تطبيق Hello World: [`packages/twenty-apps/hello-world/src/roles/function-role.ts`](https://github.com/twentyhq/twenty/blob/main/packages/twenty-apps/hello-world/src/roles/function-role.ts).
### تكوين وظيفة بلا خادم ونقطة الدخول
### تكوين الوظيفة المنطقية ونقطة الدخول
كل ملف وظيفة يستخدم `defineFunction()` لتصدير تكوين مع معالج ومشغلات اختيارية. استخدم لاحقة الملف `*.function.ts` للاكتشاف التلقائي.
@@ -510,7 +510,7 @@ export default defineFunction({
**لترحيل الدوال الحالية:** حدّث المعالج لديك لفكّ البنية من `event.body` أو `event.queryStringParameters` أو `event.pathParameters` بدلاً من القراءة مباشرةً من كائن params.
</Warning>
عندما يستدعي مشغّل المسار دالتك، فإنه يتلقى كائنًا من النوع `RoutePayload` يتبع تنسيق AWS HTTP API v2. استورد النوع من `twenty-sdk`:
عندما يستدعي مشغّل المسار وظيفتك المنطقية، يتلقى كائنًا من النوع `RoutePayload` يتبع تنسيق AWS HTTP API v2. استورد النوع من `twenty-sdk`:
```typescript
import { defineFunction, type RoutePayload } from 'twenty-sdk';
@@ -540,7 +540,7 @@ const handler = async (event: RoutePayload) => {
### تمرير رؤوس HTTP
افتراضيًا، لا يتم تمرير رؤوس HTTP من الطلبات الواردة إلى دالتك بدون خادم لأسباب أمنية. للوصول إلى رؤوس محددة، قم بإدراجها صراحةً في مصفوفة `forwardedRequestHeaders`:
افتراضيًا، **لا** تُمرَّر رؤوس HTTP من الطلبات الواردة إلى وظيفتك المنطقية لأسباب أمنية. للوصول إلى رؤوس محددة، قم بإدراجها صراحةً في مصفوفة `forwardedRequestHeaders`:
```typescript
export default defineFunction({
@@ -578,7 +578,7 @@ const handler = async (event: RoutePayload) => {
يمكنك إنشاء وظائف جديدة بطريقتين:
* **Scaffolded**: Run `yarn entity:add` and choose the option to add a new function. يُولّد هذا ملفًا مبدئيًا مع معالج وتكوين.
* **مُنشأ بالقالب**: شغّل `yarn entity:add` واختر خيار إضافة وظيفة جديدة. يُولّد هذا ملفًا مبدئيًا مع معالج وتكوين.
* **يدوي**: أنشئ ملفًا جديدًا `*.function.ts` واستخدم `defineFunction()` مع اتباع النمط نفسه.
### عميل مُولَّد مضبوط الأنواع
@@ -592,9 +592,9 @@ const client = new Twenty();
const { me } = await client.query({ me: { id: true, displayName: true } });
```
يُعاد توليد العميل بواسطة `yarn app:generate`. Re-run after changing your objects or when onboarding to a new workspace.
يُعاد توليد العميل بواسطة `yarn app:generate`. أعِد التشغيل بعد تغيير كائناتك أو عند الانضمام إلى مساحة عمل جديدة.
#### بيانات الاعتماد في وقت التشغيل في الوظائف بلا خادم
#### بيانات الاعتماد وقت التشغيل في الوظائف المنطقية
عندما تعمل وظيفتك على Twenty، يقوم النظام الأساسي بحقن بيانات الاعتماد كمتغيرات بيئة قبل تنفيذ كودك:
@@ -604,7 +604,7 @@ const { me } = await client.query({ me: { id: true, displayName: true } });
الملاحظات:
* لا تحتاج إلى تمرير عنوان URL أو مفتاح واجهة برمجة التطبيقات إلى العميل المُولَّد. يقوم بقراءة `TWENTY_API_URL` و`TWENTY_API_KEY` من process.env وقت التشغيل.
* تُحدَّد أذونات مفتاح واجهة برمجة التطبيقات بواسطة الدور المشار إليه في `application.config.ts` عبر `functionRoleUniversalIdentifier`. هذا هو الدور الافتراضي الذي تستخدمه الوظائف بلا خادم في تطبيقك.
* تُحدَّد أذونات مفتاح واجهة برمجة التطبيقات بواسطة الدور المشار إليه في `application.config.ts` عبر `functionRoleUniversalIdentifier`. هذا هو الدور الافتراضي الذي تستخدمه الوظائف المنطقية في تطبيقك.
* يمكن للتطبيقات تعريف أدوار لاتباع مبدأ أقل الامتياز. امنح فقط الأذونات التي تحتاجها وظائفك، ثم وجّه `functionRoleUniversalIdentifier` إلى المعرّف الشامل لذلك الدور.
### مثال Hello World
@@ -640,13 +640,13 @@ yarn add -D twenty-sdk
}
```
Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:generate`, etc.
يمكنك الآن تشغيل الأوامر نفسها عبر Yarn، مثل `yarn app:dev` و`yarn app:generate`، إلخ.
## استكشاف الأخطاء وإصلاحها
* أخطاء المصادقة: شغّل `yarn auth:login` وتأكد من أن مفتاح واجهة برمجة التطبيقات لديك يمتلك الأذونات المطلوبة.
* يتعذّر الاتصال بالخادم: تحقق من عنوان URL لواجهة البرمجة وأن خادم Twenty قابل للوصول.
* Types or client missing/outdated: run `yarn app:generate`.
* الأنواع أو العميل مفقود/قديم: شغّل `yarn app:generate`.
* وضع التطوير لا يزامن: تأكد من أن `yarn app:dev` قيد التشغيل وأن التغييرات ليست متجاهلة من بيئتك.
قناة المساعدة على Discord: https://discord.com/channels/1130383047699738754/1130386664812982322
@@ -292,19 +292,19 @@ yarn command:prod cron:workflow:automated-cron-trigger
**وضع بيئي فقط:** إذا كنت قد ضبطت `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`، فأضف هذه المتغيرات إلى ملف `.env` الخاص بك بدلاً من ذلك.
</Warning>
## وظائف بلا خادم
## الوظائف المنطقية
تدعم Twenty وظائف بلا خادم لعمليات سير العمل والمنطق المخصص. يتم تكوين بيئة التنفيذ عبر متغير البيئة `SERVERLESS_TYPE`.
تدعم Twenty الوظائف المنطقية لعمليات سير العمل والمنطق المخصص. يتم تكوين بيئة التنفيذ عبر متغير البيئة `SERVERLESS_TYPE`.
<Warning>
**ملاحظة أمنية:** يقوم برنامج التشغيل المحلي لوظائف بلا خادم (`SERVERLESS_TYPE=LOCAL`) بتشغيل الشيفرة مباشرةً على المضيف ضمن عملية Node.js من دون عزل. يجب استخدامه فقط للشيفرة الموثوقة أثناء التطوير. بالنسبة لعمليات النشر الإنتاجية التي تتعامل مع شيفرة غير موثوق بها، نوصي بشدة باستخدام `SERVERLESS_TYPE=LAMBDA` أو `SERVERLESS_TYPE=DISABLED`.
**ملاحظة أمنية:** يقوم برنامج التشغيل المحلي (`SERVERLESS_TYPE=LOCAL`) بتشغيل الشيفرة مباشرةً على المضيف ضمن عملية Node.js من دون عزل. يجب استخدامه فقط للشيفرة الموثوقة أثناء التطوير. بالنسبة لعمليات النشر الإنتاجية التي تتعامل مع شيفرة غير موثوق بها، نوصي بشدة باستخدام `SERVERLESS_TYPE=LAMBDA` أو `SERVERLESS_TYPE=DISABLED`.
</Warning>
### برامج التشغيل المتاحة
| برنامج التشغيل | متغير البيئة | حالة الاستخدام | مستوى الأمان |
| -------------- | -------------------------- | ------------------------------- | ----------------------------- |
| معطل | `SERVERLESS_TYPE=DISABLED` | تعطيل وظائف بلا خادم بالكامل | غير متاح |
| معطل | `SERVERLESS_TYPE=DISABLED` | تعطيل الوظائف المنطقية بالكامل | غير متاح |
| محلي | `SERVERLESS_TYPE=LOCAL` | بيئات التطوير والبيئات الموثوقة | منخفض (من دون عزل) |
| Lambda | `SERVERLESS_TYPE=LAMBDA` | الإنتاج مع شيفرة غير موثوق بها | مرتفع (عزل على مستوى الأجهزة) |
@@ -326,12 +326,12 @@ SERVERLESS_LAMBDA_ACCESS_KEY_ID=your-access-key
SERVERLESS_LAMBDA_SECRET_ACCESS_KEY=your-secret-key
```
**لتعطيل وظائف بلا خادم:**
**لتعطيل الوظائف المنطقية:**
```bash
SERVERLESS_TYPE=DISABLED
```
<Note>
عند استخدام `SERVERLESS_TYPE=DISABLED`، ستؤدي أي محاولة لتنفيذ وظيفة بلا خادم إلى إرجاع خطأ. يكون هذا مفيدًا إذا كنت ترغب في تشغيل Twenty من دون قدرات وظائف بلا خادم.
عند استخدام `SERVERLESS_TYPE=DISABLED`، ستؤدي أي محاولة لتنفيذ وظيفة منطقية إلى إرجاع خطأ. يكون هذا مفيدًا إذا كنت ترغب في تشغيل Twenty من دون إمكانات الوظائف المنطقية.
</Note>
@@ -9,7 +9,7 @@ description: تعرّف على المصطلحات الأساسية المستخ
## التطبيقات
التطبيقات هي امتدادات مخصّصة مُنشأة على شكل شيفرة يمكنها تعريف نماذج البيانات ووظائف بدون خوادم. تمكّن المطورين من إنشاء تخصيصات قابلة لإعادة الاستخدام يمكن نشرها عبر مساحات عمل متعددة.
التطبيقات هي امتدادات مخصّصة مُنشأة على شكل شيفرة يمكنها تعريف نماذج البيانات والوظائف المنطقية. تمكّن المطورين من إنشاء تخصيصات قابلة لإعادة الاستخدام يمكن نشرها عبر مساحات عمل متعددة.
## إجراءات الكود
@@ -136,7 +136,7 @@ image: /images/user-guide/workflows/workflow.png
| **تأكيدات الفعاليات** | تفاصيل الفعالية أو جدول الأعمال |
<Note>
المرفقات ثابتة—يتم إرسال الملف نفسه إلى جميع المستلمين. بالنسبة للمستندات الديناميكية (مثل عروض الأسعار المخصصة)، أنشئ الملفات وأرفقها باستخدام [وظيفة بدون خادم](/l/ar/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty).
المرفقات ثابتة—يتم إرسال الملف نفسه إلى جميع المستلمين. بالنسبة للمستندات الديناميكية (مثل عروض الأسعار المخصصة)، أنشئ الملفات وأرفقها باستخدام [وظيفة منطقية](/l/ar/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty).
</Note>
## أفضل الممارسات
@@ -256,7 +256,7 @@ import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
* اختبر الكود مباشرة في الخطوة
<Note>
إذا كنت بحاجة إلى استخدام مفاتيح API خارجية في كودك، فيجب إدخالها مباشرةً في جسم الدالة. لا يمكنك تكوين مفاتيح API في مكان آخر والإشارة إليها في الدالة عديمة الخادم.
إذا كنت بحاجة إلى استخدام مفاتيح API خارجية في كودك، فيجب إدخالها مباشرةً في جسم الدالة. لا يمكنك تكوين مفاتيح API في مكان آخر والإشارة إليها في الدالة المنطقية.
</Note>
<Tip>
@@ -7,7 +7,7 @@ description: أنشئ سير عمل لإنشاء ملف PDF (مثل عرض سع
## نظرة عامة
يستخدم سير العمل هذا **المحفز اليدوي** بحيث يتمكن المستخدمون من إنشاء ملف PDF عند الطلب لأي سجل محدد. **وظيفة بلا خادم** تتولى ما يلي:
يستخدم سير العمل هذا **المحفز اليدوي** بحيث يتمكن المستخدمون من إنشاء ملف PDF عند الطلب لأي سجل محدد. تتولى **الوظيفة المنطقية** ما يلي:
1. تنزيل ملف PDF من عنوان URL (من خدمة إنشاء PDF)
2. رفع الملف إلى Twenty
@@ -17,7 +17,7 @@ description: أنشئ سير عمل لإنشاء ملف PDF (مثل عرض سع
قبل إعداد سير العمل:
1. **أنشئ مفتاح API**: انتقل إلى **الإعدادات → واجهات برمجة التطبيقات** ثم أنشئ مفتاح API جديدًا. ستحتاج إلى هذا الرمز المميز للوظيفة بلا خادم.
1. **أنشئ مفتاح API**: انتقل إلى **الإعدادات → واجهات برمجة التطبيقات** ثم أنشئ مفتاح API جديدًا. ستحتاج إلى هذا الرمز المميز للوظيفة المنطقية.
2. **قم بإعداد خدمة إنشاء PDF** (اختياري): إذا كنت تريد إنشاء ملفات PDF ديناميكيًا (مثل عروض الأسعار)، فاستخدم خدمة مثل Carbone أو PDFMonkey أو DocuSeal لإنشاء ملف PDF والحصول على رابط تنزيل.
## إعداد خطوة بخطوة
@@ -32,9 +32,9 @@ description: أنشئ سير عمل لإنشاء ملف PDF (مثل عرض سع
باستخدام المحفز اليدوي، يمكن للمستخدمين تشغيل سير العمل هذا عبر زر يظهر في أعلى اليمين عند تحديد سجل، وذلك لإنشاء ملف PDF وإرفاقه.
</Tip>
### الخطوة 2: إضافة وظيفة بلا خادم
### الخطوة 2: إضافة وظيفة منطقية
1. أضف إجراء **وظيفة بلا خادم**
1. أضف إجراء **Code** (وظيفة منطقية)
2. أنشئ وظيفة جديدة باستخدام الكود أدناه
3. قم بتهيئة معلمات الإدخال
@@ -45,10 +45,10 @@ description: أنشئ سير عمل لإنشاء ملف PDF (مثل عرض سع
| `companyId` | `{{trigger.object.id}}` |
<Note>
إذا كنت تُرفق إلى كائن مختلف (شخص، فرصة، إلخ)، فأعد تسمية المعلمة وفقًا لذلك (مثلًا، `personId`، `opportunityId`) وحدث الوظيفة بلا خادم.
إذا كنت تُرفِقه بكائن مختلف (شخص، فرصة، إلخ)، فأعد تسمية المعلمة وفقًا لذلك (مثلًا، `personId`، `opportunityId`) وحدّث الوظيفة المنطقية.
</Note>
#### كود الوظيفة بلا خادم
#### كود الوظيفة المنطقية
```typescript
export const main = async (
@@ -172,7 +172,7 @@ export const main = async (
إذا كنت تستخدم خدمة إنشاء PDF، يمكنك:
1. أولًا، أنشئ إجراء طلب HTTP لإنشاء ملف PDF
2. مرّر رابط ملف PDF المُعاد إلى الوظيفة بلا خادم كمعلمة
2. مرّر رابط ملف PDF المُعاد إلى الوظيفة المنطقية كمعلمة
```typescript
export const main = async (
@@ -211,7 +211,7 @@ export const main = async (
* **DocuSeal** - منصة أتمتة المستندات
* **Documint** - إنشاء مستندات يعتمد على واجهة برمجة التطبيقات أولًا
توفر كل خدمة واجهة برمجة تطبيقات تُرجع رابط ملف PDF، ويمكنك بعدها تمريره إلى الوظيفة بلا خادم.
توفر كل خدمة واجهة برمجة تطبيقات تُرجع رابط ملف PDF، ويمكنك بعدها تمريره إلى الوظيفة المنطقية.
## استكشاف الأخطاء وإصلاحها
@@ -224,5 +224,5 @@ export const main = async (
## ذات صلة
* [مشغلات سير العمل](/l/ar/user-guide/workflows/capabilities/workflow-triggers)
* [وظائف بلا خادم](/l/ar/user-guide/workflows/capabilities/workflow-actions#serverless-function)
* [الوظائف المنطقية](/l/ar/user-guide/workflows/capabilities/workflow-actions#code)
* [إنشاء عرض سعر أو فاتورة من Twenty](/l/ar/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty)
@@ -131,7 +131,7 @@ description: الأسئلة الشائعة حول سير العمل في Twenty.
</Accordion>
<Accordion title="ما أقصى وقت تنفيذ لإجراءات Code؟">
إجراءات Code (دوال بلا خادم) لديها **مهلة افتراضية قدرها 5 دقائق** (300 ثانية).
إجراءات Code (دوال منطقية) لديها **مهلة افتراضية قدرها 5 دقائق** (300 ثانية).
أقصى مهلة يمكن ضبطها هي **15 دقيقة** (900 ثانية).
@@ -9,12 +9,12 @@ description: Vytvářejte a spravujte přizpůsobení Twenty jako kód.
## Co jsou aplikace?
Aplikace vám umožňují vytvářet a spravovat přizpůsobení Twenty **jako kód**. Místo konfigurace všeho přes uživatelské rozhraní definujete v kódu svůj datový model a serverless funkce — což zrychluje vývoj, údržbu i nasazování do více pracovních prostorů.
Aplikace vám umožňují vytvářet a spravovat přizpůsobení Twenty **jako kód**. Místo konfigurace všeho přes uživatelské rozhraní definujete v kódu svůj datový model a logické funkce — což zrychluje vývoj, údržbu i nasazování do více pracovních prostorů.
**Co můžete dělat už dnes:**
* Definujte vlastní objekty a pole jako kód (spravovaný datový model)
* Vytvářejte serverless funkce s vlastními spouštěči
* Vytvářejte logické funkce s vlastními spouštěči
* Nasazujte stejnou aplikaci do více pracovních prostorů
**Již brzy:**
@@ -156,23 +156,23 @@ src/
V kostce:
* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall`, and `auth:login` that delegate to the local `twenty` CLI.
* **package.json**: Deklaruje název aplikace, verzi, engines (Node 24+, Yarn 4) a přidává `twenty-sdk` plus skripty jako `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall` a `auth:login`, které delegují na lokální `twenty` CLI.
* **.gitignore**: Ignoruje běžné artefakty jako `node_modules`, `.yarn`, `generated/` (typovaný klient), `dist/`, `build/`, složky s coverage, logy a soubory `.env*`.
* **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Zamykají a konfigurují nástrojový řetězec Yarn 4 používaný projektem.
* **.nvmrc**: Fixuje verzi Node.js požadovanou projektem.
* **eslint.config.mjs** a **tsconfig.json**: Poskytují lintování a konfiguraci TypeScriptu pro zdrojové soubory vaší aplikace v TypeScriptu.
* **README.md**: Krátké README v kořeni aplikace se základními pokyny.
* **src/**: The main place where you define your application-as-code:
* **src/**: Hlavní místo, kde definujete svou aplikaci jako kód:
* `application.config.ts`: Globální konfigurace vaší aplikace (metadata a napojení za běhu). Viz „Konfigurace aplikace“ níže.
* `*.role.ts`: Definice rolí používané vašimi serverless funkcemi. Viz „Výchozí role funkce“ níže.
* `*.role.ts`: Definice rolí používané vašimi logickými funkcemi. Viz „Výchozí role funkce“ níže.
* `*.object.ts`: Definice vlastních objektů.
* `*.function.ts`: Definice serverless funkcí.
* `*.front-component.tsx`: Front component definitions.
* `*.function.ts`: Definice logických funkcí.
* `*.front-component.tsx`: Definice frontových komponent.
Pozdější příkazy přidají další soubory a složky:
* `yarn app:generate` vytvoří složku `generated/` (typovaný klient Twenty + typy pracovního prostoru).
* `yarn entity:add` will add entity definition files under `src/` for your custom objects, functions, front components, or roles.
* `yarn entity:add` přidá soubory s definicemi entit do `src/` pro vaše vlastní objekty, funkce, frontové komponenty nebo role.
## Ověření
@@ -219,7 +219,7 @@ SDK poskytuje čtyři pomocné funkce s vestavěnou validací pro definování e
| ------------------ | ------------------------------------------------ |
| `defineApp()` | Konfigurace metadat aplikace |
| `defineObject()` | Definice vlastních objektů s poli |
| `defineFunction()` | Definice serverless funkcí s obslužnými funkcemi |
| `defineFunction()` | Definice logických funkcí s obslužnými funkcemi |
| `defineRole()` | Konfigurace oprávnění rolí a přístupu k objektům |
Tyto funkce validují vaši konfiguraci za běhu a poskytují lepší automatické doplňování v IDE a lepší typovou bezpečnost.
@@ -303,7 +303,7 @@ Hlavní body:
* Hodnota `universalIdentifier` musí být jedinečná a stabilní napříč nasazeními.
* Každé pole vyžaduje `name`, `type`, `label` a svůj vlastní stabilní `universalIdentifier`.
* Pole `fields` je volitelné — objekty můžete definovat i bez vlastních polí.
* You can scaffold new objects using `yarn entity:add`, which guides you through naming, fields, and relationships.
* Nové objekty můžete vygenerovat pomocí `yarn entity:add`, který vás provede pojmenováním, poli a vztahy.
<Note>
**Základní pole jsou vytvořena automaticky.** Když definujete vlastní objekt, Twenty automaticky přidá standardní pole jako `name`, `createdAt`, `updatedAt`, `createdBy`, `position` a `deletedAt`. Nemusíte je definovat v poli `fields` — přidejte pouze svá vlastní pole.
@@ -349,7 +349,7 @@ Poznámky:
#### Role a oprávnění
Aplikace mohou definovat role, které zapouzdřují oprávnění k objektům a akcím ve vašem pracovním prostoru. Pole `functionRoleUniversalIdentifier` v `application.config.ts` určuje výchozí roli používanou serverless funkcemi vaší aplikace.
Aplikace mohou definovat role, které zapouzdřují oprávnění k objektům a akcím ve vašem pracovním prostoru. Pole `functionRoleUniversalIdentifier` v `application.config.ts` určuje výchozí roli používanou logickými funkcemi vaší aplikace.
* Běhový klíč API vložený jako `TWENTY_API_KEY` je odvozen z této výchozí role funkcí.
* Typovaný klient bude omezen oprávněními udělenými této roli.
@@ -411,7 +411,7 @@ Poznámky:
* `permissionFlags` řídí přístup k schopnostem na úrovni platformy. Držte je na minimu; přidávejte pouze to, co potřebujete.
* Podívejte se na funkční příklad v aplikaci Hello World: [`packages/twenty-apps/hello-world/src/roles/function-role.ts`](https://github.com/twentyhq/twenty/blob/main/packages/twenty-apps/hello-world/src/roles/function-role.ts).
### Konfigurace serverless funkcí a vstupní bod
### Konfigurace logických funkcí a vstupní bod
Každý soubor funkce používá `defineFunction()` k exportu konfigurace s obslužnou funkcí (handlerem) a volitelnými spouštěči. Pro automatickou detekci použijte příponu souboru `*.function.ts`.
@@ -510,7 +510,7 @@ Poznámky:
**Jak migrovat existující funkce:** Aktualizujte svůj handler tak, aby destrukturoval z `event.body`, `event.queryStringParameters` nebo `event.pathParameters` místo přímo z objektu params.
</Warning>
Když spouštěč trasy vyvolá vaši funkci, ta obdrží objekt `RoutePayload`, který odpovídá formátu AWS HTTP API v2. Importujte typ z `twenty-sdk`:
Když spouštěč trasy vyvolá vaši logickou funkci, ta obdrží objekt `RoutePayload`, který odpovídá formátu AWS HTTP API v2. Importujte typ z `twenty-sdk`:
```typescript
import { defineFunction, type RoutePayload } from 'twenty-sdk';
@@ -540,7 +540,7 @@ Typ `RoutePayload` má následující strukturu:
### Přeposílání záhlaví HTTP
Ve výchozím nastavení se záhlaví HTTP z příchozích požadavků z bezpečnostních důvodů do vaší serverless funkce **ne** předávají. Chcete-li zpřístupnit konkrétní záhlaví, výslovně je uveďte v poli `forwardedRequestHeaders`:
Ve výchozím nastavení se záhlaví HTTP z příchozích požadavků z bezpečnostních důvodů do vaší logické funkce **ne** předávají. Chcete-li zpřístupnit konkrétní záhlaví, výslovně je uveďte v poli `forwardedRequestHeaders`:
```typescript
export default defineFunction({
@@ -578,7 +578,7 @@ const handler = async (event: RoutePayload) => {
Nové funkce můžete vytvářet dvěma způsoby:
* **Scaffolded**: Run `yarn entity:add` and choose the option to add a new function. Tím se vygeneruje startovací soubor s obslužnou funkcí a konfigurací.
* **Vygenerované**: Spusťte `yarn entity:add` a zvolte možnost přidat novou funkci. Tím se vygeneruje startovací soubor s obslužnou funkcí a konfigurací.
* **Ruční**: Vytvořte nový soubor `*.function.ts` a použijte `defineFunction()` podle stejného vzoru.
### Generovaný typovaný klient
@@ -592,9 +592,9 @@ const client = new Twenty();
const { me } = await client.query({ me: { id: true, displayName: true } });
```
Klient je znovu generován příkazem `yarn app:generate`. Re-run after changing your objects or when onboarding to a new workspace.
Klient je znovu generován příkazem `yarn app:generate`. Spusťte znovu po změně vašich objektů nebo při připojování k novému pracovnímu prostoru.
#### Běhové přihlašovací údaje v serverless funkcích
#### Běhové přihlašovací údaje v logických funkcích
Když vaše funkce běží na Twenty, platforma před spuštěním kódu vloží přihlašovací údaje jako proměnné prostředí:
@@ -604,7 +604,7 @@ Když vaše funkce běží na Twenty, platforma před spuštěním kódu vloží
Poznámky:
* Není nutné předávat URL ani klíč API vygenerovanému klientovi. Za běhu čte `TWENTY_API_URL` a `TWENTY_API_KEY` z process.env.
* Oprávnění API klíče jsou určena rolí odkazovanou v `application.config.ts` prostřednictvím `functionRoleUniversalIdentifier`. Toto je výchozí role používaná serverless funkcemi vaší aplikace.
* Oprávnění API klíče jsou určena rolí odkazovanou v `application.config.ts` prostřednictvím `functionRoleUniversalIdentifier`. Toto je výchozí role používaná logickými funkcemi vaší aplikace.
* Aplikace mohou definovat role podle principu nejmenších oprávnění. Udělte pouze oprávnění, která vaše funkce potřebují, a poté nastavte `functionRoleUniversalIdentifier` na univerzální identifikátor této role.
### Příklad Hello World
@@ -640,13 +640,13 @@ Poté přidejte skripty jako tyto:
}
```
Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:generate`, etc.
Nyní můžete spouštět stejné příkazy přes Yarn, např. `yarn app:dev`, `yarn app:generate` atd.
## Řešení potíží
* Chyby ověření: spusťte `yarn auth:login` a ujistěte se, že váš klíč API má požadovaná oprávnění.
* Nelze se připojit k serveru: ověřte URL API a že je server Twenty dosažitelný.
* Types or client missing/outdated: run `yarn app:generate`.
* Typy nebo klient chybí nebo jsou zastaralé: spusťte `yarn app:generate`.
* Režim vývoje nesynchronizuje: ujistěte se, že běží `yarn app:dev` a že vaše prostředí změny neignoruje.
Kanál podpory na Discordu: https://discord.com/channels/1130383047699738754/1130386664812982322
@@ -292,19 +292,19 @@ yarn command:prod cron:workflow:automated-cron-trigger
**Režim pouze s prostředím:** Pokud nastavíte `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, přidejte tyto proměnné do souboru `.env`
</Warning>
## Serverless funkce
## Logické funkce
Twenty podporuje serverless funkce pro pracovní postupy a vlastní logiku. Běhové prostředí se konfiguruje pomocí proměnné prostředí `SERVERLESS_TYPE`.
Twenty podporuje logické funkce pro pracovní postupy a vlastní logiku. Běhové prostředí se konfiguruje pomocí proměnné prostředí `SERVERLESS_TYPE`.
<Warning>
**Upozornění na zabezpečení:** Místní serverless ovladač (`SERVERLESS_TYPE=LOCAL`) spouští kód přímo na hostiteli v procesu Node.js bez sandboxu. Měl by být používán pouze pro důvěryhodný kód při vývoji. Pro produkční nasazení, která pracují s nedůvěryhodným kódem, důrazně doporučujeme použít `SERVERLESS_TYPE=LAMBDA` nebo `SERVERLESS_TYPE=DISABLED`.
**Upozornění na zabezpečení:** Místní ovladač (`SERVERLESS_TYPE=LOCAL`) spouští kód přímo na hostiteli v procesu Node.js bez sandboxu. Měl by být používán pouze pro důvěryhodný kód při vývoji. Pro produkční nasazení, která pracují s nedůvěryhodným kódem, důrazně doporučujeme použít `SERVERLESS_TYPE=LAMBDA` nebo `SERVERLESS_TYPE=DISABLED`.
</Warning>
### Dostupné ovladače
| Ovladač | Proměnná prostředí | Případ použití | Úroveň zabezpečení |
| --------- | -------------------------- | ------------------------------------------ | ----------------------------------- |
| Neaktivní | `SERVERLESS_TYPE=DISABLED` | Úplně zakázat serverless funkce | N/A |
| Neaktivní | `SERVERLESS_TYPE=DISABLED` | Úplně zakázat logické funkce | N/A |
| Lokální | `SERVERLESS_TYPE=LOCAL` | Vývojová a důvěryhodná prostředí | Nízká (bez sandboxu) |
| Lambda | `SERVERLESS_TYPE=LAMBDA` | Produkční prostředí s nedůvěryhodným kódem | Vysoká (izolace na úrovni hardwaru) |
@@ -326,12 +326,12 @@ SERVERLESS_LAMBDA_ACCESS_KEY_ID=your-access-key
SERVERLESS_LAMBDA_SECRET_ACCESS_KEY=your-secret-key
```
**Pro zakázání serverless funkcí:**
**Pro zakázání logických funkcí:**
```bash
SERVERLESS_TYPE=DISABLED
```
<Note>
Při použití `SERVERLESS_TYPE=DISABLED` skončí každý pokus o spuštění serverless funkce chybou. To je užitečné, pokud chcete provozovat Twenty bez podpory serverless funkcí.
Při použití `SERVERLESS_TYPE=DISABLED` skončí každý pokus o spuštění logické funkce chybou. To je užitečné, pokud chcete provozovat Twenty bez podpory logických funkcí.
</Note>
@@ -9,7 +9,7 @@ API (rozhraní pro programování aplikací) umožňuje propojení Twenty s dal
## Aplikace
Aplikace jsou vlastní rozšíření vytvořená jako kód, která mohou definovat datové modely a bezserverové funkce. Umožňují vývojářům vytvářet znovupoužitelné přizpůsobení, které lze nasadit do více pracovních prostorů.
Aplikace jsou vlastní rozšíření vytvořená jako kód, která mohou definovat datové modely a logické funkce. Umožňují vývojářům vytvářet znovupoužitelné přizpůsobení, které lze nasadit do více pracovních prostorů.
## Akce kódu
@@ -136,7 +136,7 @@ K e-mailům odesílaným z pracovních postupů můžete přikládat soubory. P
| **Potvrzení událostí** | Podrobnosti o události nebo program |
<Note>
Přílohy jsou statické—všem příjemcům se posílá stejný soubor. U dynamických dokumentů (například personalizovaných nabídek) soubory vygenerujte a přiložte pomocí [Serverless funkce](/l/cs/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty).
Přílohy jsou statické—všem příjemcům se posílá stejný soubor. U dynamických dokumentů (například personalizovaných nabídek) soubory vygenerujte a přiložte pomocí [Logic funkce](/l/cs/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty).
</Note>
## Osvědčené postupy
@@ -256,7 +256,7 @@ Spouští vlastní JavaScript ve vašem pracovním postupu.
* Testovat kód přímo ve kroku
<Note>
Pokud potřebujete ve svém kódu použít externí klíče API, musíte je zadat přímo do těla funkce. Klíče API nelze nakonfigurovat jinde a odkazovat na ně v bezserverové funkci.
Pokud potřebujete ve svém kódu použít externí klíče API, musíte je zadat přímo do těla funkce. You cannot configure API keys elsewhere and reference them in the logic function.
</Note>
<Tip>
@@ -7,7 +7,7 @@ Automaticky vygenerujte nebo získejte PDF a připojte ho k záznamu v Twenty. T
## Přehled
Tento pracovní postup používá **Ruční spouštěč**, takže uživatelé mohou na požádání vygenerovat PDF pro libovolný vybraný záznam. O zpracování se stará **Serverless funkce**:
Tento pracovní postup používá **Ruční spouštěč**, takže uživatelé mohou na požádání vygenerovat PDF pro libovolný vybraný záznam. O zpracování se stará **logická funkce**:
1. Stažení PDF z adresy URL (ze služby pro generování PDF)
2. Nahrání souboru do Twenty
@@ -17,7 +17,7 @@ Tento pracovní postup používá **Ruční spouštěč**, takže uživatelé mo
Než nastavíte pracovní postup:
1. **Vytvořte klíč API**: Přejděte do **Nastavení → API** a vytvořte nový klíč API. Tento token budete potřebovat pro serverless funkci.
1. **Vytvořte klíč API**: Přejděte do **Nastavení → API** a vytvořte nový klíč API. Tento token budete potřebovat pro logickou funkci.
2. **Nastavte službu pro generování PDF** (volitelné): Pokud chcete dynamicky generovat PDF (např. nabídky), použijte službu jako Carbone, PDFMonkey nebo DocuSeal k vytvoření PDF a získání adresy URL pro stažení.
## Nastavení krok za krokem
@@ -32,9 +32,9 @@ Než nastavíte pracovní postup:
S **Ručním spouštěčem** mohou uživatelé spustit tento pracovní postup pomocí tlačítka, které se zobrazí vpravo nahoře po výběru záznamu, aby vygenerovali a připojili PDF.
</Tip>
### Krok 2: Přidejte serverless funkci
### Krok 2: Přidejte logickou funkci
1. Přidejte akci **Serverless funkce**
1. Přidejte akci **Code** (logická funkce)
2. Vytvořte novou funkci pomocí kódu níže
3. Nakonfigurujte vstupní parametry
@@ -45,10 +45,10 @@ Než nastavíte pracovní postup:
| `companyId` | `{{trigger.object.id}}` |
<Note>
Pokud připojujete k jinému objektu (Osoba, Příležitost apod.), přejmenujte parametr podle toho (např. `personId`, `opportunityId`) a aktualizujte serverless funkci.
Pokud připojujete k jinému objektu (Osoba, Příležitost apod.), přejmenujte parametr podle toho (např. `personId`, `opportunityId`) a aktualizujte logickou funkci.
</Note>
#### Kód serverless funkce
#### Kód logické funkce
```typescript
export const main = async (
@@ -172,7 +172,7 @@ Aktualizujte jak parametr funkce, tak objekt `variables.data` v mutaci přílohy
Pokud používáte službu pro generování PDF, můžete:
1. Nejprve proveďte akci HTTP Request pro vygenerování PDF
2. Předejte vrácenou adresu URL PDF serverless funkci jako parametr
2. Předejte vrácenou adresu URL PDF logické funkci jako parametr
```typescript
export const main = async (
@@ -211,7 +211,7 @@ Pro vytváření dynamických nabídek nebo faktur:
* **DocuSeal** - Platforma pro automatizaci dokumentů
* **Documint** - Generování dokumentů primárně přes API
Každá služba poskytuje API, které vrací adresu URL PDF, kterou pak můžete předat serverless funkci.
Každá služba poskytuje API, které vrací adresu URL PDF, kterou pak můžete předat logické funkci.
## Řešení potíží
@@ -224,5 +224,5 @@ Každá služba poskytuje API, které vrací adresu URL PDF, kterou pak můžete
## Související
* [Spouštěče pracovních postupů](/l/cs/user-guide/workflows/capabilities/workflow-triggers)
* [Serverless funkce](/l/cs/user-guide/workflows/capabilities/workflow-actions#serverless-function)
* [Logické funkce](/l/cs/user-guide/workflows/capabilities/workflow-actions#code)
* [Vygenerujte nabídku nebo fakturu z Twenty](/l/cs/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty)
@@ -131,7 +131,7 @@ description: Často kladené otázky k pracovním postupům v Twenty.
</Accordion>
<Accordion title="Jaký je maximální čas spuštění pro akce Code?">
Akce Code (serverless funkce) mají **výchozí časový limit 5 minut** (300 sekund).
Akce Code (logické funkce) mají **výchozí časový limit 5 minut** (300 sekund).
Maximální nastavitelný časový limit je **15 minut** (900 sekund).
@@ -9,12 +9,12 @@ description: Twenty-Anpassungen als Code erstellen und verwalten.
## Was sind Apps?
Mit Apps können Sie Twenty-Anpassungen **als Code** erstellen und verwalten. Anstatt alles über die UI zu konfigurieren, definieren Sie Ihr Datenmodell und serverlose Funktionen im Code — das beschleunigt Entwicklung, Wartung und Rollout auf mehrere Workspaces.
Mit Apps können Sie Twenty-Anpassungen **als Code** erstellen und verwalten. Anstatt alles über die UI zu konfigurieren, definieren Sie Ihr Datenmodell und Logikfunktionen im Code — das beschleunigt Entwicklung, Wartung und den Rollout auf mehrere Workspaces.
**Was Sie heute tun können:**
* Benutzerdefinierte Objekte und Felder als Code definieren (verwaltetes Datenmodell)
* Serverlose Funktionen mit benutzerdefinierten Triggern erstellen
* Logikfunktionen mit benutzerdefinierten Triggern erstellen
* Dieselbe App in mehreren Workspaces bereitstellen
**Bald verfügbar:**
@@ -156,23 +156,23 @@ src/
Auf hoher Ebene:
* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall`, and `auth:login` that delegate to the local `twenty` CLI.
* **package.json**: Deklariert den App-Namen, die Version, Engines (Node 24+, Yarn 4) und fügt `twenty-sdk` sowie Skripte wie `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall` und `auth:login` hinzu, die an die lokale `twenty`-CLI delegieren.
* **.gitignore**: Ignoriert übliche Artefakte wie `node_modules`, `.yarn`, `generated/` (typisierter Client), `dist/`, `build/`, Coverage-Ordner, Logdateien und `.env*`-Dateien.
* **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Fixieren und konfigurieren die vom Projekt verwendete Yarn-4-Toolchain.
* **.nvmrc**: Legt die vom Projekt erwartete Node.js-Version fest.
* **eslint.config.mjs** und **tsconfig.json**: Stellen Linting und TypeScript-Konfiguration für die TypeScript-Quellen Ihrer App bereit.
* **README.md**: Ein kurzes README im App-Root mit grundlegenden Anweisungen.
* **src/**: The main place where you define your application-as-code:
* **src/**: Der Hauptort, an dem Sie Ihre Anwendung als Code definieren:
* `application.config.ts`: Globale Konfiguration für Ihre App (Metadaten und Laufzeit-Anbindung). Siehe unten „Anwendungskonfiguration“.
* `*.role.ts`: Rollendefinitionen, die von Ihren serverlosen Funktionen verwendet werden. Siehe unten „Standard-Funktionsrolle“.
* `*.role.ts`: Rollendefinitionen, die von Ihren Logikfunktionen verwendet werden. Siehe unten „Standard-Funktionsrolle“.
* `*.object.ts`: Benutzerdefinierte Objektdefinitionen.
* `*.function.ts`: Definitionen serverloser Funktionen.
* `*.front-component.tsx`: Front component definitions.
* `*.function.ts`: Definitionen von Logikfunktionen.
* `*.front-component.tsx`: Front-Komponenten-Definitionen.
Spätere Befehle fügen weitere Dateien und Ordner hinzu:
* `yarn app:generate` erstellt einen `generated/`-Ordner (typisierter Twenty-Client + Workspace-Typen).
* `yarn entity:add` will add entity definition files under `src/` for your custom objects, functions, front components, or roles.
* `yarn entity:add` fügt unter `src/` Entitätsdefinitionsdateien für Ihre benutzerdefinierten Objekte, Funktionen, Front-Komponenten oder Rollen hinzu.
## Authentifizierung
@@ -219,7 +219,7 @@ Das SDK stellt vier Hilfsfunktionen mit eingebauter Validierung bereit, um Ihre
| ------------------ | ---------------------------------------------------- |
| `defineApp()` | Anwendungsmetadaten konfigurieren |
| `defineObject()` | Benutzerdefinierte Objekte mit Feldern definieren |
| `defineFunction()` | Serverlose Funktionen mit Handlern definieren |
| `defineFunction()` | Logikfunktionen mit Handlern definieren |
| `defineRole()` | Rollenberechtigungen und Objektzugriff konfigurieren |
Diese Funktionen validieren Ihre Konfiguration zur Laufzeit und bieten bessere IDE-Autovervollständigung sowie Typsicherheit.
@@ -303,7 +303,7 @@ Hauptpunkte:
* Der `universalIdentifier` muss eindeutig und über Deployments hinweg stabil sein.
* Jedes Feld benötigt `name`, `type`, `label` und einen eigenen stabilen `universalIdentifier`.
* Das Array `fields` ist optional — Sie können Objekte ohne benutzerdefinierte Felder definieren.
* You can scaffold new objects using `yarn entity:add`, which guides you through naming, fields, and relationships.
* Sie können mit `yarn entity:add` neue Objekte erzeugen; der Assistent führt Sie durch Benennung, Felder und Beziehungen.
<Note>
**Basisfelder werden automatisch erstellt.** Wenn Sie ein benutzerdefiniertes Objekt definieren, fügt Twenty automatisch Standardfelder wie `name`, `createdAt`, `updatedAt`, `createdBy`, `position` und `deletedAt` hinzu. Sie müssen diese nicht in Ihrem `fields`-Array definieren — fügen Sie nur Ihre benutzerdefinierten Felder hinzu.
@@ -349,7 +349,7 @@ Notizen:
#### Rollen und Berechtigungen
Anwendungen können Rollen definieren, die Berechtigungen für die Objekte und Aktionen Ihres Workspaces kapseln. Das Feld `functionRoleUniversalIdentifier` in `application.config.ts` legt die Standardrolle fest, die von den serverlosen Funktionen Ihrer App verwendet wird.
Anwendungen können Rollen definieren, die Berechtigungen für die Objekte und Aktionen Ihres Workspaces kapseln. Das Feld `functionRoleUniversalIdentifier` in `application.config.ts` legt die Standardrolle fest, die von den Logikfunktionen Ihrer App verwendet wird.
* Der zur Laufzeit als `TWENTY_API_KEY` injizierte API-Schlüssel wird von dieser Standard-Funktionsrolle abgeleitet.
* Der typisierte Client ist auf die dieser Rolle gewährten Berechtigungen beschränkt.
@@ -411,7 +411,7 @@ Notizen:
* `permissionFlags` steuern den Zugriff auf Funktionen auf Plattformebene. Halten Sie sie minimal; fügen Sie nur hinzu, was Sie benötigen.
* Ein funktionierendes Beispiel finden Sie in der Hello-World-App: [`packages/twenty-apps/hello-world/src/roles/function-role.ts`](https://github.com/twentyhq/twenty/blob/main/packages/twenty-apps/hello-world/src/roles/function-role.ts).
### Konfiguration serverloser Funktionen und Einstiegspunkt
### Konfiguration von Logikfunktionen und Einstiegspunkt
Jede Funktionsdatei verwendet `defineFunction()`, um eine Konfiguration mit einem Handler und optionalen Triggern zu exportieren. Verwenden Sie die Dateiendung `*.function.ts` für die automatische Erkennung.
@@ -510,7 +510,7 @@ Notizen:
**So migrieren Sie bestehende Funktionen:** Aktualisieren Sie Ihren Handler, sodass er nicht mehr direkt aus dem params-Objekt destrukturiert, sondern aus `event.body`, `event.queryStringParameters` oder `event.pathParameters`.
</Warning>
Wenn ein Routen-Trigger Ihre Funktion aufruft, erhält sie ein `RoutePayload`-Objekt, das dem AWS-HTTP-API-v2-Format entspricht. Importieren Sie den Typ aus `twenty-sdk`:
Wenn ein Routen-Trigger Ihre Logikfunktion aufruft, erhält sie ein `RoutePayload`-Objekt, das dem AWS HTTP API v2-Format entspricht. Importieren Sie den Typ aus `twenty-sdk`:
```typescript
import { defineFunction, type RoutePayload } from 'twenty-sdk';
@@ -540,7 +540,7 @@ Der Typ `RoutePayload` hat die folgende Struktur:
### Weiterleiten von HTTP-Headern
Standardmäßig werden HTTP-Header von eingehenden Anfragen aus Sicherheitsgründen nicht an Ihre serverlose Funktion weitergegeben. Um auf bestimmte Header zuzugreifen, listen Sie diese explizit im Array `forwardedRequestHeaders` auf:
Standardmäßig werden HTTP-Header von eingehenden Anfragen aus Sicherheitsgründen nicht an Ihre Logikfunktion weitergegeben. Um auf bestimmte Header zuzugreifen, listen Sie diese explizit im Array `forwardedRequestHeaders` auf:
```typescript
export default defineFunction({
@@ -578,7 +578,7 @@ const handler = async (event: RoutePayload) => {
Sie können neue Funktionen auf zwei Arten erstellen:
* **Scaffolded**: Run `yarn entity:add` and choose the option to add a new function. Dadurch wird eine Starterdatei mit Handler und Konfiguration erzeugt.
* **Generiert**: Führen Sie `yarn entity:add` aus und wählen Sie die Option zum Hinzufügen einer neuen Funktion. Dadurch wird eine Starterdatei mit Handler und Konfiguration erzeugt.
* **Manuell**: Erstellen Sie eine neue `*.function.ts`-Datei und verwenden Sie `defineFunction()` nach demselben Muster.
### Generierter typisierter Client
@@ -592,9 +592,9 @@ const client = new Twenty();
const { me } = await client.query({ me: { id: true, displayName: true } });
```
Der Client wird durch `yarn app:generate` erneut generiert. Re-run after changing your objects or when onboarding to a new workspace.
Der Client wird durch `yarn app:generate` erneut generiert. Führen Sie ihn nach Änderungen an Ihren Objekten oder beim Onboarding in einen neuen Workspace erneut aus.
#### Laufzeit-Anmeldedaten in serverlosen Funktionen
#### Laufzeit-Anmeldedaten in Logikfunktionen
Wenn Ihre Funktion auf Twenty läuft, injiziert die Plattform vor der Ausführung Ihres Codes Anmeldedaten als Umgebungsvariablen:
@@ -604,7 +604,7 @@ Wenn Ihre Funktion auf Twenty läuft, injiziert die Plattform vor der Ausführun
Notizen:
* Sie müssen dem generierten Client weder URL noch API-Schlüssel übergeben. Er liest `TWENTY_API_URL` und `TWENTY_API_KEY` zur Laufzeit aus process.env.
* Die Berechtigungen des API-Schlüssels werden durch die Rolle bestimmt, auf die in Ihrer `application.config.ts` über `functionRoleUniversalIdentifier` verwiesen wird. Dies ist die Standardrolle, die von den serverlosen Funktionen Ihrer Anwendung verwendet wird.
* Die Berechtigungen des API-Schlüssels werden durch die Rolle bestimmt, auf die in Ihrer `application.config.ts` über `functionRoleUniversalIdentifier` verwiesen wird. Dies ist die Standardrolle, die von den Logikfunktionen Ihrer Anwendung verwendet wird.
* Anwendungen können Rollen definieren, um das Least-Privilege-Prinzip einzuhalten. Gewähren Sie nur die Berechtigungen, die Ihre Funktionen benötigen, und verweisen Sie dann mit `functionRoleUniversalIdentifier` auf den universellen Bezeichner dieser Rolle.
### Hello-World-Beispiel
@@ -640,13 +640,13 @@ Fügen Sie dann Skripte wie diese hinzu:
}
```
Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:generate`, etc.
Jetzt können Sie dieselben Befehle über Yarn ausführen, z. B. `yarn app:dev`, `yarn app:generate` usw.
## Fehlerbehebung
* Authentifizierungsfehler: Führen Sie `yarn auth:login` aus und stellen Sie sicher, dass Ihr API-Schlüssel die erforderlichen Berechtigungen hat.
* Verbindung zum Server nicht möglich: Überprüfen Sie die API-URL und dass der Twenty-Server erreichbar ist.
* Types or client missing/outdated: run `yarn app:generate`.
* Typen oder Client fehlen/veraltet: Führen Sie `yarn app:generate` aus.
* Dev-Modus synchronisiert nicht: Stellen Sie sicher, dass `yarn app:dev` läuft und dass Änderungen von Ihrer Umgebung nicht ignoriert werden.
Discord-Hilfekanal: https://discord.com/channels/1130383047699738754/1130386664812982322
@@ -292,19 +292,19 @@ yarn command:prod cron:workflow:automated-cron-trigger
**Nur-Umgebungsmodus:** Wenn Sie `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false` setzen, fügen Sie diese Variablen stattdessen Ihrer `.env`-Datei hinzu.
</Warning>
## Serverlose Funktionen
## Logikfunktionen
Twenty unterstützt serverlose Funktionen für Workflows und benutzerdefinierte Logik. Die Ausführungsumgebung wird über die Umgebungsvariable `SERVERLESS_TYPE` konfiguriert.
Twenty unterstützt Logikfunktionen für Workflows und benutzerdefinierte Logik. Die Ausführungsumgebung wird über die Umgebungsvariable `SERVERLESS_TYPE` konfiguriert.
<Warning>
**Sicherheitshinweis:** Der lokale serverlose Treiber (`SERVERLESS_TYPE=LOCAL`) führt Code ohne Sandbox direkt auf dem Host in einem Node.js-Prozess aus. Er sollte nur für vertrauenswürdigen Code in der Entwicklung verwendet werden. Für Produktivbereitstellungen, die nicht vertrauenswürdigen Code verarbeiten, empfehlen wir nachdrücklich, `SERVERLESS_TYPE=LAMBDA` oder `SERVERLESS_TYPE=DISABLED` zu verwenden.
**Sicherheitshinweis:** Der lokale Treiber (`SERVERLESS_TYPE=LOCAL`) führt Code ohne Sandbox direkt auf dem Host in einem Node.js-Prozess aus. Er sollte nur für vertrauenswürdigen Code in der Entwicklung verwendet werden. Für Produktivbereitstellungen, die nicht vertrauenswürdigen Code verarbeiten, empfehlen wir nachdrücklich, `SERVERLESS_TYPE=LAMBDA` oder `SERVERLESS_TYPE=DISABLED` zu verwenden.
</Warning>
### Verfügbare Treiber
| Treiber | Umgebungsvariable | Anwendungsfall | Sicherheitsstufe |
| ----------- | -------------------------- | -------------------------------------------------- | ---------------------------------- |
| Deaktiviert | `SERVERLESS_TYPE=DISABLED` | Serverlose Funktionen vollständig deaktivieren | N/A |
| Deaktiviert | `SERVERLESS_TYPE=DISABLED` | Logikfunktionen vollständig deaktivieren | N/A |
| Lokal | `SERVERLESS_TYPE=LOCAL` | Entwicklung und vertrauenswürdige Umgebungen | Niedrig (keine Sandbox) |
| Lambda | `SERVERLESS_TYPE=LAMBDA` | Produktivbetrieb mit nicht vertrauenswürdigem Code | Hoch (Isolation auf Hardwareebene) |
@@ -326,12 +326,12 @@ SERVERLESS_LAMBDA_ACCESS_KEY_ID=your-access-key
SERVERLESS_LAMBDA_SECRET_ACCESS_KEY=your-secret-key
```
**Zum Deaktivieren serverloser Funktionen:**
**Zum Deaktivieren von Logikfunktionen:**
```bash
SERVERLESS_TYPE=DISABLED
```
<Note>
Bei Verwendung von `SERVERLESS_TYPE=DISABLED` führt jeder Versuch, eine serverlose Funktion auszuführen, zu einem Fehler. Dies ist nützlich, wenn Sie Twenty ohne Unterstützung für serverlose Funktionen betreiben möchten.
Bei Verwendung von `SERVERLESS_TYPE=DISABLED` führt jeder Versuch, eine Logikfunktion auszuführen, zu einem Fehler. Dies ist nützlich, wenn Sie Twenty ohne Unterstützung für Logikfunktionen betreiben möchten.
</Note>
@@ -9,7 +9,7 @@ API (Application Programming Interface) ermöglicht es Ihnen, Twenty mit anderen
## Apps
Apps sind benutzerdefinierte Erweiterungen, die als Code erstellt werden und Datenmodelle sowie serverlose Funktionen definieren können. Damit können Entwickler wiederverwendbare Anpassungen erstellen, die in mehreren Workspaces bereitgestellt werden können.
Apps sind benutzerdefinierte Erweiterungen, die als Code erstellt werden und Datenmodelle sowie Logikfunktionen definieren können. Damit können Entwickler wiederverwendbare Anpassungen erstellen, die in mehreren Workspaces bereitgestellt werden können.
## Code-Aktionen
@@ -136,7 +136,7 @@ Sie können Dateien an E-Mails anhängen, die von Workflows gesendet werden. Der
| **Veranstaltungsbestätigungen** | Veranstaltungsdetails oder Agenda |
<Note>
Anhänge sind statisch—dieselbe Datei wird an alle Empfänger gesendet. Für dynamische Dokumente (z. B. personalisierte Angebote) erstellen und hängen Sie Dateien mithilfe einer [Serverless-Funktion](/l/de/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty) an.
Anhänge sind statisch—dieselbe Datei wird an alle Empfänger gesendet. For dynamic documents (like personalized quotes), generate and attach files using a [Logic Function](/l/de/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty).
</Note>
## Beste Praktiken
@@ -256,7 +256,7 @@ Führt benutzerdefiniertes JavaScript in Ihrem Workflow aus.
* Code direkt im Schritt testen
<Note>
If you need to use external API keys in your code, you must input them directly in the function body. You cannot configure API keys elsewhere and reference them in the serverless function.
If you need to use external API keys in your code, you must input them directly in the function body. Sie können API-Schlüssel nicht an anderer Stelle konfigurieren und sie dann in der Logikfunktion referenzieren.
</Note>
<Tip>
@@ -7,7 +7,7 @@ Automatisch ein PDF generieren oder abrufen und an einen Datensatz in Twenty anh
## Übersicht
Dieser Workflow verwendet einen **Manuellen Auslöser**, damit Benutzer bei Bedarf für jeden ausgewählten Datensatz ein PDF generieren können. Eine **Serverlose Funktion** übernimmt:
Dieser Workflow verwendet einen **Manuellen Auslöser**, damit Benutzer bei Bedarf für jeden ausgewählten Datensatz ein PDF generieren können. Eine **Logikfunktion** übernimmt:
1. Das Herunterladen des PDFs von einer URL (von einem PDF-Generierungsdienst)
2. Das Hochladen der Datei in Twenty
@@ -17,7 +17,7 @@ Dieser Workflow verwendet einen **Manuellen Auslöser**, damit Benutzer bei Beda
Bevor Sie den Workflow einrichten:
1. **API-Schlüssel erstellen**: Gehen Sie zu **Einstellungen → APIs** und erstellen Sie einen neuen API-Schlüssel. Sie benötigen dieses Token für die serverlose Funktion.
1. **API-Schlüssel erstellen**: Gehen Sie zu **Einstellungen → APIs** und erstellen Sie einen neuen API-Schlüssel. Sie benötigen dieses Token für die Logikfunktion.
2. **Richten Sie einen PDF-Generierungsdienst ein** (optional): Wenn Sie PDFs dynamisch generieren möchten (z. B. Angebote), verwenden Sie einen Dienst wie Carbone, PDFMonkey oder DocuSeal, um das PDF zu erstellen und eine Download-URL zu erhalten.
## Schritt-für-Schritt-Einrichtung
@@ -32,9 +32,9 @@ Bevor Sie den Workflow einrichten:
Mit einem manuellen Auslöser können Benutzer diesen Workflow über eine Schaltfläche ausführen, die oben rechts erscheint, sobald ein Datensatz ausgewählt ist, um ein PDF zu generieren und anzuhängen.
</Tip>
### Schritt 2: Serverlose Funktion hinzufügen
### Schritt 2: Logikfunktion hinzufügen
1. Fügen Sie eine **Serverlose Funktion**-Aktion hinzu
1. Fügen Sie eine **Code**-Aktion (Logikfunktion) hinzu
2. Erstellen Sie eine neue Funktion mit dem folgenden Code
3. Konfigurieren Sie die Eingabeparameter
@@ -45,10 +45,10 @@ Bevor Sie den Workflow einrichten:
| `companyId` | `{{trigger.object.id}}` |
<Note>
Wenn Sie an ein anderes Objekt anhängen (Person, Opportunity usw.), benennen Sie den Parameter entsprechend um (z. B. `personId`, `opportunityId`) und aktualisieren Sie die serverlose Funktion.
Wenn Sie an ein anderes Objekt anhängen (Person, Opportunity usw.), benennen Sie den Parameter entsprechend um (z. B. `personId`, `opportunityId`) und aktualisieren Sie die Logikfunktion.
</Note>
#### Code der serverlosen Funktion
#### Code der Logikfunktion
```typescript
export const main = async (
@@ -172,7 +172,7 @@ Aktualisieren Sie sowohl den Funktionsparameter als auch das Objekt `variables.d
Wenn Sie einen PDF-Generierungsdienst verwenden, können Sie:
1. Führen Sie zuerst eine HTTP-Request-Aktion aus, um das PDF zu generieren
2. Übergeben Sie die zurückgegebene PDF-URL als Parameter an die serverlose Funktion
2. Übergeben Sie die zurückgegebene PDF-URL als Parameter an die Logikfunktion
```typescript
export const main = async (
@@ -211,7 +211,7 @@ Zum Erstellen dynamischer Angebote oder Rechnungen:
* **DocuSeal** Plattform für Dokumentenautomatisierung
* **Documint** API-first-Dokumentenerstellung
Jeder Dienst stellt eine API bereit, die eine PDF-URL zurückgibt, die Sie anschließend an die serverlose Funktion übergeben können.
Jeder Dienst stellt eine API bereit, die eine PDF-URL zurückgibt, die Sie anschließend an die Logikfunktion übergeben können.
## Fehlerbehebung
@@ -224,5 +224,5 @@ Jeder Dienst stellt eine API bereit, die eine PDF-URL zurückgibt, die Sie ansch
## Verwandt
* [Workflow-Trigger](/l/de/user-guide/workflows/capabilities/workflow-triggers)
* [Serverlose Funktionen](/l/de/user-guide/workflows/capabilities/workflow-actions#serverless-function)
* [Logikfunktionen](/l/de/user-guide/workflows/capabilities/workflow-actions#code)
* [Ein Angebot oder eine Rechnung aus Twenty generieren](/l/de/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty)
@@ -131,7 +131,7 @@ description: Häufig gestellte Fragen zu Workflows in Twenty.
</Accordion>
<Accordion title="Wie lang ist die maximale Ausführungszeit für Code-Aktionen?">
Code-Aktionen (serverlose Funktionen) haben ein **Standard-Timeout von 5 Minuten** (300 Sekunden).
Code-Aktionen (Logikfunktionen) haben ein **Standard-Timeout von 5 Minuten** (300 Sekunden).
Das maximal konfigurierbare Timeout beträgt **15 Minuten** (900 Sekunden).
@@ -9,12 +9,12 @@ description: Crea y gestiona personalizaciones de Twenty como código.
## ¿Qué son las aplicaciones?
Las aplicaciones te permiten crear y administrar personalizaciones de Twenty **como código**. En lugar de configurar todo a través de la interfaz de usuario, defines tu modelo de datos y funciones sin servidor en código, lo que hace más rápido crear, mantener y desplegar en múltiples espacios de trabajo.
Las aplicaciones te permiten crear y administrar personalizaciones de Twenty **como código**. En lugar de configurar todo a través de la interfaz de usuario, defines tu modelo de datos y funciones de lógica en código, lo que hace más rápido crear, mantener y desplegar en múltiples espacios de trabajo.
**Lo que puedes hacer hoy:**
* Define objetos y campos personalizados como código (modelo de datos gestionado)
* Crea funciones sin servidor con desencadenadores personalizados
* Crea funciones de lógica con desencadenadores personalizados
* Despliega la misma aplicación en múltiples espacios de trabajo
**Próximamente:**
@@ -156,23 +156,23 @@ src/
A grandes rasgos:
* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall`, and `auth:login` that delegate to the local `twenty` CLI.
* **package.json**: Declara el nombre de la aplicación, la versión, los entornos (Node 24+, Yarn 4) y agrega `twenty-sdk` además de scripts como `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall` y `auth:login` que delegan en la CLI local `twenty`.
* **.gitignore**: Ignora artefactos comunes como `node_modules`, `.yarn`, `generated/` (cliente tipado), `dist/`, `build/`, carpetas de cobertura, archivos de registro y archivos `.env*`.
* **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Bloquean y configuran la cadena de herramientas Yarn 4 utilizada por el proyecto.
* **.nvmrc**: Fija la versión de Node.js esperada por el proyecto.
* **eslint.config.mjs** y **tsconfig.json**: Proporcionan linting y configuración de TypeScript para las fuentes de TypeScript de tu aplicación.
* **README.md**: Un README breve en la raíz de la aplicación con instrucciones básicas.
* **src/**: The main place where you define your application-as-code:
* **src/**: El lugar principal donde defines tu aplicación como código:
* `application.config.ts`: Configuración global de tu aplicación (metadatos y vinculación en tiempo de ejecución). Consulta "Configuración de la aplicación" más abajo.
* `*.role.ts`: Definiciones de roles usadas por tus funciones sin servidor. Consulta "Rol de función predeterminado" más abajo.
* `*.role.ts`: Definiciones de roles usadas por tus funciones de lógica. Consulta "Rol de función predeterminado" más abajo.
* `*.object.ts`: Definiciones de objetos personalizados.
* `*.function.ts`: Definiciones de funciones sin servidor.
* `*.front-component.tsx`: Front component definitions.
* `*.function.ts`: Definiciones de funciones de lógica.
* `*.front-component.tsx`: Definiciones de componentes de interfaz.
Comandos posteriores añadirán más archivos y carpetas:
* `yarn app:generate` creará una carpeta `generated/` (cliente tipado de Twenty + tipos del espacio de trabajo).
* `yarn entity:add` will add entity definition files under `src/` for your custom objects, functions, front components, or roles.
* `yarn entity:add` añadirá archivos de definición de entidades en `src/` para tus objetos, funciones, componentes de interfaz o roles personalizados.
## Autenticación
@@ -215,12 +215,12 @@ El twenty-sdk proporciona bloques de construcción tipados y funciones auxiliare
El SDK proporciona cuatro funciones auxiliares con validación incorporada para definir las entidades de tu aplicación:
| Función | Propósito |
| ------------------ | ----------------------------------------------- |
| `defineApp()` | Configura los metadatos de la aplicación |
| `defineObject()` | Define objetos personalizados con campos |
| `defineFunction()` | Define funciones sin servidor con controladores |
| `defineRole()` | Configura permisos de roles y acceso a objetos |
| Función | Propósito |
| ------------------ | ---------------------------------------------- |
| `defineApp()` | Configura los metadatos de la aplicación |
| `defineObject()` | Define objetos personalizados con campos |
| `defineFunction()` | Define funciones de lógica con controladores |
| `defineRole()` | Configura permisos de roles y acceso a objetos |
Estas funciones validan tu configuración en tiempo de ejecución y proporcionan un mejor autocompletado en el IDE y seguridad de tipos.
@@ -303,7 +303,7 @@ Puntos clave:
* El `universalIdentifier` debe ser único y estable entre implementaciones.
* Cada campo requiere `name`, `type`, `label` y su propio `universalIdentifier` estable.
* La matriz `fields` es opcional: puedes definir objetos sin campos personalizados.
* You can scaffold new objects using `yarn entity:add`, which guides you through naming, fields, and relationships.
* Puedes generar nuevos objetos usando `yarn entity:add`, que te guía por el nombrado, los campos y las relaciones.
<Note>
**Los campos base se crean automáticamente.** Cuando defines un objeto personalizado, Twenty añade automáticamente campos estándar como `name`, `createdAt`, `updatedAt`, `createdBy`, `position` y `deletedAt`. No necesitas definir estos en tu matriz `fields` — solo agrega tus campos personalizados.
@@ -349,7 +349,7 @@ Notas:
#### Roles y permisos
Las aplicaciones pueden definir roles que encapsulan permisos sobre los objetos y acciones de tu espacio de trabajo. El campo `functionRoleUniversalIdentifier` en `application.config.ts` designa el rol predeterminado que usan las funciones sin servidor de tu aplicación.
Las aplicaciones pueden definir roles que encapsulan permisos sobre los objetos y acciones de tu espacio de trabajo. El campo `functionRoleUniversalIdentifier` en `application.config.ts` designa el rol predeterminado que usan las funciones de lógica de tu aplicación.
* La clave de API en tiempo de ejecución inyectada como `TWENTY_API_KEY` se deriva de este rol de función predeterminado.
* El cliente tipado estará restringido a los permisos otorgados a ese rol.
@@ -411,7 +411,7 @@ Notas:
* `permissionFlags` controla el acceso a capacidades a nivel de plataforma. Mantenlos al mínimo; agrega solo lo que necesites.
* Consulta un ejemplo funcional en la aplicación Hello World: [`packages/twenty-apps/hello-world/src/roles/function-role.ts`](https://github.com/twentyhq/twenty/blob/main/packages/twenty-apps/hello-world/src/roles/function-role.ts).
### Configuración y punto de entrada de funciones sin servidor
### Configuración y punto de entrada de funciones de lógica
Cada archivo de función usa `defineFunction()` para exportar una configuración con un controlador y desencadenadores opcionales. Usa el sufijo de archivo `*.function.ts` para la detección automática.
@@ -510,7 +510,7 @@ Notas:
**Para migrar las funciones existentes:** Actualiza tu controlador para desestructurar desde `event.body`, `event.queryStringParameters` o `event.pathParameters` en lugar de hacerlo directamente desde el objeto params.
</Warning>
Cuando un disparador de ruta invoca tu función, esta recibe un objeto `RoutePayload` que sigue el formato de AWS HTTP API v2. Importa el tipo desde `twenty-sdk`:
Cuando un disparador de ruta invoca tu función de lógica, esta recibe un objeto `RoutePayload` que sigue el formato de AWS HTTP API v2. Importa el tipo desde `twenty-sdk`:
```typescript
import { defineFunction, type RoutePayload } from 'twenty-sdk';
@@ -540,7 +540,7 @@ El tipo `RoutePayload` tiene la siguiente estructura:
### Reenvío de encabezados HTTP
De forma predeterminada, los encabezados HTTP de las solicitudes entrantes **no** se pasan a tu función sin servidor por razones de seguridad. Para acceder a encabezados específicos, enuméralos explícitamente en el arreglo `forwardedRequestHeaders`:
De forma predeterminada, los encabezados HTTP de las solicitudes entrantes **no** se pasan a tu función de lógica por razones de seguridad. Para acceder a encabezados específicos, enuméralos explícitamente en el arreglo `forwardedRequestHeaders`:
```typescript
export default defineFunction({
@@ -578,7 +578,7 @@ const handler = async (event: RoutePayload) => {
Puedes crear funciones nuevas de dos maneras:
* **Scaffolded**: Run `yarn entity:add` and choose the option to add a new function. Esto genera un archivo inicial con un controlador y configuración.
* **Generado**: Ejecuta `yarn entity:add` y elige la opción para añadir una nueva funcn. Esto genera un archivo inicial con un controlador y configuración.
* **Manual**: Crea un nuevo archivo `*.function.ts` y usa `defineFunction()`, siguiendo el mismo patrón.
### Cliente tipado generado
@@ -592,9 +592,9 @@ const client = new Twenty();
const { me } = await client.query({ me: { id: true, displayName: true } });
```
El cliente se vuelve a generar con `yarn app:generate`. Re-run after changing your objects or when onboarding to a new workspace.
El cliente se vuelve a generar con `yarn app:generate`. Vuelve a ejecutarlo después de cambiar tus objetos o al incorporarte a un nuevo espacio de trabajo.
#### Credenciales en tiempo de ejecución en funciones sin servidor
#### Credenciales en tiempo de ejecución en funciones de lógica
Cuando tu función se ejecuta en Twenty, la plataforma inyecta credenciales como variables de entorno antes de que tu código se ejecute:
@@ -604,7 +604,7 @@ Cuando tu función se ejecuta en Twenty, la plataforma inyecta credenciales como
Notas:
* No necesitas pasar la URL ni la clave de API al cliente generado. Lee `TWENTY_API_URL` y `TWENTY_API_KEY` de process.env en tiempo de ejecución.
* Los permisos de la clave de API están determinados por el rol referenciado en tu `application.config.ts` mediante `functionRoleUniversalIdentifier`. Este es el rol predeterminado que usan las funciones sin servidor de tu aplicación.
* Los permisos de la clave de API están determinados por el rol referenciado en tu `application.config.ts` mediante `functionRoleUniversalIdentifier`. Este es el rol predeterminado que usan las funciones de lógica de tu aplicación.
* Las aplicaciones pueden definir roles para seguir el principio de mínimo privilegio. Concede solo los permisos que necesitan tus funciones y después apunta `functionRoleUniversalIdentifier` al identificador universal de ese rol.
### Ejemplo Hello World
@@ -640,13 +640,13 @@ Luego agrega scripts como estos:
}
```
Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:generate`, etc.
Ahora puedes ejecutar los mismos comandos mediante Yarn, p. ej., `yarn app:dev`, `yarn app:generate`, etc.
## Solución de problemas
* Errores de autenticación: ejecuta `yarn auth:login` y asegúrate de que tu clave de API tenga los permisos necesarios.
* No se puede conectar al servidor: verifica la URL de la API y que el servidor de Twenty sea accesible.
* Types or client missing/outdated: run `yarn app:generate`.
* Tipos o cliente faltantes/obsoletos: ejecuta `yarn app:generate`.
* El modo de desarrollo no sincroniza: asegúrate de que `yarn app:dev` esté ejecutándose y de que los cambios no sean ignorados por tu entorno.
Canal de ayuda en Discord: https://discord.com/channels/1130383047699738754/1130386664812982322
@@ -292,21 +292,21 @@ yarn command:prod cron:workflow:automated-cron-trigger
**Modo solo de entorno:** Si establece `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, agregue estas variables a su archivo `.env` en su lugar.
</Warning>
## Funciones sin servidor
## Funciones de lógica
Twenty admite funciones sin servidor para flujos de trabajo y lógica personalizada. El entorno de ejecución se configura mediante la variable de entorno `SERVERLESS_TYPE`.
Twenty admite funciones de lógica para flujos de trabajo y lógica personalizada. El entorno de ejecución se configura mediante la variable de entorno `SERVERLESS_TYPE`.
<Warning>
**Aviso de seguridad:** El controlador local sin servidor (`SERVERLESS_TYPE=LOCAL`) ejecuta código directamente en el host en un proceso de Node.js sin aislamiento. Solo debe utilizarse para código de confianza en desarrollo. Para implementaciones de producción que manejen código no confiable, recomendamos encarecidamente usar `SERVERLESS_TYPE=LAMBDA` o `SERVERLESS_TYPE=DISABLED`.
**Aviso de seguridad:** El controlador local (`SERVERLESS_TYPE=LOCAL`) ejecuta código directamente en el host en un proceso de Node.js sin aislamiento. Solo debe utilizarse para código de confianza en desarrollo. Para implementaciones de producción que manejen código no confiable, recomendamos encarecidamente usar `SERVERLESS_TYPE=LAMBDA` o `SERVERLESS_TYPE=DISABLED`.
</Warning>
### Controladores disponibles
| Controlador | Variable de entorno | Caso de uso | Nivel de seguridad |
| ----------- | -------------------------- | --------------------------------------------------- | -------------------------------------- |
| Desactivado | `SERVERLESS_TYPE=DISABLED` | Desactivar completamente las funciones sin servidor | N/A |
| Local | `SERVERLESS_TYPE=LOCAL` | Entornos de desarrollo y de confianza | Bajo (sin aislamiento) |
| Lambda | `SERVERLESS_TYPE=LAMBDA` | Producción con código no confiable | Alto (aislamiento a nivel de hardware) |
| Controlador | Variable de entorno | Caso de uso | Nivel de seguridad |
| ----------- | -------------------------- | ------------------------------------------------ | -------------------------------------- |
| Desactivado | `SERVERLESS_TYPE=DISABLED` | Desactivar completamente las funciones de lógica | N/A |
| Local | `SERVERLESS_TYPE=LOCAL` | Entornos de desarrollo y de confianza | Bajo (sin aislamiento) |
| Lambda | `SERVERLESS_TYPE=LAMBDA` | Producción con código no confiable | Alto (aislamiento a nivel de hardware) |
### Configuración recomendada
@@ -326,12 +326,12 @@ SERVERLESS_LAMBDA_ACCESS_KEY_ID=your-access-key
SERVERLESS_LAMBDA_SECRET_ACCESS_KEY=your-secret-key
```
**Para desactivar las funciones sin servidor:**
**Para desactivar las funciones de lógica:**
```bash
SERVERLESS_TYPE=DISABLED
```
<Note>
Al usar `SERVERLESS_TYPE=DISABLED`, cualquier intento de ejecutar una función sin servidor devolverá un error. Esto es útil si desea ejecutar Twenty sin capacidades de funciones sin servidor.
Al usar `SERVERLESS_TYPE=DISABLED`, cualquier intento de ejecutar una función de lógica devolverá un error. Esto es útil si desea ejecutar Twenty sin capacidades de funciones de lógica.
</Note>
@@ -9,7 +9,7 @@ La API (Interfaz de Programación de Aplicaciones) permite conectar Twenty con o
## Aplicaciones
Las aplicaciones son extensiones personalizadas desarrolladas mediante código que pueden definir modelos de datos y funciones sin servidor. Permiten que los desarrolladores creen personalizaciones reutilizables que pueden desplegarse en varios espacios de trabajo.
Las aplicaciones son extensiones personalizadas desarrolladas mediante código que pueden definir modelos de datos y funciones de lógica. Permiten que los desarrolladores creen personalizaciones reutilizables que pueden desplegarse en varios espacios de trabajo.
## Acciones de código
@@ -136,7 +136,7 @@ Puedes adjuntar archivos a los correos electrónicos enviados desde los flujos d
| **Confirmaciones de eventos** | Detalles o agenda del evento |
<Note>
Los archivos adjuntos son estáticos—se envía el mismo archivo a todos los destinatarios. Para documentos dinámicos (como presupuestos personalizados), genera y adjunta archivos usando una [Función sin servidor](/l/es/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty).
Los archivos adjuntos son estáticos—se envía el mismo archivo a todos los destinatarios. Para documentos dinámicos (como presupuestos personalizados), genera y adjunta archivos usando una [Función lógica](/l/es/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty).
</Note>
## Mejores prácticas
@@ -256,7 +256,7 @@ Ejecuta JavaScript personalizado dentro de su flujo de trabajo.
* Pruebe el código directamente en el paso
<Note>
Si necesita usar claves de API externas en su código, debe introducirlas directamente en el cuerpo de la función. No puede configurar claves de API en otro lugar y hacer referencia a ellas en la función sin servidor.
Si necesita usar claves de API externas en su código, debe introducirlas directamente en el cuerpo de la función. No puede configurar claves de API en otro lugar y hacer referencia a ellas en la función lógica.
</Note>
<Tip>
@@ -7,7 +7,7 @@ Genere u obtenga automáticamente un PDF y adjúntelo a un registro en Twenty. E
## Resumen
Este flujo de trabajo utiliza un **Activador manual** para que los usuarios puedan generar un PDF bajo demanda para cualquier registro seleccionado. Una **Función sin servidor** se encarga de:
Este flujo de trabajo utiliza un **Activador manual** para que los usuarios puedan generar un PDF bajo demanda para cualquier registro seleccionado. Una **Función de lógica** se encarga de:
1. Descargar el PDF desde una URL (de un servicio de generación de PDF)
2. Subir el archivo a Twenty
@@ -17,7 +17,7 @@ Este flujo de trabajo utiliza un **Activador manual** para que los usuarios pued
Antes de configurar el flujo de trabajo:
1. **Cree una clave de API**: Vaya a **Settings → APIs** y cree una nueva clave de API. Necesitará este token para la función sin servidor.
1. **Cree una clave de API**: Vaya a **Settings → APIs** y cree una nueva clave de API. Necesitará este token para la función de lógica.
2. **Configure un servicio de generación de PDF** (opcional): Si desea generar PDFs dinámicamente (p. ej., cotizaciones), use un servicio como Carbone, PDFMonkey o DocuSeal para crear el PDF y obtener una URL de descarga.
## Configuración paso a paso
@@ -32,9 +32,9 @@ Antes de configurar el flujo de trabajo:
Con un Activador manual, los usuarios pueden ejecutar este flujo de trabajo usando un botón que aparece en la parte superior derecha una vez que se selecciona un registro, para generar y adjuntar un PDF.
</Tip>
### Paso 2: Añadir una Función sin servidor
### Paso 2: Añadir una Función de lógica
1. Añada una acción de **Función sin servidor**
1. Añada una acción **Code** (función de lógica)
2. Cree una nueva función con el siguiente código
3. Configure los parámetros de entrada
@@ -45,10 +45,10 @@ Antes de configurar el flujo de trabajo:
| `companyId` | `{{trigger.object.id}}` |
<Note>
Si va a adjuntar a un objeto diferente (Persona, Oportunidad, etc.), cambie el nombre del parámetro en consecuencia (p. ej., `personId`, `opportunityId`) y actualice la función sin servidor.
Si va a adjuntar a un objeto diferente (Persona, Oportunidad, etc.), cambie el nombre del parámetro en consecuencia (p. ej., `personId`, `opportunityId`) y actualice la función de lógica.
</Note>
#### Código de la Función sin servidor
#### Código de la Función de lógica
```typescript
export const main = async (
@@ -172,7 +172,7 @@ Actualice tanto el parámetro de la función como el objeto `variables.data` en
Si usa un servicio de generación de PDF, puede:
1. Primero, cree una acción de solicitud HTTP para generar el PDF
2. Pase la URL de PDF devuelta a la función sin servidor como parámetro
2. Pase la URL de PDF devuelta a la función de lógica como parámetro
```typescript
export const main = async (
@@ -211,7 +211,7 @@ Para crear cotizaciones o facturas dinámicas:
* **DocuSeal** - Plataforma de automatización de documentos
* **Documint** - Generación de documentos con enfoque API-first
Cada servicio proporciona una API que devuelve una URL de PDF, que luego puede pasar a la función sin servidor.
Cada servicio proporciona una API que devuelve una URL de PDF, que luego puede pasar a la función de lógica.
## Solución de Problemas
@@ -224,5 +224,5 @@ Cada servicio proporciona una API que devuelve una URL de PDF, que luego puede p
## Relacionado
* [Disparadores de flujos de trabajo](/l/es/user-guide/workflows/capabilities/workflow-triggers)
* [Funciones sin servidor](/l/es/user-guide/workflows/capabilities/workflow-actions#serverless-function)
* [Funciones de lógica](/l/es/user-guide/workflows/capabilities/workflow-actions#code)
* [Generar una cotización o factura desde Twenty](/l/es/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty)
@@ -9,12 +9,12 @@ description: Créez et gérez les personnalisations Twenty sous forme de code.
## Que sont les applications ?
Les applications vous permettent de créer et de gérer des personnalisations Twenty **sous forme de code**. Au lieu de tout configurer via linterface utilisateur, vous définissez votre modèle de données et des fonctions sans serveur dans le code — ce qui accélère la création, la maintenance et le déploiement sur plusieurs espaces de travail.
Les applications vous permettent de créer et de gérer des personnalisations Twenty **sous forme de code**. Au lieu de tout configurer via linterface utilisateur, vous définissez votre modèle de données et vos fonctions logiques dans le code — ce qui accélère la création, la maintenance et le déploiement sur plusieurs espaces de travail.
**Ce que vous pouvez faire aujourd'hui:**
* Définir des objets et des champs personnalisés sous forme de code (modèle de données géré)
* Créer des fonctions sans serveur avec des déclencheurs personnalisés
* Créer des fonctions logiques avec des déclencheurs personnalisés
* Déployer la même application sur plusieurs espaces de travail
**Bientôt disponible :**
@@ -156,23 +156,23 @@ src/
Dans les grandes lignes :
* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall`, and `auth:login` that delegate to the local `twenty` CLI.
* **package.json** : Déclare le nom de lapplication, la version, les moteurs (Node 24+, Yarn 4), et ajoute `twenty-sdk` ainsi que des scripts comme `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall` et `auth:login` qui délèguent à la CLI locale `twenty`.
* **.gitignore** : Ignore les artefacts courants tels que `node_modules`, `.yarn`, `generated/` (client typé), `dist/`, `build/`, les dossiers de couverture, les fichiers journaux et les fichiers `.env*`.
* **yarn.lock**, **.yarnrc.yml**, **.yarn/** : Verrouillent et configurent la chaîne doutils Yarn 4 utilisée par le projet.
* **.nvmrc** : Fige la version de Node.js attendue par le projet.
* **eslint.config.mjs** et **tsconfig.json** : Fournissent la configuration de linting et TypeScript pour les sources TypeScript de votre application.
* **README.md** : Un bref README à la racine de lapplication avec des instructions de base.
* **src/**: The main place where you define your application-as-code:
* **src/** : Lendroit principal où vous définissez votre application sous forme de code :
* `application.config.ts` : Configuration globale de votre application (métadonnées et liaisons dexécution). Voir « Configuration de lapplication » ci-dessous.
* `*.role.ts` : Définitions de rôles utilisées par vos fonctions sans serveur. Voir « Rôle de fonction par défaut » ci-dessous.
* `*.role.ts` : Définitions de rôles utilisées par vos fonctions logiques. Voir « Rôle de fonction par défaut » ci-dessous.
* `*.object.ts` : Définitions dobjets personnalisés.
* `*.function.ts` : Définitions de fonctions sans serveur.
* `*.front-component.tsx`: Front component definitions.
* `*.function.ts` : Définitions de fonctions logiques.
* `*.front-component.tsx` : Définitions des composants front-end.
Des commandes ultérieures ajouteront dautres fichiers et dossiers :
* `yarn app:generate` créera un dossier `generated/` (client Twenty typé + types de lespace de travail).
* `yarn entity:add` will add entity definition files under `src/` for your custom objects, functions, front components, or roles.
* `yarn entity:add` ajoutera des fichiers de définition dentité sous `src/` pour vos objets, fonctions, composants front-end ou rôles personnalisés.
## Authentification
@@ -219,7 +219,7 @@ Le SDK fournit quatre fonctions utilitaires avec validation intégrée pour déf
| ------------------ | ---------------------------------------------------------- |
| `defineApp()` | Configurer les métadonnées de lapplication |
| `defineObject()` | Définir des objets personnalisés avec des champs |
| `defineFunction()` | Définir des fonctions sans serveur avec des gestionnaires |
| `defineFunction()` | Définir des fonctions logiques avec des gestionnaires |
| `defineRole()` | Configurer les autorisations de rôle et laccès aux objets |
Ces fonctions valident votre configuration à lexécution et offrent une meilleure autocomplétion IDE et une sécurité de typage accrue.
@@ -303,7 +303,7 @@ Points clés :
* Le `universalIdentifier` doit être unique et stable entre les déploiements.
* Chaque champ nécessite un `name`, un `type`, un `label` et son propre `universalIdentifier` stable.
* Le tableau `fields` est facultatif — vous pouvez définir des objets sans champs personnalisés.
* You can scaffold new objects using `yarn entity:add`, which guides you through naming, fields, and relationships.
* Vous pouvez générer de nouveaux objets avec `yarn entity:add`, qui vous guide à travers le nommage, les champs et les relations.
<Note>
**Les champs de base sont créés automatiquement.** Lorsque vous définissez un objet personnalisé, Twenty ajoute automatiquement des champs standard tels que `name`, `createdAt`, `updatedAt`, `createdBy`, `position` et `deletedAt`. Vous n'avez pas besoin de les définir dans votre tableau `fields` — ajoutez uniquement vos champs personnalisés.
@@ -349,7 +349,7 @@ Notes :
#### Rôles et autorisations
Les applications peuvent définir des rôles qui encapsulent des autorisations sur les objets et actions de votre espace de travail. Le champ `functionRoleUniversalIdentifier` dans `application.config.ts` désigne le rôle par défaut utilisé par les fonctions sans serveur de votre application.
Les applications peuvent définir des rôles qui encapsulent des autorisations sur les objets et actions de votre espace de travail. Le champ `functionRoleUniversalIdentifier` dans `application.config.ts` désigne le rôle par défaut utilisé par les fonctions logiques de votre application.
* La clé API dexécution injectée sous `TWENTY_API_KEY` est dérivée de ce rôle de fonction par défaut.
* Le client typé sera limité aux autorisations accordées à ce rôle.
@@ -411,7 +411,7 @@ Notes :
* `permissionFlags` contrôlent laccès aux capacités au niveau de la plateforme. Gardez-les au minimum ; najoutez que ce dont vous avez besoin.
* Voir un exemple fonctionnel dans lapplication Hello World : [`packages/twenty-apps/hello-world/src/roles/function-role.ts`](https://github.com/twentyhq/twenty/blob/main/packages/twenty-apps/hello-world/src/roles/function-role.ts).
### Configuration et point dentrée des fonctions sans serveur
### Configuration et point dentrée des fonctions logiques
Chaque fichier de fonction utilise `defineFunction()` pour exporter une configuration avec un gestionnaire et des déclencheurs facultatifs. Utilisez le suffixe de fichier `*.function.ts` pour la détection automatique.
@@ -510,7 +510,7 @@ Notes :
**Pour migrer les fonctions existantes :** Mettez à jour votre gestionnaire pour déstructurer à partir de `event.body`, `event.queryStringParameters` ou `event.pathParameters` plutôt que directement à partir de l'objet params.
</Warning>
Lorsqu'un déclencheur de route appelle votre fonction, elle reçoit un objet `RoutePayload` qui suit le format AWS HTTP API v2. Importez le type depuis `twenty-sdk` :
Lorsquun déclencheur de route appelle votre fonction logique, elle reçoit un objet `RoutePayload` qui suit le format AWS HTTP API v2. Importez le type depuis `twenty-sdk` :
```typescript
import { defineFunction, type RoutePayload } from 'twenty-sdk';
@@ -540,7 +540,7 @@ Le type `RoutePayload` a la structure suivante :
### Transfert des en-têtes HTTP
Par défaut, les en-têtes HTTP des requêtes entrantes ne sont pas transmis à votre fonction sans serveur pour des raisons de sécurité. Pour accéder à des en-têtes spécifiques, listez-les explicitement dans le tableau `forwardedRequestHeaders` :
Par défaut, les en-têtes HTTP des requêtes entrantes ne sont pas transmis à votre fonction logique pour des raisons de sécurité. Pour accéder à des en-têtes spécifiques, listez-les explicitement dans le tableau `forwardedRequestHeaders` :
```typescript
export default defineFunction({
@@ -578,7 +578,7 @@ const handler = async (event: RoutePayload) => {
Vous pouvez créer de nouvelles fonctions de deux façons :
* **Scaffolded**: Run `yarn entity:add` and choose the option to add a new function. Cela génère un fichier de démarrage avec un gestionnaire et une configuration.
* **Générée** : Exécutez `yarn entity:add` et choisissez loption pour ajouter une nouvelle fonction. Cela génère un fichier de démarrage avec un gestionnaire et une configuration.
* **Manuelle** : Créez un nouveau fichier `*.function.ts` et utilisez `defineFunction()`, en suivant le même modèle.
### Client typé généré
@@ -592,9 +592,9 @@ const client = new Twenty();
const { me } = await client.query({ me: { id: true, displayName: true } });
```
Le client est régénéré par `yarn app:generate`. Re-run after changing your objects or when onboarding to a new workspace.
Le client est régénéré par `yarn app:generate`. Relancez après avoir modifié vos objets ou lors de lintégration à un nouvel espace de travail.
#### Identifiants dexécution dans les fonctions sans serveur
#### Identifiants dexécution dans les fonctions logiques
Lorsque votre fonction sexécute sur Twenty, la plateforme injecte des identifiants sous forme de variables denvironnement avant lexécution de votre code :
@@ -604,7 +604,7 @@ Lorsque votre fonction sexécute sur Twenty, la plateforme injecte des identi
Notes:
* Vous navez pas besoin de passer lURL ou la clé API au client généré. Il lit `TWENTY_API_URL` et `TWENTY_API_KEY` depuis process.env à lexécution.
* Les autorisations de la clé API sont déterminées par le rôle référencé dans votre `application.config.ts` via `functionRoleUniversalIdentifier`. Il sagit du rôle par défaut utilisé par les fonctions sans serveur de votre application.
* Les autorisations de la clé API sont déterminées par le rôle référencé dans votre `application.config.ts` via `functionRoleUniversalIdentifier`. Il sagit du rôle par défaut utilisé par les fonctions logiques de votre application.
* Les applications peuvent définir des rôles pour appliquer le principe du moindre privilège. Naccordez que les autorisations dont vos fonctions ont besoin, puis faites pointer `functionRoleUniversalIdentifier` vers lidentifiant universel de ce rôle.
### Exemple Hello World
@@ -640,13 +640,13 @@ Ajoutez ensuite des scripts comme ceux-ci :
}
```
Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:generate`, etc.
Vous pouvez désormais exécuter les mêmes commandes via Yarn, par exemple `yarn app:dev`, `yarn app:generate`, etc.
## Résolution des problèmes
* Erreurs dauthentification : exécutez `yarn auth:login` et assurez-vous que votre clé API dispose des autorisations requises.
* Impossible de se connecter au serveur : vérifiez lURL de lAPI et que le serveur Twenty est accessible.
* Types or client missing/outdated: run `yarn app:generate`.
* Types ou client manquants/obsolètes : exécutez `yarn app:generate`.
* Le mode dev ne se synchronise pas : assurez-vous que `yarn app:dev` est en cours dexécution et que les modifications ne sont pas ignorées par votre environnement.
Canal daide Discord : https://discord.com/channels/1130383047699738754/1130386664812982322
@@ -292,21 +292,21 @@ yarn command:prod cron:workflow:automated-cron-trigger
**Mode réservé à l'environnement :** Si vous définissez `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, ajoutez ces variables à votre fichier `.env` à la place.
</Warning>
## Fonctions sans serveur
## Fonctions logiques
Twenty prend en charge les fonctions sans serveur pour les flux de travail et la logique personnalisée. L'environnement d'exécution est configuré via la variable d'environnement `SERVERLESS_TYPE`.
Twenty prend en charge les fonctions logiques pour les flux de travail et la logique personnalisée. L'environnement d'exécution est configuré via la variable d'environnement `SERVERLESS_TYPE`.
<Warning>
**Avis de sécurité :** Le pilote local de fonctions sans serveur (`SERVERLESS_TYPE=LOCAL`) exécute le code directement sur l'hôte dans un processus Node.js sans sandboxing. Il ne doit être utilisé que pour du code approuvé en développement. Pour les déploiements de production traitant du code non approuvé, nous recommandons fortement d'utiliser `SERVERLESS_TYPE=LAMBDA` ou `SERVERLESS_TYPE=DISABLED`.
**Avis de sécurité :** Le pilote local (`SERVERLESS_TYPE=LOCAL`) exécute le code directement sur l'hôte dans un processus Node.js sans sandboxing. Il ne doit être utilisé que pour du code approuvé en développement. Pour les déploiements de production traitant du code non approuvé, nous recommandons fortement d'utiliser `SERVERLESS_TYPE=LAMBDA` ou `SERVERLESS_TYPE=DISABLED`.
</Warning>
### Pilotes disponibles
| Pilote | Variable d'environnement | Cas d'utilisation | Niveau de sécurité |
| --------- | -------------------------- | -------------------------------------------------- | ------------------------------------ |
| Désactivé | `SERVERLESS_TYPE=DISABLED` | Désactiver complètement les fonctions sans serveur | N/A |
| Local | `SERVERLESS_TYPE=LOCAL` | Environnements de développement et approuvés | Faible (aucun sandboxing) |
| Lambda | `SERVERLESS_TYPE=LAMBDA` | Production avec du code non approuvé | Élevé (isolement au niveau matériel) |
| Pilote | Variable d'environnement | Cas d'utilisation | Niveau de sécurité |
| --------- | -------------------------- | ---------------------------------------------- | ------------------------------------ |
| Désactivé | `SERVERLESS_TYPE=DISABLED` | Désactiver complètement les fonctions logiques | N/A |
| Local | `SERVERLESS_TYPE=LOCAL` | Environnements de développement et approuvés | Faible (aucun sandboxing) |
| Lambda | `SERVERLESS_TYPE=LAMBDA` | Production avec du code non approuvé | Élevé (isolement au niveau matériel) |
### Configuration recommandée
@@ -326,12 +326,12 @@ SERVERLESS_LAMBDA_ACCESS_KEY_ID=your-access-key
SERVERLESS_LAMBDA_SECRET_ACCESS_KEY=your-secret-key
```
**Pour désactiver les fonctions sans serveur:**
**Pour désactiver les fonctions logiques:**
```bash
SERVERLESS_TYPE=DISABLED
```
<Note>
Lorsque vous utilisez `SERVERLESS_TYPE=DISABLED`, toute tentative d'exécuter une fonction sans serveur renverra une erreur. Cela est utile si vous souhaitez exécuter Twenty sans les capacités de fonctions sans serveur.
Lorsque vous utilisez `SERVERLESS_TYPE=DISABLED`, toute tentative d'exécuter une fonction logique renverra une erreur. Cela est utile si vous souhaitez exécuter Twenty sans la prise en charge des fonctions logiques.
</Note>
@@ -9,7 +9,7 @@ L'API (Interface de Programmation d'Applications) permet de connecter Twenty ave
## Applications
Les applications sont des extensions personnalisées, créées sous forme de code, qui peuvent définir des modèles de données et des fonctions sans serveur. Elles permettent aux développeurs de créer des personnalisations réutilisables pouvant être déployées sur plusieurs espaces de travail.
Les applications sont des extensions personnalisées, créées sous forme de code, qui peuvent définir des modèles de données et des fonctions de logique métier. Elles permettent aux développeurs de créer des personnalisations réutilisables pouvant être déployées sur plusieurs espaces de travail.
## Actions de code
@@ -136,7 +136,7 @@ Vous pouvez joindre des fichiers aux e-mails envoyés à partir de workflows. La
| **Confirmations d'événements** | Détails de l'événement ou programme |
<Note>
Les pièces jointes sont statiques — le même fichier est envoyé à tous les destinataires. Pour les documents dynamiques (comme des devis personnalisés), générez et joignez des fichiers à l'aide d'une [fonction sans serveur](/l/fr/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty).
Les pièces jointes sont statiques — le même fichier est envoyé à tous les destinataires. Pour les documents dynamiques (comme des devis personnalisés), générez et joignez des fichiers à l'aide d'une [Logic Function](/l/fr/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty).
</Note>
## Meilleures pratiques
@@ -256,7 +256,7 @@ Exécute du JavaScript personnalisé dans votre flux de travail.
* Testez le code directement dans l'étape
<Note>
Si vous devez utiliser des clés d'API externes dans votre code, vous devez les saisir directement dans le corps de la fonction. Vous ne pouvez pas configurer des clés d'API ailleurs et les référencer dans la fonction serverless.
Si vous devez utiliser des clés d'API externes dans votre code, vous devez les saisir directement dans le corps de la fonction. Vous ne pouvez pas configurer des clés d'API ailleurs et les référencer dans la fonction logique.
</Note>
<Tip>
@@ -7,7 +7,7 @@ Générez ou récupérez automatiquement un PDF et joignez-le à un enregistreme
## Vue d'ensemble
Ce flux de travail utilise un **Déclencheur manuel** afin que les utilisateurs puissent générer un PDF à la demande pour tout enregistrement sélectionné. Une **Fonction sans serveur** gère :
Ce flux de travail utilise un **Déclencheur manuel** afin que les utilisateurs puissent générer un PDF à la demande pour tout enregistrement sélectionné. Une **fonction logique** gère :
1. Téléchargement du PDF depuis une URL (provenant d'un service de génération de PDF)
2. Téléversement du fichier dans Twenty
@@ -17,7 +17,7 @@ Ce flux de travail utilise un **Déclencheur manuel** afin que les utilisateurs
Avant de configurer le flux de travail :
1. **Créer une clé API** : Allez dans **Settings → APIs** et créez une nouvelle clé API. Vous aurez besoin de ce jeton pour la fonction sans serveur.
1. **Créer une clé API** : Allez dans **Settings → APIs** et créez une nouvelle clé API. Vous aurez besoin de ce jeton pour la fonction logique.
2. **Configurer un service de génération de PDF** (facultatif) : Si vous souhaitez générer des PDF dynamiquement (par exemple, des devis), utilisez un service comme Carbone, PDFMonkey ou DocuSeal pour créer le PDF et obtenir une URL de téléchargement.
## Configuration pas à pas
@@ -32,9 +32,9 @@ Avant de configurer le flux de travail :
Avec un déclencheur manuel, les utilisateurs peuvent exécuter ce flux de travail à l'aide d'un bouton qui apparaît en haut à droite une fois un enregistrement sélectionné, afin de générer et de joindre un PDF.
</Tip>
### Étape 2 : Ajouter une fonction sans serveur
### Étape 2 : Ajouter une fonction logique
1. Ajoutez une action **Fonction sans serveur**
1. Ajoutez une action **Code** (fonction logique)
2. Créez une nouvelle fonction avec le code ci-dessous
3. Configurez les paramètres d'entrée
@@ -45,10 +45,10 @@ Avant de configurer le flux de travail :
| `companyId` | `{{trigger.object.id}}` |
<Note>
Si vous joignez à un objet différent (Personne, Opportunité, etc.), renommez le paramètre en conséquence (par exemple, `personId`, `opportunityId`) et mettez à jour la fonction sans serveur.
Si vous l'attachez à un objet différent (Personne, Opportunité, etc.), renommez le paramètre en conséquence (par exemple, `personId`, `opportunityId`) et mettez à jour la fonction logique.
</Note>
#### Code de la fonction sans serveur
#### Code de la fonction logique
```typescript
export const main = async (
@@ -172,7 +172,7 @@ Mettez à jour à la fois le paramètre de la fonction et l'objet `variables.dat
Si vous utilisez un service de génération de PDF, vous pouvez :
1. Commencez par créer une action HTTP Request pour générer le PDF
2. Transmettez l'URL du PDF retournée à la fonction sans serveur en tant que paramètre
2. Transmettez l'URL du PDF retournée à la fonction logique en tant que paramètre
```typescript
export const main = async (
@@ -211,7 +211,7 @@ Pour créer des devis ou des factures dynamiques :
* **DocuSeal** - Plateforme d'automatisation de documents
* **Documint** - Génération de documents axée sur l'API
Chaque service fournit une API qui renvoie une URL de PDF, que vous pouvez ensuite transmettre à la fonction sans serveur.
Chaque service fournit une API qui renvoie une URL de PDF, que vous pouvez ensuite transmettre à la fonction logique.
## Résolution des problèmes
@@ -224,5 +224,5 @@ Chaque service fournit une API qui renvoie une URL de PDF, que vous pouvez ensui
## Articles connexes
* [Déclencheurs de workflows](/l/fr/user-guide/workflows/capabilities/workflow-triggers)
* [Fonctions sans serveur](/l/fr/user-guide/workflows/capabilities/workflow-actions#serverless-function)
* [Fonctions logiques](/l/fr/user-guide/workflows/capabilities/workflow-actions#code)
* [Générer un devis ou une facture depuis Twenty](/l/fr/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty)
@@ -131,7 +131,7 @@ description: Foire aux questions sur les flux de travail dans Twenty.
</Accordion>
<Accordion title="Quel est le temps d'exécution maximal pour les actions Code ?">
Les actions Code (fonctions serverless) ont un **délai d'expiration par défaut de 5 minutes** (300 secondes).
Les actions Code (fonctions logiques) ont un **délai d'expiration par défaut de 5 minutes** (300 secondes).
Le délai d'expiration maximal configurable est de **15 minutes** (900 secondes).
@@ -9,12 +9,12 @@ description: Crea e gestisci le personalizzazioni di Twenty come codice.
## Cosa sono le app?
Le app ti consentono di creare e gestire le personalizzazioni di Twenty **come codice**. Invece di configurare tutto tramite l'interfaccia utente, definisci in codice il modello dati e le funzioni serverless — rendendo più veloce creare, mantenere e distribuire su più spazi di lavoro.
Le app ti consentono di creare e gestire le personalizzazioni di Twenty **come codice**. Invece di configurare tutto tramite l'interfaccia utente, definisci in codice il modello dati e le funzioni logiche — rendendo più veloce creare, mantenere e distribuire su più spazi di lavoro.
**Cosa puoi fare oggi:**
* Definisci oggetti e campi personalizzati come codice (modello dati gestito)
* Crea funzioni serverless con trigger personalizzati
* Crea funzioni logiche con trigger personalizzati
* Distribuisci la stessa app su più spazi di lavoro
**In arrivo:**
@@ -156,23 +156,23 @@ src/
A livello generale:
* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall`, and `auth:login` that delegate to the local `twenty` CLI.
* **package.json**: Dichiara il nome dell'app, la versione, i motori (Node 24+, Yarn 4) e aggiunge `twenty-sdk`, oltre a script come `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall` e `auth:login` che delegano alla CLI locale `twenty`.
* **.gitignore**: Ignora i file generati comuni come `node_modules`, `.yarn`, `generated/` (client tipizzato), `dist/`, `build/`, cartelle di coverage, file di log e file `.env*`.
* **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Bloccano e configurano la toolchain Yarn 4 utilizzata dal progetto.
* **.nvmrc**: Fissa la versione di Node.js prevista dal progetto.
* **eslint.config.mjs** e **tsconfig.json**: Forniscono linting e configurazione TypeScript per i sorgenti TypeScript della tua app.
* **README.md**: Un breve README nella radice dell'app con istruzioni di base.
* **src/**: The main place where you define your application-as-code:
* **src/**: Il luogo principale in cui definisci la tua applicazione come codice:
* `application.config.ts`: Configurazione globale della tua app (metadati e collegamenti di runtime). Vedi "Configurazione dell'applicazione" qui sotto.
* `*.role.ts`: Definizioni di ruoli usate dalle tue funzioni serverless. Vedi "Ruolo funzione predefinito" qui sotto.
* `*.role.ts`: Definizioni di ruoli usate dalle tue funzioni logiche. Vedi "Ruolo funzione predefinito" qui sotto.
* `*.object.ts`: Definizioni di oggetti personalizzati.
* `*.function.ts`: Definizioni di funzioni serverless.
* `*.front-component.tsx`: Front component definitions.
* `*.function.ts`: Definizioni di funzioni logiche.
* `*.front-component.tsx`: Definizioni di componenti front-end.
Comandi successivi aggiungeranno altri file e cartelle:
* `yarn app:generate` creerà una cartella `generated/` (client Twenty tipizzato + tipi dello spazio di lavoro).
* `yarn entity:add` will add entity definition files under `src/` for your custom objects, functions, front components, or roles.
* `yarn entity:add` aggiungerà file di definizione delle entità sotto `src/` per i tuoi oggetti, funzioni, componenti front-end o ruoli personalizzati.
## Autenticazione
@@ -219,7 +219,7 @@ L'SDK fornisce quattro funzioni helper con convalida integrata per definire le e
| ------------------ | ------------------------------------------------------- |
| `defineApp()` | Configura i metadati dell'applicazione |
| `defineObject()` | Definisci oggetti personalizzati con campi |
| `defineFunction()` | Definisci funzioni serverless con handler |
| `defineFunction()` | Definisci funzioni logiche con handler |
| `defineRole()` | Configura i permessi dei ruoli e l'accesso agli oggetti |
Queste funzioni convalidano la configurazione a runtime e offrono un migliore completamento automatico nell'IDE e una maggiore sicurezza dei tipi.
@@ -303,7 +303,7 @@ Punti chiave:
* Il `universalIdentifier` deve essere univoco e stabile tra i deployment.
* Ogni campo richiede un `name`, `type`, `label` e il proprio `universalIdentifier` stabile.
* L'array `fields` è facoltativo: puoi definire oggetti senza campi personalizzati.
* You can scaffold new objects using `yarn entity:add`, which guides you through naming, fields, and relationships.
* Puoi generare nuovi oggetti con `yarn entity:add`, che ti guida nella denominazione, nei campi e nelle relazioni.
<Note>
**I campi base vengono creati automaticamente.** Quando definisci un oggetto personalizzato, Twenty aggiunge automaticamente i campi standard come `name`, `createdAt`, `updatedAt`, `createdBy`, `position` e `deletedAt`. Non è necessario definirli nel tuo array `fields` — aggiungi solo i tuoi campi personalizzati.
@@ -349,7 +349,7 @@ Note:
#### Ruoli e permessi
Le applicazioni possono definire ruoli che incapsulano i permessi sugli oggetti e sulle azioni del tuo spazio di lavoro. Il campo `functionRoleUniversalIdentifier` in `application.config.ts` designa il ruolo predefinito utilizzato dalle funzioni serverless della tua app.
Le applicazioni possono definire ruoli che incapsulano i permessi sugli oggetti e sulle azioni del tuo spazio di lavoro. Il campo `functionRoleUniversalIdentifier` in `application.config.ts` designa il ruolo predefinito utilizzato dalle funzioni logiche della tua app.
* La chiave API di runtime iniettata come `TWENTY_API_KEY` è derivata da questo ruolo funzione predefinito.
* Il client tipizzato sarà limitato ai permessi concessi a quel ruolo.
@@ -411,7 +411,7 @@ Note:
* `permissionFlags` controllano l'accesso alle funzionalità a livello di piattaforma. Mantienili al minimo; aggiungi solo ciò che ti serve.
* Vedi un esempio funzionante nell'app Hello World: [`packages/twenty-apps/hello-world/src/roles/function-role.ts`](https://github.com/twentyhq/twenty/blob/main/packages/twenty-apps/hello-world/src/roles/function-role.ts).
### Configurazione e punto di ingresso della funzione serverless
### Configurazione e punto di ingresso della funzione logica
Ogni file di funzione usa `defineFunction()` per esportare una configurazione con un handler e trigger opzionali. Usa il suffisso di file `*.function.ts` per il rilevamento automatico.
@@ -510,7 +510,7 @@ Note:
**Per migrare le funzioni esistenti:** Aggiorna l'handler per estrarre i dati da `event.body`, `event.queryStringParameters` o `event.pathParameters` invece che direttamente dall'oggetto `params`.
</Warning>
Quando un trigger di route invoca la tua funzione, questa riceve un oggetto `RoutePayload` che segue il formato AWS HTTP API v2. Importa il tipo da `twenty-sdk`:
Quando un trigger di route invoca la tua funzione logica, questa riceve un oggetto `RoutePayload` che segue il formato AWS HTTP API v2. Importa il tipo da `twenty-sdk`:
```typescript
import { defineFunction, type RoutePayload } from 'twenty-sdk';
@@ -540,7 +540,7 @@ Il tipo `RoutePayload` ha la seguente struttura:
### Inoltro delle intestazioni HTTP
Per impostazione predefinita, le intestazioni HTTP delle richieste in ingresso non vengono passate alla tua funzione serverless per motivi di sicurezza. Per accedere a intestazioni specifiche, elencale esplicitamente nell'array `forwardedRequestHeaders`:
Per impostazione predefinita, le intestazioni HTTP delle richieste in ingresso **non** vengono passate alla tua funzione logica per motivi di sicurezza. Per accedere a intestazioni specifiche, elencale esplicitamente nell'array `forwardedRequestHeaders`:
```typescript
export default defineFunction({
@@ -578,7 +578,7 @@ const handler = async (event: RoutePayload) => {
Puoi creare nuove funzioni in due modi:
* **Scaffolded**: Run `yarn entity:add` and choose the option to add a new function. Questo genera un file iniziale con un handler e una configurazione.
* **Generata dallo scaffolder**: Esegui `yarn entity:add` e scegli l'opzione per aggiungere una nuova funzione. Questo genera un file iniziale con un handler e una configurazione.
* **Manuale**: Crea un nuovo file `*.function.ts` e usa `defineFunction()`, seguendo lo stesso schema.
### Client tipizzato generato
@@ -592,9 +592,9 @@ const client = new Twenty();
const { me } = await client.query({ me: { id: true, displayName: true } });
```
Il client viene rigenerato da `yarn app:generate`. Re-run after changing your objects or when onboarding to a new workspace.
Il client viene rigenerato da `yarn app:generate`. Eseguilo nuovamente dopo aver modificato i tuoi oggetti oppure quando effettui l'onboarding su un nuovo spazio di lavoro.
#### Credenziali di runtime nelle funzioni serverless
#### Credenziali di runtime nelle funzioni logiche
Quando la tua funzione viene eseguita su Twenty, la piattaforma inietta le credenziali come variabili d'ambiente prima dell'esecuzione del tuo codice:
@@ -604,7 +604,7 @@ Quando la tua funzione viene eseguita su Twenty, la piattaforma inietta le crede
Note:
* Non è necessario passare URL o chiave API al client generato. Legge `TWENTY_API_URL` e `TWENTY_API_KEY` da process.env in fase di esecuzione.
* I permessi della chiave API sono determinati dal ruolo referenziato in `application.config.ts` tramite `functionRoleUniversalIdentifier`. Questo è il ruolo predefinito utilizzato dalle funzioni serverless della tua applicazione.
* I permessi della chiave API sono determinati dal ruolo referenziato in `application.config.ts` tramite `functionRoleUniversalIdentifier`. Questo è il ruolo predefinito utilizzato dalle funzioni logiche della tua applicazione.
* Le applicazioni possono definire ruoli per seguire il principio del privilegio minimo. Concedi solo i permessi necessari alle tue funzioni, quindi punta `functionRoleUniversalIdentifier` all'identificatore universale di quel ruolo.
### Esempio Hello World
@@ -640,13 +640,13 @@ Quindi aggiungi script come questi:
}
```
Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:generate`, etc.
Ora puoi eseguire gli stessi comandi tramite Yarn, ad esempio `yarn app:dev`, `yarn app:generate`, ecc.
## Risoluzione dei problemi
* Errori di autenticazione: esegui `yarn auth:login` e assicurati che la tua chiave API abbia i permessi richiesti.
* Impossibile connettersi al server: verifica l'URL dell'API e che il server Twenty sia raggiungibile.
* Types or client missing/outdated: run `yarn app:generate`.
* Tipi o client mancanti/obsoleti: esegui `yarn app:generate`.
* Modalità di sviluppo non in sincronizzazione: assicurati che `yarn app:dev` sia in esecuzione e che le modifiche non vengano ignorate dal tuo ambiente.
Canale di supporto su Discord: https://discord.com/channels/1130383047699738754/1130386664812982322
@@ -291,21 +291,21 @@ yarn command:prod cron:workflow:automated-cron-trigger
**Modalità solo ambiente:** Se imposti `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, aggiungi queste variabili al tuo file `.env` invece.
</Warning>
## Funzioni serverless
## Funzioni logiche
Twenty supporta le funzioni serverless per i workflow e la logica personalizzata. L'ambiente di esecuzione è configurato tramite la variabile di ambiente `SERVERLESS_TYPE`.
Twenty supporta le funzioni logiche per i workflow e la logica personalizzata. L'ambiente di esecuzione è configurato tramite la variabile di ambiente `SERVERLESS_TYPE`.
<Warning>
**Avviso di sicurezza:** Il driver serverless locale (`SERVERLESS_TYPE=LOCAL`) esegue il codice direttamente sull'host in un processo Node.js senza sandboxing. Dovrebbe essere utilizzato solo per codice attendibile in fase di sviluppo. Per le distribuzioni in produzione che gestiscono codice non attendibile, consigliamo vivamente di usare `SERVERLESS_TYPE=LAMBDA` o `SERVERLESS_TYPE=DISABLED`.
**Avviso di sicurezza:** Il driver locale (`SERVERLESS_TYPE=LOCAL`) esegue il codice direttamente sull'host in un processo Node.js senza sandboxing. Dovrebbe essere utilizzato solo per codice attendibile in fase di sviluppo. Per le distribuzioni in produzione che gestiscono codice non attendibile, consigliamo vivamente di usare `SERVERLESS_TYPE=LAMBDA` o `SERVERLESS_TYPE=DISABLED`.
</Warning>
### Driver disponibili
| Driver | Variabile di ambiente | Caso d'uso | Livello di sicurezza |
| ------------ | -------------------------- | ----------------------------------------------- | ------------------------------------ |
| Disabilitato | `SERVERLESS_TYPE=DISABLED` | Disabilita completamente le funzioni serverless | N/A |
| Locale | `SERVERLESS_TYPE=LOCAL` | Ambienti di sviluppo e attendibili | Basso (nessuna sandbox) |
| Lambda | `SERVERLESS_TYPE=LAMBDA` | Produzione con codice non attendibile | Alto (isolamento a livello hardware) |
| Driver | Variabile di ambiente | Caso d'uso | Livello di sicurezza |
| ------------ | -------------------------- | -------------------------------------------- | ------------------------------------ |
| Disabilitato | `SERVERLESS_TYPE=DISABLED` | Disabilita completamente le funzioni logiche | N/A |
| Locale | `SERVERLESS_TYPE=LOCAL` | Ambienti di sviluppo e attendibili | Basso (nessuna sandbox) |
| Lambda | `SERVERLESS_TYPE=LAMBDA` | Produzione con codice non attendibile | Alto (isolamento a livello hardware) |
### Configurazione consigliata
@@ -325,12 +325,12 @@ SERVERLESS_LAMBDA_ACCESS_KEY_ID=your-access-key
SERVERLESS_LAMBDA_SECRET_ACCESS_KEY=your-secret-key
```
**Per disabilitare le funzioni serverless:**
**Per disabilitare le funzioni logiche:**
```bash
SERVERLESS_TYPE=DISABLED
```
<Note>
Quando si utilizza `SERVERLESS_TYPE=DISABLED`, qualsiasi tentativo di eseguire una funzione serverless restituirà un errore. Ciò è utile se si desidera eseguire Twenty senza il supporto per le funzioni serverless.
Quando si utilizza `SERVERLESS_TYPE=DISABLED`, qualsiasi tentativo di eseguire una funzione logica restituirà un errore. Ciò è utile se si desidera eseguire Twenty senza il supporto per le funzioni logiche.
</Note>
@@ -9,7 +9,7 @@ Le API (Interfaccia di Programmazione delle Applicazioni) ti consentono di conne
## App
Le app sono estensioni personalizzate sviluppate sotto forma di codice che possono definire modelli di dati e funzioni serverless. Consentono agli sviluppatori di creare personalizzazioni riutilizzabili che possono essere distribuite in più spazi di lavoro.
Le app sono estensioni personalizzate sviluppate sotto forma di codice che possono definire modelli di dati e funzioni di logica. Consentono agli sviluppatori di creare personalizzazioni riutilizzabili che possono essere distribuite in più spazi di lavoro.
## Azioni di codice
@@ -256,7 +256,7 @@ Esegue JavaScript personalizzato all'interno del tuo workflow.
* Verifica il codice direttamente nel passaggio
<Note>
Se devi utilizzare chiavi API esterne nel tuo codice, devi inserirle direttamente nel corpo della funzione. Non puoi configurare le chiavi API altrove e farvi riferimento nella funzione serverless.
Se devi utilizzare chiavi API esterne nel tuo codice, devi inserirle direttamente nel corpo della funzione. Non puoi configurare le chiavi API altrove e farvi riferimento nella funzione logica.
</Note>
<Tip>
@@ -7,7 +7,7 @@ Genera o recupera automaticamente un PDF e allegalo a un record in Twenty. Quest
## Panoramica
Questo flusso di lavoro usa un **Attivatore manuale** così gli utenti possono generare un PDF su richiesta per qualsiasi record selezionato. Una **Funzione serverless** gestisce:
Questo flusso di lavoro usa un **Attivatore manuale** così gli utenti possono generare un PDF su richiesta per qualsiasi record selezionato. Una **Funzione logica** gestisce:
1. Scaricare il PDF da un URL (da un servizio di generazione di PDF)
2. Caricare il file su Twenty
@@ -17,7 +17,7 @@ Questo flusso di lavoro usa un **Attivatore manuale** così gli utenti possono g
Prima di configurare il flusso di lavoro:
1. **Crea una chiave API**: vai su **Impostazioni → API** e crea una nuova chiave API. Ti servirà questo token per la funzione serverless.
1. **Crea una chiave API**: vai su **Impostazioni → API** e crea una nuova chiave API. Ti servirà questo token per la funzione logica.
2. **Configura un servizio di generazione PDF** (opzionale): se vuoi generare dinamicamente PDF (ad es. preventivi), usa un servizio come Carbone, PDFMonkey o DocuSeal per creare il PDF e ottenere un URL di download.
## Configurazione passo-passo
@@ -32,9 +32,9 @@ Prima di configurare il flusso di lavoro:
Con un **Attivatore manuale**, gli utenti possono eseguire questo flusso di lavoro utilizzando un pulsante che appare in alto a destra una volta selezionato un record, per generare e allegare un PDF.
</Tip>
### Passaggio 2: aggiungi una Funzione serverless
### Passaggio 2: aggiungi una Funzione logica
1. Aggiungi un'azione **Funzione serverless**
1. Aggiungi un'azione **Code** (funzione logica)
2. Crea una nuova funzione con il codice seguente
3. Configura i parametri di input
@@ -45,10 +45,10 @@ Prima di configurare il flusso di lavoro:
| `companyId` | `{{trigger.object.id}}` |
<Note>
Se alleghi a un oggetto diverso (Person, Opportunity, ecc.), rinomina di conseguenza il parametro (ad es. `personId`, `opportunityId`) e aggiorna la funzione serverless.
Se alleghi a un oggetto diverso (Person, Opportunity, ecc.), rinomina di conseguenza il parametro (ad es. `personId`, `opportunityId`) e aggiorna la funzione logica.
</Note>
#### Codice della funzione serverless
#### Codice della Funzione logica
```typescript
export const main = async (
@@ -172,7 +172,7 @@ Aggiorna sia il parametro della funzione sia l'oggetto `variables.data` nella mu
Se usi un servizio di generazione PDF, puoi:
1. Per prima cosa esegui un'azione HTTP Request per generare il PDF
2. Passa l'URL PDF restituito alla funzione serverless come parametro
2. Passa l'URL PDF restituito alla funzione logica come parametro
```typescript
export const main = async (
@@ -211,7 +211,7 @@ Per creare preventivi o fatture dinamici:
* **DocuSeal** - Piattaforma di automazione dei documenti
* **Documint** - Generazione di documenti API-first
Ogni servizio fornisce un'API che restituisce un URL PDF, che puoi quindi passare alla funzione serverless.
Ogni servizio fornisce un'API che restituisce un URL PDF, che puoi quindi passare alla funzione logica.
## Risoluzione dei problemi
@@ -224,5 +224,5 @@ Ogni servizio fornisce un'API che restituisce un URL PDF, che puoi quindi passar
## Correlati
* [Trigger dei flussi di lavoro](/l/it/user-guide/workflows/capabilities/workflow-triggers)
* [Funzioni serverless](/l/it/user-guide/workflows/capabilities/workflow-actions#serverless-function)
* [Funzioni logiche](/l/it/user-guide/workflows/capabilities/workflow-actions#code)
* [Genera un preventivo o una fattura da Twenty](/l/it/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty)
@@ -9,12 +9,12 @@ description: Twenty のカスタマイズをコードとして構築・管理し
## Apps とは?
Apps を使うと、Twenty のカスタマイズを**コードとして**構築・管理できます。 すべてを UI から設定する代わりに、データモデルやサーバーレス関数をコードで定義できます。これにより、構築と保守が高速になり、複数のワークスペースへの展開も容易になります。
Apps を使うと、Twenty のカスタマイズを**コードとして**構築・管理できます。 Instead of configuring everything through the UI, you define your data model and logic functions in code — making it faster to build, maintain, and roll out to multiple workspaces.
**現在できること:**
* カスタムオブジェクトとフィールドをコードとして定義(管理されたデータモデル)
* カスタムトリガー付きのサーバーレス関数を作成
* Build logic functions with custom triggers
* 同じアプリを複数のワークスペースにデプロイ
**近日公開:**
@@ -164,9 +164,9 @@ src/
* **README.md**: アプリのルートにある、基本的な手順を記した短い README。
* **src/**: The main place where you define your application-as-code:
* `application.config.ts`: アプリのグローバル設定(メタデータとランタイムの接続)。 「アプリケーション設定」を参照してください。
* `*.role.ts`: サーバーレス関数で使用するロール定義。 「デフォルトの関数ロール」を参照してください。
* `*.role.ts`: Role definitions used by your logic functions. 「デフォルトの関数ロール」を参照してください。
* `*.object.ts`: カスタムオブジェクトの定義。
* `*.function.ts`: サーバーレス関数の定義。
* `*.function.ts`: Logic function definitions.
* `*.front-component.tsx`: Front component definitions.
後続のコマンドにより、さらにファイルやフォルダーが追加されます:
@@ -215,12 +215,12 @@ twenty-sdk は、アプリ内で使用する型付きのビルディングブロ
この SDK は、アプリのエンティティを定義するための組み込み検証付きヘルパー関数を 4 つ提供します:
| 関数 | 目的 |
| ------------------ | --------------------- |
| `defineApp()` | アプリケーションのメタデータを構成 |
| `defineObject()` | フィールド付きのカスタムオブジェクトを定義 |
| `defineFunction()` | ハンドラー付きのサーバーレス関数を定義 |
| `defineRole()` | ロールの権限とオブジェクトアクセスを構成 |
| 関数 | 目的 |
| ------------------ | ------------------------------------ |
| `defineApp()` | アプリケーションのメタデータを構成 |
| `defineObject()` | フィールド付きのカスタムオブジェクトを定義 |
| `defineFunction()` | Define logic functions with handlers |
| `defineRole()` | ロールの権限とオブジェクトアクセスを構成 |
これらの関数は実行時に設定を検証し、IDE の補完と型安全性を向上させます。
@@ -349,7 +349,7 @@ export default defineApp({
#### ロールと権限
アプリケーションは、ワークスペース内のオブジェクトやアクションに対する権限をカプセル化するロールを定義できます。 `application.config.ts` の `functionRoleUniversalIdentifier` フィールドは、アプリのサーバーレス関数で使用されるデフォルトのロールを指定します。
アプリケーションは、ワークスペース内のオブジェクトやアクションに対する権限をカプセル化するロールを定義できます。 The field `functionRoleUniversalIdentifier` in `application.config.ts` designates the default role used by your app's logic functions.
* `TWENTY_API_KEY` として注入される実行時の API キーは、このデフォルトの関数ロールから派生します。
* 型付きクライアントの権限は、そのロールに付与された権限に制限されます。
@@ -411,7 +411,7 @@ export default defineRole({
* `permissionFlags` はプラットフォームレベルの機能へのアクセスを制御します。 最小限に保ち、必要なものだけを追加してください。
* 動作例は Hello World アプリにあります: [packages/twenty-apps/hello-world/src/roles/function-role.ts](https://github.com/twentyhq/twenty/blob/main/packages/twenty-apps/hello-world/src/roles/function-role.ts)。
### サーバーレス関数の設定とエントリポイント
### Logic function config and entrypoint
各関数ファイルは、ハンドラーと任意のトリガーを含む設定を `defineFunction()` でエクスポートします。 自動検出のために `*.function.ts` のファイルサフィックスを使用します。
@@ -510,7 +510,7 @@ export default defineFunction({
**既存の関数を移行するには:** ハンドラーで、params オブジェクトから直接ではなく、`event.body`、`event.queryStringParameters`、または `event.pathParameters` から分割代入するように更新してください。
</Warning>
ルートトリガーが関数を呼び出すと、AWS HTTP API v2 形式に準拠した `RoutePayload` オブジェクトを受け取ります。 型を `twenty-sdk` からインポートします:
When a route trigger invokes your logic function, it receives a `RoutePayload` object that follows the AWS HTTP API v2 format. 型を `twenty-sdk` からインポートします:
```typescript
import { defineFunction, type RoutePayload } from 'twenty-sdk';
@@ -540,7 +540,7 @@ const handler = async (event: RoutePayload) => {
### HTTP ヘッダーの転送
デフォルトでは、セキュリティ上の理由から、受信リクエストの HTTP ヘッダーはサーバーレス関数に**渡されません**。 特定のヘッダーにアクセスするには、`forwardedRequestHeaders` 配列に明示的に列挙してください:
By default, HTTP headers from incoming requests are **not** passed to your logic function for security reasons. 特定のヘッダーにアクセスするには、`forwardedRequestHeaders` 配列に明示的に列挙してください:
```typescript
export default defineFunction({
@@ -594,7 +594,7 @@ const { me } = await client.query({ me: { id: true, displayName: true } });
このクライアントは `yarn app:generate` によって再生成されます。 Re-run after changing your objects or when onboarding to a new workspace.
#### サーバーレス関数における実行時認証情報
#### Runtime credentials in logic functions
関数が Twenty 上で実行されると、コードが実行される前に、プラットフォームが認証情報を環境変数として注入します:
@@ -604,7 +604,7 @@ const { me } = await client.query({ me: { id: true, displayName: true } });
ノート:
* 生成されたクライアントに URL や API キーを渡す必要はありません。 実行時に process.env から `TWENTY_API_URL` と `TWENTY_API_KEY` を読み取ります。
* API キーの権限は、`application.config.ts` で `functionRoleUniversalIdentifier` によって参照されるロールによって決まります。 これは、アプリケーションのサーバーレス関数で使用されるデフォルトのロールです。
* API キーの権限は、`application.config.ts` で `functionRoleUniversalIdentifier` によって参照されるロールによって決まります。 This is the default role used by logic functions of your application.
* アプリケーションは、最小権限の原則に従うロールを定義できます。 関数に必要な権限のみを付与し、`functionRoleUniversalIdentifier` をそのロールのユニバーサル識別子に指定してください。
### Hello World の例
@@ -294,21 +294,21 @@ yarn command:prod cron:workflow:automated-cron-trigger
**環境専用モード:** `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false` を設定した場合、これらの変数を `.env` ファイルに追加してください。
</Warning>
## サーバーレス関数
## Logic Functions
Twenty は、ワークフローやカスタムロジックのためのサーバーレス関数をサポートします。 実行環境は、`SERVERLESS_TYPE` 環境変数で設定されます。
Twenty supports logic functions for workflows and custom logic. 実行環境は、`SERVERLESS_TYPE` 環境変数で設定されます。
<Warning>
**セキュリティに関する注意:** ローカルのサーバーレスドライバー(`SERVERLESS_TYPE=LOCAL`)は、ホスト上の Node.js プロセス内でサンドボックスなしにコードを直接実行します。 開発では、信頼できるコードにのみ使用してください。 信頼できないコードを扱う本番デプロイでは、`SERVERLESS_TYPE=LAMBDA` または `SERVERLESS_TYPE=DISABLED` の使用を強く推奨します。
**Security Notice:** The local driver (`SERVERLESS_TYPE=LOCAL`) runs code directly on the host in a Node.js process with no sandboxing. 開発では、信頼できるコードにのみ使用してください。 信頼できないコードを扱う本番デプロイでは、`SERVERLESS_TYPE=LAMBDA` または `SERVERLESS_TYPE=DISABLED` の使用を強く推奨します。
</Warning>
### 利用可能なドライバー
| ドライバー | 環境変数 | ユースケース | セキュリティレベル |
| ------ | -------------------------- | ----------------- | --------------- |
| 無効 | `SERVERLESS_TYPE=DISABLED` | サーバーレス関数を完全に無効化する | 該当なし |
| ローカル | `SERVERLESS_TYPE=LOCAL` | 開発および信頼できる環境 | 低(サンドボックスなし) |
| Lambda | `SERVERLESS_TYPE=LAMBDA` | 信頼できないコードを扱う本番環境 | 高(ハードウェアレベルの分離) |
| ドライバー | 環境変数 | ユースケース | セキュリティレベル |
| ------ | -------------------------- | -------------------------------- | --------------- |
| 無効 | `SERVERLESS_TYPE=DISABLED` | Disable logic functions entirely | 該当なし |
| ローカル | `SERVERLESS_TYPE=LOCAL` | 開発および信頼できる環境 | 低(サンドボックスなし) |
| Lambda | `SERVERLESS_TYPE=LAMBDA` | 信頼できないコードを扱う本番環境 | 高(ハードウェアレベルの分離) |
### 推奨構成
@@ -328,12 +328,12 @@ SERVERLESS_LAMBDA_ACCESS_KEY_ID=your-access-key
SERVERLESS_LAMBDA_SECRET_ACCESS_KEY=your-secret-key
```
**サーバーレス関数を無効化するには:**
**To disable logic functions:**
```bash
SERVERLESS_TYPE=DISABLED
```
<Note>
`SERVERLESS_TYPE=DISABLED` を使用している場合、サーバーレス関数を実行しようとするとエラーが返されます。 これは、サーバーレス関数の機能なしで Twenty を実行したい場合に便利です。
When using `SERVERLESS_TYPE=DISABLED`, any attempt to execute a logic function will return an error. This is useful if you want to run Twenty without logic function capabilities.
</Note>
@@ -9,7 +9,7 @@ API(アプリケーションプログラミングインターフェース)
## アプリ
アプリは、データモデルやサーバーレス関数を定義できる、コードとして構築されたカスタム拡張機能です。 これにより、開発者は複数のワークスペースにデプロイ可能な再利用可能なカスタマイズを作成できます。
Apps are custom extensions built as code that can define data models and logic functions. これにより、開発者は複数のワークスペースにデプロイ可能な再利用可能なカスタマイズを作成できます。
## コードアクション
@@ -136,7 +136,7 @@ CRM で特定のイベントが発生したときにメールを自動送信し
| **イベント確認メール** | イベントの詳細またはアジェンダ |
<Note>
添付ファイルは静的です—すべての受信者に同じファイルが送信されます。 動的ドキュメント(パーソナライズされた見積もりなど)の場合は、[サーバーレス関数](/l/ja/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty)を使ってファイルを生成し、添付します。
添付ファイルは静的です—すべての受信者に同じファイルが送信されます。 For dynamic documents (like personalized quotes), generate and attach files using a [Logic Function](/l/ja/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty).
</Note>
## ベストプラクティス
@@ -256,7 +256,7 @@ import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
* ステップ内でコードを直接テスト
<Note>
コードで外部のAPIキーを使用する必要がある場合は、関数本体に直接入力する必要があります。 別の場所でAPIキーを設定して、それをサーバーレス関数で参照することはできません。
コードで外部のAPIキーを使用する必要がある場合は、関数本体に直接入力する必要があります。 You cannot configure API keys elsewhere and reference them in the logic function.
</Note>
<Tip>
@@ -7,7 +7,7 @@ Twenty で PDF を自動生成または取得し、レコードに添付しま
## 概要
このワークフローでは **手動トリガー** を使用し、選択した任意のレコードに対してオンデマンドで PDF を生成できるようにします。 次を **サーバーレス関数** が処理します:
このワークフローでは **手動トリガー** を使用し、選択した任意のレコードに対してオンデマンドで PDF を生成できるようにします。 A **Logic Function** handles:
1. URL(PDF 生成サービスから)から PDF をダウンロードする
2. ファイルを Twenty にアップロードする
@@ -17,7 +17,7 @@ Twenty で PDF を自動生成または取得し、レコードに添付しま
ワークフローを設定する前に:
1. **API キーを作成**: **Settings → APIs** に移動して新しい API キーを作成します。 サーバーレス関数でこのトークンが必要になります。
1. **API キーを作成**: **Settings → APIs** に移動して新しい API キーを作成します。 You'll need this token for the logic function.
2. **PDF 生成サービスを設定**(任意):PDF を動的に生成したい場合(例: 見積書)は、Carbone、PDFMonkey、DocuSeal のようなサービスを使用して PDF を作成し、ダウンロード URL を取得します。
## ステップバイステップの設定
@@ -32,9 +32,9 @@ Twenty で PDF を自動生成または取得し、レコードに添付しま
手動トリガーを使用すると、レコードを選択すると右上に表示されるボタンからこのワークフローを実行し、PDF を生成して添付できます。
</Tip>
### ステップ 2: サーバーレス関数を追加する
### Step 2: Add a Logic Function
1. **サーバーレス関数** アクションを追加します
1. Add a **Code** action (logic function)
2. 以下のコードで新しい関数を作成します
3. 入力パラメーターを設定します
@@ -45,10 +45,10 @@ Twenty で PDF を自動生成または取得し、レコードに添付しま
| `companyId` | `{{trigger.object.id}}` |
<Note>
別のオブジェクト(PersonOpportunity など)に添付する場合は、適切にパラメーター名を変更(例: `personId``opportunityId`)し、サーバーレス関数を更新します。
If attaching to a different object (Person, Opportunity, etc.), rename the parameter accordingly (e.g., `personId`, `opportunityId`) and update the logic function.
</Note>
#### サーバーレス関数のコード
#### Logic Function Code
```typescript
export const main = async (
@@ -172,7 +172,7 @@ export const main = async (
PDF 生成サービスを使用する場合、次のことができます:
1. まず HTTP Request アクションで PDF を生成します
2. 返された PDF URL をパラメーターとしてサーバーレス関数に渡します
2. Pass the returned PDF URL to the logic function as a parameter
```typescript
export const main = async (
@@ -211,7 +211,7 @@ export const main = async (
* **DocuSeal** - ドキュメント自動化プラットフォーム
* **Documint** - API ファーストのドキュメント生成
各サービスは PDF URL を返す API を提供しており、その URL をサーバーレス関数に渡すことができます。
Each service provides an API that returns a PDF URL, which you can then pass to the logic function.
## トラブルシューティング
@@ -224,5 +224,5 @@ export const main = async (
## 関連
* [ワークフローのトリガー](/l/ja/user-guide/workflows/capabilities/workflow-triggers)
* [サーバーレス関数](/l/ja/user-guide/workflows/capabilities/workflow-actions#serverless-function)
* [Logic Functions](/l/ja/user-guide/workflows/capabilities/workflow-actions#code)
* [Twenty から見積書または請求書を生成する](/l/ja/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty)
@@ -131,7 +131,7 @@ description: Twenty のワークフローに関するよくある質問。
</Accordion>
<Accordion title="Code アクションの最大実行時間はどれくらいですか?">
Code アクション(サーバーレス関数)の**既定のタイムアウトは 5 分**(300 秒)です。
Code actions (logic functions) have a **default timeout of 5 minutes** (300 seconds).
設定可能な最大タイムアウトは**15 分**(900 秒)です。
@@ -9,12 +9,12 @@ description: Twenty 맞춤설정을 코드로 구축하고 관리하세요.
## 앱이란 무엇인가요?
앱을 사용하면 Twenty 맞춤설정을 **코드로** 구축하고 관리할 수 있습니다. 모든 것을 UI에서 구성하는 대신, 데이터 모델과 서버리스 함수를 코드로 정의합니다 — 이를 통해 더 빠르게 구축·유지 관리하고 여러 워크스페이스에 배포할 수 있습니다.
앱을 사용하면 Twenty 맞춤설정을 **코드로** 구축하고 관리할 수 있습니다. 모든 것을 UI에서 구성하는 대신, 데이터 모델과 로직 함수를 코드로 정의합니다 — 이를 통해 더 빠르게 구축·유지 관리하고 여러 워크스페이스에 배포할 수 있습니다.
**현재 가능한 작업:**
* 사용자 정의 객체와 필드를 코드로 정의하기(관리형 데이터 모델)
* 사용자 정의 트리거를 사용하여 서버리스 함수 구축
* 사용자 정의 트리거로 로직 함수 구축
* 동일한 앱을 여러 워크스페이스에 배포
**곧 제공 예정:**
@@ -156,23 +156,23 @@ src/
개요:
* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall`, and `auth:login` that delegate to the local `twenty` CLI.
* **package.json**: 앱 이름, 버전, 엔진(Node 24+, Yarn 4)을 선언하고, `twenty-sdk`와 함께 `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall`, `auth:login` 같은 스크립트를 추가합니다. 이 스크립트들은 로컬 `twenty` CLI에 위임됩니다.
* **.gitignore**: `node_modules`, `.yarn`, `generated/`(타입드 클라이언트), `dist/`, `build/`, 커버리지 폴더, 로그 파일, `.env*` 파일 등의 일반 산출물을 무시합니다.
* **yarn.lock**, **.yarnrc.yml**, **.yarn/**: 프로젝트에서 사용하는 Yarn 4 툴체인을 고정하고 구성합니다.
* **.nvmrc**: 프로젝트에서 예상하는 Node.js 버전을 고정합니다.
* **eslint.config.mjs** 및 **tsconfig.json**: 앱의 TypeScript 소스에 대한 린팅 및 TypeScript 구성을 제공합니다.
* **README.md**: 앱 루트에 기본 안내를 담은 간단한 README입니다.
* **src/**: The main place where you define your application-as-code:
* **src/**: 애플리케이션을 코드로 정의하는 주요 위치:
* `application.config.ts`: 앱의 전역 구성(메타데이터 및 런타임 연결)입니다. 아래의 "Application config"를 참조하세요.
* `*.role.ts`: 서버리스 함수에서 사용하는 역할 정의. 아래의 "Default function role"을 참조하세요.
* `*.role.ts`: 로직 함수에서 사용하는 역할 정의. 아래의 "Default function role"을 참조하세요.
* `*.object.ts`: 사용자 정의 객체 정의.
* `*.function.ts`: 서버리스 함수 정의.
* `*.front-component.tsx`: Front component definitions.
* `*.function.ts`: 로직 함수 정의.
* `*.front-component.tsx`: 프런트 컴포넌트 정의.
이후 명령을 실행하면 더 많은 파일과 폴더가 추가됩니다:
* `yarn app:generate`는 `generated/` 폴더를 생성합니다(타입드 Twenty 클라이언트 + 워크스페이스 타입).
* `yarn entity:add` will add entity definition files under `src/` for your custom objects, functions, front components, or roles.
* `yarn entity:add`는 사용자 정의 객체, 함수, 프런트 컴포넌트 또는 역할에 대한 엔티티 정의 파일을 `src/` 아래에 추가합니다.
## 인증
@@ -219,7 +219,7 @@ SDK는 앱 엔티티를 정의할 때 사용할 수 있는, 내장 검증이 포
| ------------------ | ------------------- |
| `defineApp()` | 애플리케이션 메타데이터 구성 |
| `defineObject()` | 필드가 있는 사용자 정의 객체 정의 |
| `defineFunction()` | 핸들러가 있는 서버리스 함수 정의 |
| `defineFunction()` | 핸들러가 있는 로직 함수 정의 |
| `defineRole()` | 역할 권한과 객체 접근 구성 |
이 함수들은 런타임에 구성을 검증하고, 더 나은 IDE 자동 완성과 타입 안정성을 제공합니다.
@@ -303,7 +303,7 @@ export default defineObject({
* `universalIdentifier`는 배포 전반에서 고유하고 안정적이어야 합니다.
* 각 필드는 `name`, `type`, `label` 및 고유하고 안정적인 `universalIdentifier`가 필요합니다.
* `fields` 배열은 선택 사항입니다. 사용자 정의 필드 없이도 객체를 정의할 수 있습니다.
* You can scaffold new objects using `yarn entity:add`, which guides you through naming, fields, and relationships.
* `yarn entity:add`를 사용하여 새 객체를 스캐폴딩할 수 있으며, 이름, 필드, 관계 설정 과정을 안내합니다.
<Note>
**기본 필드는 자동으로 생성됩니다.** 사용자 정의 객체를 정의하면 Twenty가 `name`, `createdAt`, `updatedAt`, `createdBy`, `position`, `deletedAt` 등의 표준 필드를 자동으로 추가합니다. 이 필드들은 `fields` 배열에 정의할 필요가 없습니다. 사용자 정의 필드만 추가하세요.
@@ -349,7 +349,7 @@ export default defineApp({
#### 역할 및 권한
애플리케이션은 워크스페이스의 객체와 작업에 대한 권한을 캡슐화하는 역할을 정의할 수 있습니다. `application.config.ts`의 `functionRoleUniversalIdentifier` 필드는 앱의 서버리스 함수가 사용하는 기본 역할을 지정합니다.
애플리케이션은 워크스페이스의 객체와 작업에 대한 권한을 캡슐화하는 역할을 정의할 수 있습니다. `application.config.ts`의 `functionRoleUniversalIdentifier` 필드는 앱의 로직 함수가 사용하는 기본 역할을 지정합니다.
* `TWENTY_API_KEY`로 주입되는 런타임 API 키는 이 기본 함수 역할에서 파생됩니다.
* 타입드 클라이언트는 해당 역할에 부여된 권한으로 제한됩니다.
@@ -411,7 +411,7 @@ export default defineRole({
* `permissionFlags`는 플랫폼 수준 기능에 대한 액세스를 제어합니다. 최소한으로 유지하고, 필요한 것만 추가하세요.
* Hello World 앱의 동작 예제를 참조하세요: [`packages/twenty-apps/hello-world/src/roles/function-role.ts`](https://github.com/twentyhq/twenty/blob/main/packages/twenty-apps/hello-world/src/roles/function-role.ts).
### 서버리스 함수 구성과 엔트리포인트
### 로직 함수 구성과 엔트리포인트
각 함수 파일은 `defineFunction()`을 사용해 핸들러와 선택적 트리거가 포함된 구성을 내보냅니다. 자동 감지를 위해 `*.function.ts` 파일 접미사를 사용하세요.
@@ -510,7 +510,7 @@ export default defineFunction({
**기존 함수 마이그레이션 방법:** 핸들러에서 params 객체에서 직접 구조 분해하는 대신 `event.body`, `event.queryStringParameters`, 또는 `event.pathParameters`에서 구조 분해하도록 업데이트하세요.
</Warning>
라우트 트리거가 함수를 호출하면, AWS HTTP API v2 형식을 따르는 `RoutePayload` 객체를 받습니다. `twenty-sdk`에서 해당 타입을 임포트하세요:
라우트 트리거가 로직 함수를 호출하면, AWS HTTP API v2 형식을 따르는 `RoutePayload` 객체를 받습니다. `twenty-sdk`에서 해당 타입을 임포트하세요:
```typescript
import { defineFunction, type RoutePayload } from 'twenty-sdk';
@@ -540,7 +540,7 @@ const handler = async (event: RoutePayload) => {
### HTTP 헤더 전달
기본적으로 보안상의 이유로 들어오는 요청의 HTTP 헤더는 서버리스 함수로 **전달되지 않습니다**. 특정 헤더에 접근하려면 `forwardedRequestHeaders` 배열에 명시적으로 나열하세요:
기본적으로 보안상의 이유로 들어오는 요청의 HTTP 헤더는 로직 함수로 **전달되지 않습니다**. 특정 헤더에 접근하려면 `forwardedRequestHeaders` 배열에 명시적으로 나열하세요:
```typescript
export default defineFunction({
@@ -578,7 +578,7 @@ const handler = async (event: RoutePayload) => {
새 함수를 만드는 방법은 두 가지입니다:
* **Scaffolded**: Run `yarn entity:add` and choose the option to add a new function. 이렇게 하면 핸들러와 구성이 포함된 시작 파일이 생성됩니다.
* **스캐폴딩**: `yarn entity:add`를 실행하고 새 함수를 추가하는 옵션을 선택하세요. 이렇게 하면 핸들러와 구성이 포함된 시작 파일이 생성됩니다.
* **수동**: 새 `*.function.ts` 파일을 만들고 동일한 패턴에 따라 `defineFunction()`을 사용하세요.
### 생성된 타입드 클라이언트
@@ -592,9 +592,9 @@ const client = new Twenty();
const { me } = await client.query({ me: { id: true, displayName: true } });
```
클라이언트는 `yarn app:generate`로 다시 생성됩니다. Re-run after changing your objects or when onboarding to a new workspace.
클라이언트는 `yarn app:generate`로 다시 생성됩니다. 객체를 변경한 후 또는 새 워크스페이스에 온보딩할 때 다시 실행하세요.
#### 서버리스 함수의 런타임 자격 증명
#### 로직 함수의 런타임 자격 증명
함수가 Twenty에서 실행될 때, 플랫폼은 코드가 실행되기 전에 자격 증명을 환경 변수로 주입합니다:
@@ -604,7 +604,7 @@ const { me } = await client.query({ me: { id: true, displayName: true } });
노트:
* 생성된 클라이언트에 URL이나 API 키를 전달할 필요가 없습니다. 런타임에 process.env에서 `TWENTY_API_URL`과 `TWENTY_API_KEY`를 읽습니다.
* API 키의 권한은 `application.config.ts`에서 `functionRoleUniversalIdentifier`를 통해 참조된 역할에 의해 결정됩니다. 이는 애플리케이션의 서버리스 함수에서 사용하는 기본 역할입니다.
* API 키의 권한은 `application.config.ts`에서 `functionRoleUniversalIdentifier`를 통해 참조된 역할에 의해 결정됩니다. 이는 애플리케이션의 로직 함수에서 사용하는 기본 역할입니다.
* 애플리케이션은 최소 권한 원칙을 따르도록 역할을 정의할 수 있습니다. 함수에 필요한 권한만 부여하고, `functionRoleUniversalIdentifier`를 해당 역할의 universal identifier로 지정하세요.
### Hello World 예제
@@ -640,13 +640,13 @@ yarn add -D twenty-sdk
}
```
Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:generate`, etc.
이제 Yarn을 통해 동일한 명령을 실행할 수 있습니다. 예: `yarn app:dev`, `yarn app:generate`.
## 문제 해결
* 인증 오류: `yarn auth:login`를 실행하고 API 키에 필요한 권한이 있는지 확인하세요.
* 서버에 연결할 수 없음: API URL과 Twenty 서버에 접근 가능한지 확인하세요.
* Types or client missing/outdated: run `yarn app:generate`.
* 타입 또는 클라이언트가 없거나 오래된 경우: `yarn app:generate`를 실행하세요.
* 개발 모드가 동기화되지 않음: `yarn app:dev`가 실행 중인지, 환경에서 변경 사항을 무시하지 않는지 확인하세요.
Discord 도움말 채널: https://discord.com/channels/1130383047699738754/1130386664812982322
@@ -292,19 +292,19 @@ yarn command:prod cron:workflow:automated-cron-trigger
**환경 전용 모드:** `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`로 설정한 경우, `.env` 파일에 이러한 변수를 추가하세요.
</Warning>
## 서버리스 함수
## 로직 함수
Twenty는 워크플로 및 사용자 지정 로직을 위해 서버리스 함수를 지원합니다. `SERVERLESS_TYPE` 환경 변수를 통해 실행 환경을 구성합니다.
Twenty는 워크플로 및 사용자 지정 로직을 위해 로직 함수를 지원합니다. `SERVERLESS_TYPE` 환경 변수를 통해 실행 환경을 구성합니다.
<Warning>
**보안 공지:** 로컬 서버리스 드라이버 (`SERVERLESS_TYPE=LOCAL`)는 샌드박싱 없이 호스트의 Node.js 프로세스에서 코드를 직접 실행합니다. 개발 환경에서 신뢰할 수 있는 코드에만 사용해야 합니다. 신뢰할 수 없는 코드를 처리하는 프로덕션 배포의 경우 `SERVERLESS_TYPE=LAMBDA` 또는 `SERVERLESS_TYPE=DISABLED` 사용을 강력히 권장합니다.
**보안 공지:** 로컬 드라이버 (`SERVERLESS_TYPE=LOCAL`)는 샌드박싱 없이 호스트의 Node.js 프로세스에서 코드를 직접 실행합니다. 개발 환경에서 신뢰할 수 있는 코드에만 사용해야 합니다. 신뢰할 수 없는 코드를 처리하는 프로덕션 배포의 경우 `SERVERLESS_TYPE=LAMBDA` 또는 `SERVERLESS_TYPE=DISABLED` 사용을 강력히 권장합니다.
</Warning>
### 사용 가능한 드라이버
| 드라이버 | 환경 변수 | 사용 사례 | 보안 수준 |
| ------ | -------------------------- | ------------------------- | --------------- |
| 비활성화 | `SERVERLESS_TYPE=DISABLED` | 서버리스 함수를 완전히 비활성화 | 해당 없음 |
| 비활성화 | `SERVERLESS_TYPE=DISABLED` | 로직 함수를 완전히 비활성화 | 해당 없음 |
| 로컬 | `SERVERLESS_TYPE=LOCAL` | 개발 및 신뢰할 수 있는 환경 | 낮음 (샌드박싱 없음) |
| Lambda | `SERVERLESS_TYPE=LAMBDA` | 신뢰할 수 없는 코드를 처리하는 프로덕션 환경 | 높음 (하드웨어 수준 격리) |
@@ -326,12 +326,12 @@ SERVERLESS_LAMBDA_ACCESS_KEY_ID=your-access-key
SERVERLESS_LAMBDA_SECRET_ACCESS_KEY=your-secret-key
```
**서버리스 함수를 비활성화하려면:**
**로직 함수를 비활성화하려면:**
```bash
SERVERLESS_TYPE=DISABLED
```
<Note>
`SERVERLESS_TYPE=DISABLED`를 사용하는 경우 서버리스 함수를 실행하려는 모든 시도는 오류를 반환합니다. 서버리스 함수 기능 없이 Twenty를 실행하려는 경우 유용합니다.
`SERVERLESS_TYPE=DISABLED`를 사용하는 경우 로직 함수를 실행하려는 모든 시도는 오류를 반환합니다. 로직 함수 기능 없이 Twenty를 실행하려는 경우 유용합니다.
</Note>
@@ -9,7 +9,7 @@ API(응용 프로그래밍 인터페이스)는 Twenty를 다른 소프트웨어
## 앱
앱은 데이터 모델과 서버리스 함수를 정의할 수 있도록 코드로 작성된 사용자 정의 확장 기능입니다. 이를 통해 개발자는 여러 워크스페이스에 걸쳐 배포할 수 있는 재사용 가능한 사용자 정의 기능을 만들 수 있습니다.
앱은 데이터 모델과 로직 함수를 정의할 수 있도록 코드로 작성된 사용자 정의 확장 기능입니다. 이를 통해 개발자는 여러 워크스페이스에 걸쳐 배포할 수 있는 재사용 가능한 사용자 정의 기능을 만들 수 있습니다.
## 코드 액션
@@ -136,7 +136,7 @@ The Team
| **이벤트 확인** | 이벤트 세부 정보 또는 일정 |
<Note>
첨부 파일은 정적입니다—모든 수신자에게 동일한 파일이 전송됩니다. 개인화된 견적서와 같은 동적 문서의 경우 [서버리스 함수](/l/ko/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty)를 사용하여 파일을 생성하고 첨부합니다.
첨부 파일은 정적입니다—모든 수신자에게 동일한 파일이 전송됩니다. 개인화된 견적서와 같은 동적 문서의 경우 [로직 함수](/l/ko/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty)를 사용하여 파일을 생성하고 첨부합니다.
</Note>
## 모범 사례
@@ -256,7 +256,7 @@ import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
* 해당 단계에서 코드를 직접 테스트하세요
<Note>
코드에서 외부 API 키를 사용해야 하는 경우, 함수 본문에 직접 입력해야 합니다. 다른 곳에서 API 키를 구성한 뒤 서버리스 함수에서 참조할 수는 없습니다.
코드에서 외부 API 키를 사용해야 하는 경우, 함수 본문에 직접 입력해야 합니다. You cannot configure API keys elsewhere and reference them in the logic function.
</Note>
<Tip>
@@ -7,7 +7,7 @@ Twenty에서 PDF를 자동으로 생성하거나 가져와 레코드에 첨부
## 개요
이 워크플로우는 **수동 트리거**를 사용하므로 사용자가 선택한 레코드에 대해 필요할 때 PDF를 생성할 수 있습니다. **서버리스 함수**가 다음을 처리합니다:
이 워크플로우는 **수동 트리거**를 사용하므로 사용자가 선택한 레코드에 대해 필요할 때 PDF를 생성할 수 있습니다. **로직 함수**가 다음을 처리합니다:
1. URL에서 PDF를 다운로드(PDF 생성 서비스에서 제공)
2. 파일을 Twenty에 업로드
@@ -17,7 +17,7 @@ Twenty에서 PDF를 자동으로 생성하거나 가져와 레코드에 첨부
워크플로우를 설정하기 전에:
1. **API 키 생성**: **Settings → APIs**로 이동하여 새 API 키를 만드세요. 이 토큰은 서버리스 함수에 필요합니다.
1. **API 키 생성**: **Settings → APIs**로 이동하여 새 API 키를 만드세요. 이 토큰은 로직 함수에 필요합니다.
2. **PDF 생성 서비스 설정**(선택 사항): PDF를 동적으로 생성하려면(예: 견적서) Carbone, PDFMonkey, DocuSeal 같은 서비스를 사용해 PDF를 만들고 다운로드 URL을 받으세요.
## 단계별 설정
@@ -32,9 +32,9 @@ Twenty에서 PDF를 자동으로 생성하거나 가져와 레코드에 첨부
수동 트리거를 사용하면 사용자가 레코드를 선택한 후 우측 상단에 표시되는 버튼으로 이 워크플로우를 실행해 PDF를 생성하고 첨부할 수 있습니다.
</Tip>
### 2단계: 서버리스 함수 추가
### 2단계: 로직 함수 추가
1. **서버리스 함수** 작업을 추가합니다
1. **Code** 액션(로직 함수)을 추가합니다
2. 아래 코드로 새 함수를 만드세요
3. 입력 매개변수를 구성하세요
@@ -45,10 +45,10 @@ Twenty에서 PDF를 자동으로 생성하거나 가져와 레코드에 첨부
| `companyId` | `{{trigger.object.id}}` |
<Note>
다른 객체(Person, Opportunity 등)에 첨부하는 경우 해당 매개변수 이름을 바꾸고(예: `personId`, `opportunityId`) 서버리스 함수를 업데이트하세요.
다른 객체(Person, Opportunity 등)에 첨부하는 경우 해당 매개변수 이름을 바꾸고(예: `personId`, `opportunityId`) 로직 함수를 업데이트하세요.
</Note>
#### 서버리스 함수 코드
#### 로직 함수 코드
```typescript
export const main = async (
@@ -172,7 +172,7 @@ export const main = async (
PDF 생성 서비스를 사용하는 경우 다음을 수행할 수 있습니다:
1. 먼저 PDF를 생성하기 위해 HTTP 요청 작업을 만듭니다
2. 반환된 PDF URL을 서버리스 함수의 매개변수로 전달합니다
2. 반환된 PDF URL을 로직 함수의 매개변수로 전달합니다
```typescript
export const main = async (
@@ -211,7 +211,7 @@ export const main = async (
* **DocuSeal** - 문서 자동화 플랫폼
* **Documint** - API 우선 문서 생성
각 서비스는 PDF URL을 반환하는 API를 제공하며, 이 URL을 서버리스 함수에 전달할 수 있습니다.
각 서비스는 PDF URL을 반환하는 API를 제공하며, 이 URL을 로직 함수에 전달할 수 있습니다.
## 문제 해결
@@ -224,5 +224,5 @@ export const main = async (
## 관련 항목
* [워크플로우 트리거](/l/ko/user-guide/workflows/capabilities/workflow-triggers)
* [서버리스 함수](/l/ko/user-guide/workflows/capabilities/workflow-actions#serverless-function)
* [로직 함수](/l/ko/user-guide/workflows/capabilities/workflow-actions#code)
* [Twenty에서 견적서 또는 송장 생성](/l/ko/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty)
@@ -131,7 +131,7 @@ description: Frequently asked questions about workflows in Twenty.
</Accordion>
<Accordion title="What's the maximum execution time for Code actions?">
Code actions (serverless functions) have a **default timeout of 5 minutes** (300 seconds).
코드 액션(로직 함수)에는 **5분의 기본 제한 시간** (300초)이 있습니다.
The maximum configurable timeout is **15 minutes** (900 seconds).
@@ -9,12 +9,12 @@ description: Crie e gerencie personalizações do Twenty como código.
## O que são aplicativos?
Os aplicativos permitem criar e gerenciar personalizações do Twenty **como código**. Em vez de configurar tudo pela UI, você define seu modelo de dados e funções serverless em código — tornando mais rápido criar, manter e distribuir para vários espaços de trabalho.
Os aplicativos permitem criar e gerenciar personalizações do Twenty **como código**. Em vez de configurar tudo pela UI, você define seu modelo de dados e funções de lógica em código — tornando mais rápido criar, manter e distribuir para vários workspaces.
**O que você pode fazer hoje:**
* Defina objetos e campos personalizados como código (modelo de dados gerenciado)
* Crie funções serverless com gatilhos personalizados
* Crie funções de lógica com gatilhos personalizados
* Implemente o mesmo aplicativo em vários espaços de trabalho
**Em breve:**
@@ -156,23 +156,23 @@ src/
Em alto nível:
* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall`, and `auth:login` that delegate to the local `twenty` CLI.
* **package.json**: Declara o nome do app, versão, engines (Node 24+, Yarn 4) e adiciona `twenty-sdk`, além de scripts como `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall` e `auth:login` que delegam para a CLI local `twenty`.
* **.gitignore**: Ignora artefatos comuns como `node_modules`, `.yarn`, `generated/` (cliente tipado), `dist/`, `build/`, pastas de cobertura, arquivos de log e arquivos `.env*`.
* **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Bloqueiam e configuram a ferramenta Yarn 4 usada pelo projeto.
* **.nvmrc**: Fixa a versão do Node.js esperada pelo projeto.
* **eslint.config.mjs** e **tsconfig.json**: Fornecem lint e configuração do TypeScript para os fontes TypeScript do seu aplicativo.
* **README.md**: Um README curto na raiz do aplicativo com instruções básicas.
* **src/**: The main place where you define your application-as-code:
* **src/**: O local principal onde você define seu aplicativo como código:
* `application.config.ts`: Configuração global do seu aplicativo (metadados e conexões de execução). Veja "Configuração do aplicativo" abaixo.
* `*.role.ts`: Definições de papéis usados pelas suas funções serverless. Veja "Papel de função padrão" abaixo.
* `*.role.ts`: Definições de papéis usadas pelas suas funções de lógica. Veja "Papel de função padrão" abaixo.
* `*.object.ts`: Definições de objetos personalizados.
* `*.function.ts`: Definições de funções serverless.
* `*.front-component.tsx`: Front component definitions.
* `*.function.ts`: Definições de funções de lógica.
* `*.front-component.tsx`: Definições de componentes de front-end.
Comandos posteriores adicionarão mais arquivos e pastas:
* `yarn app:generate` criará uma pasta `generated/` (cliente tipado do Twenty + tipos do workspace).
* `yarn entity:add` will add entity definition files under `src/` for your custom objects, functions, front components, or roles.
* `yarn entity:add` adicionará arquivos de definição de entidade em `src/` para seus objetos, funções, componentes de front-end ou papéis personalizados.
## Autenticação
@@ -219,7 +219,7 @@ O SDK fornece quatro funções utilitárias com validação integrada para defin
| ------------------ | ------------------------------------------------- |
| `defineApp()` | Configura os metadados do aplicativo |
| `defineObject()` | Define objetos personalizados com campos |
| `defineFunction()` | Define funções serverless com handlers |
| `defineFunction()` | Defina funções de lógica com handlers |
| `defineRole()` | Configura permissões de papéis e acesso a objetos |
Essas funções validam sua configuração em tempo de execução e oferecem melhor autocompletar na IDE e segurança de tipos.
@@ -303,7 +303,7 @@ 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.
* You can scaffold new objects using `yarn entity:add`, which guides you through naming, fields, and relationships.
* Você pode criar novos objetos usando `yarn entity:add`, que orienta você sobre nomeação, campos e relacionamentos.
<Note>
**Os campos base são criados automaticamente.** Quando você define um objeto personalizado, o Twenty adiciona automaticamente campos padrão como `name`, `createdAt`, `updatedAt`, `createdBy`, `position` e `deletedAt`. Você não precisa definir esses no seu array `fields` — adicione apenas seus campos personalizados.
@@ -349,7 +349,7 @@ Notas:
#### Papéis e permissões
Os aplicativos podem definir papéis que encapsulam permissões sobre os objetos e ações do seu espaço de trabalho. O campo `functionRoleUniversalIdentifier` em `application.config.ts` designa o papel padrão usado pelas funções serverless do seu aplicativo.
Os aplicativos podem definir papéis que encapsulam permissões sobre os objetos e ações do seu espaço de trabalho. O campo `functionRoleUniversalIdentifier` em `application.config.ts` designa o papel padrão usado pelas funções de lógica do seu app.
* A chave de API em tempo de execução, injetada como `TWENTY_API_KEY`, é derivada desse papel padrão de função.
* O cliente tipado ficará restrito às permissões concedidas a esse papel.
@@ -411,7 +411,7 @@ Notas:
* `permissionFlags` controlam o acesso a recursos em nível de plataforma. Mantenha-os mínimos; adicione apenas o que for necessário.
* Veja um exemplo funcional no app Hello World: [`packages/twenty-apps/hello-world/src/roles/function-role.ts`](https://github.com/twentyhq/twenty/blob/main/packages/twenty-apps/hello-world/src/roles/function-role.ts).
### Configuração de função serverless e ponto de entrada
### Configuração de função de lógica e ponto de entrada
Cada arquivo de função usa `defineFunction()` para exportar uma configuração com um handler e gatilhos opcionais. Use o sufixo de arquivo `*.function.ts` para detecção automática.
@@ -510,7 +510,7 @@ Notas:
**Para migrar funções existentes:** Atualize seu handler para desestruturar de `event.body`, `event.queryStringParameters` ou `event.pathParameters` em vez de diretamente do objeto de parâmetros.
</Warning>
Quando um gatilho de rota invoca sua função, ela recebe um objeto `RoutePayload` que segue o formato do AWS HTTP API v2. Importe o tipo de `twenty-sdk`:
Quando um gatilho de rota invoca sua função de lógica, ela recebe um objeto `RoutePayload` que segue o formato do AWS HTTP API v2. Importe o tipo de `twenty-sdk`:
```typescript
import { defineFunction, type RoutePayload } from 'twenty-sdk';
@@ -540,7 +540,7 @@ O tipo `RoutePayload` tem a seguinte estrutura:
### Encaminhamento de cabeçalhos HTTP
Por padrão, os cabeçalhos HTTP das requisições recebidas **não** são repassados para sua função serverless por motivos de segurança. Para acessar cabeçalhos específicos, liste-os explicitamente no array `forwardedRequestHeaders`:
Por padrão, os cabeçalhos HTTP das requisições recebidas **não** são repassados para sua função de lógica por motivos de segurança. Para acessar cabeçalhos específicos, liste-os explicitamente no array `forwardedRequestHeaders`:
```typescript
export default defineFunction({
@@ -578,7 +578,7 @@ const handler = async (event: RoutePayload) => {
Você pode criar novas funções de duas formas:
* **Scaffolded**: Run `yarn entity:add` and choose the option to add a new function. Isso gera um arquivo inicial com um handler e configuração.
* **Gerado automaticamente**: Execute `yarn entity:add` e escolha a opção para adicionar uma nova função. Isso gera um arquivo inicial com um handler e configuração.
* **Manual**: Crie um novo arquivo `*.function.ts` e use `defineFunction()`, seguindo o mesmo padrão.
### Cliente tipado gerado
@@ -592,9 +592,9 @@ const client = new Twenty();
const { me } = await client.query({ me: { id: true, displayName: true } });
```
O cliente é regenerado pelo `yarn app:generate`. Re-run after changing your objects or when onboarding to a new workspace.
O cliente é regenerado pelo `yarn app:generate`. Execute novamente após alterar seus objetos ou ao ingressar em um novo workspace.
#### Credenciais em tempo de execução em funções serverless
#### Credenciais em tempo de execução em funções de lógica
Quando sua função é executada no Twenty, a plataforma injeta credenciais como variáveis de ambiente antes da execução do seu código:
@@ -604,7 +604,7 @@ Quando sua função é executada no Twenty, a plataforma injeta credenciais como
Notas:
* Você não precisa passar a URL ou a chave de API para o cliente gerado. Ele lê `TWENTY_API_URL` e `TWENTY_API_KEY` de process.env em tempo de execução.
* As permissões da chave de API são determinadas pelo papel referenciado no seu `application.config.ts` via `functionRoleUniversalIdentifier`. Este é o papel padrão usado pelas funções serverless do seu aplicativo.
* As permissões da chave de API são determinadas pelo papel referenciado no seu `application.config.ts` via `functionRoleUniversalIdentifier`. Este é o papel padrão usado pelas funções de lógica do seu app.
* Os aplicativos podem definir papéis para seguir o princípio do menor privilégio. Conceda apenas as permissões de que suas funções precisam e, em seguida, aponte `functionRoleUniversalIdentifier` para o identificador universal desse papel.
### Exemplo Hello World
@@ -640,13 +640,13 @@ Em seguida, adicione scripts como estes:
}
```
Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:generate`, etc.
Agora você pode executar os mesmos comandos via Yarn, por exemplo, `yarn app:dev`, `yarn app:generate`, etc.
## Resolução de Problemas
* Erros de autenticação: execute `yarn auth:login` e certifique-se de que sua chave de API tenha as permissões necessárias.
* Não é possível conectar ao servidor: verifique a URL da API e se o servidor do Twenty está acessível.
* Types or client missing/outdated: run `yarn app:generate`.
* Tipos ou cliente ausentes/desatualizados: execute `yarn app:generate`.
* Modo de desenvolvimento não sincronizando: certifique-se de que `yarn app:dev` esteja em execução e de que as alterações não estejam sendo ignoradas pelo seu ambiente.
Canal de ajuda no Discord: https://discord.com/channels/1130383047699738754/1130386664812982322
@@ -292,21 +292,21 @@ yarn command:prod cron:workflow:automated-cron-trigger
**Modo somente ambiente:** Se você definir `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, adicione estas variáveis ao seu arquivo `.env`.
</Warning>
## Funções serverless
## Funções lógicas
O Twenty oferece suporte a funções serverless para fluxos de trabalho e lógica personalizada. O ambiente de execução é configurado por meio da variável de ambiente `SERVERLESS_TYPE`.
O Twenty oferece suporte a funções lógicas para fluxos de trabalho e lógica personalizada. O ambiente de execução é configurado por meio da variável de ambiente `SERVERLESS_TYPE`.
<Warning>
**Aviso de segurança:** O driver serverless local (`SERVERLESS_TYPE=LOCAL`) executa código diretamente no host em um processo Node.js sem sandbox. Deve ser usado apenas para código confiável em desenvolvimento. Para implantações de produção que lidam com código não confiável, recomendamos fortemente usar `SERVERLESS_TYPE=LAMBDA` ou `SERVERLESS_TYPE=DISABLED`.
**Aviso de segurança:** O driver local (`SERVERLESS_TYPE=LOCAL`) executa código diretamente no host em um processo Node.js sem sandbox. Deve ser usado apenas para código confiável em desenvolvimento. Para implantações de produção que lidam com código não confiável, recomendamos fortemente usar `SERVERLESS_TYPE=LAMBDA` ou `SERVERLESS_TYPE=DISABLED`.
</Warning>
### Drivers disponíveis
| Driver | Variável de ambiente | Caso de uso | Nível de segurança |
| ---------- | -------------------------- | --------------------------------------------- | -------------------------------------- |
| Desativado | `SERVERLESS_TYPE=DISABLED` | Desativar completamente as funções serverless | N/A |
| Local | `SERVERLESS_TYPE=LOCAL` | Desenvolvimento e ambientes confiáveis | Baixo (sem sandbox) |
| Lambda | `SERVERLESS_TYPE=LAMBDA` | Produção com código não confiável | Alto (isolamento em nível de hardware) |
| Driver | Variável de ambiente | Caso de uso | Nível de segurança |
| ---------- | -------------------------- | ------------------------------------------ | -------------------------------------- |
| Desativado | `SERVERLESS_TYPE=DISABLED` | Desativar completamente as funções lógicas | N/A |
| Local | `SERVERLESS_TYPE=LOCAL` | Desenvolvimento e ambientes confiáveis | Baixo (sem sandbox) |
| Lambda | `SERVERLESS_TYPE=LAMBDA` | Produção com código não confiável | Alto (isolamento em nível de hardware) |
### Configuração recomendada
@@ -326,12 +326,12 @@ SERVERLESS_LAMBDA_ACCESS_KEY_ID=your-access-key
SERVERLESS_LAMBDA_SECRET_ACCESS_KEY=your-secret-key
```
**Para desativar as funções serverless:**
**Para desativar as funções lógicas:**
```bash
SERVERLESS_TYPE=DISABLED
```
<Note>
Ao usar `SERVERLESS_TYPE=DISABLED`, qualquer tentativa de executar uma função serverless retornará um erro. Isso é útil se você quiser executar o Twenty sem recursos de funções serverless.
Ao usar `SERVERLESS_TYPE=DISABLED`, qualquer tentativa de executar uma função lógica retornará um erro. Isso é útil se você quiser executar o Twenty sem recursos de funções lógicas.
</Note>
@@ -9,7 +9,7 @@ API (Interface de Programação de Aplicações) permite que você conecte o Twe
## Aplicativos
Os aplicativos são extensões personalizadas escritas em código que podem definir modelos de dados e funções sem servidor. Eles permitem que desenvolvedores criem personalizações reutilizáveis que podem ser implantadas em vários espaços de trabalho.
Os aplicativos são extensões personalizadas escritas em código que podem definir modelos de dados e funções de lógica. Eles permitem que desenvolvedores criem personalizações reutilizáveis que podem ser implantadas em vários espaços de trabalho.
## Ações de código
@@ -136,7 +136,7 @@ Você pode anexar arquivos a e-mails enviados a partir de fluxos de trabalho. O
| **Confirmações de evento** | Detalhes ou agenda do evento |
<Note>
Os anexos são estáticos — o mesmo arquivo é enviado a todos os destinatários. Para documentos dinâmicos (como cotações personalizadas), gere e anexe arquivos usando uma [Função sem servidor](/l/pt/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty).
Os anexos são estáticos — o mesmo arquivo é enviado a todos os destinatários. Para documentos dinâmicos (como cotações personalizadas), gere e anexe arquivos usando uma [Função Lógica](/l/pt/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty).
</Note>
## Melhores Práticas
@@ -256,7 +256,7 @@ Executa JavaScript personalizado dentro do seu fluxo de trabalho.
* Teste o código diretamente na etapa
<Note>
Se você precisar usar chaves de API externas em seu código, deverá inseri-las diretamente no corpo da função. Você não pode configurar chaves de API em outro lugar e referenciá-las na função serverless.
Se você precisar usar chaves de API externas em seu código, deverá inseri-las diretamente no corpo da função. Você não pode configurar chaves de API em outro lugar e referenciá-las na função de lógica.
</Note>
<Tip>
@@ -7,7 +7,7 @@ Gere automaticamente ou obtenha um PDF e anexe-o a um registo no Twenty. Isto é
## Visão Geral
Este fluxo de trabalho utiliza um **Gatilho Manual** para que os utilizadores possam gerar um PDF a pedido para qualquer registo selecionado. Uma **Função serverless** trata de:
Este fluxo de trabalho utiliza um **Gatilho Manual** para que os utilizadores possam gerar um PDF a pedido para qualquer registo selecionado. Uma **Função lógica** trata de:
1. Transferir o PDF a partir de um URL (de um serviço de geração de PDF)
2. Carregar o ficheiro para o Twenty
@@ -17,7 +17,7 @@ Este fluxo de trabalho utiliza um **Gatilho Manual** para que os utilizadores po
Antes de configurar o fluxo de trabalho:
1. **Crie uma Chave de API**: Vá a **Definições → APIs** e crie uma nova chave de API. Vai precisar deste token para a função serverless.
1. **Crie uma Chave de API**: Vá a **Definições → APIs** e crie uma nova chave de API. Vai precisar deste token para a função lógica.
2. **Configure um serviço de geração de PDF** (opcional): Se quiser gerar PDFs dinamicamente (por exemplo, orçamentos), utilize um serviço como o Carbone, o PDFMonkey ou o DocuSeal para criar o PDF e obter um URL de transferência.
## Configuração passo a passo
@@ -32,9 +32,9 @@ Antes de configurar o fluxo de trabalho:
Com um Gatilho Manual, os utilizadores podem executar este fluxo de trabalho utilizando um botão que aparece no canto superior direito quando um registo é selecionado, para gerar e anexar um PDF.
</Tip>
### Passo 2: Adicionar uma Função serverless
### Passo 2: Adicionar uma Função lógica
1. Adicione a ação **Função serverless**
1. Adicionar uma ação **Code** (função lógica)
2. Crie uma nova função com o código abaixo
3. Configure os parâmetros de entrada
@@ -45,10 +45,10 @@ Antes de configurar o fluxo de trabalho:
| `companyId` | `{{trigger.object.id}}` |
<Note>
Se estiver a anexar a um objeto diferente (Pessoa, Oportunidade, etc.), renomeie o parâmetro em conformidade (por exemplo, `personId`, `opportunityId`) e atualize a função serverless.
Se estiver a anexar a um objeto diferente (Pessoa, Oportunidade, etc.), renomeie o parâmetro em conformidade (por exemplo, `personId`, `opportunityId`) e atualize a função lógica.
</Note>
#### Código da Função serverless
#### Código da Função lógica
```typescript
export const main = async (
@@ -172,7 +172,7 @@ Atualize tanto o parâmetro da função como o objeto `variables.data` na mutaç
Se utilizar um serviço de geração de PDF, pode:
1. Primeiro, faça uma ação de Pedido HTTP para gerar o PDF
2. Passe o URL do PDF devolvido para a função serverless como parâmetro
2. Passe o URL do PDF devolvido para a função lógica como parâmetro
```typescript
export const main = async (
@@ -211,7 +211,7 @@ Para criar orçamentos ou faturas dinâmicos:
* **DocuSeal** - Plataforma de automatização de documentos
* **Documint** - Geração de documentos orientada a API
Cada serviço fornece uma API que devolve um URL de PDF, que pode depois passar para a função serverless.
Cada serviço fornece uma API que devolve um URL de PDF, que pode depois passar para a função lógica.
## Resolução de Problemas
@@ -224,5 +224,5 @@ Cada serviço fornece uma API que devolve um URL de PDF, que pode depois passar
## Relacionados
* [Gatilhos de Fluxo de Trabalho](/l/pt/user-guide/workflows/capabilities/workflow-triggers)
* [Funções serverless](/l/pt/user-guide/workflows/capabilities/workflow-actions#serverless-function)
* [Funções lógicas](/l/pt/user-guide/workflows/capabilities/workflow-actions#code)
* [Gerar um Orçamento ou Fatura a partir do Twenty](/l/pt/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty)
@@ -131,7 +131,7 @@ description: Perguntas frequentes sobre fluxos de trabalho na Twenty.
</Accordion>
<Accordion title="Qual é o tempo máximo de execução para ações Code?">
As ações Code (funções serverless) têm um **tempo limite padrão de 5 minutos** (300 segundos).
As ações Code (funções lógicas) têm um **tempo limite padrão de 5 minutos** (300 segundos).
O tempo limite máximo configurável é de **15 minutos** (900 segundos).
@@ -9,12 +9,12 @@ description: Construiți și gestionați personalizările Twenty sub formă de c
## Ce sunt aplicațiile?
Aplicațiile vă permit să construiți și să gestionați personalizările Twenty **sub formă de cod**. În loc să configurați totul prin interfața de utilizator (UI), vă definiți modelul de date și funcțiile serverless în cod — făcând mai rapidă construirea, mentenanța și implementarea în mai multe spații de lucru.
Aplicațiile vă permit să construiți și să gestionați personalizările Twenty **sub formă de cod**. În loc să configurați totul prin interfața de utilizator (UI), vă definiți modelul de date și funcțiile de logică în cod — făcând mai rapidă construirea, mentenanța și implementarea în mai multe spații de lucru.
**Ce puteți face astăzi:**
* Definiți obiecte și câmpuri personalizate sub formă de cod (model de date gestionat)
* Creați funcții serverless cu declanșatoare personalizate
* Creați funcții de logică cu declanșatoare personalizate
* Implementați aceeași aplicație în mai multe spații de lucru
**În curând:**
@@ -156,23 +156,23 @@ src/
Pe scurt:
* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall`, and `auth:login` that delegate to the local `twenty` CLI.
* **package.json**: Declară numele aplicației, versiunea, motoarele (Node 24+, Yarn 4) și adaugă `twenty-sdk` plus scripturi precum `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall` și `auth:login` care deleagă către CLI-ul local `twenty`.
* **.gitignore**: Ignoră artefacte comune precum `node_modules`, `.yarn`, `generated/` (client tipizat), `dist/`, `build/`, foldere de coverage, fișiere jurnal și fișiere `.env*`.
* **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Blochează și configurează lanțul de instrumente Yarn 4 folosit de proiect.
* **.nvmrc**: Fixează versiunea Node.js așteptată de proiect.
* **eslint.config.mjs** și **tsconfig.json**: Oferă linting și configurație TypeScript pentru fișierele TypeScript ale aplicației.
* **README.md**: Un README scurt în rădăcina aplicației, cu instrucțiuni de bază.
* **src/**: The main place where you define your application-as-code:
* **src/**: Locul principal unde vă definiți aplicația sub formă de cod:
* `application.config.ts`: Configurație globală pentru aplicație (metadate și conectare la runtime). Vezi "Configurația aplicației" mai jos.
* `*.role.ts`: Definiții de rol folosite de funcțiile dvs. serverless. Vezi "Rol implicit pentru funcții" mai jos.
* `*.role.ts`: Definiții de rol folosite de funcțiile dvs. de logică. Vezi "Rol implicit pentru funcții" mai jos.
* `*.object.ts`: Definiții de obiecte personalizate.
* `*.function.ts`: Definiții de funcții serverless.
* `*.front-component.tsx`: Front component definitions.
* `*.function.ts`: Definiții de funcții de logică.
* `*.front-component.tsx`: Definiții de componente front-end.
Comenzile ulterioare vor adăuga mai multe fișiere și foldere:
* `yarn app:generate` va crea un folder `generated/` (client Twenty tipizat + tipuri pentru spațiul de lucru).
* `yarn entity:add` will add entity definition files under `src/` for your custom objects, functions, front components, or roles.
* `yarn entity:add` va adăuga fișiere de definire a entităților în `src/` pentru obiectele, funcțiile, componentele front-end sau rolurile personalizate.
## Autentificare
@@ -219,7 +219,7 @@ SDK-ul oferă patru funcții ajutătoare cu validare încorporată pentru defini
| ------------------ | -------------------------------------------------------- |
| `defineApp()` | Configurați metadatele aplicației |
| `defineObject()` | Definiți obiecte personalizate cu câmpuri |
| `defineFunction()` | Definiți funcții serverless cu handleri |
| `defineFunction()` | Definiți funcții de logică cu handleri |
| `defineRole()` | Configurați permisiunile rolurilor și accesul la obiecte |
Aceste funcții validează configurația în timpul execuției și oferă o completare automată mai bună în IDE și siguranța tipurilor.
@@ -303,7 +303,7 @@ Puncte cheie:
* `universalIdentifier` trebuie să fie unic și stabil între implementări.
* Fiecare câmp necesită un `name`, un `type`, un `label` și propriul `universalIdentifier` stabil.
* Matricea `fields` este opțională — puteți defini obiecte fără câmpuri personalizate.
* You can scaffold new objects using `yarn entity:add`, which guides you through naming, fields, and relationships.
* Puteți genera obiecte noi folosind `yarn entity:add`, care vă ghidează prin denumire, câmpuri și relații.
<Note>
**Câmpurile de bază sunt create automat.** Când definiți un obiect personalizat, Twenty adaugă automat câmpuri standard precum `name`, `createdAt`, `updatedAt`, `createdBy`, `position` și `deletedAt`. Nu trebuie să le definiți în tabloul `fields` — adăugați doar câmpurile personalizate proprii.
@@ -349,7 +349,7 @@ Notițe:
#### Roluri și permisiuni
Aplicațiile pot defini roluri care încapsulează permisiuni asupra obiectelor și acțiunilor din spațiul dvs. de lucru. Câmpul `functionRoleUniversalIdentifier` din `application.config.ts` desemnează rolul implicit folosit de funcțiile serverless ale aplicației.
Aplicațiile pot defini roluri care încapsulează permisiuni asupra obiectelor și acțiunilor din spațiul dvs. de lucru. Câmpul `functionRoleUniversalIdentifier` din `application.config.ts` desemnează rolul implicit folosit de funcțiile de logică ale aplicației.
* Cheia API de runtime injectată ca `TWENTY_API_KEY` este derivată din acest rol implicit pentru funcții.
* Clientul tipizat va fi restricționat la permisiunile acordate acelui rol.
@@ -411,7 +411,7 @@ Notițe:
* `permissionFlags` controlează accesul la capabilități la nivelul platformei. Mențineți-le la minimum; adăugați doar ceea ce aveți nevoie.
* Vedeți un exemplu funcțional în aplicația Hello World: [`packages/twenty-apps/hello-world/src/roles/function-role.ts`](https://github.com/twentyhq/twenty/blob/main/packages/twenty-apps/hello-world/src/roles/function-role.ts).
### Configurația funcției serverless și punctul de intrare
### Configurația funcției de logică și punctul de intrare
Fiecare fișier de funcție folosește `defineFunction()` pentru a exporta o configurație cu un handler și declanșatoare opționale. Folosiți sufixul de fișier `*.function.ts` pentru detectare automată.
@@ -510,7 +510,7 @@ Notițe:
**Pentru a migra funcțiile existente:** Actualizează handler-ul pentru a extrage câmpurile din `event.body`, `event.queryStringParameters` sau `event.pathParameters` în loc să le iei direct din obiectul params.
</Warning>
Când un declanșator de rută îți apelează funcția, aceasta primește un obiect `RoutePayload` care urmează formatul AWS HTTP API v2. Importă tipul din `twenty-sdk`:
Când un declanșator de rută apelează funcția dvs. de logică, aceasta primește un obiect `RoutePayload` care urmează formatul AWS HTTP API v2. Importă tipul din `twenty-sdk`:
```typescript
import { defineFunction, type RoutePayload } from 'twenty-sdk';
@@ -540,7 +540,7 @@ Tipul `RoutePayload` are următoarea structură:
### Transmiterea anteturilor HTTP
În mod implicit, anteturile HTTP din cererile de intrare **nu** sunt transmise funcției tale serverless din motive de securitate. Pentru a accesa anumite anteturi, listează-le explicit în array-ul `forwardedRequestHeaders`:
În mod implicit, anteturile HTTP din cererile de intrare **nu** sunt transmise funcției dvs. de logică din motive de securitate. Pentru a accesa anumite anteturi, listează-le explicit în array-ul `forwardedRequestHeaders`:
```typescript
export default defineFunction({
@@ -578,7 +578,7 @@ const handler = async (event: RoutePayload) => {
Puteți crea funcții noi în două moduri:
* **Scaffolded**: Run `yarn entity:add` and choose the option to add a new function. Aceasta generează un fișier inițial cu un handler și o configurație.
* **Generat**: Rulați `yarn entity:add` și alegeți opțiunea de a adăuga o funcție nouă. Aceasta generează un fișier inițial cu un handler și o configurație.
* **Manual**: Creați un fișier nou `*.function.ts` și folosiți `defineFunction()`, urmând același model.
### Client tipizat generat
@@ -592,9 +592,9 @@ const client = new Twenty();
const { me } = await client.query({ me: { id: true, displayName: true } });
```
Clientul este regenerat de `yarn app:generate`. Re-run after changing your objects or when onboarding to a new workspace.
Clientul este regenerat de `yarn app:generate`. Rulați din nou după ce vă modificați obiectele sau când vă integrați într-un spațiu de lucru nou.
#### Acreditări la runtime în funcțiile serverless
#### Acreditări la runtime în funcțiile de logică
Când funcția rulează pe Twenty, platforma injectează acreditări ca variabile de mediu înainte de execuția codului:
@@ -604,7 +604,7 @@ Când funcția rulează pe Twenty, platforma injectează acreditări ca variabil
Notițe:
* Nu trebuie să transmiteți URL-ul sau cheia API către clientul generat. Acesta citește `TWENTY_API_URL` și `TWENTY_API_KEY` din process.env la runtime.
* Permisiunile cheii API sunt determinate de rolul referențiat în `application.config.ts` prin `functionRoleUniversalIdentifier`. Acesta este rolul implicit folosit de funcțiile serverless ale aplicației.
* Permisiunile cheii API sunt determinate de rolul referențiat în `application.config.ts` prin `functionRoleUniversalIdentifier`. Acesta este rolul implicit folosit de funcțiile de logică ale aplicației.
* Aplicațiile pot defini roluri pentru a urma principiul celui mai mic privilegiu. Acordați doar permisiunile de care au nevoie funcțiile, apoi setați `functionRoleUniversalIdentifier` la identificatorul universal al acelui rol.
### Exemplu Hello World
@@ -640,13 +640,13 @@ Apoi adăugați scripturi ca acestea:
}
```
Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:generate`, etc.
Acum puteți rula aceleași comenzi prin Yarn, de ex. `yarn app:dev`, `yarn app:generate`, etc.
## Depanare
* Erori de autentificare: rulați `yarn auth:login` și asigurați-vă că cheia API are permisiunile necesare.
* Nu se poate conecta la server: verificați URL-ul API și că serverul Twenty este accesibil.
* Types or client missing/outdated: run `yarn app:generate`.
* Tipuri sau client lipsă/învechite: rulați `yarn app:generate`.
* Modul dev nu sincronizează: asigurați-vă că `yarn app:dev` rulează și că modificările nu sunt ignorate de mediul dvs.
Canal de ajutor pe Discord: https://discord.com/channels/1130383047699738754/1130386664812982322
@@ -292,21 +292,21 @@ yarn command:prod cron:workflow:automated-cron-trigger
**Mod doar pentru mediu:** Dacă setați `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, adăugați aceste variabile în fișierul dvs. `.env` în schimb.
</Warning>
## Funcții serverless
## Funcții logice
Twenty acceptă funcții serverless pentru fluxuri de lucru și logică personalizată. Mediul de execuție este configurat prin variabila de mediu `SERVERLESS_TYPE`.
Twenty acceptă funcții logice pentru fluxuri de lucru și logică personalizată. Mediul de execuție este configurat prin variabila de mediu `SERVERLESS_TYPE`.
<Warning>
**Atenționare de securitate:** Driverul serverless local (`SERVERLESS_TYPE=LOCAL`) rulează codul direct pe gazdă într-un proces Node.js, fără sandboxing. Ar trebui utilizat doar pentru cod de încredere, în dezvoltare. Pentru implementări de producție care gestionează cod neverificat, recomandăm cu tărie utilizarea `SERVERLESS_TYPE=LAMBDA` sau `SERVERLESS_TYPE=DISABLED`.
**Atenționare de securitate:** Driverul local (`SERVERLESS_TYPE=LOCAL`) rulează codul direct pe gazdă într-un proces Node.js, fără sandboxing. Ar trebui utilizat doar pentru cod de încredere, în dezvoltare. Pentru implementări de producție care gestionează cod neverificat, recomandăm cu tărie utilizarea `SERVERLESS_TYPE=LAMBDA` sau `SERVERLESS_TYPE=DISABLED`.
</Warning>
### Drivere disponibile
| Driver | Variabilă de mediu | Caz de utilizare | Nivel de securitate |
| ---------- | -------------------------- | ----------------------------------------- | -------------------------------------- |
| Dezactivat | `SERVERLESS_TYPE=DISABLED` | Dezactivează complet funcțiile serverless | N/A |
| Local | `SERVERLESS_TYPE=LOCAL` | Dezvoltare și medii de încredere | Scăzut (fără sandboxing) |
| Lambda | `SERVERLESS_TYPE=LAMBDA` | Producție cu cod neverificat | Ridicat (izolare la nivel de hardware) |
| Driver | Variabilă de mediu | Caz de utilizare | Nivel de securitate |
| ---------- | -------------------------- | ------------------------------------- | -------------------------------------- |
| Dezactivat | `SERVERLESS_TYPE=DISABLED` | Dezactivează complet funcțiile logice | N/A |
| Local | `SERVERLESS_TYPE=LOCAL` | Dezvoltare și medii de încredere | Scăzut (fără sandboxing) |
| Lambda | `SERVERLESS_TYPE=LAMBDA` | Producție cu cod neverificat | Ridicat (izolare la nivel de hardware) |
### Configurație recomandată
@@ -326,12 +326,12 @@ SERVERLESS_LAMBDA_ACCESS_KEY_ID=your-access-key
SERVERLESS_LAMBDA_SECRET_ACCESS_KEY=your-secret-key
```
**Pentru a dezactiva funcțiile serverless:**
**Pentru a dezactiva funcțiile logice:**
```bash
SERVERLESS_TYPE=DISABLED
```
<Note>
Când se utilizează `SERVERLESS_TYPE=DISABLED`, orice încercare de a executa o funcție serverless va returna o eroare. Acest lucru este util dacă doriți să rulați Twenty fără capabilități de funcții serverless.
Când se utilizează `SERVERLESS_TYPE=DISABLED`, orice încercare de a executa o funcție logică va returna o eroare. Acest lucru este util dacă doriți să rulați Twenty fără capabilități de funcții logice.
</Note>
@@ -9,7 +9,7 @@ API (Interfața de Programare a Aplicațiilor) permite conectarea Twenty cu alte
## Aplicații
Aplicațiile sunt extensii personalizate sub formă de cod, care pot defini modele de date și funcții serverless. Acestea le permit dezvoltatorilor să creeze personalizări reutilizabile care pot fi implementate în mai multe spații de lucru.
Aplicațiile sunt extensii personalizate sub formă de cod, care pot defini modele de date și funcții de logică. Acestea le permit dezvoltatorilor să creeze personalizări reutilizabile care pot fi implementate în mai multe spații de lucru.
## Acțiuni de cod
@@ -136,7 +136,7 @@ Puteți atașa fișiere la e-mailurile trimise din fluxuri de lucru. Atașamentu
| **Confirmări pentru evenimente** | Detalii despre eveniment sau agendă |
<Note>
Atașamentele sunt statice — același fișier este trimis tuturor destinatarilor. Pentru documente dinamice (cum ar fi ofertele personalizate), generați și atașați fișiere folosind o [Funcție serverless](/l/ro/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty).
Atașamentele sunt statice — același fișier este trimis tuturor destinatarilor. Pentru documente dinamice (cum ar fi ofertele personalizate), generați și atașați fișiere folosind o [Funcție logică](/l/ro/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty).
</Note>
## Cele mai bune practici
@@ -256,7 +256,7 @@ Rulați JavaScript personalizat în cadrul fluxului dumneavoastră de lucru.
* Testați codul direct în pas
<Note>
Dacă trebuie să utilizați chei API externe în codul dvs., trebuie să le introduceți direct în corpul funcției. Nu puteți configura cheile API în altă parte și face referire la ele în funcția serverless.
Dacă trebuie să utilizați chei API externe în codul dvs., trebuie să le introduceți direct în corpul funcției. Nu puteți configura cheile API în altă parte și faceți referire la ele în funcția logică.
</Note>
<Tip>
@@ -7,7 +7,7 @@ Generați sau preluați automat un PDF și atașați-l la o înregistrare în Tw
## Prezentare generală
Acest flux de lucru folosește un **Manual Trigger** pentru ca utilizatorii să poată genera un PDF la cerere pentru orice înregistrare selectată. O **Serverless Function** se ocupă de:
Acest flux de lucru folosește un **Manual Trigger** pentru ca utilizatorii să poată genera un PDF la cerere pentru orice înregistrare selectată. O **funcție logică** se ocupă de:
1. Descărcarea PDF-ului dintr-un URL (de la un serviciu de generare PDF)
2. Încărcarea fișierului în Twenty
@@ -17,7 +17,7 @@ Acest flux de lucru folosește un **Manual Trigger** pentru ca utilizatorii să
Înainte de a configura fluxul de lucru:
1. **Creați o cheie API**: Accesați **Settings → APIs** și creați o nouă cheie API. Veți avea nevoie de acest token pentru funcția serverless.
1. **Creați o cheie API**: Accesați **Settings → APIs** și creați o nouă cheie API. Veți avea nevoie de acest token pentru funcția logică.
2. **Configurați un serviciu de generare PDF** (opțional): Dacă doriți să generați dinamic fișiere PDF (de ex., oferte), utilizați un serviciu precum Carbone, PDFMonkey sau DocuSeal pentru a crea PDF-ul și a obține un URL de descărcare.
## Configurare pas cu pas
@@ -32,9 +32,9 @@ Acest flux de lucru folosește un **Manual Trigger** pentru ca utilizatorii să
Cu un Manual Trigger, utilizatorii pot rula acest flux de lucru folosind un buton care apare în dreapta sus după selectarea unei înregistrări, pentru a genera și atașa un PDF.
</Tip>
### Pasul 2: Adăugați o Serverless Function
### Pasul 2: Adăugați o funcție logică
1. Adăugați o acțiune **Serverless Function**
1. Adăugați o acțiune **Code** (funcție logică)
2. Creați o funcție nouă cu codul de mai jos
3. Configurați parametrii de intrare
@@ -45,10 +45,10 @@ Acest flux de lucru folosește un **Manual Trigger** pentru ca utilizatorii să
| `companyId` | `{{trigger.object.id}}` |
<Note>
Dacă atașați la un alt obiect (Persoană, Oportunitate etc.), redenumiți parametrul în mod corespunzător (de ex., `personId`, `opportunityId`) și actualizați funcția serverless.
Dacă atașați la un alt obiect (Persoană, Oportunitate etc.), redenumiți parametrul în mod corespunzător (de ex., `personId`, `opportunityId`) și actualizați funcția logică.
</Note>
#### Cod pentru Serverless Function
#### Codul funcției logice
```typescript
export const main = async (
@@ -172,7 +172,7 @@ Actualizați atât parametrul funcției, cât și obiectul `variables.data` în
Dacă utilizați un serviciu de generare PDF, puteți:
1. Mai întâi creați o acțiune HTTP Request pentru a genera PDF-ul
2. Transmiteți URL-ul PDF returnat către funcția serverless ca parametru
2. Transmiteți URL-ul PDF returnat către funcția logică ca parametru
```typescript
export const main = async (
@@ -211,7 +211,7 @@ Pentru crearea de oferte sau facturi dinamice:
* **DocuSeal** - Platformă de automatizare a documentelor
* **Documint** - Generare de documente orientată pe API
Fiecare serviciu oferă un API care returnează un URL către PDF, pe care îl puteți apoi transmite funcției serverless.
Fiecare serviciu oferă un API care returnează un URL către PDF, pe care îl puteți apoi transmite funcției logice.
## Depanare
@@ -224,5 +224,5 @@ Fiecare serviciu oferă un API care returnează un URL către PDF, pe care îl p
## Conexe
* [Declanșatoare ale fluxurilor de lucru](/l/ro/user-guide/workflows/capabilities/workflow-triggers)
* [Funcții serverless](/l/ro/user-guide/workflows/capabilities/workflow-actions#serverless-function)
* [Funcții logice](/l/ro/user-guide/workflows/capabilities/workflow-actions#code)
* [Generați o ofertă sau o factură din Twenty](/l/ro/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty)
@@ -131,7 +131,7 @@ description: Întrebări frecvente despre fluxurile de lucru din Twenty.
</Accordion>
<Accordion title="Care este timpul maxim de execuție pentru acțiunile Code?">
Acțiunile Code (funcții serverless) au un **timeout implicit de 5 minute** (300 de secunde).
Acțiunile Code (funcții logice) au un **timeout implicit de 5 minute** (300 de secunde).
Timeoutul maxim configurabil este de **15 minute** (900 de secunde).
@@ -9,12 +9,12 @@ description: Создавайте и управляйте настройками
## Что такое приложения?
Приложения позволяют создавать и управлять настройками Twenty **в виде кода**. Вместо настройки всего через интерфейс вы определяете модель данных и бессерверные функции в коде — так быстрее создавать, поддерживать и развёртывать в нескольких рабочих пространствах.
Приложения позволяют создавать и управлять настройками Twenty **в виде кода**. Вместо настройки всего через интерфейс вы определяете модель данных и логические функции в коде — так быстрее создавать, поддерживать и развёртывать в нескольких рабочих пространствах.
**Что вы можете делать уже сегодня:**
* Определяйте пользовательские объекты и поля в виде кода (управляемая модель данных)
* Создавайте бессерверные функции с пользовательскими триггерами
* Создавайте логические функции с пользовательскими триггерами
* Развёртывайте одно и то же приложение в нескольких рабочих пространствах
**Скоро:**
@@ -156,23 +156,23 @@ src/
В общих чертах:
* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall`, and `auth:login` that delegate to the local `twenty` CLI.
* **package.json**: Объявляет имя приложения, версию, движки (Node 24+, Yarn 4) и добавляет `twenty-sdk`, а также скрипты вроде `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall` и `auth:login`, которые делегируют выполнение локальному CLI `twenty`.
* **.gitignore**: Игнорирует распространённые артефакты, такие как `node_modules`, `.yarn`, `generated/` (типизированный клиент), `dist/`, `build/`, каталоги coverage, файлы журналов и файлы `.env*`.
* **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Фиксируют и настраивают используемый в проекте инструментарий Yarn 4.
* **.nvmrc**: Фиксирует версию Node.js, ожидаемую проектом.
* **eslint.config.mjs** и **tsconfig.json**: Обеспечивают линтинг и конфигурацию TypeScript для исходников вашего приложения на TypeScript.
* **README.md**: Короткий README в корне приложения с базовыми инструкциями.
* **src/**: The main place where you define your application-as-code:
* **src/**: Основное место, где вы определяете приложение как код:
* `application.config.ts`: Глобальная конфигурация вашего приложения (метаданные и параметры выполнения). См. раздел «Конфигурация приложения» ниже.
* `*.role.ts`: Определения ролей, используемых вашими бессерверными функциями. См. раздел «Роль функции по умолчанию» ниже.
* `*.role.ts`: Определения ролей, используемых вашими логическими функциями. См. раздел «Роль функции по умолчанию» ниже.
* `*.object.ts`: Определения пользовательских объектов.
* `*.function.ts`: Определения бессерверных функций.
* `*.front-component.tsx`: Front component definitions.
* `*.function.ts`: Определения логических функций.
* `*.front-component.tsx`: Определения фронтенд-компонентов.
Позднее команды добавят больше файлов и папок:
* `yarn app:generate` создаст папку `generated/` (типизированный клиент Twenty + типы рабочего пространства).
* `yarn entity:add` will add entity definition files under `src/` for your custom objects, functions, front components, or roles.
* `yarn entity:add` добавит файлы определений сущностей в `src/` для ваших пользовательских объектов, функций, фронтенд-компонентов или ролей.
## Аутентификация
@@ -215,12 +215,12 @@ yarn auth:status
SDK предоставляет четыре вспомогательных функции с встроенной валидацией для определения сущностей вашего приложения:
| Функция | Назначение |
| ------------------ | ----------------------------------------------- |
| `defineApp()` | Настраивает метаданные приложения |
| `defineObject()` | Определяет пользовательские объекты с полями |
| `defineFunction()` | Определяет бессерверные функции с обработчиками |
| `defineRole()` | Настраивает права роли и доступ к объектам |
| Функция | Назначение |
| ------------------ | ---------------------------------------------- |
| `defineApp()` | Настраивает метаданные приложения |
| `defineObject()` | Определяет пользовательские объекты с полями |
| `defineFunction()` | Определение логических функций с обработчиками |
| `defineRole()` | Настраивает права роли и доступ к объектам |
Эти функции проверяют вашу конфигурацию во время выполнения и обеспечивают лучшую автодополняемость в IDE и безопасность типов.
@@ -303,7 +303,7 @@ export default defineObject({
* `universalIdentifier` должен быть уникальным и стабильным между развёртываниями.
* Каждому полю требуются `name`, `type`, `label` и собственный стабильный `universalIdentifier`.
* Массив `fields` необязателен — вы можете определять объекты без пользовательских полей.
* You can scaffold new objects using `yarn entity:add`, which guides you through naming, fields, and relationships.
* Вы можете сгенерировать новые объекты с помощью `yarn entity:add`, который проведёт вас через выбор именования, полей и связей.
<Note>
**Базовые поля создаются автоматически.** Когда вы определяете пользовательский объект, Twenty автоматически добавляет стандартные поля, такие как `name`, `createdAt`, `updatedAt`, `createdBy`, `position` и `deletedAt`. Вам не нужно определять их в массиве `fields` — добавляйте только свои пользовательские поля.
@@ -349,7 +349,7 @@ export default defineApp({
#### Роли и разрешения
Приложения могут определять роли, инкапсулирующие права на объекты и действия в вашем рабочем пространстве. Поле `functionRoleUniversalIdentifier` в `application.config.ts` обозначает роль по умолчанию, используемую бессерверными функциями вашего приложения.
Приложения могут определять роли, инкапсулирующие права на объекты и действия в вашем рабочем пространстве. Поле `functionRoleUniversalIdentifier` в `application.config.ts` обозначает роль по умолчанию, используемую логическими функциями вашего приложения.
* Ключ API во время выполнения, подставляемый как `TWENTY_API_KEY`, получается из этой роли функции по умолчанию.
* Типизированный клиент будет ограничен правами, предоставленными этой ролью.
@@ -411,7 +411,7 @@ export default defineRole({
* `permissionFlags` управляют доступом к возможностям на уровне платформы. Держите их минимальными; добавляйте только то, что нужно.
* См. рабочий пример в приложении Hello World: [`packages/twenty-apps/hello-world/src/roles/function-role.ts`](https://github.com/twentyhq/twenty/blob/main/packages/twenty-apps/hello-world/src/roles/function-role.ts).
### Конфигурация бессерверной функции и точка входа
### Конфигурация логической функции и точка входа
Каждый файл функции использует `defineFunction()` для экспорта конфигурации с обработчиком и необязательными триггерами. Используйте суффикс файла `*.function.ts` для автоматического обнаружения.
@@ -510,7 +510,7 @@ export default defineFunction({
**Чтобы мигрировать существующие функции:** Обновите обработчик, чтобы деструктурировать из `event.body`, `event.queryStringParameters` или `event.pathParameters` вместо прямого доступа к объекту params.
</Warning>
Когда триггер маршрута вызывает вашу функцию, она получает объект `RoutePayload`, соответствующий формату AWS HTTP API v2. Импортируйте тип из `twenty-sdk`:
Когда триггер маршрута вызывает вашу логическую функцию, она получает объект `RoutePayload`, соответствующий формату AWS HTTP API v2. Импортируйте тип из `twenty-sdk`:
```typescript
import { defineFunction, type RoutePayload } from 'twenty-sdk';
@@ -540,7 +540,7 @@ const handler = async (event: RoutePayload) => {
### Проброс HTTP-заголовков
По умолчанию HTTP-заголовки из входящих запросов **не** передаются в вашу бессерверную функцию по соображениям безопасности. Чтобы получить доступ к определённым заголовкам, явно перечислите их в массиве `forwardedRequestHeaders`:
По умолчанию HTTP-заголовки из входящих запросов **не** передаются в вашу логическую функцию по соображениям безопасности. Чтобы получить доступ к определённым заголовкам, явно перечислите их в массиве `forwardedRequestHeaders`:
```typescript
export default defineFunction({
@@ -578,7 +578,7 @@ const handler = async (event: RoutePayload) => {
Вы можете создать новые функции двумя способами:
* **Scaffolded**: Run `yarn entity:add` and choose the option to add a new function. Это создаёт стартовый файл с обработчиком и конфигурацией.
* **Сгенерировано**: Запустите `yarn entity:add` и выберите опцию добавления новой функции. Это создаёт стартовый файл с обработчиком и конфигурацией.
* **Вручную**: Создайте новый файл `*.function.ts` и используйте `defineFunction()`, следуя тому же шаблону.
### Сгенерированный типизированный клиент
@@ -592,9 +592,9 @@ const client = new Twenty();
const { me } = await client.query({ me: { id: true, displayName: true } });
```
Клиент повторно генерируется командой `yarn app:generate`. Re-run after changing your objects or when onboarding to a new workspace.
Клиент повторно генерируется командой `yarn app:generate`. Запускайте повторно после изменения ваших объектов или при подключении к новому рабочему пространству.
#### Учётные данные времени выполнения в бессерверных функциях
#### Учётные данные времени выполнения в логических функциях
Когда ваша функция запускается на Twenty, платформа подставляет учётные данные как переменные окружения перед выполнением вашего кода:
@@ -604,7 +604,7 @@ const { me } = await client.query({ me: { id: true, displayName: true } });
Заметки:
* Вам не нужно передавать URL или ключ API сгенерированному клиенту. Он читает `TWENTY_API_URL` и `TWENTY_API_KEY` из process.env во время выполнения.
* Права ключа API определяются ролью, на которую ссылается ваш `application.config.ts` через `functionRoleUniversalIdentifier`. Это роль по умолчанию, используемая бессерверными функциями вашего приложения.
* Права ключа API определяются ролью, на которую ссылается ваш `application.config.ts` через `functionRoleUniversalIdentifier`. Это роль по умолчанию, используемая логическими функциями вашего приложения.
* Приложения могут определять роли, чтобы следовать принципу наименьших привилегий. Выдавайте только те права, которые нужны вашим функциям, затем укажите в `functionRoleUniversalIdentifier` универсальный идентификатор этой роли.
### Пример Hello World
@@ -640,13 +640,13 @@ yarn add -D twenty-sdk
}
```
Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:generate`, etc.
Теперь вы можете запускать те же команды через Yarn, например, `yarn app:dev`, `yarn app:generate` и т. д.
## Устранение неполадок
* Ошибки аутентификации: выполните `yarn auth:login` и убедитесь, что у вашего ключа API есть необходимые права.
* Не удаётся подключиться к серверу: проверьте URL API и доступность сервера Twenty.
* Types or client missing/outdated: run `yarn app:generate`.
* Типы или клиент отсутствуют/устарели: выполните `yarn app:generate`.
* Режим разработки не синхронизируется: убедитесь, что запущен `yarn app:dev`, и что ваша среда не игнорирует изменения.
Канал помощи в Discord: https://discord.com/channels/1130383047699738754/1130386664812982322
@@ -291,21 +291,21 @@ yarn command:prod cron:workflow:automated-cron-trigger
**Режим только для среды:** если вы установили `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`, добавьте эти переменные в свой `.env` файл вместо этого.
</Warning>
## Бессерверные функции
## Логические функции
Twenty поддерживает бессерверные функции для рабочих процессов и пользовательской логики. Среда выполнения настраивается через переменную окружения `SERVERLESS_TYPE`.
Twenty поддерживает логические функции для рабочих процессов и пользовательской логики. Среда выполнения настраивается через переменную окружения `SERVERLESS_TYPE`.
<Warning>
**Уведомление о безопасности:** локальный драйвер бессерверных функций (`SERVERLESS_TYPE=LOCAL`) выполняет код напрямую на хосте в процессе Node.js без изоляции. Его следует использовать только для доверенного кода в разработке. Для промышленных развертываний, обрабатывающих недоверенный код, настоятельно рекомендуем использовать `SERVERLESS_TYPE=LAMBDA` или `SERVERLESS_TYPE=DISABLED`.
**Уведомление о безопасности:** локальный драйвер (`SERVERLESS_TYPE=LOCAL`) выполняет код напрямую на хосте в процессе Node.js без изоляции. Его следует использовать только для доверенного кода в разработке. Для промышленных развертываний, обрабатывающих недоверенный код, настоятельно рекомендуем использовать `SERVERLESS_TYPE=LAMBDA` или `SERVERLESS_TYPE=DISABLED`.
</Warning>
### Доступные драйверы
| Драйвер | Переменная окружения | Сценарий использования | Уровень безопасности |
| --------- | -------------------------- | ---------------------------------------- | ----------------------------------------- |
| Отключено | `SERVERLESS_TYPE=DISABLED` | Полностью отключить бессерверные функции | Н/Д |
| Локальный | `SERVERLESS_TYPE=LOCAL` | Разработка и доверенные среды | Низкий (без изоляции) |
| Lambda | `SERVERLESS_TYPE=LAMBDA` | Продакшн с недоверенным кодом | Высокий (изоляция на уровне оборудования) |
| Драйвер | Переменная окружения | Сценарий использования | Уровень безопасности |
| --------- | -------------------------- | -------------------------------------- | ----------------------------------------- |
| Отключено | `SERVERLESS_TYPE=DISABLED` | Полностью отключить логические функции | Н/Д |
| Локальный | `SERVERLESS_TYPE=LOCAL` | Разработка и доверенные среды | Низкий (без изоляции) |
| Lambda | `SERVERLESS_TYPE=LAMBDA` | Продакшн с недоверенным кодом | Высокий (изоляция на уровне оборудования) |
### Рекомендуемая конфигурация
@@ -325,12 +325,12 @@ SERVERLESS_LAMBDA_ACCESS_KEY_ID=your-access-key
SERVERLESS_LAMBDA_SECRET_ACCESS_KEY=your-secret-key
```
**Чтобы отключить бессерверные функции:**
**Чтобы отключить логические функции:**
```bash
SERVERLESS_TYPE=DISABLED
```
<Note>
При использовании `SERVERLESS_TYPE=DISABLED` любая попытка выполнить бессерверную функцию вернет ошибку. Это полезно, если вы хотите запускать Twenty без возможностей бессерверных функций.
При использовании `SERVERLESS_TYPE=DISABLED` любая попытка выполнить логическую функцию вернет ошибку. Это полезно, если вы хотите запускать Twenty без возможностей логических функций.
</Note>
@@ -9,7 +9,7 @@ API (интерфейс программирования приложений)
## Приложения
Приложения — это настраиваемые расширения, создаваемые в виде кода, которые могут определять модели данных и бессерверные функции. Они позволяют разработчикам создавать повторно используемые пользовательские настройки, которые можно развертывать в нескольких рабочих пространствах.
Приложения — это настраиваемые расширения, создаваемые в виде кода, которые могут определять модели данных и функции бизнес-логики. Они позволяют разработчикам создавать повторно используемые пользовательские настройки, которые можно развертывать в нескольких рабочих пространствах.
## Действия кода
@@ -136,7 +136,7 @@ The Team
| **Подтверждения участия в мероприятиях** | Информация о мероприятии или программа |
<Note>
Вложения статичны — один и тот же файл отправляется всем получателям. Для динамических документов (например, персонализированных коммерческих предложений) генерируйте и прикрепляйте файлы с помощью [функции без сервера](/l/ru/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty).
Вложения статичны — один и тот же файл отправляется всем получателям. Для динамических документов (например, персонализированных коммерческих предложений) генерируйте и прикрепляйте файлы с помощью [Logic Function](/l/ru/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty).
</Note>
## Лучшие практики
@@ -256,7 +256,7 @@ import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
* Проверяйте код непосредственно в шаге
<Note>
Если вам нужно использовать внешние ключи API в вашем коде, их необходимо вводить прямо в тело функции. Нельзя настроить ключи API в другом месте и ссылаться на них в бессерверной функции.
Если вам нужно использовать внешние ключи API в вашем коде, их необходимо вводить прямо в тело функции. Нельзя настроить ключи API в другом месте и ссылаться на них в логической функции.
</Note>
<Tip>
@@ -7,7 +7,7 @@ description: Создайте рабочий процесс для создан
## Обзор
В этом рабочем процессе используется **Ручной триггер**, чтобы пользователи могли по запросу создавать PDF для любой выбранной записи. За обработку отвечает **Бессерверная функция**:
В этом рабочем процессе используется **Ручной триггер**, чтобы пользователи могли по запросу создавать PDF для любой выбранной записи. За обработку отвечает **Логическая функция**:
1. Загрузка PDF по URL (из сервиса генерации PDF)
2. Загрузка файла в Twenty
@@ -17,7 +17,7 @@ description: Создайте рабочий процесс для создан
Прежде чем настраивать рабочий процесс:
1. **Создайте ключ API**: перейдите в **Настройки → APIs** и создайте новый ключ API. Этот токен понадобится для бессерверной функции.
1. **Создайте ключ API**: перейдите в **Настройки → APIs** и создайте новый ключ API. Этот токен понадобится для логической функции.
2. **Настройте сервис генерации PDF** (необязательно): если вы хотите динамически генерировать PDF (например, коммерческие предложения), используйте такие сервисы, как Carbone, PDFMonkey или DocuSeal, чтобы создать PDF и получить URL для скачивания.
## Пошаговая настройка
@@ -32,9 +32,9 @@ description: Создайте рабочий процесс для создан
С помощью ручного триггера пользователи могут запускать этот рабочий процесс с кнопки, которая появляется в правом верхнем углу после выбора записи, чтобы сгенерировать и прикрепить PDF.
</Tip>
### Шаг 2: Добавьте бессерверную функцию
### Шаг 2: Добавьте логическую функцию
1. Добавьте действие **Бессерверная функция**
1. Добавьте действие **Code** (логическая функция)
2. Создайте новую функцию с кодом ниже
3. Настройте входные параметры
@@ -45,10 +45,10 @@ description: Создайте рабочий процесс для создан
| `companyId` | `{{trigger.object.id}}` |
<Note>
Если прикрепляете к другому объекту (Person, Opportunity и т. д.), переименуйте параметр соответствующим образом (например, `personId`, `opportunityId`) и обновите бессерверную функцию.
Если прикрепляете к другому объекту (Person, Opportunity и т. д.), переименуйте параметр соответствующим образом (например, `personId`, `opportunityId`) и обновите логическую функцию.
</Note>
#### Код бессерверной функции
#### Код логической функции
```typescript
export const main = async (
@@ -172,7 +172,7 @@ export const main = async (
Если используете сервис генерации PDF, вы можете:
1. Сначала выполните действие HTTP Request, чтобы сгенерировать PDF
2. Передайте возвращенный URL PDF в бессерверную функцию как параметр
2. Передайте возвращенный URL PDF в логическую функцию как параметр
```typescript
export const main = async (
@@ -211,7 +211,7 @@ export const main = async (
* **DocuSeal** — платформа автоматизации документооборота
* **Documint** — генерация документов, ориентированная на API
Каждый сервис предоставляет API, который возвращает URL PDF; затем его можно передать в бессерверную функцию.
Каждый сервис предоставляет API, который возвращает URL PDF; затем его можно передать в логическую функцию.
## Устранение неполадок
@@ -224,5 +224,5 @@ export const main = async (
## Связанные материалы
* [Триггеры рабочего процесса](/l/ru/user-guide/workflows/capabilities/workflow-triggers)
* [Бессерверные функции](/l/ru/user-guide/workflows/capabilities/workflow-actions#serverless-function)
* [Логические функции](/l/ru/user-guide/workflows/capabilities/workflow-actions#code)
* [Создание коммерческого предложения или счета в Twenty](/l/ru/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty)
@@ -131,7 +131,7 @@ description: Часто задаваемые вопросы о рабочих п
</Accordion>
<Accordion title="Каково максимальное время выполнения для действий Code?">
Действия Code (serverless-функции) имеют **тайм-аут по умолчанию 5 минут** (300 секунд).
Действия Code (функции бизнес-логики) имеют **тайм-аут по умолчанию в 5 минут** (300 секунд).
Максимально настраиваемый тайм-аут — **15 минут** (900 секунд).
@@ -9,12 +9,12 @@ description: Twenty özelleştirmelerini kod olarak oluşturun ve yönetin.
## Uygulamalar Nedir?
Uygulamalar, Twenty özelleştirmelerini **kod olarak** oluşturup yönetmenizi sağlar. Her şeyi UI üzerinden yapılandırmak yerine, veri modelinizi ve sunucusuz fonksiyonlarınızı kodla tanımlarsınız — bu da oluşturmayı, bakımı ve birden çok çalışma alanına dağıtımı hızlandırır.
Uygulamalar, Twenty özelleştirmelerini **kod olarak** oluşturup yönetmenizi sağlar. Her şeyi UI üzerinden yapılandırmak yerine, veri modelinizi ve mantık fonksiyonlarınızı kodla tanımlarsınız — bu da oluşturmayı, bakımı ve birden çok çalışma alanına dağıtmayı hızlandırır.
**Bugün Yapabilecekleriniz:**
* Özel nesneleri ve alanları kod olarak tanımlayın (yönetilen veri modeli)
* Özel tetikleyicilerle sunucusuz fonksiyonlar oluşturun
* Özel tetikleyicilerle mantık fonksiyonları oluşturun
* Aynı uygulamayı birden çok çalışma alanına dağıtın
**Yakında:**
@@ -156,23 +156,23 @@ src/
Genel hatlarıyla:
* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall`, and `auth:login` that delegate to the local `twenty` CLI.
* **package.json**: Uygulama adını, sürümünü, motorları (Node 24+, Yarn 4) bildirir ve yerel `twenty` CLIsine yetki devreden `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall` ve `auth:login` gibi betiklerin yanı sıra `twenty-sdk` ekler.
* **.gitignore**: `node_modules`, `.yarn`, `generated/` (türlendirilmiş istemci), `dist/`, `build/`, kapsam klasörleri, günlük dosyaları ve `.env*` dosyaları gibi yaygın artifaktları yok sayar.
* **yarn.lock**, **.yarnrc.yml**, **.yarn/**: Proje tarafından kullanılan Yarn 4 araç zincirini kilitler ve yapılandırır.
* **.nvmrc**: Projenin beklediği Node.js sürümünü sabitler.
* **eslint.config.mjs** ve **tsconfig.json**: Uygulamanızın TypeScript kaynakları için linting ve TypeScript yapılandırması sağlar.
* **README.md**: Uygulama kökünde temel talimatların yer aldığı kısa bir README.
* **src/**: The main place where you define your application-as-code:
* **src/**: Uygulamanızı kod olarak tanımladığınız ana yer:
* `application.config.ts`: Uygulamanız için genel yapılandırma (meta veriler ve çalışma zamanı bağlantıları). Aşağıda "Uygulama yapılandırması"na bakın.
* `*.role.ts`: Sunucusuz fonksiyonlarınız tarafından kullanılan rol tanımları. Aşağıda "Varsayılan fonksiyon rolü"ne bakın.
* `*.role.ts`: Mantık fonksiyonlarınız tarafından kullanılan rol tanımları. Aşağıda "Varsayılan fonksiyon rolü"ne bakın.
* `*.object.ts`: Özel nesne tanımları.
* `*.function.ts`: Sunucusuz fonksiyon tanımları.
* `*.front-component.tsx`: Front component definitions.
* `*.function.ts`: Mantık fonksiyon tanımları.
* `*.front-component.tsx`: Ön bileşen tanımları.
İlerideki komutlar daha fazla dosya ve klasör ekleyecektir:
* `yarn app:generate`, `generated/` klasörünü oluşturur (türlendirilmiş Twenty istemcisi + çalışma alanı türleri).
* `yarn entity:add` will add entity definition files under `src/` for your custom objects, functions, front components, or roles.
* `yarn entity:add`, özel nesneleriniz, fonksiyonlarınız, ön bileşenleriniz veya rolleriniz için `src/` altında varlık tanım dosyaları ekler.
## Kimlik Doğrulama
@@ -215,12 +215,12 @@ twenty-sdk, uygulamanız içinde kullandığınız türlendirilmiş yapı taşla
SDK, uygulama varlıklarınızı tanımlamak için yerleşik doğrulamaya sahip dört yardımcı fonksiyon sunar:
| Fonksiyon | Amaç |
| ------------------ | ----------------------------------------------- |
| `defineApp()` | Uygulama meta verilerini yapılandırın |
| `defineObject()` | Alanlara sahip özel nesneler tanımlayın |
| `defineFunction()` | İşleyicilerle sunucusuz fonksiyonlar tanımlayın |
| `defineRole()` | Rol izinlerini ve nesne erişimini yapılandırın |
| Fonksiyon | Amaç |
| ------------------ | ---------------------------------------------- |
| `defineApp()` | Uygulama meta verilerini yapılandırın |
| `defineObject()` | Alanlara sahip özel nesneler tanımlayın |
| `defineFunction()` | İşleyicilerle mantık fonksiyonları tanımlayın |
| `defineRole()` | Rol izinlerini ve nesne erişimini yapılandırın |
Bu fonksiyonlar, yapılandırmanızı çalışma anında doğrular ve daha iyi IDE otomatik tamamlama ve tür güvenliği sağlar.
@@ -303,7 +303,7 @@ export default defineObject({
* `universalIdentifier` dağıtımlar arasında benzersiz ve kararlı olmalıdır.
* Her alan bir `name`, `type`, `label` ve kendi kararlı `universalIdentifier` değerini gerektirir.
* `fields` dizisi isteğe bağlıdır — özel alanlar olmadan da nesneler tanımlayabilirsiniz.
* You can scaffold new objects using `yarn entity:add`, which guides you through naming, fields, and relationships.
* `yarn entity:add` kullanarak, adlandırma, alanlar ve ilişkiler konusunda sizi yönlendirerek yeni nesneler oluşturabilirsiniz.
<Note>
**Temel alanlar otomatik olarak oluşturulur.** Özel bir nesne tanımladığınızda Twenty, `name`, `createdAt`, `updatedAt`, `createdBy`, `position` ve `deletedAt` gibi standart alanları otomatik olarak ekler. Bunları `fields` dizinizde tanımlamanız gerekmez — yalnızca özel alanlarınızı ekleyin.
@@ -349,7 +349,7 @@ Notlar:
#### Roller ve izinler
Uygulamalar, çalışma alanınızdaki nesneler ve eylemler üzerindeki izinleri kapsülleyen roller tanımlayabilir. `application.config.ts` içindeki `functionRoleUniversalIdentifier` alanı, uygulamanızın sunucusuz fonksiyonları tarafından kullanılan varsayılan rolü belirtir.
Uygulamalar, çalışma alanınızdaki nesneler ve eylemler üzerindeki izinleri kapsülleyen roller tanımlayabilir. `application.config.ts` içindeki `functionRoleUniversalIdentifier` alanı, uygulamanızın mantık fonksiyonları tarafından kullanılan varsayılan rolü belirtir.
* `TWENTY_API_KEY` olarak enjekte edilen çalışma zamanı API anahtarı bu varsayılan fonksiyon rolünden türetilir.
* Türlendirilmiş istemci, o role tanınan izinlerle sınırlandırılır.
@@ -411,7 +411,7 @@ Notlar:
* `permissionFlags`, platform düzeyindeki yeteneklere erişimi kontrol eder. Minimumda tutun; yalnızca ihtiyacınız olanları ekleyin.
* Çalışan bir örneği Hello World uygulamasında görün: [`packages/twenty-apps/hello-world/src/roles/function-role.ts`](https://github.com/twentyhq/twenty/blob/main/packages/twenty-apps/hello-world/src/roles/function-role.ts).
### Sunucusuz fonksiyon yapılandırması ve giriş noktası
### Mantık fonksiyon yapılandırması ve giriş noktası
Her fonksiyon dosyası, bir işleyici ve isteğe bağlı tetikleyiciler içeren bir yapılandırmayı dışa aktarmak için `defineFunction()` kullanır. Otomatik algılama için `*.function.ts` dosya soneğini kullanın.
@@ -510,7 +510,7 @@ Notlar:
**Mevcut fonksiyonları taşımak için:** İşleyicinizi, parametreler nesnesinden doğrudan ayırmak yerine `event.body`, `event.queryStringParameters` veya `event.pathParameters` üzerinden ayrıştıracak şekilde güncelleyin.
</Warning>
Bir rota tetikleyicisi fonksiyonunuzu çağırdığında, AWS HTTP API v2 formatını izleyen bir `RoutePayload` nesnesi alır. Türü `twenty-sdk` içinden içe aktarın:
Bir rota tetikleyicisi mantık fonksiyonunuzu çağırdığında, AWS HTTP API v2 formatını izleyen bir `RoutePayload` nesnesi alır. Türü `twenty-sdk` içinden içe aktarın:
```typescript
import { defineFunction, type RoutePayload } from 'twenty-sdk';
@@ -540,7 +540,7 @@ const handler = async (event: RoutePayload) => {
### HTTP başlıklarını iletme
Varsayılan olarak, güvenlik nedenleriyle gelen isteklerden HTTP başlıkları sunucusuz fonksiyonunuza **aktarılmaz**. Belirli başlıklara erişmek için bunları açıkça `forwardedRequestHeaders` dizisinde listeleyin:
Varsayılan olarak, güvenlik nedenleriyle gelen isteklerden HTTP başlıkları mantık fonksiyonunuza **aktarılmaz**. Belirli başlıklara erişmek için bunları açıkça `forwardedRequestHeaders` dizisinde listeleyin:
```typescript
export default defineFunction({
@@ -578,7 +578,7 @@ const handler = async (event: RoutePayload) => {
Yeni fonksiyonları iki şekilde oluşturabilirsiniz:
* **Scaffolded**: Run `yarn entity:add` and choose the option to add a new function. Bu, bir işleyici ve yapılandırma içeren bir başlangıç dosyası oluşturur.
* **Şablondan**: `yarn entity:add` çalıştırın ve yeni bir fonksiyon ekleme seçeneğini seçin. Bu, bir işleyici ve yapılandırma içeren bir başlangıç dosyası oluşturur.
* **Manuel**: Yeni bir `*.function.ts` dosyası oluşturun ve aynı deseni izleyerek `defineFunction()` kullanın.
### Oluşturulmuş türlendirilmiş istemci
@@ -592,9 +592,9 @@ const client = new Twenty();
const { me } = await client.query({ me: { id: true, displayName: true } });
```
İstemci `yarn app:generate` tarafından yeniden oluşturulur. Re-run after changing your objects or when onboarding to a new workspace.
İstemci `yarn app:generate` tarafından yeniden oluşturulur. Nesnelerinizi değiştirdikten sonra veya yeni bir çalışma alanına katılırken yeniden çalıştırın.
#### Sunucusuz fonksiyonlarda çalışma zamanı kimlik bilgileri
#### Mantık fonksiyonlarında çalışma zamanı kimlik bilgileri
Fonksiyonunuz Twenty üzerinde çalıştığında, platform kodunuz yürütülmeden önce kimlik bilgilerini ortam değişkenleri olarak enjekte eder:
@@ -604,7 +604,7 @@ Fonksiyonunuz Twenty üzerinde çalıştığında, platform kodunuz yürütülme
Notlar:
* Oluşturulan istemciye URL veya API anahtarı geçirmeniz gerekmez. Çalışma zamanında `TWENTY_API_URL` ve `TWENTY_API_KEY` değerlerini process.env üzerinden okur.
* API anahtarının izinleri, `application.config.ts` içinde `functionRoleUniversalIdentifier` aracılığıyla referans verilen role göre belirlenir. Bu, uygulamanızın sunucusuz fonksiyonları tarafından kullanılan varsayılan roldür.
* API anahtarının izinleri, `application.config.ts` içinde `functionRoleUniversalIdentifier` aracılığıyla referans verilen role göre belirlenir. Bu, uygulamanızın mantık fonksiyonları tarafından kullanılan varsayılan roldür.
* Uygulamalar, en az ayrıcalık ilkesini izlemek için roller tanımlayabilir. Yalnızca fonksiyonlarınızın ihtiyaç duyduğu izinleri verin ve ardından `functionRoleUniversalIdentifier` değerini o rolün evrensel tanımlayıcısına yönlendirin.
### Hello World örneği
@@ -640,13 +640,13 @@ Ardından şu gibi betikler ekleyin:
}
```
Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:generate`, etc.
Artık aynı komutları Yarn üzerinden çalıştırabilirsiniz; örn. `yarn app:dev`, `yarn app:generate` vb.
## Sorun Giderme
* Kimlik doğrulama hataları: `yarn auth:login` çalıştırın ve API anahtarınızın gerekli izinlere sahip olduğundan emin olun.
* Sunucuya bağlanılamıyor: API URLsini ve Twenty sunucusunun erişilebilir olduğunu doğrulayın.
* Types or client missing/outdated: run `yarn app:generate`.
* Türler veya istemci eksik/eski: `yarn app:generate` çalıştırın.
* Geliştirme modu eşitlenmiyor: `yarn app:dev`'in çalıştığından ve değişikliklerin ortamınız tarafından yok sayılmadığından emin olun.
Discord Yardım Kanalı: https://discord.com/channels/1130383047699738754/1130386664812982322
@@ -292,19 +292,19 @@ yarn command:prod cron:workflow:automated-cron-trigger
**Çevre-yalnızca modu:** `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false` ayarlarsanız, bu değişkenleri `.env` dosyanıza ekleyin.
</Warning>
## Sunucusuz İşlevler
## Mantıksal işlevler
Twenty, iş akışları ve özel mantık için sunucusuz işlevleri destekler. Yürütme ortamı, `SERVERLESS_TYPE` ortam değişkeni aracılığıyla yapılandırılır.
Twenty, iş akışları ve özel mantık için mantıksal işlevleri destekler. Yürütme ortamı, `SERVERLESS_TYPE` ortam değişkeni aracılığıyla yapılandırılır.
<Warning>
**Güvenlik Notu:** Yerel sunucusuz sürücü (`SERVERLESS_TYPE=LOCAL`), herhangi bir sandbox olmadan kodu ana makinede doğrudan bir Node.js sürecinde çalıştırır. Yalnızca geliştirirken güvenilen kod için kullanılmalıdır. Güvenilmeyen kodu işleyen üretim dağıtımları için `SERVERLESS_TYPE=LAMBDA` veya `SERVERLESS_TYPE=DISABLED` kullanmanızı şiddetle öneririz.
**Güvenlik Notu:** Yerel sürücü (`SERVERLESS_TYPE=LOCAL`), herhangi bir sandbox olmadan kodu ana makinede doğrudan bir Node.js sürecinde çalıştırır. Yalnızca geliştirirken güvenilen kod için kullanılmalıdır. Güvenilmeyen kodu işleyen üretim dağıtımları için `SERVERLESS_TYPE=LAMBDA` veya `SERVERLESS_TYPE=DISABLED` kullanmanızı şiddetle öneririz.
</Warning>
### Kullanılabilir Sürücüler
| Sürücü | Ortam Değişkeni | Kullanım alanı | Güvenlik Düzeyi |
| ---------- | -------------------------- | ---------------------------------------------- | ------------------------------------ |
| Devre dışı | `SERVERLESS_TYPE=DISABLED` | Sunucusuz işlevleri tamamen devre dışı bırakın | Uygulanamaz |
| Devre dışı | `SERVERLESS_TYPE=DISABLED` | Mantıksal işlevleri tamamen devre dışı bırakın | Uygulanamaz |
| Yerel | `SERVERLESS_TYPE=LOCAL` | Geliştirme ve güvenilir ortamlar | Düşük (sandbox yok) |
| Lambda | `SERVERLESS_TYPE=LAMBDA` | Güvenilmeyen kodla üretim | Yüksek (donanım düzeyinde izolasyon) |
@@ -326,12 +326,12 @@ SERVERLESS_LAMBDA_ACCESS_KEY_ID=your-access-key
SERVERLESS_LAMBDA_SECRET_ACCESS_KEY=your-secret-key
```
**Sunucusuz işlevleri devre dışı bırakmak için:**
**Mantıksal işlevleri devre dışı bırakmak için:**
```bash
SERVERLESS_TYPE=DISABLED
```
<Note>
`SERVERLESS_TYPE=DISABLED` kullanıldığında, bir sunucusuz işlevi yürütmeye yönelik herhangi bir girişim bir hata döndürür. Bu, Twenty'yi sunucusuz işlev yetenekleri olmadan çalıştırmak istiyorsanız kullanışlıdır.
`SERVERLESS_TYPE=DISABLED` kullanıldığında, bir mantıksal işlevi yürütmeye yönelik herhangi bir girişim bir hata döndürür. Bu, Twenty'yi mantıksal işlev yetenekleri olmadan çalıştırmak istiyorsanız kullanışlıdır.
</Note>
@@ -9,7 +9,7 @@ API (Uygulama Programlama Arayüzü), Twenty'yi diğer yazılım sistemleriyle b
## Uygulamalar
Uygulamalar, veri modellerini ve sunucusuz işlevleri tanımlayabilen, kod olarak oluşturulmuş özel uzantılardır. Geliştiricilerin birden çok çalışma alanına dağıtılabilen, yeniden kullanılabilir özelleştirmeler oluşturmasına olanak tanır.
Uygulamalar, veri modellerini ve mantık işlevlerini tanımlayabilen, kod olarak oluşturulmuş özel uzantılardır. Geliştiricilerin birden çok çalışma alanına dağıtılabilen, yeniden kullanılabilir özelleştirmeler oluşturmasına olanak tanır.
## Kod Eylemleri
@@ -136,7 +136,7 @@ Ekip
| **Etkinlik onayları** | Etkinlik ayrıntıları veya gündem |
<Note>
Ekler statiktir—aynı dosya tüm alıcılara gönderilir. For dynamic documents (like personalized quotes), generate and attach files using a [Logic Function](/l/tr/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty).
Ekler statiktir—aynı dosya tüm alıcılara gönderilir. Kişiselleştirilmiş teklifler gibi dinamik belgeler için, bir [Mantık İşlevi](/l/tr/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty) kullanarak dosyalar oluşturup ekleyin.
</Note>
## En İyi Uygulamalar
@@ -256,7 +256,7 @@ Aşağıdaki tüm adımlar için kişiselleştirme amacıyla önceki adımlardan
* Kodu doğrudan adımda test edin
<Note>
Kodunuzda harici API anahtarlarını kullanmanız gerekiyorsa, bunları doğrudan fonksiyon gövdesine girmeniz gerekir. You cannot configure API keys elsewhere and reference them in the logic function.
Kodunuzda harici API anahtarlarını kullanmanız gerekiyorsa, bunları doğrudan fonksiyon gövdesine girmeniz gerekir. API anahtarlarını başka bir yerde yapılandıramazsınız ve bunlara mantık fonksiyonu içinde referans veremezsiniz.
</Note>
<Tip>
@@ -7,7 +7,7 @@ Twenty'de PDF'yi otomatik olarak oluşturun veya edinin ve bir kayda ekleyin. Bu
## Genel Bakış
Bu iş akışı, kullanıcıların seçilen herhangi bir kayıt için isteğe bağlı olarak PDF oluşturabilmesi için **Manuel Tetikleyici** kullanır. Bir **Sunucusuz İşlev** şunları gerçekleştirir:
Bu iş akışı, kullanıcıların seçilen herhangi bir kayıt için isteğe bağlı olarak PDF oluşturabilmesi için **Manuel Tetikleyici** kullanır. Bir **Mantıksal İşlev** şunları gerçekleştirir:
1. PDF'yi bir URL'den indirme (bir PDF oluşturma hizmetinden)
2. Dosyayı Twenty'ye yükleme
@@ -17,7 +17,7 @@ Bu iş akışı, kullanıcıların seçilen herhangi bir kayıt için isteğe ba
İş akışını kurmadan önce:
1. **Bir API Anahtarı oluşturun**: **Ayarlar → API'ler**'e gidin ve yeni bir API anahtarı oluşturun. Sunucusuz işlev için bu anahtara ihtiyacınız olacak.
1. **Bir API Anahtarı oluşturun**: **Ayarlar → API'ler**'e gidin ve yeni bir API anahtarı oluşturun. Mantıksal işlev için bu belirtece ihtiyacınız olacak.
2. **Bir PDF oluşturma hizmeti kurun** (isteğe bağlı): PDF'leri dinamik olarak oluşturmak istiyorsanız (ör. teklifler), PDF'yi oluşturmak ve bir indirme URL'si almak için Carbone, PDFMonkey veya DocuSeal gibi bir hizmet kullanın.
## Adım Adım Kurulum
@@ -32,9 +32,9 @@ Bu iş akışı, kullanıcıların seçilen herhangi bir kayıt için isteğe ba
Manuel Tetikleyici ile kullanıcılar, bir kayıt seçildiğinde sağ üstte görünen bir düğmeyi kullanarak bu iş akışını çalıştırıp bir PDF oluşturabilir ve ekleyebilir.
</Tip>
### Adım 2: Bir Sunucusuz İşlev ekleyin
### Adım 2: Bir Mantıksal İşlev ekleyin
1. Bir **Sunucusuz İşlev** eylemi ekleyin
1. Bir **Kod** eylemi (mantıksal işlev) ekleyin
2. Aşağıdaki kodla yeni bir işlev oluşturun
3. Girdi parametrelerini yapılandırın
@@ -45,10 +45,10 @@ Bu iş akışı, kullanıcıların seçilen herhangi bir kayıt için isteğe ba
| `companyId` | `{{trigger.object.id}}` |
<Note>
Farklı bir nesneye (Person, Opportunity vb.) ekliyorsanız, parametreyi buna göre yeniden adlandırın (ör. `personId`, `opportunityId`) ve sunucusuz işlevi güncelleyin.
Farklı bir nesneye (Person, Opportunity vb.) ekliyorsanız, parametreyi buna göre yeniden adlandırın (ör. `personId`, `opportunityId`) ve mantıksal işlevi güncelleyin.
</Note>
#### Sunucusuz İşlev Kodu
#### Mantıksal İşlev Kodu
```typescript
export const main = async (
@@ -172,7 +172,7 @@ Ek oluşturma mutasyonunda hem işlev parametresini hem de `variables.data` nesn
Bir PDF oluşturma hizmeti kullanıyorsanız şunları yapabilirsiniz:
1. Önce PDF'yi oluşturmak için bir HTTP İsteği eylemi yapın
2. Döndürülen PDF URL'sini sunucusuz işleve bir parametre olarak iletin
2. Döndürülen PDF URL'sini mantıksal işleve bir parametre olarak iletin
```typescript
export const main = async (
@@ -211,7 +211,7 @@ Dinamik teklifler veya faturalar oluşturmak için:
* **DocuSeal** - Belge otomasyon platformu
* **Documint** - API-öncelikli belge oluşturma
Her hizmet, bir PDF URL'si döndüren bir API sağlar; ardından bunu sunucusuz işleve iletebilirsiniz.
Her hizmet, bir PDF URL'si döndüren bir API sağlar; ardından bunu mantıksal işleve iletebilirsiniz.
## Sorun Giderme
@@ -224,5 +224,5 @@ Her hizmet, bir PDF URL'si döndüren bir API sağlar; ardından bunu sunucusuz
## İlgili
* [İş Akışı Tetikleyicileri](/l/tr/user-guide/workflows/capabilities/workflow-triggers)
* [Sunucusuz İşlevler](/l/tr/user-guide/workflows/capabilities/workflow-actions#serverless-function)
* [Mantıksal İşlevler](/l/tr/user-guide/workflows/capabilities/workflow-actions#code)
* [Twenty'den Teklif veya Fatura Oluşturun](/l/tr/user-guide/workflows/how-tos/connect-to-other-tools/generate-quote-or-invoice-from-twenty)
@@ -131,7 +131,7 @@ description: Twenty'deki iş akışları hakkında sıkça sorulan sorular.
</Accordion>
<Accordion title="Code eylemleri için en uzun yürütme süresi nedir?">
Code actions (logic functions) have a **default timeout of 5 minutes** (300 seconds).
Code eylemlerinin (mantık fonksiyonları) **varsayılan zaman aşımı 5 dakikadır** (300 saniye).
Yapılandırılabilir en yüksek zaman aşımı **15 dakikadır** (900 saniye).
@@ -9,12 +9,12 @@ description: 以代码的形式构建并管理 Twenty 自定义项。
## 什么是应用?
应用使你能够**以代码的形式**构建和管理 Twenty 自定义项。 无需通过 UI 配置所有内容,你可以在代码中定义数据模型和无服务器函数——从而更快地构建、维护,并推广到多个工作空间。
应用使你能够**以代码的形式**构建和管理 Twenty 自定义项。 无需通过 UI 配置所有内容,你可以在代码中定义数据模型和逻辑函数——从而更快地构建、维护,并推广到多个工作空间。
**你现在可以做什么:**
* 以代码定义自定义对象和字段(受管理的数据模型)
* 构建带有自定义触发器的无服务器函数
* 构建带有自定义触发器的逻辑函数
* 将同一个应用部署到多个工作空间
**即将推出:**
@@ -59,7 +59,7 @@ yarn app:generate
yarn function:logs
# Execute a function by name
yarn function:execute -n my-function -p '{"name": "test"}'
yarn function:execute -n my-function -p '{\"name\": \"test\"}'
# Uninstall the application from the current workspace
yarn app:uninstall
@@ -94,23 +94,23 @@ my-twenty-app/
tsconfig.json
README.md
src/
application.config.ts # Required - main application configuration
default-function.role.ts # Default role for serverless functions
hello-world.function.ts # Example serverless function
hello-world.front-component.tsx # Example front component
// your entities (*.object.ts, *.function.ts, *.front-component.tsx, *.role.ts)
application.config.ts # 必需 - 主应用程序配置
default-function.role.ts # 用于无服务器函数的默认角色
hello-world.function.ts # 示例无服务器函数
hello-world.front-component.tsx # 示例前端组件
// 你的实体 (*.object.ts, *.function.ts, *.front-component.tsx, *.role.ts)
```
### 约定优于配置
应用采用**约定优于配置**的方式,根据文件后缀检测实体。 这使得可以在 `src/app/` 文件夹内灵活组织:
| 文件后缀 | 实体类型 |
| ----------------------- | --------------------------- |
| `*.object.ts` | 自定义对象定义 |
| `*.function.ts` | 无服务器函数定义 |
| `*.front-component.tsx` | Front component definitions |
| `*.role.ts` | 角色定义 |
| 文件后缀 | 实体类型 |
| ----------------------- | -------- |
| `*.object.ts` | 自定义对象定义 |
| `*.function.ts` | 无服务器函数定义 |
| `*.front-component.tsx` | 前端组件定义 |
| `*.role.ts` | 角色定义 |
### 支持的文件夹组织方式
@@ -156,23 +156,23 @@ src/
总体来说:
* **package.json**: Declares the app name, version, engines (Node 24+, Yarn 4), and adds `twenty-sdk` plus scripts like `app:dev`, `app:generate`, `entity:add`, `function:logs`, `function:execute`, `app:uninstall`, and `auth:login` that delegate to the local `twenty` CLI.
* **package.json**:声明应用名称、版本、运行时(Node 24+Yarn 4),并添加 `twenty-sdk`,以及诸如 `app:dev``app:generate``entity:add``function:logs``function:execute``app:uninstall` `auth:login` 等脚本,这些脚本会委托给本地的 `twenty` CLI
* **.gitignore**:忽略常见产物,如 `node_modules`、`.yarn`、`generated/`(类型化客户端)、`dist/`、`build/`、覆盖率文件夹、日志文件以及 `.env*` 文件。
* **yarn.lock**、**.yarnrc.yml**、**.yarn/**:锁定并配置项目使用的 Yarn 4 工具链。
* **.nvmrc**:固定项目期望的 Node.js 版本。
* **eslint.config.mjs** 和 **tsconfig.json**:为应用的 TypeScript 源码提供 Lint 与 TypeScript 配置。
* **README.md**:应用根目录中的简短 README,包含基本说明。
* **src/**: The main place where you define your application-as-code:
* **src/**:你以代码形式定义应用的主要位置:
* `application.config.ts`:应用的全局配置(元数据和运行时关联)。 参见下方“应用配置”。
* `*.role.ts`:你的无服务器函数所使用的角色定义。 参见下方“默认函数角色”。
* `*.role.ts`:你的逻辑函数所使用的角色定义。 参见下方“默认函数角色”。
* `*.object.ts`:自定义对象定义。
* `*.function.ts`无服务器函数定义。
* `*.front-component.tsx`: Front component definitions.
* `*.function.ts`逻辑函数定义。
* `*.front-component.tsx`:前端组件定义。
后续命令将添加更多文件和文件夹:
* `yarn app:generate` 将创建一个 `generated/` 文件夹(类型化 Twenty 客户端 + 工作空间类型)。
* `yarn entity:add` will add entity definition files under `src/` for your custom objects, functions, front components, or roles.
* `yarn entity:add` 会在 `src/` 下为你的自定义对象、函数、前端组件或角色添加实体定义文件。
## 身份验证
@@ -215,12 +215,12 @@ twenty-sdk 提供你在应用中使用的类型化构件和辅助函数。 以
该 SDK 提供四个带内置校验的辅助函数,用于定义你的应用实体:
| 函数 | 目的 |
| ------------------ | -------------- |
| `defineApp()` | 配置应用元数据 |
| `defineObject()` | 定义带字段的自定义对象 |
| `defineFunction()` | 定义带处理程序的无服务器函数 |
| `defineRole()` | 配置角色权限和对象访问 |
| 函数 | 目的 |
| ------------------ | ------------ |
| `defineApp()` | 配置应用元数据 |
| `defineObject()` | 定义带字段的自定义对象 |
| `defineFunction()` | 定义带处理程序的逻辑函数 |
| `defineRole()` | 配置角色权限和对象访问 |
这些函数会在运行时校验你的配置,并提供更好的 IDE 自动补全和类型安全。
@@ -303,7 +303,7 @@ export default defineObject({
* `universalIdentifier` 必须在各次部署间保持唯一且稳定。
* 每个字段都需要 `name`、`type`、`label` 以及其自身稳定的 `universalIdentifier`。
* `fields` 数组是可选的——你可以定义没有自定义字段的对象。
* You can scaffold new objects using `yarn entity:add`, which guides you through naming, fields, and relationships.
* 你可以使用 `yarn entity:add` 脚手架创建新对象,它会引导你完成命名、字段和关系。
<Note>
**基础字段会自动创建。** 当你定义自定义对象时,Twenty 会自动添加 `name`、`createdAt`、`updatedAt`、`createdBy`、`position`、`deletedAt` 等标准字段。 你无需在 `fields` 数组中定义这些字段——只需添加你的自定义字段。
@@ -349,7 +349,7 @@ export default defineApp({
#### 角色和权限
应用可以定义角色,以封装对工作空间对象与操作的权限。 `application.config.ts` 中的 `functionRoleUniversalIdentifier` 字段指定你的应用无服务器函数所使用的默认角色。
应用可以定义角色,以封装对工作空间对象与操作的权限。 `application.config.ts` 中的 `functionRoleUniversalIdentifier` 字段指定你的应用逻辑函数所使用的默认角色。
* 作为 `TWENTY_API_KEY` 注入的运行时 API 密钥源自该默认函数角色。
* 类型化客户端将受限于该角色授予的权限。
@@ -411,7 +411,7 @@ export default defineRole({
* `permissionFlags` 控制对平台级能力的访问。 尽量保持最小化;仅添加所需项。
* 在 Hello World 应用中查看可运行示例:[`packages/twenty-apps/hello-world/src/roles/function-role.ts`](https://github.com/twentyhq/twenty/blob/main/packages/twenty-apps/hello-world/src/roles/function-role.ts)。
### 无服务器函数的配置与入口点
### 逻辑函数的配置与入口点
每个函数文件都使用 `defineFunction()` 导出包含处理程序和可选触发器的配置。 使用 `*.function.ts` 文件后缀以便自动检测。
@@ -510,7 +510,7 @@ export default defineFunction({
**迁移现有函数:** 将处理程序更新为从 `event.body`、`event.queryStringParameters` 或 `event.pathParameters` 解构,而不是直接从参数对象解构。
</Warning>
当路由触发器调用你的函数时,它会接收一个遵循 AWS HTTP API v2 格式的 `RoutePayload` 对象。 从 `twenty-sdk` 导入该类型:
当路由触发器调用你的逻辑函数时,它会接收一个遵循 AWS HTTP API v2 格式的 `RoutePayload` 对象。 从 `twenty-sdk` 导入该类型:
```typescript
import { defineFunction, type RoutePayload } from 'twenty-sdk';
@@ -540,7 +540,7 @@ const handler = async (event: RoutePayload) => {
### 转发 HTTP 请求头
出于安全原因,默认不会将传入请求的 HTTP 请求头传递给你的无服务器函数。 如需访问特定请求头,请在 `forwardedRequestHeaders` 数组中显式列出:
出于安全原因,默认**不会**将传入请求的 HTTP 请求头传递给你的逻辑函数。 如需访问特定请求头,请在 `forwardedRequestHeaders` 数组中显式列出:
```typescript
export default defineFunction({
@@ -578,7 +578,7 @@ const handler = async (event: RoutePayload) => {
你可以通过两种方式创建新函数:
* **Scaffolded**: Run `yarn entity:add` and choose the option to add a new function. 这将生成一个包含处理程序和配置的入门文件。
* **脚手架生成**:运行 `yarn entity:add` 并选择添加新函数的选项。 这将生成一个包含处理程序和配置的入门文件。
* **手动**:创建一个新的 `*.function.ts` 文件,并使用 `defineFunction()`,遵循相同的模式。
### 生成的类型化客户端
@@ -592,9 +592,9 @@ const client = new Twenty();
const { me } = await client.query({ me: { id: true, displayName: true } });
```
客户端会通过 `yarn app:generate` 重新生成。 Re-run after changing your objects or when onboarding to a new workspace.
客户端会通过 `yarn app:generate` 重新生成。 在更改对象之后或接入新工作空间时,请重新运行。
#### 无服务器函数中的运行时凭据
#### 逻辑函数中的运行时凭据
当你的函数在 Twenty 上运行时,平台会在代码执行前将凭据作为环境变量注入:
@@ -604,7 +604,7 @@ const { me } = await client.query({ me: { id: true, displayName: true } });
备注:
* 你无需向生成的客户端传递 URL 或 API 密钥。 它会在运行时从 process.env 读取 `TWENTY_API_URL` 和 `TWENTY_API_KEY`。
* API 密钥的权限由 `application.config.ts` 中通过 `functionRoleUniversalIdentifier` 引用的角色决定。 这是你的应用无服务器函数使用的默认角色。
* API 密钥的权限由 `application.config.ts` 中通过 `functionRoleUniversalIdentifier` 引用的角色决定。 这是你的应用逻辑函数使用的默认角色。
* 应用可以定义角色以遵循最小权限原则。 仅授予函数所需的权限,然后将 `functionRoleUniversalIdentifier` 指向该角色的通用标识符。
### Hello World 示例
@@ -640,13 +640,13 @@ yarn add -D twenty-sdk
}
```
Now you can run the same commands via Yarn, e.g. `yarn app:dev`, `yarn app:generate`, etc.
现在你可以通过 Yarn 运行相同的命令,例如 `yarn app:dev``yarn app:generate` 等。
## 故障排除
* 身份验证错误:运行 `yarn auth:login`,并确保你的 API 密钥具有所需权限。
* 无法连接到服务器:请验证 API URL,并确保 Twenty 服务器可达。
* Types or client missing/outdated: run `yarn app:generate`.
* 类型或客户端缺失/过期:运行 `yarn app:generate`
* 开发模式未同步:确保 `yarn app:dev` 正在运行,并且你的环境不会忽略变更。
Discord 帮助频道:https://discord.com/channels/1130383047699738754/1130386664812982322
@@ -292,19 +292,19 @@ yarn command:prod cron:workflow:automated-cron-trigger
**仅限环境模式:** 如果你设置 `IS_CONFIG_VARIABLES_IN_DB_ENABLED=false`,请将这些变量添加到 `.env` 文件中。
</Warning>
## 无服务器函数
## 逻辑函数
Twenty 支持用于工作流和自定义逻辑的无服务器函数。 执行环境通过 `SERVERLESS_TYPE` 环境变量进行配置。
Twenty 支持用于工作流和自定义逻辑的逻辑函数。 执行环境通过 `SERVERLESS_TYPE` 环境变量进行配置。
<Warning>
\*\*安全提示:\*\*本地无服务器驱动(`SERVERLESS_TYPE=LOCAL`)在没有沙箱的情况下,在主机上的 Node.js 进程中直接运行代码。 它应仅在开发环境中用于可信代码。 对于在生产环境中处理不受信任代码的部署,我们强烈建议使用 `SERVERLESS_TYPE=LAMBDA` 或 `SERVERLESS_TYPE=DISABLED`。
\*\*安全提示:\*\*本地驱动(`SERVERLESS_TYPE=LOCAL`)在没有沙箱的情况下,在主机上的 Node.js 进程中直接运行代码。 它应仅在开发环境中用于可信代码。 对于在生产环境中处理不受信任代码的部署,我们强烈建议使用 `SERVERLESS_TYPE=LAMBDA` 或 `SERVERLESS_TYPE=DISABLED`。
</Warning>
### 可用驱动
| 驱动 | 环境变量 | 用例 | 安全级别 |
| ------ | -------------------------- | -------------- | -------- |
| 禁用 | `SERVERLESS_TYPE=DISABLED` | 完全禁用无服务器函数 | 不适用 |
| 禁用 | `SERVERLESS_TYPE=DISABLED` | 完全禁用逻辑函数 | 不适用 |
| 本地 | `SERVERLESS_TYPE=LOCAL` | 开发和可信环境 | 低(无沙箱) |
| Lambda | `SERVERLESS_TYPE=LAMBDA` | 生产环境(处理不受信任代码) | 高(硬件级隔离) |
@@ -326,12 +326,12 @@ SERVERLESS_LAMBDA_ACCESS_KEY_ID=your-access-key
SERVERLESS_LAMBDA_SECRET_ACCESS_KEY=your-secret-key
```
**要禁用无服务器函数:**
**要禁用逻辑函数:**
```bash
SERVERLESS_TYPE=DISABLED
```
<Note>
使用 `SERVERLESS_TYPE=DISABLED` 时,任何尝试执行无服务器函数的操作都会返回错误。 如果你想在不启用无服务器函数能力的情况下运行 Twenty,这将很有用。
使用 `SERVERLESS_TYPE=DISABLED` 时,任何尝试执行逻辑函数的操作都会返回错误。 如果你想在不启用逻辑函数能力的情况下运行 Twenty,这将很有用。
</Note>
@@ -9,7 +9,7 @@ API(应用程序接口)允许您将 Twenty 与其他软件系统连接并构
## 应用
Apps are custom extensions built as code that can define data models and logic functions. 它使开发者能够创建可复用的自定义内容,并可部署到多个工作区。
应用是以代码构建的自定义扩展,可定义数据模型和逻辑函数。 它使开发者能够创建可复用的自定义内容,并可部署到多个工作区。
## 代码操作
@@ -136,7 +136,7 @@ Hi {{trigger.object.firstName}},
| **活动确认** | 活动详情或议程 |
<Note>
附件是静态的——将向所有收件人发送相同的文件。 For dynamic documents (like personalized quotes), generate and attach files using a [Logic Function](/l/zh/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty).
附件是静态的——将向所有收件人发送相同的文件。 对于动态文档(如个性化报价),请使用 [逻辑函数](/l/zh/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty) 生成并附加文件。
</Note>
## 最佳实践
@@ -256,7 +256,7 @@ import { VimeoEmbed } from '/snippets/vimeo-embed.mdx';
* 直接在步骤中测试代码
<Note>
如果需要在代码中使用外部 API 密钥,必须将其直接输入到函数主体中。 You cannot configure API keys elsewhere and reference them in the logic function.
如果需要在代码中使用外部 API 密钥,必须将其直接输入到函数主体中。 你无法在其他位置配置 API 密钥并在逻辑函数中引用它们。
</Note>
<Tip>
@@ -131,7 +131,7 @@ description: 关于 Twenty 中工作流的常见问题。
</Accordion>
<Accordion title="Code 操作的最大执行时间是多少?">
Code actions (logic functions) have a **default timeout of 5 minutes** (300 seconds).
Code 操作(逻辑函数)的**默认超时时间为 5 分钟**(300 秒)。
可配置的最大超时时间为**15 分钟**(900 秒)。