NahdaAIنهضة
Firebase & Supabase • المستوى الرابع • الدرس 1

الدوال السحابية بدون خادم (Firebase Cloud Functions & Supabase Edge Functions)

العودة لفهرس المستوى

أهداف الدرس العلمية

  • فهم مفهوم Serverless Architecture وكيف توفر التكلفة.
  • كتابة Firebase Cloud Functions (HTTP + Callable + Triggers).
  • استخدام Supabase Edge Functions (Deno + TypeScript).
  • حماية الدوال الحساسة والتحقق من هوية المستخدم.

1. ما هي الدوال السحابية (Serverless)؟

Serverless هي بنية معمارية لا تحتاج فيها لإدارة خادم. أنت تكتب كوداً فقط، والمنصة (Firebase/Supabase) تُشغّله فقط عند الطلب وتدفع فقط مقابل الاستخدام.

Firebase Cloud Functions
  • • Node.js (JavaScript/TypeScript)
  • • تعمل على Google Cloud
  • • تكامل عميق مع Firestore/Auth
Supabase Edge Functions
  • • Deno (TypeScript)
  • • تعمل على حافة الشبكة (Edge)
  • • زمن استجابة أقل عالمياً

2. أنواع Firebase Cloud Functions

onRequest (HTTP)

دالة تُستدعى عبر HTTP/REST.

export const hello = onRequest(
  (req, res) => {
    res.send('Hi');
  }
);
onCall (Callable)

دالة يستدعيها SDK مباشرة من العميل.

export const add = onCall(
  (req) => {
    return req.data.a + req.data.b;
  }
);
Triggers (مستمعات)

تعمل تلقائياً عند حدث (كتابة/حذف).

onDocumentCreated(
  'users/{id}',
  async (event) => {...}
);
Scheduled (Cron)

تعمل بجدولة زمنية (مثل التنظيف اليومي).

onSchedule('every day 03:00',
  async () => {...}
);

3. أمان الدوال — التحقق من الهوية

الدوال الخادمية هي المكان المثالي للعمليات الحساسة (حذف مستخدمين، تعديل صلاحيات، دفع، ...). لكن يجب التحقق من الهوية دائماً:

javascript
import { onCall, HttpsError } from "firebase-functions/v2/https";

export const sensitiveAction = onCall(async (request) => {
  // 1. تحقق أن المستخدم مسجّل
  if (!request.auth) {
    throw new HttpsError("unauthenticated", "يجب تسجيل الدخول");
  }

  // 2. تحقق من صلاحية معينة
  if (request.auth.token.admin !== true) {
    throw new HttpsError("permission-denied", "أنت لست مشرفاً");
  }

  // 3. الآن يمكن تنفيذ العملية الحساسة
  return { success: true };
});
أخطاء HttpsError الشائعة
  • • unauthenticated — المستخدم غير مسجّل
  • • permission-denied — لا يملك الصلاحية
  • • invalid-argument — بيانات غير صحيحة
  • • internal — خطأ داخلي

4. Supabase Edge Functions

Supabase يُقدّم Edge Functions مبنية على Deno (TypeScript). تشغيلها على الحافة (Edge) يعني استجابة أسرع للمستخدمين حول العالم.

javascript
// supabase/functions/hello/index.ts
import { serve } from "https://deno.land/std/http/server.ts";

serve(async (req) => {
  const { name } = await req.json();

  return new Response(
    JSON.stringify({ message: `أهلاً يا ${name}` }),
    { headers: { "Content-Type": "application/json" } }
  );
});

// نشر الدالة:
// npx supabase functions deploy hello

// استدعاؤها:
// const { data, error } = await supabase.functions.invoke('hello', {
//   body: { name: 'أحمد' }
// });
استدعاء من العميل
supabase.functions.invoke(
  'hello',
  { body: { name: 'Ahmed' } }
)
JWT Verification

Edge Functions تتحقق من JWT تلقائياً.

5. جدول مقارنة شامل

الميزةFirebase FunctionsSupabase Edge
اللغةNode.js (JS/TS)Deno (TS)
التشغيلGoogle CloudEdge (Global)
زمن الاستجابةجيدأسرع (Edge)
التكاملعميق مع FirestorePostgres مباشرة
التسعيرلكل استدعاءلكل استدعاء
الاستخدام المثاليتطبيقات Google Cloudتطبيقات عالمية
التطبيق العملي المباشر

تحدي الدرس الأول: بناء Cloud Functions متكاملة

قم بالتعديل على الكود بداخل المحرر أدناه لتطبيق المتطلبات التالية:

  1. احتفظ بدالة helloWorld و greetUser.
  2. أضف دالة addNumbers (Callable) تستقبل a و b وتُرجع مجموعهما.
  3. أضف دالة createUserProfile محمية بالتحقق من request.auth.
  4. أضف Trigger onNewMessage يستمع لإنشاء رسائل جديدة في Firestore.
  5. أضف دالة makeAdmin تستخدم setCustomUserClaims.
  6. اضغط "تشغيل الكود" لرؤية المخرجات.
⏳ جارٍ التحميل...