6.6 KiB
6.6 KiB
راهنمای استفاده فرانت از APIهای Notifications
این فایل برای تیم فرانت نوشته شده تا بدون بررسی کد بکاند، بتواند APIهای ماژول notifications را مصرف کند.
خلاصه خیلی کوتاه
- تمام APIهای فعلی نوتیفیکیشن بر اساس
farm_uuidکار میکنند. - برای گرفتن نوتیفیکیشنها باید
GET /api/notifications/long-poll/را صدا بزنید. - در هر آیتم نوتیفیکیشن، فیلد
since_idبرگردانده میشود. - برای علامتزدن نوتیفیکیشنها بهعنوان خواندهشده باید
POST /api/notifications/mark-as-read/را باfarm_uuidوslice_idصدا بزنید. - هر نوتیفیکیشن دارای وضعیت
is_readاست:falseیعنی خوانده نشدهtrueیعنی خوانده شده
Base Path
/api/notifications/
احراز هویت
هر دو API فعلی نیاز به کاربر لاگینشده دارند.
یعنی فرانت باید توکن کاربر را مثل بقیه endpointهای protected ارسال کند.
1) گرفتن نوتیفیکیشنها
Endpoint
GET /api/notifications/long-poll/?farm_uuid=<farm_uuid>&since_id=<since_id>&timeout=<seconds>
Query Params
| نام | اجباری | توضیح |
|---|---|---|
farm_uuid |
بله | شناسه مزرعه انتخابشده |
since_id |
خیر | فقط نوتیفیکیشنهای جدیدتر از این مقدار برگردانده میشوند |
timeout |
خیر | زمان long-poll بر حسب ثانیه، بین 0 تا 60 |
رفتار
- اگر
since_idارسال نشود، همه نوتیفیکیشنهای مزرعه برمیگردند. - اگر
since_idارسال شود، فقط نوتیفیکیشنهایی کهid > since_idدارند برمیگردند. - اگر نوتیفیکیشن جدیدی وجود نداشته باشد، تا زمان
timeoutمنتظر میماند و بعد آرایه خالی برمیگرداند. - این endpoint فقط برای مزرعهای جواب میدهد که متعلق به همان کاربر باشد.
نمونه درخواست
GET /api/notifications/long-poll/?farm_uuid=550e8400-e29b-41d4-a716-446655440000&since_id=12&timeout=15
نمونه response موفق
{
"code": 200,
"msg": "success",
"data": [
{
"uuid": "0d4f68d0-8a49-4d5c-9d1c-1d4fd6d5e3a1",
"farm_uuid": "550e8400-e29b-41d4-a716-446655440000",
"since_id": 13,
"title": "هشدار آبیاری",
"message": "رطوبت خاک پایین است",
"level": "warning",
"is_read": false,
"metadata": {
"sensor": "soil-1"
},
"created_at": "2025-02-20T10:30:00Z"
}
]
}
معنی فیلدهای مهم
| فیلد | توضیح |
|---|---|
since_id |
شناسه ترتیبی نوتیفیکیشن برای polling بعدی |
is_read |
وضعیت خواندهشدن نوتیفیکیشن |
level |
سطح نوتیفیکیشن مثل info، warning، critical |
metadata |
اطلاعات تکمیلی برای UI یا رفتارهای خاص |
نکته مهم برای فرانت
بعد از هر بار دریافت response:
- اگر
dataخالی نبود،since_idآخرین آیتم را نگه دارید. - در درخواست بعدی، همان مقدار را بهعنوان
since_idبفرستید. - برای badge یا شمارنده unread، از
is_readاستفاده کنید.
2) خواندهکردن نوتیفیکیشنها
Endpoint
POST /api/notifications/mark-as-read/
Body
{
"farm_uuid": "550e8400-e29b-41d4-a716-446655440000",
"slice_id": 13
}
معنی slice_id
slice_id یعنی:
- همه نوتیفیکیشنهای همان مزرعه که
id <= slice_idدارند - و هنوز
is_read=falseهستند - به
is_read=trueتغییر میکنند
به بیان ساده، اگر کاربر تا یک نقطه از لیست نوتیفیکیشنها را دیده، فرانت میتواند since_id آخرین آیتم دیدهشده را بهعنوان slice_id ارسال کند.
نمونه response موفق
{
"code": 200,
"msg": "success",
"marked_count": 4
}
معنی marked_count
تعداد نوتیفیکیشنهایی که واقعا در دیتابیس از unread به read تغییر کردهاند.
خطاهای رایج
مزرعه پیدا نشد
اگر farm_uuid متعلق به کاربر نباشد یا وجود نداشته باشد:
{
"code": 404,
"msg": "Farm not found."
}
جدول نوتیفیکیشن آماده نیست
اگر migrationهای بکاند اجرا نشده باشند:
{
"code": 503,
"msg": "Notifications table is not ready. Run migrations."
}
پیشنهاد Flow برای فرانت
سناریوی پیشنهادی
- کاربر یک مزرعه active انتخاب میکند.
- فرانت
farm_uuidآن مزرعه را در state نگه میدارد. - اولین بار:
GET /api/notifications/long-poll/?farm_uuid=<farm_uuid>&timeout=0
- آخرین
since_idرا ذخیره میکند. - بعد از آن polling را با
since_idادامه میدهد:
GET /api/notifications/long-poll/?farm_uuid=<farm_uuid>&since_id=<last_since_id>&timeout=15
- وقتی کاربر نوتیفیکیشنها را دید، فرانت آخرین آیتم دیدهشده را با
slice_idبه endpoint خواندهشدن میفرستد.
پیشنهاد پیادهسازی در فرانت
- برای هر
farm_uuidیکlast_since_idجدا نگه دارید. - لیست نوتیفیکیشنها را per-farm در state نگه دارید.
- unread count را از روی آیتمهایی که
is_read=falseدارند محاسبه کنید. - وقتی کاربر صفحه نوتیفیکیشن را باز کرد یا لیست را تا انتها دید،
slice_idآخرین آیتم دیدهشده را ارسال کنید.
routeهای فعال فعلی
| Method | Path | توضیح |
|---|---|---|
| GET | /api/notifications/long-poll/ |
دریافت نوتیفیکیشنها با پشتیبانی از since_id |
| POST | /api/notifications/mark-as-read/ |
خواندهکردن نوتیفیکیشنها تا slice_id |