Files
docs/CHANGELOG-2025-12-20.md
T
masoodafar-web e7d979117c feat: Add Chatika integration and Club Features system documentation
- 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
2025-12-24 01:07:49 +03:30

6.7 KiB

📝 Changelog - ۳۰ آذر ۱۴۰۴ (20 December 2025)

Session: رفع باگ‌های BackOffice UI و فعال‌سازی قابلیت‌های Products


🎯 خلاصه Session

این session شامل رفع چندین باگ در صفحات BackOffice و فعال‌سازی قابلیت‌های صفحه Products بود.


🐛 Bug Fixes

1. صفحه /network/balances - ValidationException

مشکل: خطای ValidationException هنگام لود صفحه بالانس‌های هفتگی

علت: Mapster mapping برای GetUserWeeklyBalancesRequestGetUserWeeklyBalancesQuery وجود نداشت

راه‌حل: اضافه کردن mapping در CommissionProfile.cs:

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 اضافه شده:

// 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:
public override async Task<GetClubStatisticsResponse> GetClubStatistics(
    GetClubStatisticsRequest request, ServerCallContext context)
{
    return await _dispatchRequestToCQRS.Handle<GetClubStatisticsRequest, GetClubStatisticsQuery, GetClubStatisticsResponse>(request, context);
}
  1. اضافه کردن 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 نبود و باعث می‌شد مقدار ارسال/دریافت نشه:

// 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 استفاده کنید:

config.NewConfig<SourceDto, ProtoResponse>()
    .MapWith(src => new ProtoResponse
    {
        Field1 = src.Field1,
        RepeatedField = { src.List?.Select(...) ?? Enumerable.Empty<...>() }
    });

Alias Imports برای Proto Disambiguation

using BffProtos = BackOffice.BFF.ClubMembership.Protobuf.Protos.ClubMembership;
using CmsProtos = CMSMicroservice.Protobuf.Protos.ClubMembership;