# پلن حذف 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