وثائق المطورين

حزمة رسمية للـ TypeScript وأخرى لـ PHP. نفس العقد، نفس المسارات، نفس الصلاحيات التي يفحصها تطبيق قُرب نفسه.

TypeScript1.7.0PHP1.7

التثبيت والمصادقة

التثبيت

bash
npm install @gurb/server @gurb/embed
bash
composer require gurb/sdk

مفتاحان، لا يتبادلان

إنشاء المجتمعات وإصدار المفاتيح ليست أعمالاً يقوم بها تكامل عادي، فتعيش في عميل مختلف بمفتاح مختلف.

العميلشكل المفتاحيقدر
GurbClientgurb_<id>_<secret>مجتمع واحد: القراءة، الكتابة، الأعضاء، الصلاحيات، التضمين
GurbAdminClientgurb_sa_<id>_<secret>المنصة: إنشاء مجتمعات، إصدار وإلغاء مفاتيح

كل واحد يرفض مفتاح الآخر عند الإنشاء

وهذا ليس تأدباً. نطاق الضرر يختلف بمراتب: مفتاح مجتمع مسرّب يعبث بمجتمع واحد، ومفتاح منصة مسرّب ينشئ مجتمعات ويصدر مفاتيح أخرى. فالخطأ لازم يفشل بصوت عالٍ عند الإنشاء، لا بهدوء عند أول 403.
ts
createGurbClient({ apiKey: 'gurb_sa_...' })
// → That is a super-admin key, not a community API key. Use GurbAdminClient…

من يملك المجتمع الذي تنشئه

افتراضياً يؤسسه من يعمل المفتاح لحسابه — ومفتاح المنصة لا يصدره إلا مشرف عام، فافتراضياً يكون المالك هو مشرف المنصة لا أنت. سمِّ المالك بالبريد:

ts
import { createGurbAdminClient } from '@gurb/server'

const admin = createGurbAdminClient({ adminKey: process.env.GURB_ADMIN_KEY! })

const community = await admin.communities.create({
  name: 'نادي القراءة',
  slug: 'book-club',
  ownerEmail: 'ahmed@corp.com',   // ← this account founds it
  ownerFirstName: 'أحمد',          // only used if the account is new
})

هذا الحساب يصير المدير الوحيد للمجتمع. لو ما له حساب في قُرب يُنشأ واحد؛ ولو كان موجوداً يُعاد استخدامه ولا يُعدّل — لا كلمة سر تتغير ولا اسم يُستبدل.

اعرف لحساب من يعمل مفتاحك — قبل أي شيء لا رجعة فيه

لو رجعت actsForIssuer بقيمة true، فكل ما تنشئه سيخص مشرف المنصة لا أنت. اطلب مفتاحاً جديداً بدل أن تكمل.
ts
import { effectiveOwner } from '@gurb/server'

const me = await admin.me()
if (me.actsForIssuer) {
  throw new Error('This key names no subject — pass ownerEmail, or ask for a new key.')
}
effectiveOwner(me).email