Browse Source

online class base url updated

master
Mohsen Taba 2 months ago
parent
commit
e3891e2f29
  1. 6
      apps/course/token-join-guide.md
  2. 8
      apps/course/views/course.py
  3. 6
      config/settings/base.py
  4. 4
      create_live_room.sh
  5. 4
      docs/CHANGELOG_EXCHANGE_TOKEN.md
  6. 4
      docs/exchange_token_api.md
  7. 6
      docs/live-session-api.md
  8. 4
      docs/online_class_entry_flow.md
  9. 57
      nginx/imamjavad.conf
  10. 8
      utils/admin.py

6
apps/course/token-join-guide.md

@ -3,7 +3,7 @@
این راهنما خلاصه می‌کند که برای سناریوی استاد/دانشجو چگونه از سرویس plugNmeet توکن بگیریم و کلاینت فرانت‌اند (`client/`) با آن وارد کلاس شود.
## پیش‌نیازها
- آدرس سرویس: `window.PLUG_N_MEET_SERVER_URL = "https://meet.newhorizonco.uk"` (در `config.js`).
- آدرس سرویس: `window.PLUG_N_MEET_SERVER_URL = "https://meet.imamjavad.online"` (در `config.js`).
- `api_key` و `secret` از فایل پیکربندی بک‌اند (`services/plugnmeet-server/config.yaml`).
- بدنهٔ درخواست‌ها باید با پروتکل JSON متناظر با پیام‌های پروتوباف (`plugnmeet-protocol`) ارسال شود؛ سرور طبق `HandleAuthHeaderCheck` هدرهای امنیتی را بررسی می‌کند.
@ -194,12 +194,12 @@ if not is_admin:
فرانت با این `token` می‌تواند کاربر را به PlugNMeet وارد کند:
```
https://meet.newhorizonco.uk/?access_token=<TOKEN>
https://meet.imamjavad.online/?access_token=<TOKEN>
```
## گام ۳: ورود کلاینت با توکن
۱. توکن را در URL یا کوکی قرار دهید؛ کلاینت مقدار را از `access_token` در کوئری‌استرینگ یا از کوکی `pnm_access_token` می‌خواند (`getAccessToken` در `client/src/helpers/utils.ts`).
۲. آدرس ورود: `https://meet.newhorizonco.uk/?access_token=<TOKEN>`.
۲. آدرس ورود: `https://meet.imamjavad.online/?access_token=<TOKEN>`.
۳. اپلیکیشن React موجود در `client/src/components/app/index.tsx` پس از بارگذاری:
- درخواست `POST /api/verifyToken` را با هدر `Authorization: <TOKEN>` می‌فرستد (`HandleVerifyToken`).
- اگر توکن معتبر باشد، لیست آدرس‌های NATS و موضوعات لازم را می‌گیرد و اتصال را آغاز می‌کند (`startNatsConn`).

8
apps/course/views/course.py

@ -1,6 +1,7 @@
from django.conf import settings
import logging
from django.conf import settings
from django.contrib.auth import get_user_model
from django.db.models import Count, Q, F
from django.shortcuts import get_object_or_404
@ -379,7 +380,7 @@ class CourseOnlineClassTokenAPIView(GenericAPIView):
examples={
"application/json": {
"token": "abc123xyz789...",
"url": "https://imamjavad.newhorizonco.uk/join-class?token=abc123xyz789...&slug=python-basics",
"url": "https://imamjavad.online/join-class?token=abc123xyz789...&slug=python-basics",
"expires_in": 300,
}
}
@ -413,7 +414,8 @@ class CourseOnlineClassTokenAPIView(GenericAPIView):
})
# ساخت URL ثابت با token و course slug
entry_url = f"https://imamjavad.newhorizonco.uk/join-class?token={token}&slug={course.slug}"
frontend_base = getattr(settings, "ONLINE_CLASS_FRONTEND_DOMAIN", getattr(settings, "SITE_DOMAIN", "")).rstrip("/")
entry_url = f"{frontend_base}/join-class?token={token}&slug={course.slug}"
return Response({
'token': token,
@ -819,4 +821,4 @@ class CourseOnlineClassTokenValidateAPIView(GenericAPIView):
)
if updated_count > 0:
logger.info(f"[Room Sync] User sessions closed - session_id={session.id} count={updated_count}")
logger.info(f"[Room Sync] User sessions closed - session_id={session.id} count={updated_count}")

6
config/settings/base.py

@ -310,11 +310,11 @@ FILER_ENABLE_LOGGING = True
FILER_DEBUG = True
ADMIN_TITLE = 'Imam Javad App'
ADMIN_INDEX_TITLE = 'Imam Javad Administration'
SITE_DOMAIN = "https://imamjavad.newhorizonco.uk"
SITE_DOMAIN = "https://imamjavad.online"
DOVODI_DOMAIN = "https://dovodi.newhorizonco.uk"
ONLINE_CLASS_FRONTEND_DOMAIN = env('ONLINE_CLASS_FRONTEND_DOMAIN', default=SITE_DOMAIN)
ONLINE_CLASS_TOKEN_TTL = env.int('ONLINE_CLASS_TOKEN_TTL', default=3000)
PLUGNMEET_SERVER_URL ='https://meet.newhorizonco.uk'
PLUGNMEET_SERVER_URL ='https://meet.imamjavad.online'
PLUGNMEET_API_KEY ='habibmeet_api_key_2024'
PLUGNMEET_API_SECRET ='habibmeet_secret_zumyyYWqv7KR2kUqvYdq4z4sXg7XTBD2ljT6_2024'
PLUGNMEET_TIMEOUT = env.float('PLUGNMEET_TIMEOUT', default=10.0)
@ -941,4 +941,4 @@ sentry_sdk.init(
INTERNAL_WEBHOOK_SECRET = env('INTERNAL_WEBHOOK_SECRET', default='super-secret-key-12345')
FASTAPI_SERVER_URL = env('FASTAPI_SERVER_URL', default='http://88.99.212.243:8020')
FASTAPI_SERVER_URL = env('FASTAPI_SERVER_URL', default='http://88.99.212.243:8020')

4
create_live_room.sh

@ -2,8 +2,8 @@
set -e
API_BASE="https://imamjavad.newhorizonco.uk/api"
LIVE_BASE="https://live.newhorizonco.uk"
API_BASE="https://imamjavad.online/api"
LIVE_BASE="https://meet.imamjavad.online"
DEFAULT_COURSE_SLUG="test-1-ghorbani"
DEFAULT_AUTH_TOKEN="e5ec00c7660302c3225276eaf7be99459c9a7012"

4
docs/CHANGELOG_EXCHANGE_TOKEN.md

@ -53,7 +53,7 @@
```json
{
"token": "abc123xyz789",
"url": "https://imamjavad.newhorizonco.uk/join-class?token=abc123xyz789&slug=python-basics",
"url": "https://imamjavad.online/join-class?token=abc123xyz789&slug=python-basics",
"expires_in": 300
}
```
@ -74,7 +74,7 @@
دیگر از تنظیمات یا environment variable استفاده نمی‌شود. URL ثابت است:
```
https://imamjavad.newhorizonco.uk/join-class?token={TEMP_TOKEN}&slug={COURSE_SLUG}
https://imamjavad.online/join-class?token={TEMP_TOKEN}&slug={COURSE_SLUG}
```
### مزایای تغییرات

4
docs/exchange_token_api.md

@ -91,7 +91,7 @@ curl -X POST http://localhost:8000/api/courses/1/online/token/ \
```json
{
"token": "abc123xyz789...",
"url": "https://imamjavad.newhorizonco.uk/join-class?token=abc123xyz789...&slug=python-basics",
"url": "https://imamjavad.online/join-class?token=abc123xyz789...&slug=python-basics",
"expires_in": 300
}
```
@ -154,7 +154,7 @@ Headers: Authorization: Token <USER_TOKEN>
Response: {
"token": "abc123",
"url": "https://imamjavad.newhorizonco.uk/join-class?token=abc123&slug=python-basics"
"url": "https://imamjavad.online/join-class?token=abc123&slug=python-basics"
}
📱 Open URL in Browser

6
docs/live-session-api.md

@ -3,7 +3,7 @@
این راهنما خلاصه می‌کند که برای سناریوی استاد/دانشجو چگونه از سرویس plugNmeet توکن بگیریم و کلاینت فرانت‌اند (`client/`) با آن وارد کلاس شود.
## پیش‌نیازها
- آدرس سرویس: `window.PLUG_N_MEET_SERVER_URL = "https://meet.newhorizonco.uk"` (در `config.js`).
- آدرس سرویس: `window.PLUG_N_MEET_SERVER_URL = "https://meet.imamjavad.online"` (در `config.js`).
- `api_key` و `secret` از فایل پیکربندی بک‌اند (`services/plugnmeet-server/config.yaml`).
- بدنهٔ درخواست‌ها باید با پروتکل JSON متناظر با پیام‌های پروتوباف (`plugnmeet-protocol`) ارسال شود؛ سرور طبق `HandleAuthHeaderCheck` هدرهای امنیتی را بررسی می‌کند.
@ -251,12 +251,12 @@ if not is_admin:
فرانت با این `token` می‌تواند کاربر را به PlugNMeet وارد کند:
```
https://meet.newhorizonco.uk/?access_token=<TOKEN>
https://meet.imamjavad.online/?access_token=<TOKEN>
```
## گام ۳: ورود کلاینت با توکن
۱. توکن را در URL یا کوکی قرار دهید؛ کلاینت مقدار را از `access_token` در کوئری‌استرینگ یا از کوکی `pnm_access_token` می‌خواند (`getAccessToken` در `client/src/helpers/utils.ts`).
۲. آدرس ورود: `https://meet.newhorizonco.uk/?access_token=<TOKEN>`.
۲. آدرس ورود: `https://meet.imamjavad.online/?access_token=<TOKEN>`.
۳. اپلیکیشن React موجود در `client/src/components/app/index.tsx` پس از بارگذاری:
- درخواست `POST /api/verifyToken` را با هدر `Authorization: <TOKEN>` می‌فرستد (`HandleVerifyToken`).
- اگر توکن معتبر باشد، لیست آدرس‌های NATS و موضوعات لازم را می‌گیرد و اتصال را آغاز می‌کند (`startNatsConn`).

4
docs/online_class_entry_flow.md

@ -22,12 +22,12 @@ curl --request POST \
```json
{
"token": "5f7b8c...e1",
"url": "https://imamjavad.newhorizonco.uk/join-class?token=5f7b8c...e1&slug=dars-akhlagh",
"url": "https://imamjavad.online/join-class?token=5f7b8c...e1&slug=dars-akhlagh",
"expires_in": 300
}
```
**نکته:** URL ثابت است: `https://imamjavad.newhorizonco.uk/join-class?token={TOKEN}&slug={COURSE_SLUG}`
**نکته:** URL ثابت است: `https://imamjavad.online/join-class?token={TOKEN}&slug={COURSE_SLUG}`
## 2. اعتبارسنجی توکن و دریافت داده‌های کلاس

57
nginx/imamjavad.conf

@ -9,7 +9,7 @@
server {
listen 80;
listen 443 ssl;
server_name imamjavad.online imamjavad.nwhco.ir imamjavad.newhorizonco.uk;
server_name imamjavad.online imamjavad.nwhco.ir;
ssl_certificate /etc/nginx/letsencrypt/live/imamjavad.online/fullchain.pem;
ssl_certificate_key /etc/nginx/letsencrypt/live/imamjavad.online/privkey.pem;
@ -88,7 +88,7 @@ server {
client_max_body_size 1200M;
}
location /chat {
location /chat/ {
proxy_pass http://88.99.212.243:8020;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
@ -223,4 +223,55 @@ server {
expires 30d;
add_header Access-Control-Allow-Origin *;
}
}
}
# ========================================
# 3. PLUGNMEET / ONLINE CLASS SERVER BLOCK
# ========================================
server {
listen 80;
server_name meet.imamjavad.online;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name meet.imamjavad.online;
ssl_certificate /etc/nginx/letsencrypt/live/meet.imamjavad.online/fullchain.pem;
ssl_certificate_key /etc/nginx/letsencrypt/live/meet.imamjavad.online/privkey.pem;
include /etc/nginx/options-ssl-nginx.conf;
client_max_body_size 500M;
client_body_timeout 600s;
client_header_timeout 60s;
proxy_connect_timeout 600s;
proxy_send_timeout 600s;
proxy_read_timeout 3600s;
location /nats {
proxy_pass http://88.99.212.243:8222;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
location / {
proxy_pass http://88.99.212.243:8082;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 3600s;
proxy_send_timeout 3600s;
}
}

8
utils/admin.py

@ -169,7 +169,7 @@ class FormulaAdminSite(UnfoldAdminSite):
context["site_dropdown"] = [
{
"title": _("Imam Javad Site"),
"link": "https://imamjavad.newhorizonco.uk/",
"link": "https://imamjavad.online/",
"icon": "diamond",
},
{
@ -287,12 +287,12 @@ class DovoodiAdminSite(UnfoldAdminSite):
},
{
"title": _("Imam Javad Site"),
"link": "https://imamjavad.newhorizonco.uk/",
"link": "https://imamjavad.online/",
"icon": "diamond",
},
{
"title": _("Imam Javad Admin"),
"link": "https://imamjavad.newhorizonco.uk/admin/",
"link": "https://imamjavad.online/admin/",
"icon": "diamond",
}
]
@ -624,4 +624,4 @@ def dashboard_callback(request, context):
except Exception as e:
print(f"Dashboard KPI Error (Dovoodi Panel): {e}")
return context
return context
Loading…
Cancel
Save