- Add token-based admin login/logout/me endpoints - Bootstrap admin from ADMIN_USERNAME/ADMIN_PASSWORD in Docker entrypoint - Read ALLOWED_HOSTS and CORS from env only (no hardcoded server IPs) - Keep docs/Postman/tests free of real credentials - Cover login and auth flows with 31 local API tests Co-authored-by: Cursor <cursoragent@cursor.com>
13 KiB
مستندات API (Zoneco ORG)
این سند نحوهٔ کارکرد APIهای بکاند پروژه Zoneco ORG را به زبان فارسی توضیح میدهد.
وضعیت تستها
Ran 31 tests — OK (0 failures)
| تعداد تست | گروه |
|---|---|
| ۷ تست | Admin Login |
| ۶ تست | Contact Us |
| ۱۱ تست | Compositions |
| ۷ تست | Campaigns |
اجرای تستها:
cd backend
python manage.py test api -v 2
اطلاعات پایه
| مقدار | مورد |
|---|---|
{{base_url}} |
آدرس پایه |
/api/ |
پیشوند API |
| JSON | فرمت پاسخ |
| ۲۰ آیتم در هر صفحه | صفحهبندی |
/admin/ |
پنل ادمین |
متغیر Postman
در فایل Postman از متغیر {{base_url}} استفاده شده است.
مقدار آن را مطابق محیط اجرا (لوکال، سرور تست یا پروداکشن) تنظیم کنید.
نمونهٔ آدرس کامل یک endpoint:
{{base_url}}/api/contact-us/
سطح دسترسی
| دسترسی | عملیات |
|---|---|
| عمومی — بدون نیاز به ورود | لیست و جزئیات (متد GET) |
| عمومی — بدون نیاز به ورود | ایجاد (متد POST) |
| فقط ادمین — نیاز به توکن | ویرایش و حذف (متدهای PUT، PATCH، DELETE) |
۰. ورود ادمین (Admin Login)
| مقدار | مورد |
|---|---|
{{admin_username}} از env (ADMIN_USERNAME) |
نام کاربری |
{{admin_password}} از env (ADMIN_PASSWORD) |
رمز عبور |
{{base_url}}/admin/ |
پنل جنگو ادمین |
POST {{base_url}}/api/admin/login/ |
ورود از طریق API |
نام کاربری و رمز در کد هاردکد نمیشوند. روی سرور در فایل
.envتنظیم کنید.
ورود و دریافت توکن
POST {{base_url}}/api/admin/login/
Content-Type: application/json
{
"username": "{{admin_username}}",
"password": "{{admin_password}}"
}
پاسخ نمونه:
{
"token": "<token>",
"user": {
"id": 1,
"username": "<admin_username>",
"is_staff": true,
"is_superuser": true
}
}
در درخواستهای محافظتشده این هدر را بفرستید:
Authorization: Token <token>
اطلاعات ادمین فعلی
GET {{base_url}}/api/admin/me/
Authorization: Token <token>
خروج (حذف توکن)
POST {{base_url}}/api/admin/logout/
Authorization: Token <token>
برای درخواستهای ادمین در Postman، ابتدا login کنید، سپس توکن را در متغیر admin_token بگذارید.
۱. تماس با ما (Contact Us)
مسیر پایه:
/api/contact-us/
فیلدها
| توضیح | الزامی | نوع | فیلد |
|---|---|---|---|
| نام و نام خانوادگی | بله | string | name |
| ایمیل یا شماره تماس | بله | string | email_or_phone |
| متن پیام | بله | string | description |
| دستهبندی | بله | string | category |
مقادیر مجاز برای category:
- همکاری
- فروش
- پشتیبانی
- درخواست مشاور
- سایر
دریافت لیست تماسها
GET {{base_url}}/api/contact-us/
پاسخ نمونه:
{
"count": 1,
"next": null,
"previous": null,
"results": [
{
"id": 1,
"name": "احمد محمدی",
"email_or_phone": "ahmad@example.com",
"description": "سلام، سوالی دارم.",
"category": "پشتیبانی",
"created_at": "2025-12-17T12:00:00Z",
"updated_at": "2025-12-17T12:00:00Z"
}
]
}
دریافت یک تماس
GET {{base_url}}/api/contact-us/{id}/
ثبت تماس جدید
POST {{base_url}}/api/contact-us/
Content-Type: application/json
بدنه درخواست:
{
"name": "احمد محمدی",
"email_or_phone": "09121234567",
"description": "میخواهم در مورد محصولات اطلاعات بگیرم.",
"category": "فروش"
}
کد پاسخ: 201 Created
فیلتر بر اساس دستهبندی
GET {{base_url}}/api/contact-us/by_category/?category=پشتیبانی
| توضیح | الزامی | پارامتر |
|---|---|---|
| یکی از دستههای مجاز | بله | category |
اگر پارامتر category ارسال نشود، خطای 400 برمیگردد.
ویرایش و حذف (ادمین)
PUT {{base_url}}/api/contact-us/{id}/
PATCH {{base_url}}/api/contact-us/{id}/
DELETE {{base_url}}/api/contact-us/{id}/
نیاز به احراز هویت ادمین دارد.
۲. ترکیبات (Compositions)
مسیر پایه:
/api/compositions/
هر ترکیب میتواند چند تصویر داشته باشد.
یکی از تصاویر با فیلد is_main: true بهعنوان تصویر اصلی مشخص میشود.
فیلدها
| توضیح | الزامی | نوع | فیلد |
|---|---|---|---|
| نام ترکیب | بله | string | name |
| توضیحات | بله | string | description |
| یک یا چند فایل تصویر (فقط در ایجاد/ویرایش) | خیر | file[] | uploaded_images |
| ایندکس تصویر اصلی (شمارش از ۰) | خیر | integer | main_image_index |
محدودیت تصاویر
- فرمتهای مجاز: JPEG، PNG، WebP، GIF
- حداکثر حجم هر فایل: ۵ مگابایت
- مسیر ذخیره:
media/compositions/
دریافت لیست ترکیبات
GET {{base_url}}/api/compositions/
دریافت یک ترکیب
GET {{base_url}}/api/compositions/{id}/
پاسخ نمونه:
{
"id": 1,
"name": "ترکیب A",
"description": "توضیحات ترکیب",
"image": null,
"image_url": null,
"images": [
{
"id": 2,
"image": "/media/compositions/img2.jpg",
"image_url": "{{base_url}}/media/compositions/img2.jpg",
"is_main": true,
"created_at": "2025-12-17T12:00:00Z"
},
{
"id": 1,
"image": "/media/compositions/img1.jpg",
"image_url": "{{base_url}}/media/compositions/img1.jpg",
"is_main": false,
"created_at": "2025-12-17T11:00:00Z"
}
],
"main_image": {
"id": 2,
"image_url": "{{base_url}}/media/compositions/img2.jpg",
"is_main": true,
"created_at": "2025-12-17T12:00:00Z"
},
"created_at": "2025-12-17T10:00:00Z",
"updated_at": "2025-12-17T12:00:00Z"
}
فیلتر بر اساس تاریخ ایجاد
GET {{base_url}}/api/compositions/by-created-at/?from=2026-06-01T00:00:00Z&to=2026-06-30T23:59:59Z
| توضیح | الزامی | پارامتر |
|---|---|---|
برگشت ترکیبهایی که created_at >= from |
حداقل یکی | from |
برگشت ترکیبهایی که created_at <= to |
حداقل یکی | to |
فرمت تاریخ: ISO 8601 — مثال: 2026-06-01T00:00:00Z
اگر هیچ پارامتری ارسال نشود، خطای 400 برمیگردد.
ایجاد ترکیب (بدون تصویر)
POST {{base_url}}/api/compositions/
Content-Type: application/json
{
"name": "ترکیب تست",
"description": "توضیحات ترکیب"
}
ایجاد ترکیب با چند تصویر
POST {{base_url}}/api/compositions/
Content-Type: multipart/form-data
| مقدار نمونه | نوع | فیلد |
|---|---|---|
| ترکیب A | text | name |
| توضیحات | text | description |
| image1.jpg | file | uploaded_images |
| image2.jpg | file | uploaded_images |
| 1 | text | main_image_index |
نکته: فیلد uploaded_images را برای هر تصویر یکبار تکرار کنید.
نکته: اگر main_image_index ارسال نشود، اولین تصویر بهعنوان تصویر اصلی انتخاب میشود.
افزودن تصویر به ترکیب موجود (ادمین)
POST {{base_url}}/api/compositions/{id}/add-images/
Content-Type: multipart/form-data
| نوع | فیلد |
|---|---|
| file (یک یا چند فایل) | uploaded_images |
| text (اختیاری) | main_image_index |
تنظیم تصویر اصلی (ادمین)
POST {{base_url}}/api/compositions/{id}/set-main-image/
Content-Type: application/json
{
"image_id": 3
}
حذف یک تصویر (ادمین)
DELETE {{base_url}}/api/compositions/{id}/images/{image_id}/
کد پاسخ: 204 No Content
ویرایش و حذف ترکیب (ادمین)
PUT {{base_url}}/api/compositions/{id}/
PATCH {{base_url}}/api/compositions/{id}/
DELETE {{base_url}}/api/compositions/{id}/
۳. کمپینها (Campaigns)
مسیر پایه:
/api/campaigns/
فیلدها
| توضیح | الزامی | نوع | فیلد |
|---|---|---|---|
| نام کمپین | بله | string | name |
| توضیحات | بله | string | description |
| زمان شروع (ISO 8601) | بله | datetime | start_time |
زمان پایان (باید بعد از start_time باشد) |
بله | datetime | end_time |
| تصویر کمپین | خیر | file | image |
فیلدهای محاسباتی (فقط خواندنی)
| توضیح | فیلد |
|---|---|
| آیا کمپین الان فعال است | is_active |
| آیا کمپین هنوز شروع نشده | is_upcoming |
| آیا کمپین تمام شده | is_ended |
دریافت لیست کمپینها
GET {{base_url}}/api/campaigns/
دریافت یک کمپین
GET {{base_url}}/api/campaigns/{id}/
ایجاد کمپین
POST {{base_url}}/api/campaigns/
Content-Type: application/json
{
"name": "کمپین نوروز",
"description": "تخفیف ویژه نوروز",
"start_time": "2026-03-01T00:00:00Z",
"end_time": "2026-03-31T23:59:59Z"
}
کمپینهای فعال
GET {{base_url}}/api/campaigns/active/
کمپینهایی که زمان فعلی بین start_time و end_time قرار دارد.
کمپینهای آینده
GET {{base_url}}/api/campaigns/upcoming/
کمپینهایی که هنوز شروع نشدهاند.
کمپینهای پایانیافته
GET {{base_url}}/api/campaigns/ended/
ویرایش و حذف (ادمین)
PUT {{base_url}}/api/campaigns/{id}/
PATCH {{base_url}}/api/campaigns/{id}/
DELETE {{base_url}}/api/campaigns/{id}/
کدهای وضعیت HTTP
| معنی | کد |
|---|---|
| موفق | 200 |
| ایجاد شد | 201 |
| حذف شد (بدون بدنه) | 204 |
| داده نامعتبر | 400 |
| دسترسی ندارید | 403 |
| یافت نشد | 404 |
فایل Postman
مجموعه Postman در مسیر زیر قرار دارد:
backend/Zoneco_ORG_API.postman_collection.json
نحوه import
- Postman را باز کنید
- گزینه Import را بزنید
- فایل
Zoneco_ORG_API.postman_collection.jsonرا انتخاب کنید - متغیر
{{base_url}}را مطابق محیط خود تنظیم کنید - برای درخواستهای ادمین، در تب Authorization گزینه Basic Auth را فعال کنید
خلاصه endpointها
| دسترسی | Endpoint | Method | # |
|---|---|---|---|
| عمومی | /api/admin/login/ |
POST | 1 |
| ادمین | /api/admin/logout/ |
POST | 2 |
| ادمین | /api/admin/me/ |
GET | 3 |
| عمومی | /api/contact-us/ |
GET | 4 |
| عمومی | /api/contact-us/ |
POST | 5 |
| عمومی | /api/contact-us/{id}/ |
GET | 6 |
| عمومی | /api/contact-us/by_category/?category=... |
GET | 7 |
| ادمین | /api/contact-us/{id}/ |
PUT/PATCH/DELETE | 8 |
| عمومی | /api/compositions/ |
GET | 9 |
| عمومی | /api/compositions/ |
POST | 10 |
| عمومی | /api/compositions/{id}/ |
GET | 11 |
| عمومی | /api/compositions/by-created-at/?from=...&to=... |
GET | 12 |
| ادمین | /api/compositions/{id}/add-images/ |
POST | 13 |
| ادمین | /api/compositions/{id}/set-main-image/ |
POST | 14 |
| ادمین | /api/compositions/{id}/images/{image_id}/ |
DELETE | 15 |
| ادمین | /api/compositions/{id}/ |
PUT/PATCH/DELETE | 16 |
| عمومی | /api/campaigns/ |
GET | 17 |
| عمومی | /api/campaigns/ |
POST | 18 |
| عمومی | /api/campaigns/{id}/ |
GET | 19 |
| عمومی | /api/campaigns/active/ |
GET | 20 |
| عمومی | /api/campaigns/upcoming/ |
GET | 21 |
| عمومی | /api/campaigns/ended/ |
GET | 22 |
| ادمین | /api/campaigns/{id}/ |
PUT/PATCH/DELETE | 23 |
توجه: در Postman قبل از هر مسیر، مقدار
{{base_url}}را قرار دهید.
مثال:{{base_url}}/api/campaigns/active/