9.8 KiB
Farmer Calendar Backend Requirements
این فایل قرارداد کامل دادهای برای صفحه farmer-calendar را توضیح میدهد؛ یعنی هر چیزی که فرانت برای نمایش، ساخت، ویرایش و حذف رویدادهای تقویم نیاز دارد باید از بکاند دریافت یا به بکاند ارسال کند.
Scope
این مستند بر اساس این فایلها تهیه شده است:
src/views/dashboards/farm/FarmerCalendarPage.tsxsrc/views/dashboards/farm/FarmerCalendarEventModal.tsxsrc/views/dashboards/farm/FarmerCalendarEventDetails.tsxsrc/views/apps/calendar/Calendar.tsxsrc/redux-store/slices/calendar.tssrc/libs/api/services/eventService.ts
Frontend Features Covered
بکاند باید از این قابلیتهای صفحه پشتیبانی کند:
- نمایش لیست رویدادهای تقویم
- فیلتر رویدادها بر اساس بازه زمانی و نوع تقویم
- نمایش جزییات رویداد
- ساخت رویداد جدید
- ویرایش رویداد
- حذف رویداد
- دریافت جداگانهی لیست
tagها برای فرم ساخت/ویرایش - پشتیبانی از drag/drop و resize رویدادها در تقویم
Domain Model
هر رویداد تقویم باید حداقل ساختار زیر را داشته باشد:
type CalendarEvent = {
id: string;
title: string;
description: string;
deadline?: number | null;
tags: string[];
start: string;
end: string;
extendedProps?: Record<string, unknown>;
};
Required Event Fields For Frontend
فیلدهای زیر برای عملکرد درست فرانت لازم هستند:
| Field | Type | Required | Used For |
|---|---|---|---|
id |
string |
yes | شناسایی رویداد برای edit/delete/update |
title |
string |
yes | عنوان رویداد در تقویم، کارتها، مودال جزییات |
description |
string |
no but recommended | نمایش توضیح در کارتها و جزییات |
start |
ISO 8601 string |
yes | نمایش زمان شروع، تقویم، محاسبه امروز/این هفته |
end |
ISO 8601 string |
yes | نمایش بازه زمانی، resize/drop |
tags |
string[] |
yes | نمایش tag در جزییات، انتخاب مقدار در فرم |
deadline |
number |
no | فعلا در state نگهداری میشود، بهتر است برگردد |
extendedProps |
object |
no | برای توسعه آینده و سازگاری با FullCalendar |
Endpoints
1) List Events
برای لود اولیهی صفحه و رفرش رویدادها.
GET /api/events
Query Params
| Param | Type | Required | Description |
|---|---|---|---|
start |
string |
no | شروع بازه به فرمت ISO 8601 |
end |
string |
no | پایان بازه به فرمت ISO 8601 |
Success Response
{
"events": [
{
"id": "evt_101",
"title": "آبیاری بلوک شمالی",
"description": "کنترل فشار و مدت زمان آبیاری",
"deadline": 1734942600,
"tags": ["آبیاری"],
"start": "2025-02-24T06:30:00Z",
"end": "2025-02-24T08:00:00Z",
"extendedProps": {}
}
]
}
Frontend Notes
- اگر
eventsخالی باشد باید[]برگردد، نهnull - تاریخها باید قابل parse شدن با
new Date(...)وparseISO(...)باشند startوendبرای همه رویدادها لازماند
2) Get Event Details
برای سناریوهای آینده یا lazy loading جزییات.
GET /api/events/:id
Success Response
{
"event": {
"id": "evt_101",
"title": "آبیاری بلوک شمالی",
"description": "کنترل فشار و مدت زمان آبیاری",
"deadline": 1734942600,
"tags": ["آبیاری"],
"start": "2025-02-24T06:30:00Z",
"end": "2025-02-24T08:00:00Z",
"extendedProps": {}
}
}
3) Create Event
برای ساخت تسک/رویداد روزانهی جدید.
POST /api/events
Request Body
{
"title": "بازدید آفت در گلخانه",
"description": "بررسی وضعیت برگها و ثبت گزارش",
"deadline": 1734971400,
"tags": ["آفت"],
"start": "2025-02-24T14:00:00Z",
"end": "2025-02-24T15:00:00Z",
"extendedProps": {}
}
Required Create Fields
titlestartend
Success Response
{
"event": {
"id": "evt_102",
"title": "بازدید آفت در گلخانه",
"description": "بررسی وضعیت برگها و ثبت گزارش",
"deadline": 1734971400,
"tags": ["آفت"],
"start": "2025-02-24T14:00:00Z",
"end": "2025-02-24T15:00:00Z",
"extendedProps": {}
}
}
4) Update Event
برای ویرایش دستی، drag/drop و resize.
PUT /api/events/:id
Request Body
{
"title": "بازدید آفت در گلخانه",
"description": "اولویت بالا",
"deadline": 1734971400,
"tags": ["آفت", "فوری"],
"start": "2025-02-24T15:00:00Z",
"end": "2025-02-24T16:00:00Z",
"extendedProps": {}
}
Success Response
{
"event": {
"id": "evt_102",
"title": "بازدید آفت در گلخانه",
"description": "اولویت بالا",
"deadline": 1734971400,
"tags": ["آفت", "فوری"],
"start": "2025-02-24T15:00:00Z",
"end": "2025-02-24T16:00:00Z",
"extendedProps": {}
}
}
Important Update Notes
- این endpoint باید برای هر دو حالت
form editوcalendar drag/resizeجواب بدهد - تغییر
startوendباید سریع و idempotent باشد
5) Delete Event
DELETE /api/events/:id
Success Response
{
"success": true
}
Separate Tags API
طبق نیاز این صفحه، لیست tagها نباید از events استخراج شود و باید از یک API جداگانه دریافت شود.
6) List Event Tags
GET /api/events/tags
Purpose
- پر کردن
selectمربوط به tag در فرم ساخت/ویرایش - جلوگیری از وابستگی UI به استخراج
tagsاز event list - بهینهتر شدن لود مودال افزودن رویداد
Success Response
{
"tags": [
{
"id": "tag_irrigation",
"label": "آبیاری",
"value": "آبیاری"
},
{
"id": "tag_pest",
"label": "آفت",
"value": "آفت"
},
{
"id": "tag_harvest",
"label": "برداشت",
"value": "برداشت"
}
]
}
Minimum Accepted Alternative
اگر نخواهید آبجکت کامل برگردانید، این ساختار هم برای فرانت کافی است:
{
"tags": ["آبیاری", "آفت", "برداشت"]
}
Recommendation
فرمت آبجکتی بهتر است، چون بعدا این قابلیتها را سادهتر میکند:
- مرتبسازی
- disabled state
- رنگ یا آیکن برای هر tag
- localization
Error Handling
برای همه endpointها بهتر است خطاها ساختار ثابت داشته باشند:
{
"code": "EVENT_VALIDATION_ERROR",
"message": "Invalid event payload",
"details": {
"start": "start is required"
}
}
فرانت فعلی حداقل به یک message قابلنمایش نیاز دارد.
Validation Rules Recommended
titleنباید خالی باشدstartباید تاریخ معتبر باشدendباید تاریخ معتبر باشدendنباید قبل ازstartباشدtagsاگر موجود است باید آرایهای از string باشد
Date/Time Requirements
- فرمت ترجیحی:
ISO 8601 UTC, مثال:2025-02-24T06:30:00Z - timezone باید در پاسخها صریح و قابل پیشبینی باشد
- بکاند نباید تاریخ مبهم بدون timezone برگرداند
What Frontend Actually Renders Today
این فیلدها همین الان در UI استفاده میشوند:
titledescriptionstartendtags[0]
این فیلدها فعلا بیشتر برای سازگاری یا توسعه بعدی نگهداری میشوند:
deadlineextendedProps
Performance Recommendations
GET /api/eventsباید pagination یا date-range filtering را پشتیبانی کند، حتی اگر فعلا فرانت از آن بهصورت کامل استفاده نکندGET /api/events/tagsباید سبک و cacheable باشد- پاسخ
GET /api/events/tagsبهتر است کوچک و بدون payload اضافی باشد
Final Backend Checklist
GET /api/eventsGET /api/events/:idPOST /api/eventsPUT /api/events/:idDELETE /api/events/:idGET /api/events/tags- پشتیبانی از
tagsبه صورت آرایه - بازگرداندن تاریخها با فرمت ISO 8601
Suggested Stable Response Shapes
اگر بخواهید قرارداد بکاند کاملا پایدار و توسعهپذیر باشد، این دو response shape پیشنهاد میشوند:
Events List
{
"events": [
{
"id": "evt_101",
"title": "آبیاری بلوک شمالی",
"description": "کنترل فشار و مدت زمان آبیاری",
"deadline": 1734942600,
"tags": ["آبیاری"],
"start": "2025-02-24T06:30:00Z",
"end": "2025-02-24T08:00:00Z",
"extendedProps": {}
}
],
"meta": {
"total": 1
}
}
Tags List
{
"tags": [
{
"id": "tag_irrigation",
"label": "آبیاری",
"value": "آبیاری"
}
],
"meta": {
"total": 1
}
}