13 KiB
AGENTS.md — SMM Panel Project
ملف تعليمات للوكيل البرمجي (AI Agent). اقرأه بالكامل قبل كتابة أي كود. الهدف: بناء موقع SMM Panel لبيع خدمات السوشال ميديا عبر API مزوّد خارجي، مع محفظة رصيد (Wallet) ونظام مستخدمين ولوحة أدمن.
⚠️ راجع أيضاً
WALLET.md— فيه تفاصيل إلزامية عن نظام تسجيل الدخول وصحة المحفظة، وTASKS.md— فيه خطة تنفيذ مرحلية بالترتيب.
1. نظرة عامة على المشروع (Project Overview)
منصة ويب تبيع خدمات سوشال ميديا (متابعين، لايكات، مشاهدات … إلخ). المستخدم:
- يسجّل حساب ويسجّل دخول.
- يشحن محفظته (Wallet) برصيد.
- يتصفّح الخدمات المتاحة.
- ينشئ طلب (Order): يختار خدمة + يحط الرابط/الـ ID + الكمية.
- النظام يخصم من رصيده ويرسل الطلب لمزوّد الخدمة عبر API، ثم يتابع حالته.
الموقع وسيط: يشتري من مزوّد بسعر منخفض ويبيع للمستخدم بسعر أعلى (هامش ربح يحدده الأدمن).
2. المصطلحات (Glossary)
- Provider / المزوّد: الجهة الخارجية اللي تملك الـ API الحقيقي وتنفّذ الخدمات.
- Service / الخدمة: عنصر قابل للبيع (مثال: "1000 متابع انستقرام")، له
service_idوسعر وحد أدنى وأقصى. - Wallet / المحفظة: رصيد المستخدم داخل الموقع.
- Order / الطلب: عملية شراء خدمة من قبل المستخدم.
- Transaction / المعاملة: أي حركة على الرصيد (شحن، خصم، استرجاع).
- Markup / الهامش: نسبة أو مبلغ يُضاف على سعر المزوّد ليصير سعر البيع.
3. التقنيات (Tech Stack)
⚠️ هذه افتراضات قابلة للتغيير — راجع "قرارات مفتوحة" في الأسفل.
- Backend: Node.js + Express
- Database: MySQL (أو MariaDB)
- Auth: JWT + bcrypt لتشفير كلمات المرور
- Frontend: (اختر واحد) React / EJS templates بسيطة للبداية
- HTTP client للتواصل مع المزوّد:
axios - Validation:
zodأوexpress-validator - Env config:
dotenv
هيكل المجلدات المقترح:
/src
/config (اتصال قاعدة البيانات، متغيرات البيئة)
/models (استعلامات قاعدة البيانات)
/services (منطق العمل: wallet, orders, provider API)
/controllers (معالجة الطلبات)
/routes (المسارات)
/middleware (auth, admin-check, error handler)
/utils
/public (الواجهة)
4. مخطط قاعدة البيانات (Database Schema)
جدول users
| العمود | النوع | ملاحظات |
|---|---|---|
| id | BIGINT PK AUTO_INCREMENT | |
| username | VARCHAR(50) UNIQUE | |
| VARCHAR(120) UNIQUE | ||
| password_hash | VARCHAR(255) | bcrypt |
| balance | DECIMAL(12,4) DEFAULT 0 | رصيد المحفظة |
| role | ENUM('user','admin') DEFAULT 'user' | |
| status | ENUM('active','banned') DEFAULT 'active' | |
| created_at | TIMESTAMP |
جدول services
| العمود | النوع | ملاحظات |
|---|---|---|
| id | BIGINT PK | |
| provider_service_id | VARCHAR(50) | الـ ID عند المزوّد |
| name | VARCHAR(255) | |
| category | VARCHAR(100) | |
| provider_price | DECIMAL(12,4) | سعر المزوّد لكل 1000 |
| sell_price | DECIMAL(12,4) | سعر البيع لكل 1000 (بعد الهامش) |
| min | INT | أقل كمية |
| max | INT | أكبر كمية |
| is_active | BOOLEAN DEFAULT true | |
| updated_at | TIMESTAMP |
جدول orders
| العمود | النوع | ملاحظات |
|---|---|---|
| id | BIGINT PK | |
| user_id | BIGINT FK → users.id | |
| service_id | BIGINT FK → services.id | |
| link | VARCHAR(500) | الرابط/الـ ID المستهدف |
| quantity | INT | |
| charge | DECIMAL(12,4) | المبلغ المخصوم من المستخدم |
| provider_order_id | VARCHAR(80) | رقم الطلب عند المزوّد |
| status | ENUM('pending','processing','in_progress','completed','partial','canceled','failed') DEFAULT 'pending' | |
| created_at | TIMESTAMP |
جدول transactions
| العمود | النوع | ملاحظات |
|---|---|---|
| id | BIGINT PK | |
| user_id | BIGINT FK | |
| type | ENUM('deposit','order','refund') | |
| amount | DECIMAL(12,4) | موجب = إضافة، سالب = خصم |
| balance_after | DECIMAL(12,4) | الرصيد بعد العملية (للتدقيق) |
| reference | VARCHAR(120) | مرجع (رقم الطلب / رقم الإيداع) |
| note | VARCHAR(255) | |
| created_at | TIMESTAMP |
جدول deposits (طلبات الشحن اليدوي)
| العمود | النوع | ملاحظات |
|---|---|---|
| id | BIGINT PK | |
| user_id | BIGINT FK | |
| amount | DECIMAL(12,4) | |
| method | VARCHAR(50) | usdt / manual … |
| tx_ref | VARCHAR(200) | إثبات التحويل (hash / رقم عملية) |
| status | ENUM('pending','approved','rejected') DEFAULT 'pending' | |
| reviewed_by | BIGINT NULL | id الأدمن |
| created_at | TIMESTAMP |
5. تكامل API المزوّد (Provider Integration)
معظم مزوّدي SMM يتبعون نفس المعيار (Perfect Panel standard). كل الطلبات
عبارة عن POST إلى نقطة نهاية واحدة مع key و action.
متغيرات البيئة المطلوبة:
PROVIDER_API_URL=https://provider.example/api/v2
PROVIDER_API_KEY=xxxxxxxx
العمليات:
# جلب كل الخدمات
POST { key, action: "services" }
# إنشاء طلب
POST { key, action: "add", service, link, quantity }
→ يرجّع { order: <provider_order_id> }
# متابعة حالة طلب
POST { key, action: "status", order: <provider_order_id> }
→ يرجّع { charge, start_count, status, remains }
# رصيدك أنت عند المزوّد
POST { key, action: "balance" }
⚠️ تحقّق من توثيق المزوّد الفعلي: بعض الحقول قد تختلف بالتسمية. اجعل طبقة
provider.service.jsقابلة للتعديل من مكان واحد.
6. المنطق الحرج: المحفظة والطلبات (Critical Logic)
التفاصيل الكاملة (race conditions، idempotency، تسوية دورية) موجودة في
WALLET.md. هذا ملخص سريع فقط.
قاعدة ذهبية: كل عملية على الرصيد داخل Transaction من قاعدة البيانات (atomic)
لا تسمح أبداً بخصم الرصيد وإرسال الطلب في خطوات منفصلة غير محمية.
تدفق إنشاء الطلب (order flow):
1. تحقّق أن المستخدم مسجّل دخول ونشِط.
2. تحقّق أن الخدمة موجودة و is_active.
3. تحقّق quantity ضمن [min, max].
4. احسب charge = (sell_price / 1000) * quantity.
5. ابدأ DB Transaction:
a. اقفل صف المستخدم (SELECT ... FOR UPDATE).
b. تحقّق balance >= charge، وإلا ارفض (رصيد غير كافٍ).
c. اخصم: balance -= charge.
d. أنشئ صف order بحالة pending.
e. أنشئ صف transaction (type=order, amount=-charge).
f. Commit.
6. أرسل الطلب لـ API المزوّد.
7. إذا نجح: خزّن provider_order_id وحدّث status=processing.
8. إذا فشل الإرسال: أعِد الرصيد (refund) وحدّث status=failed.
تدفق الشحن اليدوي:
1. المستخدم يقدّم طلب إيداع (amount + tx_ref) → deposits(status=pending).
2. الأدمن يراجع ويوافق.
3. عند الموافقة (داخل DB Transaction):
- balance += amount
- transaction (type=deposit)
- deposit.status = approved
متابعة الحالات (cron/job): مهمة دورية تمرّ على الطلبات غير المكتملة وتستعلم عن حالتها من المزوّد وتحدّثها.
7. المسارات (API Routes)
عامة / مصادقة
POST /auth/register
POST /auth/login
POST /auth/logout
POST /auth/forgot-password
المستخدم (يتطلب تسجيل دخول)
GET /me → بيانات الحساب + الرصيد
GET /services → قائمة الخدمات النشطة (بسعر البيع)
POST /orders → إنشاء طلب
GET /orders → طلباتي
GET /orders/:id → تفاصيل طلب
GET /transactions → كشف حساب المحفظة
POST /deposits → طلب شحن يدوي
GET /deposits → طلبات الشحن الخاصة بي
الأدمن (يتطلب role=admin)
GET /admin/users
PATCH /admin/users/:id → حظر/رفع حظر، تعديل رصيد يدوي
GET /admin/deposits → طلبات الشحن المعلّقة
PATCH /admin/deposits/:id → موافقة/رفض
GET /admin/orders → كل الطلبات
POST /admin/services/sync → سحب الخدمات من المزوّد
PATCH /admin/services/:id → تعديل السعر/الهامش/التفعيل
GET /admin/stats → إحصائيات (أرباح، مبيعات)
8. متطلبات الأمان (Security — إلزامي)
- تشفير كلمات المرور بـ bcrypt (لا تخزّنها نصّاً أبداً).
- مفتاح API المزوّد في متغيرات البيئة فقط، لا يُرسل للواجهة إطلاقاً.
- كل حسابات المال بـ
DECIMALوليسFLOAT. - التحقق من صحة كل المدخلات (server-side validation).
- حماية من SQL Injection عبر prepared statements / ORM.
- Rate limiting على مسارات auth و orders.
- التحقق من الصلاحيات (middleware) على كل مسار أدمن.
- السعر يُحسب دائماً في الخادم — لا تثق بأي سعر قادم من الواجهة.
9. متغيرات البيئة (.env)
PORT=3000
DATABASE_URL=mysql://user:pass@localhost:3306/smm
JWT_SECRET=change_me_long_random
PROVIDER_API_URL=https://provider.example/api/v2
PROVIDER_API_KEY=your_provider_key
DEFAULT_MARKUP_PERCENT=25
10. ترتيب البناء (Build Order / Milestones)
- الإعداد: مشروع Node + Express + اتصال MySQL + الهجرات (migrations).
- المصادقة: register / login / JWT / middleware.
- المحفظة: جداول transactions + عرض الرصيد + كشف حساب.
- الشحن اليدوي: deposits + موافقة الأدمن.
- الخدمات: سحب من المزوّد + عرضها بسعر البيع + إدارة الأدمن.
- الطلبات: تدفق الطلب الكامل (atomic) + الإرسال للمزوّد.
- متابعة الحالات: مهمة دورية لتحديث حالات الطلبات.
- لوحة الأدمن: الإحصائيات والإدارة.
- الواجهة: ربط كل شيء بواجهة نظيفة.
سلّم كل مرحلة قابلة للتشغيل والاختبار قبل الانتقال للتالية.
📋 للتنفيذ الفعلي خطوة بخطوة، اتّبع
TASKS.md.
11. قرارات مفتوحة (Open Decisions — املأها)
هذه القرارات محسومة للنسخة الحالية، ومفصلة في DECISIONS.md:
- طريقة الشحن: شحن يدوي عبر قنوات قابلة للإدارة، مع PayPal وشام كاش وUSDT كبداية.
- اللغة/التقنية: Node.js + Express + MySQL/MariaDB.
- الواجهة: HTML/CSS/JavaScript ثابتة داخل
public/وتخدمها Express. - العملة المعتمدة: USD بأربع خانات عشرية.
- الهامش: هامش افتراضي من
DEFAULT_MARKUP_PERCENTمع تخزينmarkup_percentلكل خدمة ودعم تعديل الأدمن. - رابط ومفتاح API المزوّد الفعلي: عبر
PROVIDER_API_URLوPROVIDER_API_KEYفي متغيرات البيئة فقط. - دعم متعدد اللغات: الواجهة والرسائل عربية حالياً، وتعليقات الكود والداخليات بالإنجليزية.
12. ملاحظات للوكيل (Agent Notes)
- اطلب توثيق المزوّد الحقيقي قبل كتابة طبقة
provider.service.js. - لا تفترض تفاصيل الدفع؛ إن كانت غير محسومة اسأل المالك.
- اكتب اختبارات لمنطق المحفظة (أهم جزء حسّاس) — راجع
WALLET.mdقسم 4. - علّق الكود بالإنجليزية، والرسائل للمستخدم بالعربية (أو حسب إعداد اللغة).