e7d979117c
- Implement Chatika account activation via background job - Create IChatikaApiService interface and its implementation - Add Club Features system documentation detailing features and entities - Introduce ClubFeatureType enum to replace hardcoded IDs - Update SQL scripts for Club Membership migration - Fix various bugs in BackOffice UI and improve Products page functionality
181 lines
6.7 KiB
Markdown
181 lines
6.7 KiB
Markdown
# 📝 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;
|
|
```
|