Motoshub · Delivery Plan · Backend

تسک‌های تیم Backend — با جزئیات پیاده‌سازی

همه‌ی تسک‌های بک‌اند با subtask، تخمین، User Story و معیار پذیرش. مرجع رفتار: demo.shub.ir · خط لوله‌ی الزامی تحویل: فرآیند تحویل و کیفیت · تسک‌های Front

راهنمای پیاده‌سازیزمان‌بندیتصمیم‌های الزام‌آورفاز ۰فاز ۱فاز ۲فاز ۳فاز ۴فاز ۵فاز ۶دامنه‌ی کشف‌شدهوضعیت زنده

راهنمای پیاده‌سازی تیم Backend

استک و قراردادها. Django 5 + DRF + SimpleJWT روی MariaDB (دیتابیس مشترک Oxwall به‌صورت خواندنی از طریق مدل‌های unmanaged در legacy/). قرارداد پاسخ ثابت: پاکت {data, links, meta}، خطاهای ۴۰۱/۴۰۳/۴۰۴/۴۲۲ با بدنه‌ی یکسان — مرجع: Swagger زنده‌ی PHP در motonext.shub.ir/api/v1/docs.
auth مشترک. JWT HS256 با راز OW_PASSWORD_PEPPER و claims {iat, exp, sub} — توکن صادرشده توسط PHP باید در Django معتبر باشد و برعکس (تست سازگاری متقابل در B2.4 اجباری است).
الگوی هر ماژول. Model (یا legacy-map) ← Serializer ← ViewSet + Permission ← urls ← تست pytest (سناریوی موفق + ۴۰۱/۴۰۳/۴۲۲ + یک edge + تست IDOR برای منابع مالک‌دار). هیچ endpoint بدون تست merge نمی‌شود.
سوییچ تدریجی. هر ماژول که برابری قراردادش با PHP تایید شد، مسیرش در Gateway به Django سوییچ می‌شود (B19.3)؛ تا آن روز PHP پاسخ‌گوی production است — مهاجرت strangler-fig، بدون big-bang.
Σ

خلاصه‌ی زمان‌بندی و فازها

دو مسیرِ موازی. چون PHP api/v1 همین حالا هر ۲۹۳ عملیات را پاسخ می‌دهد، تیم Front از فاز ۱ به‌بعد به آن وصل می‌شود و منتظرِ Django نمی‌ماند؛ Backend به‌موازات همان قرارداد را در Django بازمی‌سازد و Gateway هر مسیرِ آماده را سوییچ می‌کند.

فازمحتواFrontBackendموازی
۰پایه: axios/design-system · REST-infra/auth-JWT/deploy/data-model۵.۵ روز۹ روز~۹ روز
۱احراز هویت، پوسته و ناوبری، لایه‌ی داده · endpointهای auth + مدل‌ها۹.۵ روز۶ روز~۱۰ روز
۲هسته: داشبورد، تازه‌ها، بلاگ، کاربران/پروفایل۱۷ روز۱۳ روز~۱۷ روز
۳اجتماعی: گروه‌ها، اخبار، رویدادها، رسانه، فروم۱۸.۵ روز۲۵ روز~۲۵ روز
۴ارتباط: چت، دانش، پروژه · پیام‌رسان، دوستان/اعلان، دانش/پروژه۱۵.۵ روز۱۶ روز~۱۶ روز
۵سازمانی: قرارداد/صندوق/پژوهش/آموزش · نظرسنجی/مسابقات۸ روز۱۳ روز~۱۳ روز
۶راهبری، ظاهر، گزارش، اعلان، جستجو، راهنما، دستیار، پولیش، تست۱۶ روز۴ روز~۱۶ روز
مجموع (تک‌نفره، بدون همپوشانی)~۹۰ روز~۸۶ روز~۱۰۶ روز
اصلاحِ جمع‌بندی (۱۴۰۵/۰۵/۱۱). جمعِ ستون‌های این جدول با مجموعِ تخمینِ تک‌تکِ تسک‌ها هم‌خوان نبود (Front ~۹۶ در برابر ۹۰ واقعی، Backend ~۹۲ در برابر ۸۶). اعدادِ جدول با مجموعِ واقعی هم‌خوان شد. هیچ تخمینی در هیچ تسکی تغییر نکرده است — فقط خطای جمع رفع شد. برآوردهای هفتگی و سناریوهای اندازه‌ی تیم نیز دست‌نخورده مانده‌اند، چون آن‌ها بر پایه‌ی مسیر بحرانی محاسبه شده‌اند نه جمعِ ساده.
تفسیرِ زمان. با ۲ توسعه‌دهنده‌ی Front + ۲ Backend و اجرای موازیِ فازها، بازه‌ی واقع‌بینانه‌ی رسیدن به پروتوتایپِ کامل حدود ۱۳ تا ۱۶ هفته‌ی کاری است. «حداقلِ محصولِ قابل‌نمایش» (فاز ۰ تا ۲) در حدود ۵ تا ۶ هفته به‌دست می‌آید. این اعداد تخمینی‌اند و باید در Planningِ هر Sprint دوباره کالیبره شوند.

سناریوهای اندازه‌ی تیم

ترکیب تیمMVP (فاز ۰-۲)پروتوتایپ کاململاحظات
۱ Front + ۱ Backend~۹-۱۰ هفته~۲۲-۲۶ هفتهارزان‌ترین؛ ریسک گلوگاه تک‌نفره و ریزش. توصیه نمی‌شود.
۲ Front + ۲ Backend (خط پایه)۵-۶ هفته۱۳-۱۶ هفتهترکیب فعلی. هر فاز دو workstream موازی؛ review متقابل ممکن است.
۲F + ۲B + ۱ نفر QA/تست‌خودکار۵-۶ هفته۱۲-۱۴ هفتهزمان زیاد کم نمی‌شود اما دوباره‌کاری و باگِ برگشتی به‌شدت کم می‌شود؛ پیشنهاد PO.
۳ Front + ۳ Backend + QA۴-۵ هفته۹-۱۱ هفتهبازده نزولی: مسیر بحرانی (auth→چت realtime→گزارش) کوتاه‌تر از این نمی‌شود.
تیم واقعی: ۴F + ۳B + ۱QA + ۱DevOps~۴ هفته~۹-۱۱ هفتهترکیب فعلی ما. DevOps تسک‌های B3/استقرار/CI را برمی‌دارد و Backend خالص فیچر می‌زند؛ QA از هفته‌ی ۱ گیت‌های ۸ و ۹ پایپ‌لاین را مالک است.
مسیر بحرانی مستقل از تعداد نفرات: فاز ۰ (زیرساخت) ← auth ← لایه‌ی داده ← ماژول‌های وابسته به فایل/اعلان ← چتِ بی‌درنگ ← پولیش. حداقل تقویمیِ عبوری از این زنجیره ~۹ هفته است؛ نفرِ اضافه فقط پهنای موازی را زیاد می‌کند، نه عمق زنجیره را. با تیم ۹ نفره، گلوگاه = Backend (۳ نفر / ~۸۰ روزنفرِ باقی‌مانده پس از واگذاری استقرار به DevOps).

تقسیم کار پیشنهادی تیم واقعی (workstreamهای پایدار — هر نفر مالک یک رشته)

نقشمالکیت (رشته‌ی کاری ثابت)تسک‌ها به ترتیب
Front ۱ (لید)زیرساخت فرانت، auth، لایه‌ی داده، سپس چتF1 → F3 → F5 → F15 → F20.5
Front ۲پوسته/ناوبری + هسته‌ی محتواF2 → F4 → F6 → F7 → F8
Front ۳فضاهای اجتماعیF9 → F10 → F11 → F12 → F13 → F14
Front ۴دانش/پروژه + ماژول‌های سازمانی + راهبریF16 → F17 → F18 → F19 → F20.1-3
Backend ۱ (لید)زیرساخت REST + auth مشترک + پیام‌رسانB1 → B2 → B4 → B5 → B14
Backend ۲هسته‌ی محتوا: کاربران/فید/بلاگ/اخبارB6 → B7 → B8 → B9 → B15
Backend ۳اجتماعی + سازمانی: گروه/رویداد/رسانه/فروم → دانش/پروژه → سازمانیB10 → B11 → B12 → B13 → B16 → B17 → B18
QAمالک گیت‌های ۸-۹ پایپ‌لاین: کالکشن Postman هر ماژول، تست قرارداد، E2E (Playwright) مسیرهای حیاتی، رگرسیون هفتگیاز هفته ۱ موازی با همه؛ B19.2 و F20.6 با اوست
DevOpsB3 کامل + CI enforcement + staging دو سرویس + مانیتورینگ/لاگ + بکاپ + سوییچ GatewayB3 → CI هر دو ریپو → B19.3 → پایداری production
ریسک برنامه و پادزهر: (۱) Front چهارنفره زودتر از Backend تمام می‌کند (~هفته ۷) — از آن نقطه Front ۳ و ۴ به E2E/پولیش/دواپسِ فرانت شیفت می‌شوند، نه فیچرِ جدید. (۲) وابستگی همه به فاز ۰: هفته‌ی اول همه‌ی تمرکز دو لید + DevOps روی B1/B2/B3/F1/F2 است؛ بقیه در همان هفته کالکشن تست و شناخت قرارداد API را آماده می‌کنند. (۳) هر workstream مالک ثابت دارد تا context-switching حذف شود؛ جابه‌جایی فقط با تصمیم PO.
!

تصمیم‌های معماریِ الزام‌آور

پیش‌فرض‌هایی که هر دو تیم باید رعایت کنند تا کارها به هم برسند.

۱) مبدأ داده‌ی Front مستقل از پیاده‌ساز است. Front فقط با قراردادِ api/v1 کار می‌کند؛ نباید بداند پاسخ از PHP می‌آید یا Django. همه‌ی مسیرها از libs/axios.ts با baseURL=/api/v1 و rewrite در next.config.ts.
۲) auth واحد. استانداردِ توکن = JWT HS256 با رازِ مشترک OW_PASSWORD_PEPPER و claims {iat, exp, sub:userId}. Django باید همین را verify (و در فاز بعد صادر) کند، نه صرفاً خواندنِ ow_base_user_auth_token.
۳) قراردادِ پاسخ ثابت است. فهرست‌ها همیشه پاکتِ {data, links, meta} با meta.current_page/per_page/total؛ خطاها با کدهای 401/403/404/422 و بدنه‌ی یکسان. مرجعِ فیلدها: Swagger روی motonext.shub.ir/api/v1/docs/index — که در راستی‌آزماییِ ۱۴۰۵/۰۵/۱۱ پاسخِ ۴۰۴ داد و باید بازگردانده شود (جزئیات). تا آن زمان مرجعِ فیلدها = کنترلرها و Resourceهای ow_plugins/*/src/Http در برنچ API..
۰

پایه و زیرساخت

پیش‌نیازِ هر چیزِ دیگر. بدون این‌ها هر تسکِ بعدی روی شن ساخته می‌شود. دو تیم موازی کار می‌کنند.

◆ تیم Backend
B1زیرساختِ REST مشترک (پاکت، صفحه‌بندی، خطا، CORS، آپلود)P1نساخته۴ روز

قبل از هر منبع، لایه‌های عرضیِ DRF باید ساخته شوند تا همه‌ی endpointها دقیقاً قراردادِ PHP را بدهند. الان هیچ‌کدام وجود ندارد.

EARS: هرگاه یک درخواستِ فهرست پردازش شود، سامانه باید پاسخ را در پاکتِ {data, links, meta} با meta.current_page/per_page/total بازگرداند.

Subtaskها
#کارجزئیات فنیتخمین
B1.1Pagination classPageNumberPagination سفارشی با خروجیِ دقیقِ data/links/meta۵ ساعت
B1.2Exception handlerهندلرِ سراسری برای فرمتِ یکسانِ خطا در ۴۰۱/۴۰۳/۴۰۴/۴۲۲۵ ساعت
B1.3فیلتر/جستجو/مرتب‌سازیbackendهای مشترک با نام‌پارامترهای یکسان با PHP۶ ساعت
B1.4CORS و هدرهانصب/پیکربندی django-cors-headers (نصب نیست)، هدرهای امنیتی۳ ساعت
B1.5آپلود فایل/رسانهMultiPartParser، اعتبارسنجی نوع/اندازه، مسیرِ سازگار با اکسوال۶ ساعت
B1.6پایه‌ی تستراه‌اندازی pytest-django + factory + APIClient مبنا۵ ساعت
وابستگی: ندارد (نقطه‌ی شروعِ Backend).
B2استراتژیِ auth واحد PHP↔Django (JWT مشترک)P1نساخته۳ روز

بلوکِ SIMPLE_JWT در config/settings/base.py نیست. Django باید همان JWT HS256 با رازِ مشترک و claimهای اکسوال را verify کند تا توکنِ PHP در Django معتبر باشد و بالعکس.

Subtaskها
#کارجزئیات فنیتخمین
B2.1پیکربندی SimpleJWTHS256، SIGNING_KEY = sha256(OW_PASSWORD_PEPPER)، claim sub→userId، طولِ عمرِ منطبق۶ ساعت
B2.2Authentication classکلاسِ سفارشیِ DRF: verify JWTِ PHP و resolve کاربرِ legacy۶ ساعت
B2.3Permission mappingترجمه‌ی مجوزِ پلاگینیِ اکسوال (isAuthorized) به permissionهای DRF۶ ساعت
B2.4تستِ سازگاری متقابلتوکنِ رازِ PHP در Django بپذیرد؛ بدون‌امضا/منقضی رد شود۶ ساعت
معیار پذیرش
  • Given یک JWTِ معتبرِ PHP، When به endpointِ محافظت‌شده‌ی Django فرستاده شود، Then ۲۰۰ و همان کاربر resolve شود.
  • Given توکنِ منقضی/دست‌کاری‌شده، When فرستاده شود، Then ۴۰۱ برگردد.
وابستگی: B1. مرجع: معماری — بخش auth.
B3رفعِ خطاهای استقرار و پیکربندیِ productionP1نساخته۲ روز

production.py خالی است؛ docker/Dockerfile ENTRYPOINT اشتباه دارد (shub.asgi، Celery SharifAutoEDA — کپی از پروژه‌ی دیگر)؛ requirements فاقد gunicorn/uvicorn/pytest است.

Subtaskها
#کارجزئیات فنیتخمین
B3.1production.pyDEBUG=False، ALLOWED_HOSTS، DB از env، static/media، logging۴ ساعت
B3.2Dockerfileاصلاحِ ENTRYPOINT، حذف ارجاعِ Celery غلط، multi-stage تمیز۴ ساعت
B3.3requirements و envافزودن gunicorn/uvicorn/pytest؛ اصلاحِ .env.example برای دو DB۳ ساعت
B3.4healthcheck و اجرای محلیتأیید بالاآمدنِ کانتینر، /api/v1/health، اتصالِ دو DB۵ ساعت
وابستگی: مستقل؛ موازیِ B1/B2.
۱

احراز هویت، پوسته و لایه‌ی داده

دروازه‌ی ورود و اسکلتِ همه‌ی صفحه‌های بعدی. تا اینجا تمام نشود، هیچ صفحه‌ی محتوایی قابلِ‌اتکا نیست.

◆ تیم Backend
B4endpointهای احراز هویتP1ناقص۳ روز

فقط /me و /health هست. مجموعه‌ی کاملِ auth منطبق بر قراردادِ PHP، روی مدلِ کاربرِ legacy.

Subtaskها
#کارجزئیات فنیتخمین
B4.1loginPOST /auth/login: راستیِ رمز به‌شیوه‌ی اکسوال (pepper+hash)، صدور JWT۶ ساعت
B4.2refresh + logoutPOST /auth/refresh، ابطال، چرخشِ refresh۵ ساعت
B4.3registerPOST /auth/register: اعتبارسنجی، ایجادِ کاربر در جداولِ اکسوال۶ ساعت
B4.4change-password + permissionsPATCH /auth/change-password، GET /auth/permissions۴ ساعت
B4.5تستlogin/refresh/register/۴۲۲؛ برابری با پاسخِ PHP۳ ساعت
وابستگی: B1، B2.
B5تصمیمِ داده + مدل‌های پایه‌ی legacyP1ناقص۳ روز

الان فقط ۲ جدول (ow_base_user, ow_base_user_auth_token) با managed=False نگاشت شده. سیاستِ داده تثبیت شود: خواندنِ مستقیم از ow_ در برابر مهاجرت به motoshub_new؛ و مدل‌های پایه ساخته شوند.

Subtaskها
#کارجزئیات فنیتخمین
B5.1سندِ تصمیمِ داده (ADR)کدام منابع مستقیم از ow_، کدام مهاجرت؛ روترِ DB۴ ساعت
B5.2introspect جداولinspectdb روی جداولِ کلیدی، پاک‌سازیِ مدل‌ها، managed=False۶ ساعت
B5.3مدلِ کاربر و پروفایلتکمیلِ LegacyUser، پروفایل/آواتار، رابطه‌ها۶ ساعت
B5.4سرویس‌های مشترکلایه‌ی سرویسِ پایه، تراکنش روی دو DB، تستِ اتصال۴ ساعت
وابستگی: B1. پیش‌نیازِ همه‌ی منابعِ B6 به بعد.
۲

هسته‌ی محتوا

پرتکرارترین بخش‌هایی که کاربر روزانه می‌بیند: داشبورد، تازه‌ها، بلاگ، کاربران/پروفایل. رسیدن تا اینجا = «محصولِ قابلِ‌نمایش».

◆ تیم Backend
B6منبعِ کاربران و پروفایلP1نساخته۴ روز

منبعِ پرکاربردِ همه‌ی بخش‌ها. مطابقِ endpointهای PHP: فهرست، پروفایل، ویرایش، آواتار، مسدودها و نشست‌ها.

Subtaskها
#کارجزئیات فنیتخمین
B6.1Model + Serializerنگاشتِ کاربر/پروفایل/فیلدهای پویا (ow_base_question*)۶ ساعت
B6.2list + detailGET /users، GET /users/:id با فیلتر/جستجو/صفحه‌بندی۶ ساعت
B6.3update + avatarPATCH /users/me، POST /users/me/avatar۶ ساعت
B6.4blocked + sessions/users/blocked، /sessions۴ ساعت
B6.5تست + مجوزتست‌های دسترسی/مالکیت، برابری با PHP۴ ساعت
وابستگی: B4، B5.
B7منبعِ تازه‌ها (فید) + دسته‌بندیِ انتشارP1نساخته۶ روز

پیچیده‌ترین منبعِ فاز: فید، انتشار با پیوست، لایک/نظر/فوروارد و دسته‌بندیِ انتشارِ عمومی (منطبق با فیچرِ iisnewsfeedpin).

Subtaskها
#کارجزئیات فنیتخمین
B7.1مدل‌های فیدنگاشتِ ow_newsfeed_*، اکشن/آیتم/محتوا۶ ساعت
B7.2list فیدGET /feed با scope (feed/site/user)، صفحه‌بندی۶ ساعت
B7.3create + attachmentPOST /feed، پیوستِ PDF/Word/عکس۸ ساعت
B7.4لایک/نظر/فورواردendpointهای تعامل منطبق بر PHP۸ ساعت
B7.5دسته‌بندیِ انتشارمنبعِ دسته‌ی درختی + فیلترِ فیدِ عمومی بر اساس دسته۸ ساعت
B7.6تستانتشار/تعامل/فیلترِ دسته۴ ساعت
وابستگی: B5، B6.
B8منبعِ بلاگP2نساخته۳ روز
Subtaskها
#کارجزئیات فنیتخمین
B8.1Model + Serializerنگاشتِ ow_blogs_post و نظرات/برچسب۴ ساعت
B8.2CRUDGET/POST/PATCH/DELETE /blogs، GET /blogs/:id۸ ساعت
B8.3مالکیت/مجوزچکِ مالکیت در ویرایش/حذف، منطبق بر منطقِ PHP۴ ساعت
B8.4تستlifecycle + دسترسی۴ ساعت
وابستگی: B5.
۳

فضاهای اجتماعی

بخش‌های تعاملیِ سازمان: گروه‌ها، اخبار، رویدادها، رسانه، فروم. الگوهای فاز ۲ اینجا تکرار و مقیاس‌پذیر می‌شوند.

◆ تیم Backend
B9منبعِ اخبارP2نساخته۳ روز
#کارجزئیات فنیتخمین
B9.1Model + Serializerنگاشتِ منبعِ خبر و دسته/رسانه۴ ساعت
B9.2CRUD + listGET/POST/PATCH /news، /news/:id۸ ساعت
B9.3مجوزِ انتشارمحدودسازیِ انتشار به نقشِ مدیرِ محتوا۴ ساعت
B9.4تستlifecycle + دسترسی۴ ساعت
وابستگی: B5.
B10منبعِ گروه‌هاP2نساخته۶ روز
#کارجزئیات فنیتخمین
B10.1مدل‌هاگروه/عضویت/نقش/دعوت، نگاشتِ جداولِ اکسوال۶ ساعت
B10.2CRUD گروهGET/POST/PATCH/DELETE /groups، /groups/:id۸ ساعت
B10.3اعضا/عضویت/members، /join، /invites، نقش/مجوز۸ ساعت
B10.4دیوار/فایلفیدِ گروه، /files آپلود/دانلود۸ ساعت
B10.5تستعضویت/مجوز/فایل۴ ساعت
وابستگی: B5، B7 (الگوی فید).
B11منبعِ رویدادهاP2آماده در PHP۵ روز

قراردادِ PHP و تست‌های Pest موجودند (نمونه: EventControllerTest). این تسک بازسازیِ همان در Django است.

#کارجزئیات فنیتخمین
B11.1مدل‌هارویداد/دعوت/شرکت‌کننده/فایل۶ ساعت
B11.2CRUDGET/POST/PATCH/DELETE /events، اعتبارسنجیِ زمان۸ ساعت
B11.3دعوت/RSVP/invites، حضور، سطحِ دید/دعوت۸ ساعت
B11.4تست معادلِ Pestپورتِ سناریوهای EventControllerTest به pytest۴ ساعت
وابستگی: B5.
B12منبعِ رسانه (عکس/آلبوم/ویدیو)P2آماده در PHP۶ روز

در PHP کامل و امن‌شده است (اصلاحاتِ IDOR و چکِ مالکیت در PhotoService/AlbumService). Django باید همان قرارداد و چک‌های مالکیت را بدهد.

#کارجزئیات فنیتخمین
B12.1مدل‌هاعکس/آلبوم/کاور/ویدیو، نگاشتِ ow_photo_*۶ ساعت
B12.2آلبوم CRUD/albums با چکِ مالکیت (مثلِ PHP: مالک یا ناظر)۸ ساعت
B12.3عکس CRUD + آپلود/photos، آپلود، به‌روزرسانیِ کاور، PATCH جزئی (بدون null‌کردن)۸ ساعت
B12.4ویدیو/videos CRUD + پردازش/embed۶ ساعت
B12.5تست IDORعدمِ دسترسیِ غیرمالک به ویرایش/حذف۴ ساعت
وابستگی: B5، B1.5 (آپلود).
B13منبعِ فرومP2نساخته۵ روز
#کارجزئیات فنیتخمین
B13.1مدل‌هابخش/موضوع/پست، نگاشتِ ow_forum_*۶ ساعت
B13.2موضوع‌هاGET/POST /forum/topics، دسته‌بندی۸ ساعت
B13.3پست‌ها/topics/:id/posts، پاسخ/نقل‌قول۸ ساعت
B13.4مدیریت + تستقفل/پین/انتقال با مجوز؛ تست۴ ساعت
وابستگی: B5.
۴

ارتباط و همکاری

ابزارهای کارِ روزمره: پیام‌رسان، مدیریت دانش، مدیریت پروژه (کانبان).

◆ تیم Backend
B14منبعِ پیام‌رسانP3نساخته۶ روز
#کارجزئیات فنیتخمین
B14.1مدل‌هاگفتگو/پیام/عضو/وضعیتِ خوانده، نگاشتِ ow_mailbox_*۶ ساعت
B14.2گفتگوهاGET /conversations، ساخت، شمارشِ نخوانده۶ ساعت
B14.3پیام‌ها/messages ارسال/فهرست، صفحه‌بندیِ تاریخچه۸ ساعت
B14.4بی‌درنگChannels/WebSocket یا long-poll؛ پیوست۱۰ ساعت
B14.5تستارسال/خواندن/دسترسیِ عضو۴ ساعت
وابستگی: B5. (WebSocket نیازمندِ ASGI؛ مرتبط با B3.)
B15منبعِ دوستان و اعلان‌هاP2نساخته۴ روز
#کارجزئیات فنیتخمین
B15.1دوستان/friends: درخواست/تأیید/حذف، نگاشتِ ow_friends_*۸ ساعت
B15.2اعلان‌هاGET /notifications، علامتِ خوانده، شمارش۸ ساعت
B15.3تولیدِ اعلانhookهای رویداد (لایک/نظر/دعوت) → اعلان۶ ساعت
B15.4تستچرخه‌ی دوستی/اعلان۴ ساعت
وابستگی: B5.
B16منبعِ دانش و پروژهP3نساخته۶ روز
#کارجزئیات فنیتخمین
B16.1دانش/knowledge/documents CRUD + دسته + آپلود۸ ساعت
B16.2پروژه/projects CRUD + اعضا + وضعیت۸ ساعت
B16.3وظیفه/کانبانستون/کارت/ترتیب، endpointِ جابه‌جایی و تخصیص۸ ساعت
B16.4تستCRUD + persistِ ترتیب۴ ساعت
وابستگی: B5. (اگر پروژه در اکسوال منبع ندارد، مدلِ جدید در motoshub_new.)
۵

ماژول‌های سازمانی

بخش‌های تخصصیِ سازمان: قراردادها، صندوقِ نوآوری، پژوهش، آموزش، نظرسنجی/مسابقات/ارزیابی.

◆ تیم Backend
B17منبعِ ماژول‌های سازمانیP3نساخته۸ روز
#کارجزئیات فنیتخمین
B17.1قراردادها/تیکت/tickets و منبعِ قرارداد، گردش‌کارِ وضعیت۱۲ ساعت
B17.2صندوق/cfps، /grants: فراخوان/درخواست/داوری۱۲ ساعت
B17.3پژوهش/فناوری/technologies، /journal-*۱۲ ساعت
B17.4آموزشدوره/ثبت‌نام/پیشرفت۱۲ ساعت
B17.5تستCRUD + گردش‌کار۴ ساعت
وابستگی: B5.
B18منبعِ نظرسنجی، مسابقات و ارزیابیP3نساخته۵ روز
#کارجزئیات فنیتخمین
B18.1نظرسنجی/polls: ساخت/رأی/نتیجه۸ ساعت
B18.2مسابقات/competitions: ثبت/داوری۸ ساعت
B18.3ارزیابی/evaluations۶ ساعت
B18.4تسترأی/نتیجه/دسترسی۴ ساعت
وابستگی: B5.
۶

راهبری، جستجو، پولیش و تحویل

بخش‌های مدیریتی و پایانی که محصول را «کامل» و آماده‌ی تحویل می‌کنند.

◆ تیم Backend
B19منبعِ جستجو + یکپارچه‌سازی و تحویلP3نساخته۴ روز
#کارجزئیات فنیتخمین
B19.1جستجوی سراسریGET /search چنددسته (کاربر/بلاگ/فروم/...)، صفحه‌بندی۸ ساعت
B19.2برابریِ قراردادتستِ diffِ پاسخِ Django با PHP روی endpointهای کلیدی۶ ساعت
B19.3سوییچِ Gatewayمستندِ گذارِ مسیر‌به‌مسیر از PHP به Django بدونِ downtime۶ ساعت
B19.4OpenAPI + تحویلهم‌ترازیِ drf-spectacular با قراردادِ v1، انتشارِ داکِ نهایی۶ ساعت
وابستگی: همه‌ی منابعِ Backend.
+

دامنه‌ی کشف‌شده — افزوده‌ی ۱۴۰۵/۰۵/۱۱

تطبیقِ صفحه‌های demo.shub.ir با فهرستِ B1–B19 نشان داد ماژولِ تیکت در هیچ‌کدام از دو تیم تسک نداشت، با این‌که در PHP آماده است. مانندِ سمتِ Front، این تسک با شماره‌ی تازه آمده و در جمعِ فازهای ۰ تا ۶ حساب نشده است.

◆ تیم Backend
B20منبعِ تیکت پشتیبانیP3آماده در PHP۲ روز

۱۲ عملیاتِ آماده در برنچ API (/tickets، /tickets/{id}، /ticket-categories، /ticket-orders) که هنوز روی production مستقر نشده‌اند. کارِ Backend اینجا = استقرارِ همان‌ها و سپس بازسازی در Django طبقِ همان قرارداد.

Subtaskها
#کارجزئیات فنیتخمین
B20.1استقرارِ مسیرهای PHPفعال‌سازیِ iisticketing در استقرارِ production و تاییدِ پاسخ‌ها۴ ساعت
B20.2مدل و فهرستتیکت/دسته/پاسخ، GET /tickets با فیلترِ وضعیت و صفحه‌بندی۵ ساعت
B20.3ایجاد و گردشِ وضعیتPOST /tickets، تغییرِ وضعیت، مجوزِ مالک/پشتیبان (IDOR)۵ ساعت
B20.4تستسناریوی موفق + ۴۰۱/۴۰۳/۴۲۲ + دسترسیِ کاربرِ دیگر۲ ساعت
وابستگی: B1، B4. مصرف‌کننده: F24.
نکته‌ی مکمل برای B4. در راستی‌آزماییِ ۱۴۰۵/۰۵/۱۱ مشخص شد api/v1 فقط auth/login، auth/me و auth/permissions دارد — refresh، logout، register و change-password در PHP وجود ندارند. چون F3 (فاز ۱، P1) به هر چهارِ این‌ها وابسته است، B4 عملاً روی مسیرِ بحرانیِ کلِ برنامه قرار می‌گیرد. جزئیات: وضعیت زنده.