Initial commit

This commit is contained in:
2026-08-11 16:43:12 +03:30
commit e1d830f6a9
127 changed files with 4454 additions and 0 deletions

45
README.md Normal file
View File

@@ -0,0 +1,45 @@
# Tadrisino API — فاز ۱ (۴ از ۱۱ اپ)
پیاده‌سازی اولیه‌ی ۴ اپ اول (از ۱۱ اپ طراحی‌شده): `accounts`, `content`, `progress`, `ai_tutor`.
بقیه‌ی اپ‌ها (subscription, payment, discount, affiliate, support, notifications, family) در فاز بعدی اضافه می‌شن.
## اجرا
```bash
python3 -m venv venv
source venv/bin/activate # ویندوز: venv\Scripts\activate
pip install -r requirements.txt
python manage.py migrate
python manage.py createsuperuser # اختیاری، برای /admin
python manage.py runserver
```
## تست با Swagger
مرورگر: **http://127.0.0.1:8000/api/docs/**
(Redoc هم هست: `/api/redoc/`، و پنل ادمین: `/admin/`)
## جریان تست پیشنهادی
1. `POST /api/auth/session` با `{"type":"guest","deviceId":"d_test1"}` → یک `token` می‌گیرید.
2. توی Swagger روی دکمه‌ی **Authorize** بزنید و فقط خودِ `token` رو بدون کلمه‌ی Bearer وارد کنید.
3. حالا endpointهای نیازمند auth (مثل `/api/user/grade`, `/api/user/summary`, `/api/ai/ask`) کار می‌کنن.
4. برای تست لاگین با شماره: `POST /api/auth/otp/request` بزنید (کد OTP رو در پاسخ برمی‌گردونه چون SMS واقعی وصل نیست)، یا مستقیم کد **0000** رو با هر شماره‌ای در `/api/auth/login` امتحان کنید (فقط در حالت توسعه).
5. برای تست محتوا: از پنل `/admin/` چند `Grade → Unit → Node → Lesson → Question → Choice` بسازید (حتماً یک Choice رو `is_correct=True` کنید)، بعد `/api/home?userId=1&grade=1`، `/api/lessons/{id}/questions`، `/api/questions/{id}/answer?userId=1` رو تست کنید.
## نکات مهم / اصلاحات نسبت به سند اولیه
- **مدل `Choice`** در سند شما فیلد `is_correct` نداشت (خودتون هم توی سند بهش اشاره کرده بودید که شاید سهواً جا افتاده). بدون این فیلد امکان پیاده‌سازی `POST /api/questions/{id}/answer` نبود، پس اضافه‌ش کردم (کامنت توضیح در `content/models.py`).
- احراز هویت: از یک **Bearer token امضاشده و stateless** (بدون کتابخونه‌ی JWT خارجی، با `django.core.signing`) استفاده شده که دقیقاً با فیلدهای مدل `Session` شما (که فقط `refresh_token` داره، نه access token) سازگاره.
- اپ `accounts.User` عمداً `AUTH_USER_MODEL` جنگو نیست؛ یک مدل بیزنسی مستقله، طبق طراحی خودتون.
- endpoint `POST /api/ai/ask` فعلاً پاسخ **stub** برمی‌گردونه (بدون اتصال به مدل واقعی هوش مصنوعی) — محل اتصال با کامنت مشخص شده (`ai_tutor/views.py` تابع `generate_tutor_answer`).
- endpoint کمکی که در سند نبود ولی برای تست‌پذیری اضافه شد: `POST /api/auth/otp/request` (گرفتن کد OTP بدون SMS واقعی).
## ساختار
```
config/ تنظیمات پروژه (settings, urls اصلی)
accounts/ Identity & Profile
content/ Curriculum
progress/ Progress & Gamification
ai_tutor/ AI Tutor
```
## اپ‌های باقی‌مونده (فاز بعدی)
subscription, payment, discount, affiliate, support, notifications, family