3 changed files with 254 additions and 3 deletions
@ -0,0 +1,237 @@ |
|||
# راهنمای استفاده از endpoint های ورود به کلاس آنلاین |
|||
|
|||
این فایل برای تیمهای `frontend` و `flutter` نوشته شده و فقط توضیح میدهد: |
|||
|
|||
- هر endpoint چه کاری انجام میدهد |
|||
- در چه شرایطی باید از آن استفاده شود |
|||
- ترتیب درست استفاده از endpoint ها چیست |
|||
|
|||
این راهنما وارد کدنویسی React یا Flutter نمیشود و فقط منطق استفاده را توضیح میدهد. |
|||
|
|||
## هدف کلی |
|||
|
|||
کاربر برای ورود به کلاس آنلاین دو حالت دارد: |
|||
|
|||
1. کلاس هنوز توسط استاد شروع نشده است |
|||
2. کلاس از قبل شروع شده و room فعال است |
|||
|
|||
رفتار درست فرانت باید بر اساس همین دو حالت تعیین شود. |
|||
|
|||
## اصل مهم |
|||
|
|||
فرانت نباید با درخواست اشتباه باعث ساختن کلاس توسط دانشجو شود. |
|||
|
|||
بنابراین: |
|||
|
|||
- اگر کلاس شروع نشده باشد، کاربر باید وارد `waiting page` شود |
|||
- اگر کلاس شروع شده باشد، کاربر باید مستقیم `join token` واقعی بگیرد و وارد کلاس شود |
|||
|
|||
## endpoint ها |
|||
|
|||
### 1. بررسی وضعیت کلاس |
|||
|
|||
#### Endpoint |
|||
|
|||
`GET /api/courses/<course-slug>/online/validate/` |
|||
|
|||
#### کاربرد |
|||
|
|||
این endpoint برای تصمیمگیری اولیه فرانت است. |
|||
|
|||
با این endpoint میتوان فهمید: |
|||
|
|||
- آیا کلاس الان آنلاین است یا نه |
|||
- آیا کاربر اجازه ورود به کلاس را دارد یا نه |
|||
- آیا کاربر استاد است و میتواند کلاس را شروع کند یا نه |
|||
|
|||
#### خروجی مهم |
|||
|
|||
فیلدهای مهم در `metadata`: |
|||
|
|||
- `is_online` |
|||
- `can_join_live_session` |
|||
- `can_create_live_session` |
|||
- `has_finished` |
|||
|
|||
#### زمان استفاده |
|||
|
|||
این endpoint باید قبل از تصمیم نهایی برای ورود به کلاس صدا زده شود. |
|||
|
|||
#### تصمیمگیری بر اساس پاسخ |
|||
|
|||
- اگر `is_online = true` و `can_join_live_session = true` |
|||
فرانت باید مستقیم به سراغ گرفتن `join token` واقعی برود |
|||
|
|||
- اگر `is_online = false` |
|||
فرانت نباید مستقیم سراغ `room/token` برود و باید از flow صفحه انتظار استفاده کند |
|||
|
|||
- اگر `can_create_live_session = true` |
|||
کاربر استاد است و فرانت باید مستقیم به سراغ گرفتن `join token` واقعی برود |
|||
|
|||
--- |
|||
|
|||
### 2. ساخت لینک ورود موقت برای waiting page |
|||
|
|||
#### Endpoint |
|||
|
|||
`POST /api/courses/<course_id>/online/token/` |
|||
|
|||
#### کاربرد |
|||
|
|||
این endpoint برای ورود به waiting flow استفاده میشود. |
|||
|
|||
این endpoint: |
|||
|
|||
- یک `temporary token` میسازد |
|||
- یک URL ورود به `conference_client` برمیگرداند |
|||
|
|||
#### چه زمانی باید استفاده شود |
|||
|
|||
فقط وقتی که کلاس هنوز شروع نشده است. |
|||
|
|||
#### چه زمانی نباید استفاده شود |
|||
|
|||
اگر کلاس از قبل شروع شده و room فعال است، نباید این endpoint مسیر اصلی ورود باشد. |
|||
|
|||
در آن حالت باید مستقیم `join token` واقعی گرفته شود. |
|||
|
|||
#### ورودی |
|||
|
|||
- `course_id` در URL |
|||
- هدر احراز هویت کاربر |
|||
|
|||
بدنه عملا میتواند خالی باشد. |
|||
|
|||
#### خروجی |
|||
|
|||
پاسخ شامل این فیلدهاست: |
|||
|
|||
- `token` |
|||
- `url` |
|||
- `expires_in` |
|||
|
|||
|
|||
### 3. گرفتن join token واقعی برای ورود مستقیم به کلاس |
|||
|
|||
#### Endpoint |
|||
|
|||
`POST /api/courses/online/room/token/` |
|||
|
|||
#### کاربرد |
|||
|
|||
این endpoint `access_token` واقعی PlugNMeet را میسازد. |
|||
|
|||
با این token کاربر مستقیم وارد کلاس میشود. |
|||
|
|||
#### چه زمانی باید استفاده شود |
|||
|
|||
وقتی که کلاس از قبل شروع شده و room فعال است. |
|||
|
|||
#### چه زمانی نباید استفاده شود |
|||
|
|||
وقتی هنوز کلاس شروع نشده است. |
|||
|
|||
در آن حالت این endpoint مسیر مناسب ورود نیست و باید از waiting flow استفاده شود. |
|||
|
|||
#### ورودی |
|||
|
|||
بدنه: |
|||
|
|||
`course_slug` |
|||
|
|||
به همراه هدر احراز هویت کاربر |
|||
|
|||
#### خروجی |
|||
|
|||
پاسخ شامل: |
|||
|
|||
- `room_id` |
|||
- `token` |
|||
|
|||
#### رفتار درست بعد از دریافت پاسخ |
|||
|
|||
کاربر باید مستقیم به `conference_client` با `access_token` هدایت شود. |
|||
|
|||
مثال: |
|||
|
|||
`https://meet.imamjavad.online/?access_token=<access_token>` |
|||
|
|||
|
|||
## ترتیب درست استفاده در فرانت |
|||
|
|||
### سناریو 1: کاربر روی دکمه ورود به کلاس میزند |
|||
|
|||
ترتیب درست: |
|||
|
|||
1. فرانت وضعیت کلاس را با `online/validate` بررسی کند |
|||
2. اگر کلاس فعال بود: |
|||
- `online/room/token/` |
|||
- هدایت مستقیم با `access_token` |
|||
3. اگر کلاس فعال نبود: |
|||
- `online/token/` |
|||
- هدایت کاربر به waiting page |
|||
|
|||
## منطق تصمیمگیری پیشنهادی |
|||
|
|||
- `is_online = true` |
|||
مسیر درست: ورود مستقیم به کلاس |
|||
|
|||
- `is_online = false` |
|||
مسیر درست: waiting page |
|||
|
|||
## رفتار داخل conference_client |
|||
|
|||
`conference_client` الان دو ورودی را میفهمد: |
|||
|
|||
### حالت اول: ورود مستقیم |
|||
|
|||
اگر URL شامل این باشد: |
|||
|
|||
- `access_token` |
|||
|
|||
کاربر مستقیم وارد flow اصلی کلاس میشود. |
|||
|
|||
### حالت دوم: waiting flow |
|||
|
|||
اگر URL شامل این باشد: |
|||
|
|||
- `token` |
|||
- `slug` |
|||
|
|||
کاربر وارد waiting/pre-join flow میشود. |
|||
|
|||
در این حالت: |
|||
|
|||
1. temporary token به auth token واقعی تبدیل میشود |
|||
2. وضعیت کلاس از Django خوانده میشود |
|||
3. اگر کلاس هنوز شروع نشده باشد، waiting page نمایش داده میشود |
|||
4. اگر کلاس شروع شده باشد، دکمه ورود به کلاس نمایش داده میشود |
|||
5. اگر کاربر استاد باشد و کلاس شروع نشده باشد، دکمه شروع کلاس نمایش داده میشود |
|||
|
|||
## آپدیت خودکار وضعیت |
|||
|
|||
در waiting flow، وضعیت کلاس به صورت polling دورهای از Django بررسی میشود. |
|||
|
|||
بنابراین: |
|||
|
|||
- اگر استاد کلاس را شروع کند، صفحه انتظار بهروزرسانی میشود |
|||
- اگر استاد کلاس را ببندد، وضعیت صفحه دوباره به حالت انتظار/پایان بازمیگردد |
|||
|
|||
## جمعبندی نهایی |
|||
|
|||
### برای فرانت اصلی سایت یا اپ |
|||
|
|||
- ابتدا همیشه `online/validate` |
|||
- اگر کلاس فعال بود: `online/room/token/` |
|||
- اگر کلاس فعال نبود: `online/token/` |
|||
|
|||
### برای conference_client |
|||
|
|||
- اگر `access_token` داشت: ورود مستقیم |
|||
- اگر `token + slug` داشت: waiting flow |
|||
|
|||
### قاعده مهم |
|||
|
|||
`online/token/` برای قبل از شروع کلاس است |
|||
|
|||
`online/room/token/` برای وقتی است که کلاس واقعا شروع شده است |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue