نقاط نهاية إدارة الغرف تحت /api/room/. جميع نقاط النهاية تتطلب المصادقة.
نظرة عامة
| نقطة النهاية | الطريقة | الوصف |
|---|---|---|
/api/room/create | POST | إنشاء غرفة جديدة |
/api/room/join | POST | الانضمام إلى غرفة والحصول على رمز LiveKit |
/api/room/list | GET | عرض الغرف المتاحة |
/api/room/:roomId/kick/:identity | POST | طرد مشارك (مشرف) |
/api/room/:roomId/mute/:identity | POST | كتم مشارك (مشرف) |
/api/room/:roomId/video/:identity/off | POST | تعطيل فيديو المشارك (مشرف) |
نقاط النهاية
إنشاء غرفة
إنشاء غرفة اجتماع جديدة. يصبح المستخدم المُصدَّق مشرف الغرفة.
POST /api/room/create
الرؤوس: Authorization: Bearer <accessToken>
نص الطلب:
{
"name": "team-standup",
"isPublic": true,
"mode": "standard",
"settings": {
"allowChat": true,
"allowVideo": true,
"allowAudio": true,
"requireApproval": false,
"e2ee": false
}
}ملاحظة: حقل
nameاختياري. إذا تم حذفه أو تركه فارغًا، سيُنشئ الخادم اسمًا عشوائيًا آمنًا للروابط بتنسيقxxx-xxxx-xxx(مثلbkf-qmzl-rja).
قواعد اسم الغرفة:
تظهر أسماء الغرف في الرابط كـ https://bedrud.xyz/m/NAME، لذا يجب أن تكون آمنة للروابط:
| القاعدة | الوصف |
|---|---|
| الأحرف المسموحة | أحرف صغيرة (a-z)، أرقام (0-9)، وواصلات (-) |
| الحد الأدنى للطول | ٣ أحرف |
| الحد الأقصى للطول | ٦٣ حرفًا |
| بدون أحرف خاصة | #، @، _، .، /، \، <، >، &، %، +، =، ;، :، '، "، ?، !، المسافات، إلخ غير مسموح بها |
| بدون واصلات في البداية/النهاية | -room وroom- غير صالحة |
| بدون واصلات متتالية | room--name غير صالح |
| أحرف صغيرة فقط | الأحرف الكبيرة مرفوضة؛ يُحوَّل الإدخال تلقائيًا إلى أحرف صغيرة |
| فريد | يجب أن يكون كل اسم غرفة فريدًا |
الاستجابة (200):
{
"id": "uuid",
"name": "team-standup",
"createdBy": "user-uuid",
"isActive": true,
"isPublic": true,
"maxParticipants": 0,
"settings": {
"allowChat": true,
"allowVideo": true,
"allowAudio": true,
"requireApproval": false,
"e2ee": false
},
"livekitHost": "wss://lk.bedrud.xyz",
"mode": "standard"
}الحقول
| الحقل | النوع | مطلوب | الوصف |
|---|---|---|---|
name | string | لا | اسم الغرفة الآمن للروابط (يُنشأ تلقائيًا إذا تم حذفه) |
isPublic | boolean | لا | هل تظهر الغرفة في القوائم العامة |
mode | string | لا | وضع الغرفة (مثل "standard") |
maxParticipants | number | لا | الحد الأقصى لعدد المشاركين |
settings.allowChat | boolean | لا | هل المحادثة النصية مُفعّلة |
settings.allowVideo | boolean | لا | هل الفيديو مُفعّل |
settings.allowAudio | boolean | لا | هل الصوت مُفعّل |
settings.requireApproval | boolean | لا | هل يحتاج المشاركون لموافقة المشرف |
settings.e2ee | boolean | لا | هل التشفير من طرف إلى طرف مُفعّل |
الانضمام إلى غرفة
الانضمام إلى غرفة موجودة واستلام رمز LiveKit للاتصال الوسائطي.
POST /api/room/join
الرؤوس: Authorization: Bearer <accessToken>
نص الطلب:
{
"roomName": "team-standup"
}الاستجابة (200):
{
"id": "uuid",
"name": "team-standup",
"token": "eyJ...",
"createdBy": "user-uuid",
"adminId": "user-uuid",
"isActive": true,
"isPublic": true,
"maxParticipants": 20,
"expiresAt": "2026-02-16T12:00:00Z",
"settings": { ... },
"livekitHost": "wss://lk.bedrud.xyz",
"mode": "standard"
}الرمز token هو رمز وصول LiveKit مُوقَّع. استخدمه للاتصال بخادم LiveKit عبر WebSocket:
import { Room } from 'livekit-client';
const room = new Room();
await room.connect(livekitUrl, token);عرض الغرف
الحصول على قائمة بالغرف التي أنشأها المستخدم.
GET /api/room/list
الرؤوس: Authorization: Bearer <accessToken>
الاستجابة (200):
[
{
"id": "uuid",
"name": "team-standup",
"createdBy": "user-uuid",
"isActive": true,
"maxParticipants": 20,
"expiresAt": "2026-02-16T12:00:00Z",
"settings": { ... },
"mode": "standard",
"relationship": "creator"
}
]طرد مشارك
إزالة مشارك من الغرفة. يمكن فقط لمشرف الغرفة القيام بذلك.
POST /api/room/:roomId/kick/:identity
الرؤوس: Authorization: Bearer <accessToken>
الاستجابة (200):
{
"status": "success"
}كتم مشارك
كتم ميكروفون مشارك. يمكن فقط لمشرف الغرفة القيام بذلك.
POST /api/room/:roomId/mute/:identity
الرؤوس: Authorization: Bearer <accessToken>
الاستجابة (200):
{
"status": "success"
}تعطيل فيديو المشارك
إيقاف كاميرا مشارك. يمكن فقط لمشرف الغرفة القيام بذلك.
POST /api/room/:roomId/video/:identity/off
الرؤوس: Authorization: Bearer <accessToken>
الاستجابة (200):
{
"status": "success"
}أدوات المشرف
إجراءات مشرف الغرفة (الطرد، الكتم، إيقاف الفيديو) متاحة فقط للمستخدم الذي أنشأ الغرفة (adminId). محاولة تنفيذ هذه الإجراءات كمستخدم غير مشرف تُرجع خطأ 403.
مصفوفة الصلاحيات
| الإجراء | مشرف الغرفة | المشرف العام | مستخدم عادي | ضيف |
|---|---|---|---|---|
| إنشاء غرفة | نعم | نعم | نعم | لا |
| الانضمام لغرفة | نعم | نعم | نعم | نعم |
| عرض الغرف | نعم | نعم | نعم | نعم |
| الطرد | نعم | نعم | لا | لا |
| الكتم | نعم | نعم | لا | لا |
| إيقاف الفيديو | نعم | نعم | لا | لا |
استجابات الخطأ
جميع الأخطاء تتبع تنسيقًا موحدًا:
{
"error": "human-readable error message"
}أخطاء إنشاء الغرفة
| الحالة | رسالة الخطأ | الوصف |
|---|---|---|
| 400 | "Invalid request body" | JSON مشوّه |
| 400 | "room name must contain only lowercase letters, numbers, and hyphens" | الاسم يحتوي على أحرف خاصة (#، @، _، إلخ) |
| 400 | "room name must be at least 3 characters" | الاسم قصير جدًا |
| 400 | "room name must be at most 63 characters" | الاسم طويل جدًا |
| 409 | "a room with this name already exists" | اسم مكرر |
| 500 | "Failed to create media room" | خطأ في خادم LiveKit |
| 500 | "Failed to create room" | خطأ في قاعدة البيانات |
الأخطاء العامة
| الحالة | المعنى |
|---|---|
| 400 | طلب غير صالح (بيانات مفقودة/غير صالحة) |
| 401 | غير مُصدَّق |
| 403 | غير مُصرَّح (مستخدم غير مشرف يحاول تنفيذ إجراء مشرف) |
| 404 | الغرفة غير موجودة |
| 409 | تعارض (مورد مكرر) |
| 500 | خطأ داخلي في الخادم |
انظر أيضًا
- نظرة عامة على البنية - نموذج البيانات وتدفق اتصال الاجتماعات
- معالجات API - كيفية تنفيذ نقاط نهاية الغرف