This commit is contained in:
masoodafar-web
2026-01-03 18:27:49 +03:30
parent 0369292d7f
commit 5965b98728
156 changed files with 16082 additions and 0 deletions
+180
View File
@@ -0,0 +1,180 @@
# 📝 Changelog - ۳۰ آذر ۱۴۰۴ (20 December 2025)
> **Session**: رفع باگ‌های BackOffice UI و فعال‌سازی قابلیت‌های Products
---
## 🎯 خلاصه Session
این session شامل رفع چندین باگ در صفحات BackOffice و فعال‌سازی قابلیت‌های صفحه Products بود.
---
## 🐛 Bug Fixes
### 1. صفحه `/network/balances` - ValidationException ✅
**مشکل**: خطای ValidationException هنگام لود صفحه بالانس‌های هفتگی
**علت**: Mapster mapping برای `GetUserWeeklyBalancesRequest``GetUserWeeklyBalancesQuery` وجود نداشت
**راه‌حل**: اضافه کردن mapping در `CommissionProfile.cs`:
```csharp
config.NewConfig<GetUserWeeklyBalancesRequest, GetUserWeeklyBalancesQuery>()
.Map(dest => dest.PaginationState, src => src.PaginationState);
```
**فایل**: `BackOffice.BFF/src/BackOffice.BFF.WebApi/Common/Mappings/CommissionProfile.cs`
---
### 2. صفحه `/club/members` - داده‌ها لود نمی‌شدند ✅
**مشکل**: صفحه خالی بود و هیچ داده‌ای نمایش نمی‌داد
**علت**: Mapster mappings برای `GetAllClubMemberships` در CMS و BFF وجود نداشت
**راه‌حل**: ایجاد `ClubMembershipProfile.cs` در هر دو لایه
**فایل‌های جدید/تغییر یافته**:
- `CMS/src/CMSMicroservice.WebApi/Common/Mappings/ClubMembershipProfile.cs` (NEW)
- `BackOffice.BFF/src/BackOffice.BFF.WebApi/Common/Mappings/ClubMembershipProfile.cs` (REWRITTEN)
**Mappings اضافه شده**:
```csharp
// CMS
GetAllClubMembershipsRequest GetAllClubMembershipsQuery
GetAllClubMembershipsResponseDto GetAllClubMembershipsResponse
// BFF
BFF.GetAllClubMembershipsRequest GetAllClubMembershipsQuery
CMS.GetAllClubMembershipsResponse BFF.GetAllClubMembershipsResponse
```
---
### 3. صفحه `/club/statistics` - Unimplemented Error ✅
**مشکل**: خطای `Status(StatusCode="Unimplemented", Detail="Method cms.ClubMembershipContract/GetClubStatistics is unimplemented")`
**علت**: متد `GetClubStatistics` در BFF Service override نشده بود
**راه‌حل**:
1. اضافه کردن override در `ClubMembershipService.cs`:
```csharp
public override async Task<GetClubStatisticsResponse> GetClubStatistics(
GetClubStatisticsRequest request, ServerCallContext context)
{
return await _dispatchRequestToCQRS.Handle<GetClubStatisticsRequest, GetClubStatisticsQuery, GetClubStatisticsResponse>(request, context);
}
```
2. اضافه کردن mappings برای Statistics در هر دو Profile
**فایل‌های تغییر یافته**:
- `BackOffice.BFF/src/BackOffice.BFF.WebApi/Services/ClubMembershipService.cs`
- `CMS/src/CMSMicroservice.WebApi/Common/Mappings/ClubMembershipProfile.cs`
- `BackOffice.BFF/src/BackOffice.BFF.WebApi/Common/Mappings/ClubMembershipProfile.cs`
---
## ✨ New Features
### 4. فعال‌سازی قابلیت‌های صفحه Products ✅
**قبل**: همه دکمه‌ها پیام "در حال توسعه" نشان می‌دادند (کد comment شده بود)
**بعد**: همه قابلیت‌ها فعال شدند
**متدهای فعال شده در `ProductsMainPage.razor.cs`**:
-`CreateNew()` - ایجاد محصول جدید با CreateDialog
-`Update()` - ویرایش محصول با UpdateDialog
-`OpenGallery()` - مدیریت گالری تصاویر با GalleryDialog
-`OpenTagAssignment()` - اختصاص تگ به محصول با AssignTagsDialog
**فایل**: `BackOffice/src/BackOffice/Pages/Products/ProductsMainPage.razor.cs`
---
### 5. فیلد "تعداد موجودی" در Products ✅
**اضافات در UI**:
| فایل | تغییر |
|------|-------|
| `CreateDialog.razor` | اضافه شدن فیلد `RemainingCount` |
| `UpdateDialog.razor` | اضافه شدن فیلد `RemainingCount` |
| `ProductsMainPage.razor` | اضافه شدن ستون موجودی با رنگ‌بندی |
**نمایش موجودی در لیست**:
- 🔴 **ناموجود** - اگر موجودی `0` یا کمتر (Chip قرمز)
- 🟡 **کم موجود** - اگر موجودی کمتر از `10` (Chip زرد)
- 🟢 **موجود** - اگر موجودی `10` یا بیشتر (Chip سبز)
**فیکس در BFF** (مهم!):
فیلد `RemainingCount` در BFF Application Commands نبود و باعث می‌شد مقدار ارسال/دریافت نشه:
```csharp
// BackOffice.BFF.Application/ProductsCQ/Commands/CreateNewProducts/CreateNewProductsCommand.cs
public int RemainingCount { get; init; } // ← اضافه شد
// BackOffice.BFF.Application/ProductsCQ/Commands/UpdateProducts/UpdateProductsCommand.cs
public int RemainingCount { get; init; } // ← اضافه شد
```
---
## 📁 لیست کامل فایل‌های تغییر یافته
### BackOffice.BFF (5 فایل)
| فایل | تغییر |
|------|-------|
| `WebApi/Common/Mappings/CommissionProfile.cs` | اضافه شدن mapping برای GetUserWeeklyBalances |
| `WebApi/Common/Mappings/ClubMembershipProfile.cs` | بازنویسی کامل با mappings جدید |
| `WebApi/Services/ClubMembershipService.cs` | اضافه شدن GetClubStatistics override |
| `Application/.../CreateNewProductsCommand.cs` | اضافه شدن RemainingCount |
| `Application/.../UpdateProductsCommand.cs` | اضافه شدن RemainingCount |
### CMS (1 فایل جدید)
| فایل | تغییر |
|------|-------|
| `WebApi/Common/Mappings/ClubMembershipProfile.cs` | فایل جدید با mappings کامل |
### BackOffice UI (4 فایل)
| فایل | تغییر |
|------|-------|
| `Pages/Products/ProductsMainPage.razor.cs` | فعال‌سازی CreateNew, Update, OpenGallery, OpenTagAssignment |
| `Pages/Products/ProductsMainPage.razor` | اضافه شدن ستون موجودی |
| `Pages/Products/Components/CreateDialog.razor` | اضافه شدن فیلد موجودی |
| `Pages/Products/Components/UpdateDialog.razor` | اضافه شدن فیلد موجودی |
---
## 📊 Build Status
```
✅ BackOffice.BFF: Build succeeded (0 errors)
✅ CMS: Build succeeded (0 errors)
✅ BackOffice UI: Build succeeded (0 errors)
```
---
## 🔧 نکات فنی
### Mapster با Proto Types
برای proto types که immutable هستند، از `MapWith` استفاده کنید:
```csharp
config.NewConfig<SourceDto, ProtoResponse>()
.MapWith(src => new ProtoResponse
{
Field1 = src.Field1,
RepeatedField = { src.List?.Select(...) ?? Enumerable.Empty<...>() }
});
```
### Alias Imports برای Proto Disambiguation
```csharp
using BffProtos = BackOffice.BFF.ClubMembership.Protobuf.Protos.ClubMembership;
using CmsProtos = CMSMicroservice.Protobuf.Protos.ClubMembership;
```