docs: deep analysis of 24 dead gRPC RPCs — keep 12, archive 12

Analyzed all 24 dead RPC implementations line-by-line:
- 12 KEEP (future-proof): CustomerReorderPreviousOrder, CustomerTrackOrder,
  CalculateOrderPV, GetInventorySummary, GetStockValueReport, BulkAddStock,
  BulkUpdateProductStock, GetConfigurationByKey, UpdateCustomerSettings,
  ChangeNetworkParent, AssignFeatureToMembership, GetLowStockProducts
- 12 ARCHIVE: fms.proto (2), BulkAdjustStock, 2 empty order stubs,
  2 non-functional configs, 2 redundant city ops, 3 duplicate RPCs

Key findings:
- 17/24 were actually FULLY IMPLEMENTED, just never wired to frontend
- fms.proto is the only completely dead proto file (no service class)
- Archive != Delete — marked for exclusion only
This commit is contained in:
masoodafar-web
2026-02-24 22:40:44 +03:30
parent 09b8b804d4
commit 3575e483b9
+76 -134
View File
@@ -1,7 +1,8 @@
# آدیت سرویس‌های gRPC — CMS
> تاریخ: ۱۴۰۴/۰۴
> هدف: شناسایی RPCهایی که از هیچ‌کدام از فرانت‌ها (FrontOffice مشتری + BackOffice ادمین) فراخوانی نمی‌شوند
> آخرین بروزرسانی: ۱۴۰۴/۱۲/۰۶
> هدف: شناسایی RPCهایی که از هیچ‌کدام از فرانت‌ها (FrontOffice مشتری + BackOffice ادمین) فراخوانی نمی‌شوند + تصمیم‌گیری نگهداری vs آرشیو
---
@@ -21,40 +22,49 @@
---
## 🔴 دسته A — کد مُرده واقعی (Dead Code)
## 🔴 بخش ۱ — تحلیل ۲۴ RPC مُرده: نگهداری vs آرشیو
> این RPCها نه از فرانت‌ها فراخوانی می‌شوند و نه در کد CMS پیاده‌سازی/استفاده شده‌اند (فقط ≤2 رفرنس = فقط کد proto-generated).
### ✅ نگهداری (آینده‌نگرانه — ۱۲ عدد)
| # | RPC | فایل Proto | وضعیت |
|---|-----|-----------|-------|
| 1 | `AssignFeatureToMembership` | clubmembership.proto | Stub — هرگز پیاده‌سازی نشد |
| 2 | `BulkAddStock` | inventory.proto | Stub — هرگز پیاده‌سازی نشد |
| 3 | `BulkAdjustStock` | inventory.proto | Stub — 0 رفرنس |
| 4 | `BulkUpdateProductStock` | products.proto | Stub — هرگز پیاده‌سازی نشد |
| 5 | `CalculateOrderPV` | userorder.proto | Stub — هرگز پیاده‌سازی نشد |
| 6 | `ChangeNetworkParent` | networkmembership.proto | Stub — هرگز از فرانت استفاده نشد |
| 7 | `CreateNewFileInfo` | fms.proto | 0 رفرنس — سرویس FMS هرگز ساخته نشد |
| 8 | `CreateNewOrderForCustomer` | userorder.proto | Stub — سفارش مشتری از مسیر دیگر |
| 9 | `CustomerReorderPreviousOrder` | userorder.proto | Stub — فیچر تکرار سفارش پیاده‌سازی نشد |
| 10 | `CustomerTrackOrder` | userorder.proto | Stub — فیچر ردیابی سفارش پیاده‌سازی نشد |
| 11 | `DeactivateConfiguration` | configuration.proto | Stub — هرگز استفاده نشد |
| 12 | `DeleteCity` | City.proto | Stub — حذف شهر نیاز نیست |
| 13 | `DeleteFileInfo` | fms.proto | 0 رفرنس — سرویس FMS هرگز ساخته نشد |
| 14 | `GetCategoryByIdForCustomer` | category.proto | Stub — مشتری از GetAllCategoriesForCustomer استفاده می‌کند |
| 15 | `GetConfigurationByKey` | configuration.proto | Stub — فقط GetAllConfigurations استفاده می‌شود |
| 16 | `GetConfigurationHistory` | configuration.proto | Stub — تاریخچه تنظیمات پیاده‌سازی نشد |
| 17 | `GetInventorySummary` | inventory.proto | Stub — داشبورد خلاصه انبار پیاده‌سازی نشد |
| 18 | `GetLowStockProducts` | products.proto | Stub — از GetLowStockItems (inventory) استفاده می‌شود |
| 19 | `GetOrdersByDateRange` | userorder.proto | Stub — از فیلتر GetAllUserOrderByFilter استفاده می‌شود |
| 20 | `GetServiceHealth` | health.proto | Stub — فقط GetSystemHealth استفاده می‌شود |
| 21 | `GetStockValueReport` | inventory.proto | Stub — گزارش ارزش موجودی پیاده‌سازی نشد |
| 22 | `SubmitOrderForCustomer` | userorder.proto | Stub — سفارش مشتری از مسیر دیگر |
| 23 | `UpdateCity` | City.proto | Stub — ویرایش شهر نیاز نیست |
| 24 | `UpdateCustomerSettings` | user.proto | Stub — تنظیمات مشتری پیاده‌سازی نشد |
> این RPCها پیاده‌سازی کامل دارند و در نقشه‌راه آینده محصول کاربرد دارند.
| # | RPC | فایل Proto | کیفیت کد | دلیل نگهداری |
|---|-----|-----------|---------|-------------|
| 1 | `CustomerReorderPreviousOrder` | userorder.proto | ✅ **کامل** — آیتم‌های سفارش قبلی به سبد اضافه می‌شود | UX حیاتی: «تکرار سفارش قبلی» — فیچر رایج فروشگاهی، فقط نیاز به دکمه در FrontOffice |
| 2 | `CustomerTrackOrder` | userorder.proto | ✅ **کامل** — وضعیت + TrackingCode + DeliveryInfo | UX حیاتی: «ردیابی سفارش» — وقتی ارسال پستی فعال شود ضروری است |
| 3 | `CalculateOrderPV` | userorder.proto | **کامل** — PV هر آیتم + جمع کل | سیستم MLM: محاسبه PV (Point Value) سفارش — برای فاز بعدی کمیسیون بر اساس خرید |
| 4 | `GetInventorySummary` | inventory.proto | ✅ **کامل** — آمار تعداد + ارزش کل | داشبورد ادمین: خلاصه موجودی انبار — نیاز به کارت در BackOffice Dashboard |
| 5 | `GetStockValueReport` | inventory.proto | ✅ **کامل** — گزارش ارزش ریالی موجودی | گزارش مالی: ارزش دارایی انبار — برای حسابداری ضروری |
| 6 | `BulkAddStock` | inventory.proto | ✅ **کامل** — loop با error handling | عملیات انبوه: افزودن موجودی دسته‌ای — بعد از ورود کالای فیزیکی |
| 7 | `BulkUpdateProductStock` | products.proto | ✅ **کامل** — Set/Add/Subtract با error handling | عملیات انبوه: بروزرسانی دسته‌ای موجودی محصول |
| 8 | `GetConfigurationByKey` | configuration.proto | ✅ **کامل** — خواندن از SystemConstants | API مفید: دریافت یک تنظیم خاص بدون بارگذاری همه — performance بهتر |
| 9 | `UpdateCustomerSettings` | user.proto | ✅ **کامل** — Email/SMS/Push notifications | تنظیمات اعلان‌ها: وقتی پنل تنظیمات مشتری ساخته شود |
| 10 | `ChangeNetworkParent` | networkmembership.proto | ✅ **CQRS کامل** → MoveInNetworkCommand | مدیریت شبکه: جابجایی کاربر در درخت — ابزار ادمین ضروری |
| 11 | `AssignFeatureToMembership` | clubmembership.proto | ✅ **CQRS کامل** → AssignClubFeatureCommand | مدیریت عضویت: اختصاص فیچر به عضویت — برای فاز بسته‌بندی پویا |
| 12 | `GetLowStockProducts` | products.proto | ✅ **کامل** — فیلتر threshold + pagination | هشدار موجودی: مکمل GetLowStockItems — فیلتر ClubExclusive اضافه دارد |
### 🗑️ آرشیو (حذف امن — ۱۲ عدد)
> این RPCها یا stub خالی هستند، یا جایگزین بهتری دارند، یا هرگز ساخته نشدند.
| # | RPC | فایل Proto | وضعیت کد | دلیل آرشیو |
|---|-----|-----------|---------|-----------|
| 1 | `CreateNewFileInfo` | fms.proto | ❌ **۰ رفرنس** — هیچ Service/Handler ندارد | سرویس FMS هرگز طراحی نشد — فایل‌ها از imageresolver استفاده می‌کنند |
| 2 | `DeleteFileInfo` | fms.proto | **۰ رفرنس** — هیچ Service/Handler ندارد | همان — کل fms.proto حذف‌شدنی |
| 3 | `BulkAdjustStock` | inventory.proto | ❌ **۰ رفرنس** — حتی Service method ندارد | هرگز پیاده‌سازی نشد — از AdjustStock تکی استفاده می‌شود |
| 4 | `CreateNewOrderForCustomer` | userorder.proto | ❌ **Stub خالی**`return new()` | مسیر سفارش مشتری از SubmitShopBuyOrder می‌گذرد — تکراری |
| 5 | `SubmitOrderForCustomer` | userorder.proto | ❌ **Stub خالی**`return new()` | مسیر سفارش مشتری از SubmitShopBuyOrder می‌گذرد — تکراری |
| 6 | `DeactivateConfiguration` | configuration.proto | ❌ **throw میکند** — «تنظیمات فقط خواندنی هستند» | عمداً غیرفعال شده — SystemConstants ثابت هستند |
| 7 | `GetConfigurationHistory` | configuration.proto | ❌ **خالی برمی‌گرداند**`return new()` | SystemConstants تاریخچه ندارند — بی‌معنی |
| 8 | `DeleteCity` | City.proto | ✅ کامل ولی **بی‌نیاز** | شهرها seed دیتا هستند — حذف شهر باعث خرابی آدرس‌ها می‌شود |
| 9 | `UpdateCity` | City.proto | ✅ کامل ولی **بی‌نیاز** | شهرها از سرویس خارجی seed شده‌اند — ویرایش دستی نیاز نیست |
| 10 | `GetOrdersByDateRange` | userorder.proto | ✅ کامل ولی **تکراری** | `GetAllUserOrderByFilter` همین قابلیت + فیلترهای بیشتر دارد |
| 11 | `GetServiceHealth` | health.proto | ✅ کامل ولی **تکراری** | `GetSystemHealth` کل سیستم را برمی‌گرداند — فیلتر client-side کافی است |
| 12 | `GetCategoryByIdForCustomer` | category.proto | ✅ کامل ولی **تکراری** | `GetCategory` (admin) + `GetAllCategoriesForCustomer` کافی است |
---
## 🟡 دسته B — استفاده داخلی CMS (Internal Only)
## 🟡 بخش ۲ — استفاده داخلی CMS (Internal Only — ۱۰۱ عدد)
> این RPCها از فرانت‌ها فراخوانی نمی‌شوند ولی **در کد بکند CMS فعال هستند** (background services, handlers, internal flows). **حذف نشوند!**
@@ -129,74 +139,13 @@
| `UpdateTransactions` | 23 | بروزرسانی تراکنش |
| `VerifyTransaction` | 24 | تأیید تراکنش |
### B7. سایر CRUD داخلی
### B7. سایر CRUD داخلی (خلاصه)
| RPC | فایل Proto | رفرنس CMS | علت |
|-----|-----------|-----------|-----|
| `CreateNewContract` | contract.proto | 26 | قراردادها |
| `UpdateContract` | contract.proto | 23 | بروزرسانی قرارداد |
| `DeleteContract` | contract.proto | 23 | حذف قرارداد |
| `GetContract` | contract.proto | 19 | دریافت قرارداد |
| `GetAllContractByFilter` | contract.proto | 25 | لیست قراردادها |
| `CreateNewUserContract` | usercontract.proto | 26 | قرارداد کاربر |
| `UpdateUserContract` | usercontract.proto | 23 | بروزرسانی |
| `DeleteUserContract` | usercontract.proto | 23 | حذف |
| `GetUserContract` | usercontract.proto | 19 | دریافت |
| `CreateNewFactorDetails` | factordetails.proto | 26 | جزئیات فاکتور |
| `UpdateFactorDetails` | factordetails.proto | 23 | بروزرسانی |
| `DeleteFactorDetails` | factordetails.proto | 23 | حذف |
| `GetFactorDetails` | factordetails.proto | 19 | دریافت |
| `GetAllFactorDetailsByFilter` | factordetails.proto | 24 | لیست |
| `CreateNewProductCategory` | productcategory.proto | 26 | دسته‌بندی محصول |
| `UpdateProductCategory` | productcategory.proto | 23 | بروزرسانی |
| `DeleteProductCategory` | productcategory.proto | 23 | حذف |
| `GetProductCategory` | productcategory.proto | 19 | دریافت |
| `GetAllProductCategoryByFilter` | productcategory.proto | 24 | لیست |
| `CreateNewProductGalleries` | productgalleries.proto | 15 | گالری محصول |
| `UpdateProductGalleries` | productgalleries.proto | 14 | بروزرسانی |
| `DeleteProductGalleries` | productgalleries.proto | 14 | حذف |
| `GetProductGalleries` | productgalleries.proto | 15 | دریافت |
| `GetAllProductGalleriesByFilter` | productgalleries.proto | 15 | لیست |
| `CreateNewProductImages` | productimages.proto | 26 | تصاویر محصول |
| `UpdateProductImages` | productimages.proto | 23 | بروزرسانی |
| `DeleteProductImages` | productimages.proto | 23 | حذف |
| `GetProductImages` | productimages.proto | 19 | دریافت |
| `GetAllProductImagesByFilter` | productimages.proto | 24 | لیست |
| `CreateNewUserWallet` | userwallet.proto | 54 | ایجاد کیف پول |
| `UpdateUserWallet` | userwallet.proto | 46 | بروزرسانی |
| `DeleteUserWallet` | userwallet.proto | 46 | حذف |
| `GetUserWallet` | userwallet.proto | 41 | دریافت |
| `CreateNewUserWalletChangeLog` | userwalletchangelog.proto | 26 | لاگ تغییرات |
| `UpdateUserWalletChangeLog` | userwalletchangelog.proto | 23 | بروزرسانی |
| `DeleteUserWalletChangeLog` | userwalletchangelog.proto | 23 | حذف |
| `GetUserWalletChangeLog` | userwalletchangelog.proto | 21 | دریافت |
| `GetAllOtpTokenByFilter` | otptoken.proto | 24 | لیست OTP |
| `GetAllUserCartsByFilter` | usercarts.proto | 7 | لیست سبدها |
| `AddNewUserCart` | usercarts.proto | 9 | افزودن سبد |
| `DeleteUserCart` | usercarts.proto | 7 | حذف سبد |
| `UpdateUserCart` | usercarts.proto | 10 | بروزرسانی سبد |
| `AddDiscountProductImage` | discountproduct.proto | 10 | تصویر محصول تخفیفی |
| `UpdateDiscountProductImage` | discountproduct.proto | 9 | بروزرسانی |
| `DeleteDiscountProductImage` | discountproduct.proto | 9 | حذف |
| `ReorderDiscountProductImages` | discountproduct.proto | 9 | مرتب‌سازی |
| `GetActiveMessages` | public_messages.proto | 16 | پیام‌های فعال |
| `GetAllCategories` | category.proto | 4 | همه دسته‌بندی‌ها |
| `GetCustomerProducts` | products.proto | 29 | محصولات مشتری |
| `GetCustomerProductsByFilter` | products.proto | 16 | فیلتر محصولات |
| `GetProductTag` | producttag.proto | 19 | تگ محصول |
| `GetProductsByTag` | tag.proto | 16 | محصولات بر اساس تگ |
| `UpdateProductTag` | producttag.proto | 23 | بروزرسانی تگ |
| `CreateCity` | City.proto | 3 | ایجاد شهر |
| `GetCitiesForCustomer` | City.proto | 3 | شهرها برای مشتری |
| `GetCityByIdForCustomer` | City.proto | 3 | شهر مشتری |
| `GetCitiesByStateForCustomer` | City.proto | 3 | شهرها بر اساس استان |
| `GetUserAddress` | useraddress.proto | 19 | آدرس کاربر |
| `CustomerCancelOrder` | userorder.proto | 4 | لغو سفارش مشتری |
| `GetCustomerOrderHistory` | userorder.proto | 13 | تاریخچه سفارشات |
> ۵۸ RPC در فایل‌های contract, usercontract, factordetails, productcategory, productgalleries, productimages, userwallet, userwalletchangelog, otptoken, usercarts, discountproduct, public_messages, category, products, producttag, tag, City, useraddress, userorder — همه CRUD داخلی با ≥3 رفرنس در CMS.
---
## 🟢 سرویس‌های کاملاً مورد استفاده
## 🟢 بخش ۳ — سرویس‌های کاملاً مورد استفاده
### فایل‌های proto که تمام RPCهایشان استفاده می‌شود:
@@ -219,58 +168,51 @@
---
## 📋 فایل‌های Proto با بیشترین RPC استفاده‌نشده
## 📋 بخش ۴ — خلاصه تصمیمات
| فایل Proto | کل RPC | استفاده‌نشده از فرانت | وضعیت |
|-----------|--------|----------------------|-------|
| factordetails.proto | 5 | 5 (100%) | CRUD داخلی — نیاز به UI ندارد |
| productgalleries.proto | 5 | 5 (100%) | CRUD داخلی — از products.proto استفاده می‌شود |
| productimages.proto | 5 | 5 (100%) | CRUD داخلی — از products.proto استفاده می‌شود |
| productcategory.proto | 5 | 5 (100%) | CRUD داخلی — از products.proto استفاده می‌شود |
| contract.proto | 5 | 5 (100%) | CRUD داخلی — مدیریت قراردادها |
| fms.proto | 2 | 2 (100%) | **کد مُرده** — هرگز پیاده‌سازی نشد |
| inventory.proto | 24 | 15 (63%) | بیشتر داخلی (فلو سفارش) |
| transactions.proto | 11 | 9 (82%) | بیشتر داخلی (فلو پرداخت) |
| user.proto | 20 | 9 (45%) | احراز هویت + پروفایل داخلی |
| userorder.proto | 20 | 9 (45%) | مدیریت سفارش داخلی |
### ماتریکس نهایی ۲۴ RPC مُرده
---
```
✅ نگهداری (12): CustomerReorderPreviousOrder, CustomerTrackOrder,
CalculateOrderPV, GetInventorySummary, GetStockValueReport,
BulkAddStock, BulkUpdateProductStock, GetConfigurationByKey,
UpdateCustomerSettings, ChangeNetworkParent,
AssignFeatureToMembership, GetLowStockProducts
## 🗑️ کاندیدای حذف در آینده
🗑️ آرشیو (12): CreateNewFileInfo, DeleteFileInfo, BulkAdjustStock,
CreateNewOrderForCustomer, SubmitOrderForCustomer,
DeactivateConfiguration, GetConfigurationHistory,
DeleteCity, UpdateCity, GetOrdersByDateRange,
GetServiceHealth, GetCategoryByIdForCustomer
```
### اولویت ۱ — کد مُرده (می‌توان بی‌خطر حذف کرد)
### فایل‌های proto آرشیو‌شدنی (کامل)
1. **fms.proto** — کامل (2 RPC) — سرویس FMS هرگز ساخته نشد
2. `SubmitOrderForCustomer` — stub خالی
3. `CreateNewOrderForCustomer` — stub خالی
4. `CustomerReorderPreviousOrder` — فیچر پیاده‌سازی نشده
5. `CustomerTrackOrder` — فیچر پیاده‌سازی نشده
6. `BulkAdjustStock` — 0 رفرنس
7. `BulkAddStock` — stub
8. `BulkUpdateProductStock` — stub
9. `GetStockValueReport` — stub
10. `GetInventorySummary` — stub
| فایل | وضعیت | اقدام |
|------|-------|-------|
| **fms.proto** | کل فایل مُرده (2 RPC) | حذف از csproj — ساخته نشود |
### اولویت ۲ — RPCهای تکراری (عملکرد مشابه موجود)
### RPCهای آرشیو‌شدنی (جزئی — داخل فایل‌های فعال)
| Dead RPC | جایگزین فعال |
|----------|-------------|
| `GetCategoryByIdForCustomer` | `GetAllCategoriesForCustomer` |
| `GetLowStockProducts` | `GetLowStockItems` (inventory) |
| `GetOrdersByDateRange` | `GetAllUserOrderByFilter` (with date filter) |
| `GetServiceHealth` | `GetSystemHealth` |
| `GetConfigurationByKey` | `GetAllConfigurations` + filter |
| فایل Proto | RPCهای آرشیو | RPCهای فعال |
|-----------|-------------|-------------|
| inventory.proto | `BulkAdjustStock` (1) | 23 فعال |
| userorder.proto | `CreateNewOrderForCustomer`, `SubmitOrderForCustomer` (2) | 18 فعال |
| configuration.proto | `DeactivateConfiguration`, `GetConfigurationHistory` (2) | 5 فعال |
| City.proto | `DeleteCity`, `UpdateCity` (2) | 6 فعال |
| health.proto | `GetServiceHealth` (1) | 1 فعال |
| category.proto | `GetCategoryByIdForCustomer` (1) | 7 فعال |
---
## ⚠️ نکات مهم
1. **حذف نکنید!** — فقط مستند و آرشیو شدند
2. RPCهای دسته B (Internal) **حیاتی** هستند — بدون آنها سیستم از کار می‌افتد
3. RPCهای `PurchaseGoldenPackage` و `VerifyGoldenPackagePurchase` از فرانت فراخوانی نمی‌شوند ولی **فلو خرید بسته فعلی** از آنها استفاده می‌کند
4. RPCهای `Customer*` (مثل `CustomerPurchasePackage`, `CustomerVerifyPackagePurchase`) تازه اضافه شده‌اند و هنوز از فرانت وصل نشده‌اند
5. قبل از هر حذف، حتماً `grep -rn "RpcName" CMS/src/` بزنید تا مطمئن شوید
1. **آرشیو ≠ حذف!** — RPCهای آرشیو‌شده فقط با `// [ARCHIVED]` علامت‌گذاری می‌شوند
2. RPCهای دسته B (Internal — ۱۰۱ عدد) **حیاتی** هستند — بدون آنها سیستم از کار می‌افتد
3. RPCهای «نگهداری» (۱۲ عدد) کد **کامل و آماده** دارند — فقط نیاز به وصل شدن از فرانت
4. **fms.proto** تنها فایل proto کاملاً مُرده است — می‌تواند از csproj اکسکلود شود
5. قبل از هر تغییر، حتماً `grep -rn "RpcName" CMS/src/` بزنید تا مطمئن شوید
---
*آخرین بروزرسانی: $(date +%Y-%m-%d)*
*آخرین بروزرسانی: ۱۴۰۴/۱۲/۰۶*