7.1 KiB
پلن حذف BFFها — اتصال مستقیم فرانتاند به CMS
تاریخ: February 10, 2026
📊 خلاصه وضعیت
یافتههای کلیدی:
- هر دو فرانت (BackOffice + FrontOffice) الان از protoهای CMS مستقیم استفاده میکنن — مهاجرت proto انجام شده
- CMS خودش
VerifyOtpTokenوAcceptContractcomposite handler داره — فقط یهTODOدر AcceptContract برای JWT generation - CMS خودش
IPaymentGatewayService+DayaPaymentServiceداره — PYMS جداگانه لازم نیست - CMS خودش Kavenegar + SignalR Hub داره — آمادهست
- CMS خودش
ICurrentUserServiceداره — Security logic آمادهست
فاز ۱ — حذف BackOffice.BFF ✅ (انجام میشه الان)
✅ تسک ۱.۱ — Permission Interceptor (انتقال)
وضعیت: ✅ انجام شد
چیزی که هست (BFF):
RequiresPermissionAttribute— Attribute برای mark کردن gRPC methodsPermissionInterceptor— 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.csApplication/Common/Authorization/PermissionDefinitions.csApplication/Common/Authorization/IPermissionService.csInfrastructure/Services/Authorization/PermissionService.csWebApi/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) |
خلاصه کارهای واقعی
✅ همه تسکها انجام شد:
- ✅ Permission Interceptor infrastructure + DI + gRPC pipeline
- ✅
[RequiresPermission]attributes روی ۲۱ endpoint در ۴ سرویس BackOffice - ✅ فیکس
TODOJWT generation در AcceptContractCommandHandler - ✅ تغییر GwUrl FrontOffice Staging →
cms.se.kbs1.ir - ✅ مپ
/hubs/token-relay→ آلیاس در CMS (backward compatibility) - ✅ Kavenegar — قبلاً در CMS بود
- ✅ Security Logic (ICurrentUserService) — قبلاً در CMS بود
- ✅ VerifyOtp/AcceptContract composite — قبلاً در CMS بود + JWT فیکس شد
- ✅ PYMS — فرانت مستقیم CMS protos استفاده میکنه
❌ نیاز نیست:
- AfrinoIDP — BackOffice خودش OIDC flow مستقیم داره
📋 تستهای لازم قبل از حذف نهایی BFF:
- BackOffice Staging → اتصال مستقیم به CMS + تست Permission Interceptor
- FrontOffice Staging → اتصال به
cms.se.kbs1.ir+ تست SignalR + تست OTP/AcceptContract