chore: merge admin repo history into monorepo at admin/

git-subtree-dir: admin
git-subtree-mainline: 35f5084005
git-subtree-split: 9f1eccd2f7
This commit is contained in:
2026-09-27 10:30:47 +03:30
49 changed files with 11446 additions and 0 deletions
+70
View File
@@ -0,0 +1,70 @@
# پنل ادمین دلدل
پنل مدیریت دسکتاپ‌محور (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 ها بلاک می‌شه. همه‌ی ۱۴ چک پاس شد.
## راه‌اندازی
```bash
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 در پروداکشن قرار بدی.