۲ — فیلدها و اندپوینتی که صفحهها لازم داشتند #3
Reference in New Issue
Block a user
Delete Branch "AliReza_Zareian/MathApp_frontend:zareian/api-client-2"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
سلام دوباره 👋 و ممنون که PR قبلی رو merge کردید.
بعد از merge، صفحههای اپ رو با API مقایسه کردم و دیدم چند چیزی که صفحهها لازم دارن هنوز از سرور نمیاومد. سمتِ بکاند اضافهشون کردم و این PR فقط دسترسی بهشون رو به
src/api/اضافه میکنه.همهی تغییرات افزایشیان — چیزی که الان دارید نمیشکنه.
چی اضافه شد
api.grades()lessonCountدارهapi.home()iconوcolor، هر فصلblurbapi.nodes.lessons(nodeId)api.lessons.intro()exampleوstepsوkindوvideoUrlapi.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— و پکیجِ جدیدی هم اضافه نشده.اگه جاییش به سلیقهتون نمیخوره بگید عوضش کنم 🙏
بعد از 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>کدِ 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>یه چیزی پیدا کردم که فکر کردم بهتره زودتر بدونید، چون ربطی به این PR نداره و همین الان هم هست.
کدِ auth داخلِ
App.tsxمسیرهای نسبی صدا میزنه —/api/auth/loginو مثلِ اون. این مسیرها به دامنهی خودِ فرانت میرن، و nginx چون اون مسیر رو نمیشناسهindex.htmlرو برمیگردونه. یعنی:res.okدرست به نظر میرسه (چون ۲۰۰ میگیره)res.json()باUnexpected token '<'میشکنههمین الان قابلِ امتحانه:
۲۰۰ میده ولی HTML صفحهی اپ، نه JSON.
دو راه، هر دو توی این PR
در حالتِ توسعه — یه پروکسی به
vite.config.tsاضافه کردم. از این به بعدnpm run devهر/apiرو به بکاند میفرسته و کدِ فعلیِ شما بدونِ هیچ تغییری کار میکنه. اگه بکاندِ محلی دارید:در بیلدِ نهایی — دو انتخاب دارید:
۱.
apiUrl()رو از@/apiبگیرید وfetch('/api/auth/login')رو بکنیدfetch(apiUrl('/auth/login')). تغییرِ کوچیکیه.۲. یا از کسی که سرور رو بالا میاره بخواید مسیرِ
/apiرویmath.tadrisino2.irرو به بکاند پروکسی کنه. این راه حتی بهتره چون همهچی same-origin میشه و CORS کلاً از میون برمیداره.App.tsxرو دست نزدم — تصمیمش با خودتونه. اگه راهِ دوم رو انتخاب کنید، از سمتِ شما اصلاً کدی عوض نمیشه.Pull request closed