Files
docs/cms/BFF-REMOVAL-PLAN.md
T

7.1 KiB
Raw Blame History

پلن حذف BFF‌ها — اتصال مستقیم فرانت‌اند به CMS

تاریخ: February 10, 2026


📊 خلاصه وضعیت

یافته‌های کلیدی:

  1. هر دو فرانت (BackOffice + FrontOffice) الان از proto‌های CMS مستقیم استفاده میکنن — مهاجرت proto انجام شده
  2. CMS خودش VerifyOtpToken و AcceptContract composite handler داره — فقط یه TODO در AcceptContract برای JWT generation
  3. CMS خودش IPaymentGatewayService + DayaPaymentService داره — PYMS جداگانه لازم نیست
  4. CMS خودش Kavenegar + SignalR Hub داره — آماده‌ست
  5. CMS خودش ICurrentUserService داره — Security logic آماده‌ست

فاز ۱ — حذف BackOffice.BFF (انجام میشه الان)

تسک ۱.۱ — Permission Interceptor (انتقال)

وضعیت: انجام شد

چیزی که هست (BFF):

  • RequiresPermissionAttribute — Attribute برای mark کردن gRPC methods
  • PermissionInterceptor — gRPC interceptor که attribute ها رو چک میکنه
  • IPermissionService + PermissionService — Role رو از JWT میخونه
  • RolePermissionConfig — ماتریس Role→Permission (3 نقش × 34 permission)

نقش‌ها: SuperAdmin (Administrator), Admin, Inspector
مجوزها: 34 مجوز در 9 دسته (Dashboard, Orders, Products, Users, Commission, PublicMessages, ManualPayments, Settings, Reports)

فایل‌های ساخته شده:

  • Application/Common/Authorization/RequiresPermissionAttribute.cs
  • Application/Common/Authorization/PermissionDefinitions.cs
  • Application/Common/Authorization/IPermissionService.cs
  • Infrastructure/Services/Authorization/PermissionService.cs
  • WebApi/Interceptors/PermissionInterceptor.cs

Attribute‌های اضافه شده (۲۱ عدد بر روی ۴ سرویس):

  • AppVersionService: GetAppVersion(settings.view), GetAllAppVersions(settings.view), UpdateAppVersion(settings.manage_configuration)
  • ConfigurationService: GetAllConfigurations(settings.view), CreateOrUpdateConfiguration(settings.manage_configuration), DeactivateConfiguration(settings.manage_configuration)
  • ManualPaymentService: CreateManualPayment(manualpayments.create), ApproveManualPayment(manualpayments.approve), RejectManualPayment(manualpayments.approve), GetAllManualPayments(manualpayments.view), ProcessManualMembershipPayment(manualpayments.create)
  • UserOrderService: CreateNewUserOrder(orders.create), UpdateUserOrder(orders.update), DeleteUserOrder(orders.delete), GetUserOrder(orders.view), GetAllUserOrderByFilter(orders.view), UpdateOrderStatus(orders.update), GetOrdersByDateRange(reports.view), ApplyDiscountToOrder(orders.update), CalculateOrderPV(orders.view), CancelOrder(orders.cancel)

تسک ۱.۲ — AfrinoIDP OTP (بعداً)

وضعیت: پلن شده — فعلاً نیاز نیست

BackOffice ادمین لاگین از طریق https://ids.afrino.co (AfrinoIDP) انجام میشه. این یه external identity provider هست — فرانت BackOffice خودش مستقیم با AfrinoIDP ارتباط داره (OIDC flow). CMS فقط JWT رو validate میکنه — نیازی به proxy نداره.

تسک ۱.۳ — تغییر GwUrl

وضعیت: نیاز نبود — قبلاً انجام شده بود

فایل از به
BackOffice/wwwroot/appsettings.json https://localhost:32846 https://localhost:32846 (بدون تغییر — dev)
BackOffice/wwwroot/appsettings.Staging.json قبلاً https://cms.se.kbs1.ir بدون تغییر

BackOffice Staging قبلاً مستقیم به CMS وصله! فقط dev (localhost) هنوز BFF روی همون پورته.


فاز ۲ — حذف FrontOffice.BFF (انجام میشه الان)

تسک ۲.۱ — Kavenegar SMS

وضعیت: قبلاً در CMS هستIKavenegarService + KavenegarService

تسک ۲.۲ — SignalR Token Relay

وضعیت: انجام شد — آلیاس /hubs/token-relay در CMS اضافه شد

وضعیت فعلی:

  • CMS Hub: /hubs/token-notification (اصلی )
  • CMS Hub: /hubs/token-relay (آلیاس برای backward compatibility )
  • FrontOffice Staging: HubPath/hubs/token-notification

تسک ۲.۳ — VerifyOtp + AcceptContract composite

وضعیت: کامل شد

  • VerifyOtpTokenCommandHandler — OTP verify + JWT generation
  • AcceptContractCommandHandler — Contract create + OTP verify + JWT generation (TODO فیکس شد → IGenerateJwtToken واقعی)

تسک ۲.۴ — PYMS (Zarinpal Payment)

وضعیت: نیاز نیست

دلیل: FrontOffice الان از CMS TransactionsContract.CustomerPaymentRequest/Verification استفاده میکنه — مستقیم PYMS صدا نمیزنه. CMS هم از IPaymentGatewayService (DayaPaymentService) برای payment استفاده میکنه. PYMS فقط در BFF بود — فرانت هیچوقت مستقیم PYMS صدا نمیزنه.

تسک ۲.۵ — Security Logic (currentUserId injection)

وضعیت: قبلاً در CMS هست

CMS ICurrentUserService رو inject میکنه و GetCurrentUserId() helper در همه Customer سرویس‌ها هست:

  • UserService
  • UserOrderService
  • UserWalletService
  • TransactionsService
  • PackageService
  • ClubMembershipService
  • ConfigurationService

تسک ۲.۶ — تغییر GwUrl FrontOffice

وضعیت: انجام شد

فایل از به
FrontOffice/appsettings.Staging.json https://frontoffice-bff.se.kbs1.ir https://cms.se.kbs1.ir
FrontOffice/appsettings.Staging.json HubPath /hubs/token-relay /hubs/token-notification
FrontOffice/appsettings.json https://localhost:32846 بدون تغییر (dev)

خلاصه کارهای واقعی

همه تسک‌ها انجام شد:

  1. Permission Interceptor infrastructure + DI + gRPC pipeline
  2. [RequiresPermission] attributes روی ۲۱ endpoint در ۴ سرویس BackOffice
  3. فیکس TODO JWT generation در AcceptContractCommandHandler
  4. تغییر GwUrl FrontOffice Staging → cms.se.kbs1.ir
  5. مپ /hubs/token-relay → آلیاس در CMS (backward compatibility)
  6. Kavenegar — قبلاً در CMS بود
  7. Security Logic (ICurrentUserService) — قبلاً در CMS بود
  8. VerifyOtp/AcceptContract composite — قبلاً در CMS بود + JWT فیکس شد
  9. PYMS — فرانت مستقیم CMS protos استفاده میکنه

نیاز نیست:

  1. AfrinoIDP — BackOffice خودش OIDC flow مستقیم داره

📋 تست‌های لازم قبل از حذف نهایی BFF:

  1. BackOffice Staging → اتصال مستقیم به CMS + تست Permission Interceptor
  2. FrontOffice Staging → اتصال به cms.se.kbs1.ir + تست SignalR + تست OTP/AcceptContract