You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
11 KiB
11 KiB
راهنمای اتصال فرانتاند به API لایو کلاس
این مستند جریان کامل «ایجاد روم لایو»، «گرفتن توکن ورود» و «مدیریت ورود استاد و دانشجو» را توضیح میدهد.
۱. اعتبارسنجی وضعیت دوره
GET /api/courses/<course-slug>/online/validate/
Headers:
Authorization: Token <USER_TOKEN>
پاسخ نمونه (استاد، کلاس آنلاین در حال اجرا)
{
"course": {
"id": 42,
"slug": "algebra-10",
"title": "کلاس جبر",
"is_online": true,
"online_link": "https://imamjavad.app/courses/algebra-10/live",
"status": "ongoing",
"professor": {
"id": 10,
"fullname": "استاد نمونه",
"slug": "ostad-nemoone",
"avatar": "https://imamjavad.app/media/users/avatars/2025/10/ostad.jpg"
}
},
"user": {
"id": 10,
"email": "prof@example.com",
"fullname": "استاد نمونه",
"avatar": "https://imamjavad.app/media/users/avatars/2025/10/ostad.jpg",
"roles": ["professor"],
"is_staff": false
},
"metadata": {
"status": "ongoing",
"has_started": true,
"has_finished": false,
"professor_in_class": false,
"can_create_live_session": false,
"can_join_live_session": true,
"scheduled_times": {
"day": "monday",
"start_time": "09:00",
"timezone": "Asia/Tehran"
},
"generated_at": "2025-10-14T01:32:45+03:30",
"validated_at": "2025-10-14T01:33:10+03:30",
"redirect_path": null,
"is_online": true,
"active_room_id": "algebra-1402",
"livesession_started_at": "2025-10-14T01:15:00+03:30",
"livesession_ended_at": null,
"live_session": {
"id": 7,
"room_id": "algebra-1402",
"subject": "کلاس جبر فصل ۱",
"started_at": "2025-10-14T01:15:00+03:30",
"ended_at": null
}
}
}
can_create_live_session: اگرtrue→ استاد میتواند روم جدید بسازد (فقط وقتی کلاس آفلاین است)can_join_live_session: اگرtrue→ کاربر میتواند به کلاس فعال بپیوندد (استاد یا دانشجو)active_room_id: room_id کلاس فعال (برای نمایش در UI)livesession_started_at: زمان شروع - برای محاسبه مدت سپریشده
پاسخ نمونه (استاد، کلاس آفلاین)
{
"course": { "id": 42, "title": "کلاس جبر" },
"user": { "id": 10, "fullname": "استاد نمونه" },
"metadata": {
"status": "ongoing",
"has_started": true,
"has_finished": false,
"professor_in_class": false,
"can_create_live_session": true,
"can_join_live_session": false,
"scheduled_times": { "day": "monday", "time": "09:00" },
"generated_at": "2025-10-14T01:32:45+03:30",
"validated_at": "2025-10-14T01:33:10+03:30",
"redirect_path": null,
"is_online": false,
"active_room_id": null,
"livesession_started_at": null,
"livesession_ended_at": null,
"live_session": null
}
}
پاسخ نمونه (دانشجو ثبتنامکرده، کلاس آنلاین)
{
"course": { "id": 42, "title": "کلاس جبر" },
"user": { "id": 27, "fullname": "دانشجو نمونه" },
"metadata": {
"status": "ongoing",
"has_started": true,
"has_finished": false,
"professor_in_class": false,
"can_create_live_session": false,
"can_join_live_session": true,
"scheduled_times": { "day": "monday", "time": "09:00" },
"generated_at": "2025-10-14T01:32:45+03:30",
"validated_at": "2025-10-14T01:33:10+03:30",
"redirect_path": null,
"is_online": true,
"active_room_id": "algebra-1402",
"livesession_started_at": "2025-10-14T01:15:00+03:30",
"livesession_ended_at": null,
"live_session": {
"id": 7,
"room_id": "algebra-1402",
"subject": "کلاس جبر فصل ۱",
"started_at": "2025-10-14T01:15:00+03:30",
"ended_at": null
}
}
}
پاسخ نمونه (دانشجو ثبتنامکرده، کلاس آفلاین)
{
"course": { "id": 42, "title": "کلاس جبر" },
"user": { "id": 27, "fullname": "دانشجو نمونه" },
"metadata": {
"status": "ongoing",
"has_started": true,
"has_finished": false,
"professor_in_class": false,
"can_create_live_session": false,
"can_join_live_session": false,
"scheduled_times": { "day": "monday", "time": "09:00" },
"generated_at": "2025-10-14T01:32:45+03:30",
"validated_at": "2025-10-14T01:33:10+03:30",
"redirect_path": null,
"is_online": false,
"active_room_id": null,
"livesession_started_at": null,
"livesession_ended_at": null,
"live_session": null
}
}
پاسخ نمونه (کاربر بدون دسترسی)
{
"status": "error",
"code": "app_api_error",
"status_code": 403,
"message": "An error occurred while processing the request.",
"errors": [
{ "message": "You do not have access to this course." }
]
}
۲. ساخت یا فعال کردن روم (استاد)
POST /api/courses/<course-slug>/online/room/create/
Headers:
Authorization: Token <USER_TOKEN>
Content-Type: application/json
Body (نمونه):
{
"subject": "کلاس جبر فصل ۱" // اختیاری؛ پیشفرض عنوان دوره + "Live Session"
}
⚠️ نکات مهم:
- فرانت نباید
metadataارسال کند! - بکاند بهطور خودکار تنظیمات امنیتی را اعمال میکند:
lock_microphone: true- میکروفون برای همه قفل استlock_webcam: true- وبکم برای همه قفل استlock_screen_sharing: true- اشتراک صفحه برای همه قفل استmute_on_start: true- همه با میکروفون خاموش وارد میشوند
- فقط میزبان (استاد) میتواند این محدودیتها را برداشته و به دانشجو اجازه دهد
پاسخ موفق (۲۰۱ یا ۲۰۰)
{
"session": {
"id": 7,
"room_id": "algebra-1402",
"subject": "کلاس جبر فصل ۱",
"started_at": "2025-10-14T01:32:45+03:30"
},
"plugnmeet": {
"status": "success",
"room_id": "algebra-1402",
"...": "پاسخ کامل PlugNMeet"
}
}
۳. گرفتن توکن ورود به روم
POST /api/courses/online/room/token/
Headers:
Authorization: Token <USER_TOKEN>
Content-Type: application/json
Body:
{
"course_slug": "algebra-10"
}
⚠️ نکات مهم:
- فرانت فقط
course_slugارسال میکند! - بکاند از
Authorizationheader کاربر را شناسایی میکند - بکاند خودش live session فعال دوره را پیدا میکند:
course = Course.objects.get(slug=course_slug) session = CourseLiveSession.objects.get(course=course, ended_at__isnull=True) room_id = session.room_id - بکاند خودش همه اطلاعات کاربر را میسازد:
user_idازrequest.user.idnameازuser.get_full_name()یاuser.emailis_adminازuser.can_manage_course(course)- تشخیص خودکار استاد/دانشجوprofilePicازuser.avatarlock_settingsخودکار برای دانشجو (همه قفل)
پاسخ موفق
{
"room_id": "algebra-1402",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"plugnmeet": {
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"expires": 300,
"...": "پاسخ کامل PlugNMeet"
}
}
نحوه استفاده:
tokenباید در URL سرویس PlugNMeet استفاده شود:https://meet.newhorizonco.uk/?access_token=<token>- بکاند خودکار تشخیص میدهد:
- استاد:
is_admin: true→ همه دسترسیها بدون محدودیت - دانشجو:
is_admin: false+lock_settings→ میکروفون، وبکم و اشتراک صفحه قفل است
- استاد:
سناریوهای پیشنهادی برای پیادهسازی فرانت
سناریوی استاد
-
دریافت وضعیت: با
GET /online/validate/وضعیت را بگیرید.- اگر
can_create_live_session = trueاست → دکمه «ساخت کلاس» را نشان دهید. - اگر
can_join_live_session = trueاست → دکمه «ورود به کلاس» را نشان دهید.
- اگر
-
ساخت روم (در صورت نیاز):
POST /online/room/create/ Body: { "room_id": "algebra-10-1704880365000", // اختیاری "subject": "کلاس جبر" // اختیاری }نکته: فقط این دو فیلد! بکاند خودش
metadataو تنظیمات امنیتی را اعمال میکند. -
گرفتن توکن:
POST /online/room/token/ Body: { "course_slug": "algebra-10" // فقط این! }نکته: بکاند خودش live session فعال را پیدا میکند و
room_idرا میگیرد. -
ورود به کلاس:
window.open(`https://meet.newhorizonco.uk/?access_token=${token}`, "_blank");
سناریوی دانشجو
-
دریافت وضعیت: با
GET /online/validate/وضعیت را بگیرید.- اگر
is_online = trueوcan_join_live_session = true→ دکمه «ورود به کلاس» را نمایش دهید.
- اگر
-
گرفتن توکن و ورود:
POST /online/room/token/ Body: { "course_slug": "algebra-10" // فقط این! }سپس با
tokenدریافتی به PlugNMeet وارد شوید.
✅ آنچه بکاند خودکار انجام میدهد:
موقع ساخت روم:
- ✅ تعیین
default_lock_settings(همهtrue) - ✅ تعیین
room_features.mute_on_start: true - ✅ ساخت
metadataکامل برای PlugNMeet
موقع گرفتن توکن:
- ✅ پیدا کردن live session فعال از
course_slug - ✅ گرفتن
room_idاز session - ✅ تشخیص
is_adminباuser.can_manage_course(course) - ✅ ساخت
user_infoکامل (user_id, name, profilePic) - ✅ اضافه کردن
lock_settingsبرای دانشجو
❌ آنچه فرانت نباید ارسال کند:
- ❌
metadataموقع ساخت روم - ❌
room_idموقع گرفتن توکن - ❌
user_info,is_admin,lock_settings
🔐 نکات امنیتی:
- همه تنظیمات امنیتی در سمت سرور کنترل میشود
- فرانت نمیتواند تنظیمات را دستکاری کند
- بکاند تعیین میکند چه کسی استاد است و چه کسی دانشجو
- زمانی که استاد وارد لایو شده است،
can_create_live_sessionبرابرfalseمیشود - برای نمایش مدت سپریشده، از
livesession_started_atاستفاده کرده و در فرانت اختلاف با زمان فعلی را محاسبه کنید