التثبيت والمصادقة
التثبيت
bash
npm install @gurb/server @gurb/embedbash
composer require gurb/sdkمفتاحان، لا يتبادلان
إنشاء المجتمعات وإصدار المفاتيح ليست أعمالاً يقوم بها تكامل عادي، فتعيش في عميل مختلف بمفتاح مختلف.
| العميل | شكل المفتاح | يقدر |
|---|---|---|
GurbClient | gurb_<id>_<secret> | مجتمع واحد: القراءة، الكتابة، الأعضاء، الصلاحيات، التضمين |
GurbAdminClient | gurb_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