Files
BackOffice/docs/BUILD-FIX-STATUS.md

15 KiB
Raw Blame History

BackOffice Build Fix Status

آخرین بروزرسانی: December 6, 2025

وضعیت فعلی

Build Status: SUCCESS - 0 Error

BackOffice.BFF Solution:

  • Build: موفق - 0 Error
  • Proto Projects فعال:
    • BackOffice.BFF.Tag.Protobuf
    • BackOffice.BFF.ProductTag.Protobuf
    • BackOffice.BFF.DiscountProduct.Protobuf
    • BackOffice.BFF.DiscountCategory.Protobuf
    • BackOffice.BFF.DiscountOrder.Protobuf
    • BackOffice.BFF.DiscountShoppingCart.Protobuf
    • BackOffice.BFF.PublicMessage.Protobuf
    • BackOffice.BFF.ManualPayment.Protobuf

BackOffice UI:

  • Build: موفق - 0 Error
  • Framework: Blazor WebAssembly .NET 9.0
  • UI Library: MudBlazor 8.14.0

CMS Microservice:

  • Build: موفق - 0 Error

پیشرفت کلی: از 60+ خطا به 0 خطا رسیدیم


⚠️ ملاحظات مهم Proto Packages

هشدار مهم: هر تغییری در Proto files نیاز به این 3 مرحله دارد:

چک‌لیست اجباری بعد از تغییر Proto:

  1. افزایش Version در .csproj:

    <Version>0.0.142</Version><Version>0.0.143</Version>
    
  2. Pack کردن Proto project:

    cd path/to/proto/project
    dotnet pack -c Release
    # ✅ خودکار push می‌شه به GitLab Registry
    
  3. Update Version در پروژه‌های وابسته (لایه بالاتر):

    <PackageReference Include="Foursat.CMSMicroservice.Protobuf" Version="0.0.143" />
    

مثال: تغییر در CMS Proto → Pack → Update در BFF Protos → Pack → Update در UI

⚠️ فراموش کردن این مراحل = Build Error یا Runtime Bug


ماژول‌های فعال شده (Enabled Modules)

کاملاً فعال و تست شده:

  1. DiscountShop Module (فروشگاه تخفیفی)

    • DiscountProductsMainPage - مدیریت محصولات تخفیفی
    • DiscountCategoriesMainPage - مدیریت دسته‌بندی‌ها (با MudDataGrid)
    • DiscountOrdersMainPage - مدیریت سفارشات
    • SalesReports - گزارش فروش
    • ProductImageGallery - گالری تصاویر (با MudBlazor 8 fixes)
    • Services: IDiscountProductService, IDiscountCategoryService, IDiscountOrderService
  2. PublicMessages Module (پیام‌های عمومی)

    • PublicMessagesMainPage - مدیریت پیام‌ها
    • MessageFormDialog - فرم ایجاد/ویرایش
    • MessageViewDialog - نمایش جزئیات
    • MessageTemplatesDialog - قالب‌های آماده
    • Services: IPublicMessageService
    • Proto: BackOffice.BFF.PublicMessage.Protobuf
  3. ManualPayment Module (پرداخت‌های دستی)

    • ManualPayments - صفحه اصلی مدیریت
    • ManualPaymentDialog - فرم ایجاد و تایید/رد
    • Services: Direct gRPC to ManualPaymentContract
    • Proto: BackOffice.BFF.ManualPayment.Protobuf
  4. Tag Module (برچسب‌ها)

    • TagManagementPage - مدیریت تگ‌ها
    • TagEditDialog - ویرایش تگ
    • Services: ITagService, IProductTagService
    • Proto: BackOffice.BFF.Tag.Protobuf, BackOffice.BFF.ProductTag.Protobuf
  5. Dashboard Widgets

    • DiscountShopWidget - آمار فروشگاه تخفیفی (7 روز اخیر)
  6. Payment Pages

    • Transactions - صفحه تراکنش‌ها
  7. DragDrop Pages

    • CategoryProductsDragDropPage - مدیریت محصولات دسته
    • ProductCategoriesDragDropPage - مدیریت دسته‌های محصول
  8. BulkEdit Module

    • BulkEdit - ویرایش گروهی محصولات (قیمت، موجودی، وضعیت)
    • Proto: BackOffice.BFF.Products.Protobuf (BulkUpdateProductPrices, BulkUpdateProductStock, ToggleProductStatus)
    • Note: استفاده از BackOffice.BFF.Protobuf.Common.PaginationState با using alias
  9. Product Image Management - FULLY OPERATIONAL

    • GalleryDialog - گالری تصاویر محصول
    • CreateDialog - ایجاد محصول با آپلود تصویر
    • UpdateDialog - ویرایش محصول با آپلود تصویر
    • Proto: GetProductGallery, AddProductImage, RemoveProductImage
    • Messages: ImageFileModel, ProductGalleryItem
    • Backend: ProductsService methods uncommented and active
    • CQRS Handlers: AddProductImageCommandHandler, GetProductGalleryQueryHandler, RemoveProductImageCommandHandler
    • CMS Integration: ProductGalleries microservice connected
    • Image Optimization: SixLabors.ImageSharp (1200x1200 + 300x300 thumbnail)

ماژول‌های Exclude شده (نیاز به کار اضافی)

هیچ فایلی Exclude نیست!

تمامی صفحات و کامپوننت‌ها build می‌شوند. فقط Backend implementation برای Image Upload لازمه.


تغییرات مهم MudBlazor 8

Breaking Changes برطرف شده:

  1. MudDialogInstance → IMudDialogInstance

    // قبلی:
    [CascadingParameter] MudDialogInstance MudDialog { get; set; }
    
    // جدید:
    [CascadingParameter] IMudDialogInstance MudDialog { get; set; }
    
  2. MudSwitch نیاز به T parameter

    <!-- قبلی: -->
    <MudSwitch @bind-Checked="Model.IsActive" />
    
    <!-- جدید: -->
    <MudSwitch T="bool" @bind-Value="Model.IsActive" />
    
  3. MudChip نیاز به T parameter

    <!-- قبلی: -->
    <MudChip>Text</MudChip>
    
    <!-- جدید: -->
    <MudChip T="string">Text</MudChip>
    
  4. MudTreeView تغییر API

    • راه‌حل: جایگزینی با MudDataGrid در DiscountCategoriesMainPage
  5. MudFileUpload تغییر signature

    // FilesChanged حالا IBrowserFile می‌گیرد نه IReadOnlyList
    <MudFileUpload T="IReadOnlyList<IBrowserFile>" FilesChanged="OnFilesSelected" />
    
  6. DragEventArgs.PreventDefault() حذف شد

    <!-- استفاده از directive attribute: -->
    @ondragover:preventDefault
    

تغییرات Proto

1. Google.Protobuf.WellKnownTypes Simplification

در همه جا از wrapper به مقدار مستقیم تغییر یافت:

// قبلی (اشتباه):
request.UserId = new Google.Protobuf.WellKnownTypes.Int64Value { Value = userId };
request.Status = new Google.Protobuf.WellKnownTypes.Int32Value { Value = status };
request.ReferenceNumber = new Google.Protobuf.WellKnownTypes.StringValue { Value = refNum };

// جدید (صحیح):
request.UserId = userId;
request.Status = status;
request.ReferenceNumber = refNum;

2. Timestamp to DateTime Conversion

// Proto Timestamp به DateTime تبدیل می‌شود:
var dateTime = timestamp.ToDateTime(); // به جای ToLocalTime()

تغییرات معماری

BasePageComponent Pattern

صفحات با فیلتر از BasePageComponent استفاده می‌کنند ولی ReloadAsync() ندارد. راه‌حل: استفاده مستقیم از MudDataGrid.ReloadServerData():

private MudDataGrid<ModelType>? _dataGrid;

private async Task OnFilterSubmit()
{
    if (_dataGrid != null)
        await _dataGrid.ReloadServerData();
}

  • ProductGalleryImage
  • GetCategoriesRequest/Response
  • UpdateProductCategoriesRequest
  • GetProductsForCategoryRequest/Response
  • UpdateCategoryProductsRequest

3. تغییرات csproj

Products از NuGet به ProjectReference تغییر کرد:

<!-- قبلی: -->
<PackageReference Include="Foursat.BackOffice.BFF.Products.Protobuf" Version="0.0.8" />

<!-- جدید: -->
<ProjectReference Include="../../../BackOffice.BFF/src/Protobufs/BackOffice.BFF.Products.Protobuf/BackOffice.BFF.Products.Protobuf.csproj" />

4. فیکس‌های MudBlazor

MudSwitch T parameter:

  • Pages/Settings/UserSettings.razor
  • Pages/Club/ClubMembers.razor
  • Pages/Configuration/Configuration.razor
<!-- قبلی: -->
<MudSwitch @bind-Value="..." />

<!-- جدید: -->
<MudSwitch T="bool" @bind-Value="..." />

5. فیکس Snackbar Duplicate

در فایل‌های زیر [Inject] ISnackbar Snackbar حذف شد (چون در _Imports.razor inject شده):

  • ApplyDiscountDialog.razor.cs
  • CancelOrderDialog.razor.cs
  • ChangeOrderStatusDialog.razor.cs

6. فیکس ConfigureService.cs

Using های زیر comment شدند:

// using BackOffice.Services.DiscountProduct;
// using BackOffice.Services.DiscountCategory;
// using BackOffice.Services.DiscountOrder;
// using BackOffice.Services.Tag;
// using BackOffice.Services.ProductTag;
// using BackOffice.Services.PublicMessage;

کارهای باقیمانده (TODO)

فوری - نیاز به Proto Methods:

1. Product Image Management

فایل‌های Excluded:

  • Pages/Products/Components/GalleryDialog.razor
  • Pages/Products/Components/CreateDialog.razor
  • Pages/Products/Components/UpdateDialog.razor

Proto Methods مورد نیاز در products.proto:

service ProductsContract {
    // برای GalleryDialog:
    rpc AddProductImage(AddProductImageRequest) returns (AddProductImageResponse);
    rpc RemoveProductImage(RemoveProductImageRequest) returns (google.protobuf.Empty);
    
    // برای Create/Update Dialogs:
    rpc CreateProductWithImage(CreateProductWithImageRequest) returns (CreateProductResponse);
    rpc UpdateProductWithImage(UpdateProductWithImageRequest) returns (google.protobuf.Empty);
}

message ImageFileModel {
    bytes file = 1;
    string mime = 2;
    string file_name = 3;
}

message AddProductImageRequest {
    int64 product_id = 1;
    string title = 2;
    ImageFileModel image_file = 3;
}

message AddProductImageResponse {
    int64 product_gallery_id = 1;
}

message RemoveProductImageRequest {
    int64 product_gallery_id = 1;
}

message CreateProductWithImageRequest {
    // ... سایر فیلدهای محصول
    ImageFileModel image_file = 1;
    ImageFileModel thumbnail_file = 2;
}

message UpdateProductWithImageRequest {
    int64 id = 1;
    // ... سایر فیلدها
    ImageFileModel image_file = 2;
    ImageFileModel thumbnail_file = 3;
}

وضعیت: 🔴 نیاز به پیاده‌سازی در Backend


2. BulkEdit Refactoring

فایل Excluded: Pages/Products/BulkEdit.razor

مشکل: استفاده مستقیم از CMSMicroservice.Protobuf.Protos

راه‌حل:

  1. حذف dependency به CMSMicroservice.Protobuf
  2. افزودن bulk update methods به products.proto:
service ProductsContract {
    rpc BulkUpdateProducts(BulkUpdateProductsRequest) returns (BulkUpdateProductsResponse);
}

message BulkUpdateProductsRequest {
    repeated int64 product_ids = 1;
    google.protobuf.Int64Value new_price = 2;
    google.protobuf.Int32Value new_discount = 3;
    google.protobuf.Int32Value new_club_discount_percent = 4;
    StockUpdateOperation stock_operation = 5;
    google.protobuf.BoolValue status_enable = 6;
}

enum StockUpdateOperation {
    STOCK_NO_CHANGE = 0;
    STOCK_SET = 1;
    STOCK_ADD = 2;
    STOCK_SUBTRACT = 3;
}

message BulkUpdateProductsResponse {
    int32 updated_count = 1;
    repeated int64 failed_product_ids = 2;
}

وضعیت: 🔴 نیاز به پیاده‌سازی در Backend


اختیاری - بهبودها:

3. Transactions API Implementation

فایل: Pages/Payment/Transactions.razor

وضعیت فعلی: Enabled ولی متد LoadData فقط TODO دارد

نیاز: پیاده‌سازی Transaction API در Backend


آمار نهایی

ماژول‌های فعال: 7

  1. DiscountShop (Products, Categories, Orders, Reports)
  2. PublicMessages
  3. ManualPayments
  4. Tag Management
  5. Dashboard DiscountShopWidget
  6. Transactions Page
  7. DragDrop Pages (Category ↔ Products)

ماژول‌های Excluded: 3

  1. GalleryDialog (نیاز به Image Upload API)
  2. CreateDialog/UpdateDialog (نیاز به Image Upload API)
  3. BulkEdit (نیاز به Refactoring + Bulk API)

Build Errors: 0 🎉

Proto Projects: 14 فعال

صفحات فعال: ~30+

کامپوننت‌های فعال: ~50+



Handler های موقتاً Exclude شده در BackOffice.BFF.Application

فایل‌های Exclude شده:

<Compile Remove="DiscountOrderCQ/**/*.cs" />
<Compile Remove="DiscountShoppingCartCQ/**/*.cs" />
<Compile Remove="ManualPaymentCQ/**/*.cs" />
<Compile Remove="ConfigurationCQ/**/*.cs" />
<Compile Remove="CommissionCQ/Commands/ProcessWithdrawal/**/*.cs" />

دلیل Exclude:

این Handler ها فیلدهای متفاوتی با proto های CMS دارند و نیاز به بازنویسی دارند.

مثال عدم تطابق DiscountOrder:

Handler انتظار دارد:

  • Request: UserId, AddressId, DiscountBalanceAmount, GatewayAmount
  • Response: OrderId, TrackingCode, RequiresGatewayPayment, GatewayPayableAmount

Proto CMS دارد:

  • Request: user_id, user_address_id, discount_balance_to_use, notes
  • Response: success, message, order_id, gateway_amount, payment_url

Proto Update های مورد نیاز

UserOrder.Protobuf

متدهای زیر باید اضافه شوند:

  • CancelOrderAsync(CancelOrderRequest)
  • ApplyDiscountToOrderAsync(ApplyDiscountToOrderRequest)
  • UpdateOrderStatusAsync(UpdateOrderStatusRequest)

فیلدهای زیر باید اضافه شوند:

  • VatAmount
  • VatPercentage
  • VatBaseAmount
  • VatTotalAmount
  • PaymentStatus.None

Products.Protobuf

متدهای زیر باید اضافه شوند:

  • AddProductImageAsync
  • RemoveProductImageAsync

فیلدهای زیر باید اضافه شوند:

  • ImageFile (bytes)
  • ThumbnailFile (bytes)
  • ImageFileModel message

دستورات برای ادامه کار

1. اجرای build برای دیدن خطاهای فعلی:

cd /home/masoud/Apps/project/FourSat/BackOffice/src/BackOffice
dotnet build 2>&1 | grep -E "error CS|Error"

2. فایل‌های مهم برای بررسی:

  • BackOffice.csproj - لیست exclude ها و references
  • ConfigureService.cs - DI registrations
  • _Imports.razor - global using و inject ها

3. Proto فایل‌های مهم:

  • BackOffice.BFF/src/Protobufs/BackOffice.BFF.Products.Protobuf/Protos/products.proto
  • BackOffice.BFF/src/Protobufs/BackOffice.BFF.UserOrder.Protobuf/Protos/userorder.proto

چک‌لیست برای chat جدید

  • خطاهای build رو چک کن
  • PaginationState namespace رو فیکس کن
  • WithdrawalReports binding رو فیکس کن
  • OpenGalleryDialog رو comment کن در ProductsMainPage
  • DiscountShopWidget رو از SystemOverview حذف کن
  • تست build موفق

نکات مهم

  1. هیچ فایلی حذف نشده - فقط از build exclude شدند
  2. Proto های local از ProjectReference استفاده می‌کنند نه NuGet
  3. MudBlazor 8.14.0 نیاز به T parameter برای generic components دارد
  4. Snackbar در _Imports.razor inject شده، نباید در component ها duplicate بشه