git-subtree-dir: admin git-subtree-mainline:35f5084005git-subtree-split:9f1eccd2f7
پنل ادمین دلدل
پنل مدیریت دسکتاپمحور (Next.js + Basis Design System) برای همون بکاند Go/Gin/GORM اپ دیتینگ. با این پنل میتونی بدون لمس کد، تمام لیستهای انتخابی و سوالات پروفایل اپ رو مدیریت کنی.
ویژگیها
- ورود امن: همون فلوی OTP اپ اصلی، ولی فقط کاربرهایی که
is_admin=trueدارن اجازهی ورود میگیرن (پیام «دسترسی نداری» برای بقیه). - مدیریت ۶ دستهی انتخابی: سطح تحصیلات، رشته تحصیلی، فعالیتها، اهمیت در
رابطه، علاقهمندیها، دنبال چی میگردی — برای هر کدوم:
- ویرایش عنوان و حداقل/حداکثر تعداد انتخاب مجاز
- افزودن/ویرایش/حذف گزینه
- فعال/غیرفعال کردن آنی با یک کلیک (گزینهی غیرفعال فوراً از دید کاربر مخفی میشه)
- مدیریت سوالات پروفایل: افزودن/ویرایش/حذف/فعالسازی سوالاتی که کاربر توی مرحلهی سوم آنبوردینگ ۳ تاشو انتخاب میکنه.
- فیدبک فوری با Toast بعد از هر عملیات، تایید قبل از حذف.
✅ تست شده
قبل از تحویل، یک اسکریپت Node که دقیقاً همون درخواستهای src/lib/api.ts
رو میفرسته، روی یک نمونهی واقعی از بکاند اجرا شد: ورود ادمین، GET/PATCH
دسته، CRUD کامل گزینه، toggle فعال/غیرفعال (با تایید اینکه گزینهی
غیرفعال از API عمومی کاربر واقعاً حذف میشه)، CRUD کامل سوالات، و مهمتر
از همه — تست کردیم که یک کاربر عادی (غیرادمین) با کد ۴۰۳ از تمام
/admin/* endpoint ها بلاک میشه. همهی ۱۴ چک پاس شد.
راهاندازی
cp .env.local.example .env.local
# NEXT_PUBLIC_API_URL رو به آدرس بکاندت تنظیم کن
npm install
npm run dev
http://localhost:3000 رو باز کن، با شمارهی موبایلِ یک کاربر ادمین
(همونی که با ADMIN_BOOTSTRAP_PHONE در بکاند ساخته شده، یا هر کاربری که
دستی is_admin=true شده) وارد شو.
ساختار پروژه
src/
├── app/
│ ├── login/, verify/ ← ورود OTP (مثل اپ اصلی)
│ └── (dashboard)/
│ ├── layout.tsx ← گارد ادمین + سایدبار
│ ├── page.tsx ← داشبورد با آمار سریع
│ ├── categories/page.tsx ← لیست ۶ دسته
│ ├── categories/[key]/ ← ویرایش تنظیمات دسته + CRUD گزینهها
│ └── questions/page.tsx ← CRUD سوالات پروفایل
├── components/
│ ├── ui/ ← دیزاینسیستم مشترک + Modal/Toast/ConfirmDialog جدید
│ └── Sidebar.tsx
└── lib/
├── api.ts ← کلاینت تایپشدهی endpoint های /admin/*
├── auth-context.tsx ← ورود + چک is_admin
└── hooks.ts
نکتهی امنیتی
این پنل فقط روی احراز هویت سمت بکاند (middleware.AdminRequired) تکیه
میکنه — یعنی حتی اگه کسی مستقیم به route های این پنل دسترسی پیدا کنه،
بدون توکن معتبرِ یک کاربر is_admin=true، هیچ عملیاتی از سمت بکاند رد
نمیشه (این رو با تست ۴۰۳ بالا تایید کردیم). با این حال توصیه میشه این
پنل رو پشت یک دامنهی جدا یا حداقل VPN/IP-allowlist در پروداکشن قرار بدی.