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.
5.8 KiB
5.8 KiB
Online Class Entry Scenario
1. دریافت توکن ورود به کلاس آنلاین
- هدف: کاربر لاگینشده لینک ورود موقت به کلاس بگیرد.
- درخواست:
POST /api/courses/{course_id}/online/token/به همراه توکن احراز هویت کاربر. - ورودی اختیاری:
redirect_path(مسیر نسبی در فرانت برای صفحه کلاس). - خروجی: توکن یکبارمصرف ذخیرهشده در Redis + آدرس نهایی ورود (دامنه فرانت + Query Param توکن).
نمونه curl
curl --request POST \
--url https://api.example.com/api/courses/42/online/token/ \
--header 'Authorization: Token USER_AUTH_TOKEN' \
--header 'Content-Type: application/json' \
--data '{
"redirect_path": "online-classroom"
}'
نمونه پاسخ
{
"token": "5f7b8c...e1",
"url": "https://imamjavad.newhorizonco.uk/join-class?token=5f7b8c...e1&slug=dars-akhlagh",
"expires_in": 300
}
نکته: URL ثابت است: https://imamjavad.newhorizonco.uk/join-class?token={TOKEN}&slug={COURSE_SLUG}
2. اعتبارسنجی توکن و دریافت دادههای کلاس
- هدف: فرانت با توکن دریافتی اطلاعات کلاس، پروفایل کاربر و متادیتا را بگیرد.
- درخواست:
POST /api/courses/online/token/validate/ - ورودی:
token - خروجی: آبجکت دوره (سریالایز کامل)، پروفایل کاربر، و متادیتا شامل وضعیت کلاس، زمانها و وضعیت حضور استاد.
نمونه curl
curl --request POST \
--url https://api.example.com/api/courses/online/token/validate/ \
--header 'Content-Type: application/json' \
--data '{
"token": "5f7b8c...e1"
}'
نمونه پاسخ
{
"course": {
"id": 42,
"title": "درس اخلاق",
"slug": "dars-akhlagh",
"category": {
"name": "علوم اسلامی",
"slug": "islamic-sciences",
"course_count": 15
},
"access": true,
"participant_count": 85,
"professor": {
"id": 7,
"fullname": "استاد رضایی",
"slug": "rezaei",
"avatar": "https://api.example.com/media/avatars/rezaei.jpg",
"email": "rezaei@example.com",
"phone_number": "+1234567890",
"info": "استاد دانشگاه",
"skill": "فقه و اصول",
"city": "قم",
"country": "ایران",
"birthdate": "1975-05-15",
"gender": "male"
},
"is_professor": false,
"thumbnail": "https://api.example.com/media/courses/akhlagh.jpg",
"video_type": "link",
"video_file": null,
"video_link": "https://example.com/intro-video.mp4",
"is_online": true,
"online_link": "https://meeting.example.com/class/42",
"level": "intermediate",
"description": "دوره جامع اخلاق اسلامی...",
"duration": "3 ماه",
"lessons_count": 12,
"lessons_complated_count": 5,
"short_description": "آشنایی با مبانی اخلاق اسلامی",
"status": "ongoing",
"is_free": false,
"price": "50000.00",
"discount_percentage": 10,
"final_price": "45000.00",
"timing": {
"monday": "18:00",
"wednesday": "18:00"
},
"features": ["ضبط جلسات", "گواهینامه معتبر", "پشتیبانی 24 ساعته"],
"last_lesson_id": 6,
"room_id": 123,
"user_transaction_status": "approved"
},
"user": {
"id": 105,
"device_id": "device-xyz-123",
"fcm": "fcm-token-abc",
"fullname": "علی احمدی",
"slug": "ali-ahmadi",
"avatar": "https://api.example.com/media/avatars/ali.jpg",
"email": "ali@example.com",
"phone_number": "+9876543210",
"info": "دانشجو",
"skill": "برنامهنویسی",
"city": "تهران",
"country": "ایران",
"birthdate": "1995-08-20",
"gender": "male"
},
"metadata": {
"status": "ongoing",
"is_online": true,
"has_started": true,
"has_finished": false,
"professor_in_class": false,
"can_start_online_class": false,
"scheduled_times": {
"monday": "18:00",
"wednesday": "18:00"
},
"generated_at": "2024-10-05T10:15:30Z",
"validated_at": "2024-10-05T10:16:05.123456Z",
"livesession_started_at": "2024-10-05T10:15:30Z",
}
}
توضیحات فیلدهای مهم:
- course: شامل تمام اطلاعات دوره شامل استاد، دستهبندی، درسها، قیمت و...
- user: پروفایل کامل کاربری که توکن را اعتبارسنجی کرده
- metadata.can_start_online_class:
trueبرای استاد دوره،falseبرای دانشجویان (فقط استاد میتواند کلاس را شروع کند) - metadata.professor_in_class: نشان میدهد استاد در حال حاضر در کلاس حضور دارد یا خیر
- metadata.has_started: دوره شروع شده است (
ongoingیاfinished) - metadata.has_finished: دوره به پایان رسیده است (
finished)
نکات پیادهسازی در فرانتاند
- پس از دریافت پاسخ مرحلهٔ اول، کاربر را به
urlبازگردانی کنید. - در صفحه کلاس، توکن از Query String خوانده شده و به مرحلهٔ دوم ارسال شود.
- در صورت خطا (Expiry یا Invalid)، فرانت باید کاربر را به صفحهٔ اصلی یا خطا هدایت کند و درخواست توکن جدید بدهد.
expires_inنشان میدهد لینک چه مدت اعتبار دارد؛ بهتر است شمارش معکوس یا تلاش خودکار برای تمدید توکن داشته باشید.