Refactor code structure for improved readability and maintainability

This commit is contained in:
masoodafar-web
2026-02-10 22:06:46 +03:30
parent 8f02cec22f
commit 5149b9a89c
182 changed files with 7305 additions and 243980 deletions
+131
View File
@@ -0,0 +1,131 @@
# پلن حذف 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