۲ — فیلدها و اندپوینتی که صفحه‌ها لازم داشتند #3

Closed
AliReza_Zareian wants to merge 3 commits from AliReza_Zareian/MathApp_frontend:zareian/api-client-2 into main
Collaborator

سلام دوباره 👋 و ممنون که PR قبلی رو merge کردید.

بعد از merge، صفحه‌های اپ رو با API مقایسه کردم و دیدم چند چیزی که صفحه‌ها لازم دارن هنوز از سرور نمی‌اومد. سمتِ بک‌اند اضافه‌شون کردم و این PR فقط دسترسی بهشون رو به src/api/ اضافه می‌کنه.

همه‌ی تغییرات افزایشی‌ان — چیزی که الان دارید نمی‌شکنه.

چی اضافه شد

api.grades() حالا lessonCount داره
api.home() هر مبحث icon و color، هر فصل blurb
api.nodes.lessons(nodeId) تازه — کارت‌های نقشه‌ی مهارت
api.lessons.intro() example و steps و kind و videoUrl
api.profile.update() age رو هم قبول می‌کنه

چند نکته که ممکنه وقتتون رو بگیره

lessonCount — صفر یعنی اون پایه هنوز محتوایی نداره. فهرستِ پایه‌ها تا دوازدهم می‌ره ولی محتوای واقعی فعلاً تا نهمه، پس اگه گزینه‌ی خالی رو غیرفعال کنید، کاربر دیگه صفحه‌ی خالی نمی‌بینه.

nodes.lessons(nodeId) — home() فقط شناسه‌ی درس‌ها رو می‌ده. برای کارت‌های نقشه‌ی مهارت (عنوان، آزمون یا ویدیو، «۵ سوال» / «۱۲ دقیقه»، انجام‌شده) این رو صدا بزنید: یک درخواست برای کلِ مبحث، نه یکی به‌ازای هر کارت.

متنِ درس سه‌تکه شد — introText (توضیح)، example، و steps (حلِ گام‌به‌گام). kind هم می‌گه آزمونه یا ویدیو.

icon و color حالا از سرور میان، پس لازم نیست تو کد بمونن.

یه چیزی که قبلاً خراب بود و درست شد

home(gradeId) کار نمی‌کرد. سرور اون پارامتر رو نمی‌شناخت و بی‌صدا نادیده می‌گرفت، یعنی کاربر یه پایه انتخاب می‌کرد و نقشه‌ی پایه‌ی دیگه‌ای می‌دید — بدونِ هیچ خطایی. سمتِ سرور درست شد و به کدِ شما هم دست نمی‌خوره.

تست

هر ۲۰ صدا در برابرِ یه بک‌اندِ در حالِ اجرا زده شد، از ورودِ مهمان تا ثبتِ پاسخ و دستیار. tsc --strict و npm run build هم سبزن.

مثل دفعه‌ی قبل هیچ فایلِ موجودی دست نخورده — نه App.tsx، نه package.json — و پکیجِ جدیدی هم اضافه نشده.

اگه جایی‌ش به سلیقه‌تون نمی‌خوره بگید عوضش کنم 🙏

سلام دوباره 👋 و ممنون که PR قبلی رو merge کردید. بعد از merge، صفحه‌های اپ رو با API مقایسه کردم و دیدم چند چیزی که صفحه‌ها لازم دارن هنوز از سرور نمی‌اومد. سمتِ بک‌اند اضافه‌شون کردم و این PR فقط دسترسی بهشون رو به `src/api/` اضافه می‌کنه. **همه‌ی تغییرات افزایشی‌ان — چیزی که الان دارید نمی‌شکنه.** ## چی اضافه شد | | | |---|---| | `api.grades()` | حالا `lessonCount` داره | | `api.home()` | هر مبحث `icon` و `color`، هر فصل `blurb` | | `api.nodes.lessons(nodeId)` | **تازه** — کارت‌های نقشه‌ی مهارت | | `api.lessons.intro()` | `example` و `steps` و `kind` و `videoUrl` | | `api.profile.update()` | `age` رو هم قبول می‌کنه | ## چند نکته که ممکنه وقتتون رو بگیره **`lessonCount`** — صفر یعنی اون پایه هنوز محتوایی نداره. فهرستِ پایه‌ها تا دوازدهم می‌ره ولی محتوای واقعی فعلاً تا نهمه، پس اگه گزینه‌ی خالی رو غیرفعال کنید، کاربر دیگه صفحه‌ی خالی نمی‌بینه. **`nodes.lessons(nodeId)`** — `home()` فقط شناسه‌ی درس‌ها رو می‌ده. برای کارت‌های نقشه‌ی مهارت (عنوان، آزمون یا ویدیو، «۵ سوال» / «۱۲ دقیقه»، انجام‌شده) این رو صدا بزنید: یک درخواست برای کلِ مبحث، نه یکی به‌ازای هر کارت. **متنِ درس سه‌تکه شد** — `introText` (توضیح)، `example`، و `steps` (حلِ گام‌به‌گام). `kind` هم می‌گه آزمونه یا ویدیو. **`icon` و `color`** حالا از سرور میان، پس لازم نیست تو کد بمونن. ## یه چیزی که قبلاً خراب بود و درست شد `home(gradeId)` کار نمی‌کرد. سرور اون پارامتر رو نمی‌شناخت و بی‌صدا نادیده می‌گرفت، یعنی کاربر یه پایه انتخاب می‌کرد و نقشه‌ی پایه‌ی دیگه‌ای می‌دید — بدونِ هیچ خطایی. سمتِ سرور درست شد و به کدِ شما هم دست نمی‌خوره. ## تست هر ۲۰ صدا در برابرِ یه بک‌اندِ در حالِ اجرا زده شد، از ورودِ مهمان تا ثبتِ پاسخ و دستیار. `tsc --strict` و `npm run build` هم سبزن. مثل دفعه‌ی قبل هیچ فایلِ موجودی دست نخورده — نه `App.tsx`، نه `package.json` — و پکیجِ جدیدی هم اضافه نشده. اگه جایی‌ش به سلیقه‌تون نمی‌خوره بگید عوضش کنم 🙏
AliReza_Zareian added 1 commit 2026-09-14 01:51:07 +03:30
بعد از merge شدنِ PR اول، صفحه‌های اپ با API مقایسه شدند و چند چیز کم بود.
همه‌ی تغییراتِ بک‌اند افزایشی‌اند، پس کدِ فعلی نمی‌شکند — این فقط دسترسی به
آن‌ها را اضافه می‌کند.

grades() حالا lessonCount دارد: فهرستِ پایه‌ها تا دوازدهم می‌رود ولی محتوا
تا نهم است، و بدونِ این عدد کاربر پایه‌ی خالی را انتخاب می‌کند و صفحه‌ی
خالی می‌بیند بی‌آنکه بفهمد چرا.

home() در هر مبحث icon و color و در هر فصل blurb می‌دهد، تا رنگ‌ها لازم
نباشد در کد هاردکد بمانند.

nodes.lessons(nodeId) تازه است. home() فقط شناسه‌ی درس‌ها را می‌دهد، ولی
کارتِ نقشه‌ی مهارت عنوان، نوع (آزمون/ویدیو)، زیرنویس («۵ سوال» / «۱۲
دقیقه») و «انجام شد» می‌خواهد — بدونِ این، برای هر کارت یک درخواستِ intro
جدا لازم بود.

lessons.intro() متن را سه‌تکه می‌دهد: introText (توضیح)، example، و steps
(حلِ گام‌به‌گام)؛ به‌علاوه kind و videoUrl و durationMinutes.

profile.update({ age }) هم پذیرفته می‌شود چون صفحه‌ی ثبت‌نام سن می‌پرسد؛
سرور خودش به سالِ تولدِ شمسی تبدیل می‌کند.

هنوز هیچ فایلِ موجودی دست نخورده و پکیجی اضافه نشده. هر ۲۰ صدا در برابرِ
یک بک‌اندِ در حالِ اجرا تست شد.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
AliReza_Zareian added 1 commit 2026-09-14 02:03:24 +03:30
plans() حالا features و badge می‌دهد؛ بندهای کارتِ اشتراک و برچسبِ بالایش
دیگر لازم نیست در کد بمانند و عوض کردنشان به دیپلویِ تازه نیاز ندارد.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
AliReza_Zareian added 1 commit 2026-09-14 02:26:00 +03:30
کدِ auth داخلِ App.tsx مسیرهای نسبی صدا می‌زند (`/api/auth/login` و مانندش).
این مسیرها به دامنه‌ی خودِ فرانت می‌روند، nginx چون آن مسیر را نمی‌شناسد
index.html برمی‌گرداند، و نتیجه پاسخِ ۲۰۰ با بدنه‌ی HTML است — یعنی res.ok
درست به نظر می‌رسد و بعد res.json() با «Unexpected token '<'» می‌شکند.
همین الان روی math.tadrisino2.ir قابلِ بازتولید است.

در حالتِ توسعه پروکسیِ vite حلش می‌کند: هر /api به بک‌اند فرستاده می‌شود و
کدِ موجود بدونِ هیچ تغییری کار می‌کند. مقصد با VITE_API_PROXY_TARGET قابلِ
عوض کردن است، پیش‌فرض بک‌اندِ مشترک.

برای بیلدِ نهایی apiUrl() اضافه شد: fetch(apiUrl('/auth/login')) به‌جای
fetch('/api/auth/login'). یا اگر روی سرور مسیرِ /api به بک‌اند پروکسی شود،
مسیرهای نسبی همان‌طور که هستند درست کار می‌کنند — آن راه حتی بهتر است چون
same-origin می‌شود و CORS از میان برمی‌دارد.

App.tsx دست نخورده؛ تصمیمِ اینکه کدام راه را بروند با خودشان است.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Author
Collaborator

یه چیزی پیدا کردم که فکر کردم بهتره زودتر بدونید، چون ربطی به این PR نداره و همین الان هم هست.

کدِ auth داخلِ App.tsx مسیرهای نسبی صدا می‌زنه — /api/auth/login و مثلِ اون. این مسیرها به دامنه‌ی خودِ فرانت می‌رن، و nginx چون اون مسیر رو نمی‌شناسه index.html رو برمی‌گردونه. یعنی:

  • res.ok درست به نظر می‌رسه (چون ۲۰۰ می‌گیره)
  • بعد res.json() با Unexpected token '<' می‌شکنه

همین الان قابلِ امتحانه:

curl https://math.tadrisino2.ir/api/grades

۲۰۰ می‌ده ولی HTML صفحه‌ی اپ، نه JSON.

دو راه، هر دو توی این PR

در حالتِ توسعه — یه پروکسی به vite.config.ts اضافه کردم. از این به بعد npm run dev هر /api رو به بک‌اند می‌فرسته و کدِ فعلیِ شما بدونِ هیچ تغییری کار می‌کنه. اگه بک‌اندِ محلی دارید:

VITE_API_PROXY_TARGET=http://127.0.0.1:8000 npm run dev

در بیلدِ نهایی — دو انتخاب دارید:

۱. apiUrl() رو از @/api بگیرید و fetch('/api/auth/login') رو بکنید fetch(apiUrl('/auth/login')). تغییرِ کوچیکیه.

۲. یا از کسی که سرور رو بالا میاره بخواید مسیرِ /api روی math.tadrisino2.ir رو به بک‌اند پروکسی کنه. این راه حتی بهتره چون همه‌چی same-origin می‌شه و CORS کلاً از میون برمی‌داره.

App.tsx رو دست نزدم — تصمیمش با خودتونه. اگه راهِ دوم رو انتخاب کنید، از سمتِ شما اصلاً کدی عوض نمی‌شه.

یه چیزی پیدا کردم که فکر کردم بهتره زودتر بدونید، چون ربطی به این PR نداره و همین الان هم هست. کدِ auth داخلِ `App.tsx` مسیرهای نسبی صدا می‌زنه — `/api/auth/login` و مثلِ اون. این مسیرها به دامنه‌ی خودِ فرانت می‌رن، و nginx چون اون مسیر رو نمی‌شناسه `index.html` رو برمی‌گردونه. یعنی: - `res.ok` درست به نظر می‌رسه (چون ۲۰۰ می‌گیره) - بعد `res.json()` با `Unexpected token '<'` می‌شکنه همین الان قابلِ امتحانه: ``` curl https://math.tadrisino2.ir/api/grades ``` ۲۰۰ می‌ده ولی HTML صفحه‌ی اپ، نه JSON. ## دو راه، هر دو توی این PR **در حالتِ توسعه** — یه پروکسی به `vite.config.ts` اضافه کردم. از این به بعد `npm run dev` هر `/api` رو به بک‌اند می‌فرسته و **کدِ فعلیِ شما بدونِ هیچ تغییری کار می‌کنه**. اگه بک‌اندِ محلی دارید: ``` VITE_API_PROXY_TARGET=http://127.0.0.1:8000 npm run dev ``` **در بیلدِ نهایی** — دو انتخاب دارید: ۱. `apiUrl()` رو از `@/api` بگیرید و `fetch('/api/auth/login')` رو بکنید `fetch(apiUrl('/auth/login'))`. تغییرِ کوچیکیه. ۲. یا از کسی که سرور رو بالا میاره بخواید مسیرِ `/api` روی `math.tadrisino2.ir` رو به بک‌اند پروکسی کنه. **این راه حتی بهتره** چون همه‌چی same-origin می‌شه و CORS کلاً از میون برمی‌داره. `App.tsx` رو دست نزدم — تصمیمش با خودتونه. اگه راهِ دوم رو انتخاب کنید، از سمتِ شما اصلاً کدی عوض نمی‌شه.
AliReza_Zareian closed this pull request 2026-09-25 04:45:10 +03:30

Pull request closed

Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: Tadrisino/MathApp_frontend#3