الانتقال إلى المحتوى الرئيسي
نفس المعالج يمكنه أيضا الإجابة على طلبات HTTP. سوف نضيف مسارين:
  • نقطة النهاية POST مكالمات واجهة المستخدم لإنشاء وثيقة، و
  • نقطة نهاية عامة GET تجعل الوثيقة صفحة ويب قابلة للطباعة.
وكلاهما يستخدم httpRouteTriggerSettings. طرق التطبيق تقدم تحت /s على خادم 20 (على سبيل المثال ‘http://localhost:2020/s/documents/generate\`).

مسار POST - توليد حسب الطلب

هذا يعيد استخدام GenerateDocumentHandler، لذلك لا يوجد منطق لتكراره - مجرد محول رقيق الذي يقرأ الجسم المطلوب.
import { defineLogicFunction, type RoutePayload } from 'twenty-sdk/define';
import { Response } from 'twenty-sdk/logic-function';
import { generateDocumentHandler } from 'src/logic-functions/handlers/generate-document-handler';

const handler = async (event: RoutePayload): Promise<Response> => {
  const body = event.body as Record<string, unknown> | null;

  const result = await generateDocumentHandler({
    templateId: (body?.templateId as string) ?? '',
    recordId: (body?.recordId as string) ?? '',
  });

  // Map the handler's failure reason onto a real HTTP status (400/404/500)
  // instead of always returning 200.
  return new Response(JSON.stringify(result), {
    status: result.success ? 200 : (result.status ?? 400),
    headers: { 'Content-Type': 'application/json' },
  });
};

export default defineLogicFunction({
  universalIdentifier: GENERATE_DOCUMENT_ROUTE_UNIVERSAL_IDENTIFIER,
  name: 'generate-document-route',
  timeoutSeconds: 30,
  handler,
  httpRouteTriggerSettings: {
    path: '/documents/generate',
    httpMethod: 'POST',
    isAuthRequired: true,
  },
});
يقوم المعالج المشترك بإرجاع ‘حالة’ مقترحة عند الفشل، بحيث يمكن للطريق الإجابة مع رمز 4xx/5xx. isAuthRerequirered: true يعني أنه يجب على المتصل أن يقدم رمزا صالحا - المكون الأمامي في الفصل التالي يمر رمز الوصول إلى المستخدم تلقائيا.

مسار GET - يقدم كصفحة على الشبكة

لإرجاع HTML بدلاً من JSON، قم بتدوين الجسم في ‘استجابة مع رأس 'محتوى - نوع. هذا المسار عام (‘isAuthRerequirered: false`) بحيث يمكن مشاركة مستند تم إنشاؤه كرابط .
import { defineLogicFunction, type RoutePayload } from 'twenty-sdk/define';
import { Response } from 'twenty-sdk/logic-function';
import { CoreApiClient } from 'twenty-client-sdk/core';
import { documentHtmlPage } from 'src/utils/render-document';

const htmlResponse = (html: string, status = 200): Response =>
  new Response(html, { status, headers: { 'Content-Type': 'text/html; charset=utf-8' } });

const handler = async (event: RoutePayload): Promise<Response> => {
  const documentId = event.queryStringParameters?.id;

  if (!documentId) {
    return htmlResponse(documentHtmlPage('Missing document id', 'Provide ?id=<documentId>.'), 400);
  }

  // Filtered list query so an unknown id renders a clean 404 page instead of throwing.
  const { documents } = await new CoreApiClient().query({
    documents: {
      __args: { filter: { id: { eq: documentId } }, first: 1 },
      edges: { node: { id: true, name: true, content: true } },
    },
  });

  const document = documents?.edges?.[0]?.node;
  if (!document?.id) {
    return htmlResponse(documentHtmlPage('Document not found', `No document with id ${documentId}.`), 404);
  }

  return htmlResponse(documentHtmlPage(document.name ?? 'Document', document.content ?? ''));
};

export default defineLogicFunction({
  universalIdentifier: VIEW_DOCUMENT_ROUTE_UNIVERSAL_IDENTIFIER,
  name: 'view-document',
  timeoutSeconds: 15,
  handler,
  httpRouteTriggerSettings: {
    path: '/documents/view',
    httpMethod: 'GET',
    isAuthRequired: false,
  },
});
‘documentHtmlPage’ يجعل جسم Markdown إلى HTML (مع marked، محسوسة) ويسقط في نظيف، صفحة قابلة للطباعة تعرض فقط محتوى القالب- نفس مظهر PDF والمعاينة داخل التطبيق. انظر المساعد.

جرب ذلك

مع قالب وشخص في مساحة العمل الخاصة بك، اتصل بالمسار (التقط الرمز المميز من الإعدادات → APIs & Webhooks):
curl -X POST http://localhost:2020/s/documents/generate \
  -H "Authorization: Bearer $TOKEN" -H "Content-Type: application/json" \
  -d '{"templateId":"<templateId>","recordId":"<personId>"}'
# → {"success":true,"documentId":"...","content":"Dear Jeffery Griffin, ..."}
افتح المستند الذي تم إرجاعه في المتصفح الخاص بك:
http://localhost:2020/s/documents/view?id=<documentId>
صفحة وثيقة تم إصدارها
يمكنك أيضًا بث سجلات الدالة أثناء اختبارها باستخدام yarn 20 dev:function:logs، أو استدعاء ذلك مباشرة باستخدام yarn 20 dev:function:exec.
بعد هذه الخطوة: يمكن للتطبيق إنشاء مستندات عبر HTTP وخدمتها كصفحات ويب الآن دعونا نجعله قابلا للاستخدام بدون “تعطيل”.

التالي : بناء واجهة المستخدم →

المشاهدة، الملاحة، الأوامر، والعنصر الأمامي.