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

132 lines
7.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# پلن حذف 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