Files

پنل ادمین دلدل

پنل مدیریت دسکتاپ‌محور (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 در پروداکشن قرار بدی.