
files)
+ private async Task OnFilesSelected(InputFileChangeEventArgs args)
{
+ var files = args.GetMultipleFiles();
foreach (var file in files)
{
if (file == null) continue;
@@ -125,12 +126,7 @@
_dragging = item;
}
- private void OnDragOver(DragEventArgs args)
- {
- args.PreventDefault();
- }
-
- private async void OnDrop(ProductImageItem target)
+ private async Task OnDrop(ProductImageItem target)
{
if (_dragging == null || ReferenceEquals(_dragging, target))
return;
@@ -149,7 +145,7 @@
StateHasChanged();
}
- private async void Remove(ProductImageItem item)
+ private async Task Remove(ProductImageItem item)
{
_items.Remove(item);
await OnItemsChanged();
@@ -163,5 +159,4 @@
public string PreviewUrl { get; set; } = string.Empty;
public int SortOrder { get; set; }
}
-}
-
+}
\ No newline at end of file
diff --git a/src/BackOffice/Pages/DiscountShop/DiscountCategoriesMainPage.razor b/src/BackOffice/Pages/DiscountShop/DiscountCategoriesMainPage.razor
index 134f51e..53d2144 100644
--- a/src/BackOffice/Pages/DiscountShop/DiscountCategoriesMainPage.razor
+++ b/src/BackOffice/Pages/DiscountShop/DiscountCategoriesMainPage.razor
@@ -41,58 +41,80 @@
}
else
{
-
-
-
-
-
-
-
- @category.Title
- @if (!string.IsNullOrEmpty(category.Description))
- {
- @category.Description
- }
-
-
-
-
- @(category.IsActive ? "فعال" : "غیرفعال")
-
-
- ترتیب: @category.DisplayOrder
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+ @{
+ var indent = GetIndentLevel(context.Item);
+ }
+
+ @if (context.Item.Children.Any())
+ {
+
+ }
+ else
+ {
+
+ }
+ @context.Item.Title
+ @if (!string.IsNullOrEmpty(context.Item.Name))
+ {
+ (@context.Item.Name)
+ }
+
+
+
+
+
+
+ @context.Item.ProductCount
+
+
+
+
+
+
+
+
+ @(context.Item.IsActive ? "فعال" : "غیرفعال")
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@if (!_filteredCategories.Any())
{
@@ -112,8 +134,8 @@
@code {
- private List
_categories = new();
- private HashSet _filteredCategories = new();
+ private List _allCategories = new();
+ private List _filteredCategories = new();
private bool _loading = false;
private string? _searchQuery;
@@ -127,8 +149,8 @@
_loading = true;
try
{
- var allCategories = await DiscountCategoryService.GetCategoriesAsync();
- _categories = FlattenCategories(allCategories);
+ var rootCategories = await DiscountCategoryService.GetCategoriesAsync();
+ _allCategories = FlattenCategoriesWithDepth(rootCategories, 0);
FilterCategories();
Snackbar.Add("دستهبندیها بارگذاری شدند", Severity.Success);
}
@@ -142,44 +164,61 @@
}
}
- private List FlattenCategories(List categories)
+ private List FlattenCategoriesWithDepth(List categories, int depth)
{
var result = new List();
- foreach (var category in categories)
+ foreach (var category in categories.OrderBy(c => c.SortOrder))
{
+ category.IsExpanded = false; // Use IsExpanded to store depth temporarily
result.Add(category);
if (category.Children.Any())
{
- result.AddRange(FlattenCategories(category.Children.ToList()));
+ result.AddRange(FlattenCategoriesWithDepth(category.Children, depth + 1));
}
}
return result;
}
+ private int GetIndentLevel(DiscountCategoryDto category)
+ {
+ // Calculate depth by traversing parents
+ int depth = 0;
+ var current = category;
+ while (current.ParentCategoryId.HasValue)
+ {
+ var parent = _allCategories.FirstOrDefault(c => c.Id == current.ParentCategoryId.Value);
+ if (parent == null) break;
+ current = parent;
+ depth++;
+ }
+ return depth;
+ }
+
private void FilterCategories()
{
if (string.IsNullOrWhiteSpace(_searchQuery))
{
- _filteredCategories = _categories.Where(c => c.ParentCategoryId == null).ToHashSet();
+ _filteredCategories = _allCategories;
}
else
{
var query = _searchQuery.ToLower();
- _filteredCategories = _categories
+ _filteredCategories = _allCategories
.Where(c => c.Title.ToLower().Contains(query) ||
+ c.Name.ToLower().Contains(query) ||
(c.Description?.ToLower().Contains(query) ?? false))
- .ToHashSet();
+ .ToList();
}
}
private async Task OpenCreateDialog(long? parentId = null)
{
var model = new CategoryFormModel { ParentCategoryId = parentId };
- var parameters = new DialogParameters
+ var parameters = new DialogParameters
{
- { "Model", model },
- { "IsEditMode", false },
- { "ExcludeCategoryId", (long?)null }
+ { x => x.Model, model },
+ { x => x.IsEditMode, false },
+ { x => x.ExcludeCategoryId, (long?)null }
};
var options = new DialogOptions { MaxWidth = MaxWidth.Small, FullWidth = true };
@@ -189,16 +228,18 @@
options);
var result = await dialog.Result;
- if (!result.Canceled && result.Data is CategoryFormModel formData)
+ if (result is { Canceled: false, Data: CategoryFormModel formData })
{
try
{
var dto = new CreateDiscountCategoryDto
{
ParentCategoryId = formData.ParentCategoryId,
+ Name = formData.Name,
Title = formData.Title,
Description = formData.Description,
- DisplayOrder = formData.DisplayOrder,
+ ImagePath = formData.ImagePath,
+ SortOrder = formData.SortOrder,
IsActive = formData.IsActive
};
@@ -227,31 +268,35 @@
var model = new CategoryFormModel
{
ParentCategoryId = category.ParentCategoryId,
+ Name = category.Name,
Title = category.Title,
Description = category.Description,
- DisplayOrder = category.DisplayOrder,
+ ImagePath = category.ImagePath,
+ SortOrder = category.SortOrder,
IsActive = category.IsActive
};
- var parameters = new DialogParameters
+ var parameters = new DialogParameters
{
- { "Model", model },
- { "IsEditMode", true },
- { "ExcludeCategoryId", categoryId }
+ { x => x.Model, model },
+ { x => x.IsEditMode, true },
+ { x => x.ExcludeCategoryId, categoryId }
};
var options = new DialogOptions { MaxWidth = MaxWidth.Small, FullWidth = true };
var dialog = await DialogService.ShowAsync("ویرایش دستهبندی", parameters, options);
var result = await dialog.Result;
- if (!result.Canceled && result.Data is CategoryFormModel formData)
+ if (result is { Canceled: false, Data: CategoryFormModel formData })
{
var dto = new UpdateDiscountCategoryDto
{
ParentCategoryId = formData.ParentCategoryId,
+ Name = formData.Name,
Title = formData.Title,
Description = formData.Description,
- DisplayOrder = formData.DisplayOrder,
+ ImagePath = formData.ImagePath,
+ SortOrder = formData.SortOrder,
IsActive = formData.IsActive
};
@@ -268,7 +313,7 @@
private async Task DeleteCategory(long categoryId)
{
- var category = _categories.FirstOrDefault(c => c.CategoryId == categoryId);
+ var category = _allCategories.FirstOrDefault(c => c.Id == categoryId);
if (category?.Children.Any() == true)
{
Snackbar.Add("ابتدا زیردستههای این دستهبندی را حذف کنید", Severity.Warning);
diff --git a/src/BackOffice/Pages/DiscountShop/DiscountOrdersMainPage.razor b/src/BackOffice/Pages/DiscountShop/DiscountOrdersMainPage.razor
index d9acbc0..bbc20e1 100644
--- a/src/BackOffice/Pages/DiscountShop/DiscountOrdersMainPage.razor
+++ b/src/BackOffice/Pages/DiscountShop/DiscountOrdersMainPage.razor
@@ -17,7 +17,7 @@
-
+
+ همه
+ پرداخت شده
+ پرداخت نشده
+
-
+
-
-
-
+
- @context.Item.TotalAmount.ToString("N0") ریال
+ @context.Item.TotalPrice.ToString("N0") ریال
- @context.Item.TotalDiscount.ToString("N0") ریال
+ @context.Item.DiscountBalanceUsed.ToString("N0") ریال
- @context.Item.FinalAmount.ToString("N0") ریال
+ @context.Item.GatewayAmount.ToString("N0") ریال
+
+
+ @context.Item.ItemsCount آیتم
+
+
+
-
+
@GetStatusText(context.Item.Status)
@@ -101,15 +109,15 @@
- @if (context.Item.IsPaid)
+ @if (context.Item.PaymentCompleted)
{
-
+
پرداخت شده
}
else
{
-
+
در انتظار
}
@@ -122,12 +130,12 @@
Color="Color.Info"
Size="Size.Small"
Title="مشاهده جزئیات"
- OnClick="@(() => OpenOrderDetails(context.Item.OrderId))" />
+ OnClick="@(() => OpenOrderDetails(context.Item.Id))" />
+ OnClick="@(() => OpenChangeStatusDialog(context.Item.Id))" />
@@ -143,10 +151,12 @@
private MudDataGrid? _dataGrid;
private List _orders = new();
private bool _loading = false;
+ private int _totalCount;
+ private int _totalPages;
private string? _searchQuery;
private OrderStatus? _statusFilter;
- private DateRange? _dateRange;
+ private bool? _paymentFilter;
protected override async Task OnInitializedAsync()
{
@@ -160,13 +170,14 @@
{
var filter = new OrderFilterDto
{
- SearchQuery = _searchQuery,
Status = _statusFilter,
- FromDate = _dateRange?.Start,
- ToDate = _dateRange?.End
+ PaymentCompleted = _paymentFilter
};
- _orders = await DiscountOrderService.GetOrdersAsync(filter);
+ var (orders, totalCount, totalPages) = await DiscountOrderService.GetOrdersAsync(filter);
+ _orders = orders;
+ _totalCount = totalCount;
+ _totalPages = totalPages;
Snackbar.Add("سفارشات بارگذاری شدند", Severity.Success);
}
catch (Exception ex)
@@ -195,7 +206,7 @@
return;
}
- var parameters = new DialogParameters { { "Order", order } };
+ var parameters = new DialogParameters { { x => x.Order, order } };
var options = new DialogOptions { MaxWidth = MaxWidth.Large, FullWidth = true };
await DialogService.ShowAsync("جزئیات سفارش", parameters, options);
}
@@ -209,24 +220,24 @@
{
try
{
- var order = _orders.FirstOrDefault(o => o.OrderId == orderId);
+ var order = _orders.FirstOrDefault(o => o.Id == orderId);
if (order == null)
{
Snackbar.Add("سفارش یافت نشد", Severity.Error);
return;
}
- var parameters = new DialogParameters
+ var parameters = new DialogParameters
{
- { "OrderId", orderId },
- { "CurrentStatus", order.Status }
+ { x => x.OrderId, orderId },
+ { x => x.CurrentStatus, order.Status }
};
var options = new DialogOptions { MaxWidth = MaxWidth.Small, FullWidth = true };
var dialog = await DialogService.ShowAsync("تغییر وضعیت سفارش", parameters, options);
var result = await dialog.Result;
- if (!result.Canceled && result.Data is UpdateOrderStatusDto dto)
+ if (result is { Canceled: false, Data: UpdateOrderStatusDto dto })
{
await DiscountOrderService.UpdateStatusAsync(orderId, dto);
Snackbar.Add("وضعیت سفارش با موفقیت تغییر یافت", Severity.Success);
diff --git a/src/BackOffice/Pages/DiscountShop/DiscountProductsMainPage.razor b/src/BackOffice/Pages/DiscountShop/DiscountProductsMainPage.razor
index 1e98803..9ab4344 100644
--- a/src/BackOffice/Pages/DiscountShop/DiscountProductsMainPage.razor
+++ b/src/BackOffice/Pages/DiscountShop/DiscountProductsMainPage.razor
@@ -75,7 +75,7 @@
Dense="true"
Class="mt-4">
-
+
@@ -102,27 +102,27 @@
- @context.Item.MaxDiscountPercent%
+ @context.Item.MaxDiscountPercent%
-
- @context.Item.Stock
+
+ @context.Item.RemainingCount
-
+
- @context.Item.SaleCount
+ @context.Item.ViewCount
-
@(context.Item.IsActive ? "فعال" : "غیرفعال")
@@ -134,11 +134,11 @@
+ OnClick="@(() => OpenEditDialog(context.Item.Id))" />
+ OnClick="@(() => DeleteProduct(context.Item.Id))" />
@@ -154,6 +154,8 @@
private MudDataGrid? _dataGrid;
private List _products = new();
private bool _loading = false;
+ private int _totalCount;
+ private int _totalPages;
private string? _searchQuery;
private long? _categoryFilter;
@@ -178,7 +180,10 @@
InStock = _stockFilter
};
- _products = await DiscountProductService.GetProductsAsync(filter);
+ var (products, totalCount, totalPages) = await DiscountProductService.GetProductsAsync(filter);
+ _products = products;
+ _totalCount = totalCount;
+ _totalPages = totalPages;
Snackbar.Add("محصولات بارگذاری شدند", Severity.Success);
}
catch (Exception ex)
@@ -204,31 +209,33 @@
private async Task OpenCreateDialog()
{
var model = new ProductFormModel();
- var parameters = new DialogParameters
+ var parameters = new DialogParameters
{
- { "Model", model },
- { "IsEditMode", false }
+ { x => x.Model, model },
+ { x => x.IsEditMode, false }
};
var options = new DialogOptions { MaxWidth = MaxWidth.Medium, FullWidth = true };
var dialog = await DialogService.ShowAsync("ایجاد محصول جدید", parameters, options);
var result = await dialog.Result;
- if (!result.Canceled && result.Data is ProductFormModel formData)
+ if (result is { Canceled: false, Data: ProductFormModel formData })
{
try
{
var dto = new CreateDiscountProductDto
{
Title = formData.Title,
- Description = formData.Description,
+ ShortInformation = formData.ShortInformation,
+ FullInformation = formData.FullInformation,
+ ImagePath = formData.ImagePath,
ThumbnailPath = formData.ThumbnailPath,
Price = formData.Price,
MaxDiscountPercent = formData.MaxDiscountPercent,
- Stock = formData.Stock,
+ InitialCount = formData.InitialCount,
+ SortOrder = formData.SortOrder,
IsActive = formData.IsActive,
- CategoryId = formData.CategoryId,
- Tags = formData.Tags
+ CategoryIds = formData.CategoryIds
};
await DiscountProductService.CreateAsync(dto);
@@ -256,38 +263,42 @@
var model = new ProductFormModel
{
Title = product.Title,
- Description = product.Description,
+ ShortInformation = product.ShortInformation,
+ FullInformation = product.FullInformation,
+ ImagePath = product.ImagePath,
ThumbnailPath = product.ThumbnailPath,
Price = product.Price,
MaxDiscountPercent = product.MaxDiscountPercent,
- Stock = product.Stock,
+ InitialCount = product.RemainingCount,
+ SortOrder = product.SortOrder,
IsActive = product.IsActive,
- CategoryId = product.CategoryId
+ CategoryIds = product.Categories?.Select(c => c.Id).ToList() ?? new()
};
- var parameters = new DialogParameters
+ var parameters = new DialogParameters
{
- { "Model", model },
- { "IsEditMode", true }
+ { x => x.Model, model },
+ { x => x.IsEditMode, true }
};
var options = new DialogOptions { MaxWidth = MaxWidth.Medium, FullWidth = true };
var dialog = await DialogService.ShowAsync("ویرایش محصول", parameters, options);
var result = await dialog.Result;
- if (!result.Canceled && result.Data is ProductFormModel formData)
+ if (result is { Canceled: false, Data: ProductFormModel formData })
{
var dto = new UpdateDiscountProductDto
{
Title = formData.Title,
- Description = formData.Description,
+ ShortInformation = formData.ShortInformation,
+ FullInformation = formData.FullInformation,
+ ImagePath = formData.ImagePath,
ThumbnailPath = formData.ThumbnailPath,
Price = formData.Price,
MaxDiscountPercent = formData.MaxDiscountPercent,
- Stock = formData.Stock,
+ SortOrder = formData.SortOrder,
IsActive = formData.IsActive,
- CategoryId = formData.CategoryId,
- Tags = formData.Tags
+ CategoryIds = formData.CategoryIds
};
await DiscountProductService.UpdateAsync(productId, dto);
@@ -322,19 +333,4 @@
}
}
}
-
- // Temporary DTO - will be removed when using service DTOs
- /*
- public class DiscountProductDto
- {
- public long ProductId { get; set; }
- public string Title { get; set; } = string.Empty;
- public string? ThumbnailPath { get; set; }
- public long Price { get; set; }
- public int MaxDiscountPercent { get; set; }
- public int Stock { get; set; }
- public int SaleCount { get; set; }
- public bool IsActive { get; set; }
- }
- */
}
diff --git a/src/BackOffice/Pages/DiscountShop/SalesReports.razor b/src/BackOffice/Pages/DiscountShop/SalesReports.razor
index 946cc6b..4d2cdd9 100644
--- a/src/BackOffice/Pages/DiscountShop/SalesReports.razor
+++ b/src/BackOffice/Pages/DiscountShop/SalesReports.razor
@@ -180,22 +180,25 @@
Hover="true"
Dense="true">
-
-
-
+
- @context.Item.CreatedAt.ToString("yyyy/MM/dd HH:mm")
+ @(context.Item.Created?.ToString("yyyy/MM/dd HH:mm") ?? "-")
+
+
+
+
+ @context.Item.ItemsCount
- @context.Item.FinalAmount.ToString("N0") ریال
+ @context.Item.GatewayAmount.ToString("N0") ریال
- @context.Item.TotalDiscount.ToString("N0") ریال
+ @context.Item.DiscountBalanceUsed.ToString("N0") ریال
@@ -254,16 +257,13 @@
{
var filter = new OrderFilterDto
{
- SearchQuery = _searchQuery,
Status = _statusFilter,
- FromDate = _fromDate,
- ToDate = _toDate,
PageNumber = 1,
PageSize = 200
};
- var result = await DiscountOrderService.GetOrdersAsync(filter);
- _orders.AddRange(result);
+ var (orders, _, _) = await DiscountOrderService.GetOrdersAsync(filter);
+ _orders.AddRange(orders);
BuildSummary();
BuildSalesChart();
@@ -291,8 +291,8 @@
private void BuildSummary()
{
_totalOrders = _orders.Count;
- _totalSales = _orders.Sum(o => o.FinalAmount);
- _totalDiscount = _orders.Sum(o => o.TotalDiscount);
+ _totalSales = _orders.Sum(o => o.GatewayAmount);
+ _totalDiscount = _orders.Sum(o => o.DiscountBalanceUsed);
_averageOrder = _totalOrders > 0 ? _totalSales / _totalOrders : 0;
}
@@ -306,7 +306,8 @@
}
var grouped = _orders
- .GroupBy(o => o.CreatedAt.Date)
+ .Where(o => o.Created.HasValue)
+ .GroupBy(o => o.Created!.Value.Date)
.OrderBy(g => g.Key)
.ToList();
@@ -315,11 +316,11 @@
.ToArray();
var totalSeries = grouped
- .Select(g => (double)g.Sum(o => o.FinalAmount))
+ .Select(g => (double)g.Sum(o => o.GatewayAmount))
.ToArray();
var discountSeries = grouped
- .Select(g => (double)g.Sum(o => o.TotalDiscount))
+ .Select(g => (double)g.Sum(o => o.DiscountBalanceUsed))
.ToArray();
_salesSeries = new List
@@ -339,7 +340,8 @@
// برای جلوگیری از فشار بیشازحد، فقط روی 50 سفارش اول کار میکنیم
var sampleOrders = _orders
- .OrderByDescending(o => o.CreatedAt)
+ .Where(o => o.Created.HasValue)
+ .OrderByDescending(o => o.Created)
.Take(50)
.ToList();
@@ -350,7 +352,7 @@
DiscountOrderDetailsDto? details;
try
{
- details = await DiscountOrderService.GetByIdAsync(order.OrderId);
+ details = await DiscountOrderService.GetByIdAsync(order.Id);
}
catch
{
@@ -434,17 +436,16 @@
}
var sb = new StringBuilder();
- sb.AppendLine("OrderId,UserId,UserFullName,CreatedAt,FinalAmount,TotalDiscount,Status");
+ sb.AppendLine("OrderNumber,Created,ItemsCount,GatewayAmount,DiscountBalanceUsed,Status");
- foreach (var o in _orders.OrderBy(o => o.CreatedAt))
+ foreach (var o in _orders.Where(o => o.Created.HasValue).OrderBy(o => o.Created))
{
sb.AppendLine(string.Join(",",
- o.OrderId,
- o.UserId,
- EscapeCsv(o.UserFullName),
- o.CreatedAt.ToString("yyyy-MM-dd HH:mm"),
- o.FinalAmount,
- o.TotalDiscount,
+ EscapeCsv(o.OrderNumber),
+ o.Created?.ToString("yyyy-MM-dd HH:mm") ?? "-",
+ o.ItemsCount,
+ o.GatewayAmount,
+ o.DiscountBalanceUsed,
GetStatusText(o.Status)));
}
@@ -477,12 +478,12 @@
sb.AppendLine();
sb.AppendLine("جزئیات سفارشها:");
- sb.AppendLine("شناسه | کاربر | تاریخ | مبلغ نهایی | تخفیف | وضعیت");
+ sb.AppendLine("شماره سفارش | تاریخ | تعداد آیتم | مبلغ نهایی | تخفیف | وضعیت");
- foreach (var o in _orders.OrderBy(o => o.CreatedAt))
+ foreach (var o in _orders.Where(o => o.Created.HasValue).OrderBy(o => o.Created))
{
sb.AppendLine(
- $"{o.OrderId} | {o.UserFullName} | {o.CreatedAt:yyyy/MM/dd HH:mm} | {o.FinalAmount:N0} | {o.TotalDiscount:N0} | {GetStatusText(o.Status)}");
+ $"{o.OrderNumber} | {o.Created?.ToString("yyyy/MM/dd HH:mm") ?? "-"} | {o.ItemsCount} | {o.GatewayAmount:N0} | {o.DiscountBalanceUsed:N0} | {GetStatusText(o.Status)}");
}
var bytes = Encoding.UTF8.GetBytes(sb.ToString());
diff --git a/src/BackOffice/Pages/Payment/Components/ManualPaymentDialog.razor.cs b/src/BackOffice/Pages/Payment/Components/ManualPaymentDialog.razor.cs
index 4d827ba..ff5b72d 100644
--- a/src/BackOffice/Pages/Payment/Components/ManualPaymentDialog.razor.cs
+++ b/src/BackOffice/Pages/Payment/Components/ManualPaymentDialog.razor.cs
@@ -22,7 +22,7 @@ public partial class ManualPaymentDialog
{
[CascadingParameter] IMudDialogInstance MudDialog { get; set; } = default!;
[Inject] public ManualPaymentContract.ManualPaymentContractClient ManualPaymentClient { get; set; } = default!;
- [Inject] public ISnackbar Snackbar { get; set; } = default!;
+ // Snackbar is injected via _Imports.razor
[Parameter] public ManualPaymentDialogMode Mode { get; set; }
[Parameter] public ManualPaymentModel? Model { get; set; }
@@ -44,10 +44,7 @@ public partial class ManualPaymentDialog
if (!string.IsNullOrWhiteSpace(_createModel.ReferenceNumber))
{
- request.ReferenceNumber = new Google.Protobuf.WellKnownTypes.StringValue
- {
- Value = _createModel.ReferenceNumber
- };
+ request.ReferenceNumber = _createModel.ReferenceNumber;
}
await ManualPaymentClient.CreateManualPaymentAsync(request);
@@ -73,10 +70,7 @@ public partial class ManualPaymentDialog
if (!string.IsNullOrWhiteSpace(_adminNote))
{
- request.ApprovalNote = new Google.Protobuf.WellKnownTypes.StringValue
- {
- Value = _adminNote
- };
+ request.ApprovalNote = _adminNote;
}
await ManualPaymentClient.ApproveManualPaymentAsync(request);
diff --git a/src/BackOffice/Pages/Payment/ManualPayments.razor b/src/BackOffice/Pages/Payment/ManualPayments.razor
index 4e5610c..6840bd2 100644
--- a/src/BackOffice/Pages/Payment/ManualPayments.razor
+++ b/src/BackOffice/Pages/Payment/ManualPayments.razor
@@ -58,7 +58,7 @@
-
@@ -87,7 +87,7 @@
- @context.Item.Created.ToLocalTime().MiladiToJalaliWithTime()
+ @(context.Item.Created?.ToDateTime().ToLocalTime().MiladiToJalaliWithTime() ?? "-")
@@ -108,9 +108,10 @@
@code {
[Inject] public BackOffice.BFF.ManualPayment.Protobuf.ManualPaymentContract.ManualPaymentContractClient ManualPaymentClient { get; set; } = default!;
- [Inject] public IDialogService DialogService { get; set; } = default!;
+ // DialogService is injected via _Imports.razor
private BasePageComponent? _basePage;
+ private MudDataGrid? _dataGrid;
private long? _userIdFilter;
private string? _referenceFilter;
private int? _statusFilter;
@@ -129,22 +130,22 @@
if (_userIdFilter.HasValue)
{
- request.UserId = new Google.Protobuf.WellKnownTypes.Int64Value { Value = _userIdFilter.Value };
+ request.UserId = _userIdFilter.Value;
}
if (_statusFilter.HasValue)
{
- request.Status = new Google.Protobuf.WellKnownTypes.Int32Value { Value = _statusFilter.Value };
+ request.Status = _statusFilter.Value;
}
if (_typeFilter.HasValue)
{
- request.Type = new Google.Protobuf.WellKnownTypes.Int32Value { Value = _typeFilter.Value };
+ request.Type = _typeFilter.Value;
}
if (!string.IsNullOrWhiteSpace(_referenceFilter))
{
- request.ReferenceNumber = new Google.Protobuf.WellKnownTypes.StringValue { Value = _referenceFilter };
+ request.ReferenceNumber = _referenceFilter;
}
var response = await ManualPaymentClient.GetManualPaymentsAsync(request);
@@ -158,7 +159,8 @@
private async Task OnFilterSubmit()
{
- await _basePage!.ReloadAsync();
+ if (_dataGrid != null)
+ await _dataGrid.ReloadServerData();
}
private async Task OnFilterCleared()
@@ -167,7 +169,8 @@
_referenceFilter = null;
_statusFilter = null;
_typeFilter = null;
- await _basePage!.ReloadAsync();
+ if (_dataGrid != null)
+ await _dataGrid.ReloadServerData();
}
private async Task OpenCreateDialog()
@@ -181,9 +184,9 @@
var dialog = DialogService.Show("ثبت پرداخت دستی", parameters, options);
var result = await dialog.Result;
- if (!result.Cancelled)
+ if (result is { Canceled: false } && _dataGrid != null)
{
- await _basePage!.ReloadAsync();
+ await _dataGrid.ReloadServerData();
}
}
@@ -199,9 +202,9 @@
var dialog = DialogService.Show($"جزئیات پرداخت دستی #{model.Id}", parameters, options);
var result = await dialog.Result;
- if (!result.Cancelled)
+ if (result is { Canceled: false } && _dataGrid != null)
{
- await _basePage!.ReloadAsync();
+ await _dataGrid.ReloadServerData();
}
}
diff --git a/src/BackOffice/Pages/Payment/Transactions.razor b/src/BackOffice/Pages/Payment/Transactions.razor
index 633104f..157d337 100644
--- a/src/BackOffice/Pages/Payment/Transactions.razor
+++ b/src/BackOffice/Pages/Payment/Transactions.razor
@@ -35,7 +35,7 @@
مدیریت تراکنشها
-
diff --git a/src/BackOffice/Pages/Payment/Transactions.razor.cs b/src/BackOffice/Pages/Payment/Transactions.razor.cs
index dc7b4e6..0dd1825 100644
--- a/src/BackOffice/Pages/Payment/Transactions.razor.cs
+++ b/src/BackOffice/Pages/Payment/Transactions.razor.cs
@@ -6,6 +6,7 @@ namespace BackOffice.Pages.Payment;
public partial class Transactions
{
private BasePageComponent? _basePage;
+ private MudDataGrid? _dataGrid;
private DateTime? _fromDate;
private DateTime? _toDate;
@@ -24,20 +25,20 @@ public partial class Transactions
};
}
- private Task OnFilterSubmit()
+ private async Task OnFilterSubmit()
{
- _basePage?.ReloadGrid();
- return Task.CompletedTask;
+ if (_dataGrid != null)
+ await _dataGrid.ReloadServerData();
}
- private Task OnFilterCleared()
+ private async Task OnFilterCleared()
{
_fromDate = null;
_toDate = null;
_statusFilter = null;
_typeFilter = null;
- _basePage?.ReloadGrid();
- return Task.CompletedTask;
+ if (_dataGrid != null)
+ await _dataGrid.ReloadServerData();
}
private void OpenDetails(TransactionModel model)
diff --git a/src/BackOffice/Pages/Products/BulkEdit.razor b/src/BackOffice/Pages/Products/BulkEdit.razor
index 4f911a4..ff2a177 100644
--- a/src/BackOffice/Pages/Products/BulkEdit.razor
+++ b/src/BackOffice/Pages/Products/BulkEdit.razor
@@ -74,8 +74,8 @@
-
+
diff --git a/src/BackOffice/Pages/Products/BulkEdit.razor.cs b/src/BackOffice/Pages/Products/BulkEdit.razor.cs
index 2e37b4c..a63d7a3 100644
--- a/src/BackOffice/Pages/Products/BulkEdit.razor.cs
+++ b/src/BackOffice/Pages/Products/BulkEdit.razor.cs
@@ -1,9 +1,9 @@
+using BackOffice.BFF.Products.Protobuf.Protos;
using BackOffice.BFF.Products.Protobuf.Protos.Products;
-using CMSMicroservice.Protobuf.Protos;
-using Google.Protobuf.WellKnownTypes;
using Microsoft.AspNetCore.Components;
using MudBlazor;
using DataModel = BackOffice.BFF.Products.Protobuf.Protos.Products.GetAllProductsByFilterResponseModel;
+using PaginationState = BackOffice.BFF.Protobuf.Common.PaginationState;
namespace BackOffice.Pages.Products;
@@ -157,12 +157,12 @@ public partial class BulkEdit
if (_newDiscount.HasValue)
{
- update.NewDiscount = new Int32Value { Value = _newDiscount.Value };
+ update.NewDiscount = _newDiscount.Value;
}
if (_newClubDiscountPercent.HasValue)
{
- update.NewClubDiscountPercent = new Int32Value { Value = _newClubDiscountPercent.Value };
+ update.NewClubDiscountPercent = _newClubDiscountPercent.Value;
}
priceRequest.Products.Add(update);
diff --git a/src/BackOffice/Pages/Products/ProductsMainPage.razor b/src/BackOffice/Pages/Products/ProductsMainPage.razor
index 979f188..15aa2f4 100644
--- a/src/BackOffice/Pages/Products/ProductsMainPage.razor
+++ b/src/BackOffice/Pages/Products/ProductsMainPage.razor
@@ -104,8 +104,8 @@
-
+
diff --git a/src/BackOffice/Pages/Products/ProductsMainPage.razor.cs b/src/BackOffice/Pages/Products/ProductsMainPage.razor.cs
index 3659432..88d20a8 100644
--- a/src/BackOffice/Pages/Products/ProductsMainPage.razor.cs
+++ b/src/BackOffice/Pages/Products/ProductsMainPage.razor.cs
@@ -1,4 +1,5 @@
using BackOffice.BFF.Products.Protobuf.Protos.Products;
+using BackOffice.BFF.Protobuf.Common;
using BackOffice.Common.BaseComponents;
using BackOffice.Common.Utilities;
// TODO: Uncomment when Tag proto project is created
@@ -119,7 +120,7 @@ public partial class ProductsMainPage
var exportRequest = new GetAllProductsByFilterRequest
{
Filter = _request.Filter ?? new GetAllProductsByFilterFilter(),
- PaginationState = new CMSMicroservice.Protobuf.Protos.PaginationState
+ PaginationState = new PaginationState
{
PageNumber = 1,
PageSize = 1000
@@ -162,6 +163,9 @@ public partial class ProductsMainPage
}
}
+ // TODO: Re-enable when CreateProductDialog and UpdateProductDialog are available
+ // These dialogs need ImageFile/ThumbnailFile fields in proto
+ /*
public async Task Update(DataModel model)
{
var parameters = new DialogParameters { { x => x.Model, model.Adapt() } };
@@ -175,6 +179,12 @@ public partial class ProductsMainPage
Snackbar.Add("عملیات با موفقیت انجام شد", Severity.Success);
}
}
+ */
+
+ public async Task Update(DataModel model)
+ {
+ Snackbar.Add("ویرایش محصول موقتاً غیرفعال است - در حال توسعه", Severity.Warning);
+ }
private async Task OnDelete(DataModel model)
{
@@ -198,6 +208,8 @@ public partial class ProductsMainPage
await _gridData.ReloadServerData();
}
+ // TODO: Re-enable when CreateProductDialog is available
+ /*
public async Task CreateNew()
{
var dialog = await DialogService.ShowAsync("افزودن محصول", new DialogParameters { { x => x.Model, new CreateNewProductsRequest() } }, new DialogOptions { CloseButton = true, FullWidth = true, MaxWidth = MaxWidth.Small });
@@ -208,6 +220,12 @@ public partial class ProductsMainPage
Snackbar.Add("عملیات با موفقیت انجام شد", Severity.Success);
}
}
+ */
+
+ public async Task CreateNew()
+ {
+ Snackbar.Add("افزودن محصول موقتاً غیرفعال است - در حال توسعه", Severity.Warning);
+ }
public async Task OnFilterSubmit()
{
@@ -224,15 +242,18 @@ public partial class ProductsMainPage
ReLoadData();
}
+ // TODO: Enable when GalleryDialog is working (needs AddProductImageAsync/RemoveProductImageAsync in proto)
public async Task OpenGallery(DataModel model)
{
- var parameters = new DialogParameters
- {
- { x => x.ProductId, model.Id },
- { x => x.ProductTitle, model.Title }
- };
- await DialogService.ShowAsync("گالری تصاویر", parameters,
- new DialogOptions { CloseButton = true, FullWidth = true, MaxWidth = MaxWidth.Medium });
+ // var parameters = new DialogParameters
+ // {
+ // { x => x.ProductId, model.Id },
+ // { x => x.ProductTitle, model.Title }
+ // };
+ // await DialogService.ShowAsync("گالری تصاویر", parameters,
+ // new DialogOptions { CloseButton = true, FullWidth = true, MaxWidth = MaxWidth.Medium });
+ Snackbar.Add("گالری تصاویر در حال توسعه است", Severity.Info);
+ await Task.CompletedTask;
}
public void OpenCategoryMapping(DataModel model)
diff --git a/src/BackOffice/Pages/PublicMessages/Components/MessageFormDialog.razor b/src/BackOffice/Pages/PublicMessages/Components/MessageFormDialog.razor
index 289679c..26bd4ad 100644
--- a/src/BackOffice/Pages/PublicMessages/Components/MessageFormDialog.razor
+++ b/src/BackOffice/Pages/PublicMessages/Components/MessageFormDialog.razor
@@ -1,4 +1,5 @@
@using BackOffice.Services.PublicMessage
+@using MudBlazor
@@ -47,41 +48,15 @@
Variant="Variant.Outlined" />
-
-
+
+
- @if (!string.IsNullOrEmpty(Model.ImageUrl))
- {
-
-
-
- }
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
-
@if (!Model.PublishImmediately)
@@ -132,7 +120,7 @@
@code {
- [CascadingParameter] MudDialogInstance MudDialog { get; set; } = null!;
+ [CascadingParameter] IMudDialogInstance MudDialog { get; set; } = null!;
[Parameter] public MessageFormModel Model { get; set; } = new();
[Parameter] public bool IsEditMode { get; set; }
@@ -183,10 +171,10 @@
public string Content { get; set; } = string.Empty;
public MessageType Type { get; set; } = MessageType.Announcement;
public int Priority { get; set; } = 1;
- public string? ImageUrl { get; set; }
- public string? ActionUrl { get; set; }
- public string? ActionText { get; set; }
+ public DateTime? StartsAt { get; set; }
public DateTime? ExpiresAt { get; set; }
+ public bool IsDismissible { get; set; } = true;
+ public string? TargetAudience { get; set; }
public List? Tags { get; set; }
public bool PublishImmediately { get; set; } = false;
}
diff --git a/src/BackOffice/Pages/PublicMessages/Components/MessageTemplatesDialog.razor b/src/BackOffice/Pages/PublicMessages/Components/MessageTemplatesDialog.razor
index 6497c8c..1ca0b07 100644
--- a/src/BackOffice/Pages/PublicMessages/Components/MessageTemplatesDialog.razor
+++ b/src/BackOffice/Pages/PublicMessages/Components/MessageTemplatesDialog.razor
@@ -1,5 +1,6 @@
@using Blazored.LocalStorage
@using BackOffice.Services.PublicMessage
+@using MudBlazor
@using static BackOffice.Pages.PublicMessages.Components.MessageFormDialog
@inject ILocalStorageService LocalStorage
@@ -62,7 +63,7 @@
-
+
@GetTypeText(context.Item.Type)
@@ -107,7 +108,7 @@
@code {
- [CascadingParameter] MudDialogInstance MudDialog { get; set; } = default!;
+ [CascadingParameter] IMudDialogInstance MudDialog { get; set; } = default!;
[Parameter] public EventCallback OnTemplateSelected { get; set; }
private const string StorageKey = "PublicMessageTemplates";
diff --git a/src/BackOffice/Pages/PublicMessages/Components/MessageViewDialog.razor b/src/BackOffice/Pages/PublicMessages/Components/MessageViewDialog.razor
index d29edbb..0a1ca6b 100644
--- a/src/BackOffice/Pages/PublicMessages/Components/MessageViewDialog.razor
+++ b/src/BackOffice/Pages/PublicMessages/Components/MessageViewDialog.razor
@@ -1,4 +1,5 @@
@using BackOffice.Services.PublicMessage
+@using MudBlazor
@@ -13,43 +14,26 @@
-
-
+
+
@GetTypeText(Message.Type)
-
-
+
+
@GetStatusText(Message.Status)
-
+
-
-
- @Message.ViewCount بازدید
-
-
-
- @if (!string.IsNullOrEmpty(Message.ImageUrl))
- {
-
-
-
- }
-
@@ -58,22 +42,6 @@
-
- @if (!string.IsNullOrEmpty(Message.ActionUrl))
- {
-
-
-
- @(string.IsNullOrEmpty(Message.ActionText) ? "مشاهده بیشتر" : Message.ActionText)
-
-
-
- }
-
@if (Message.Tags?.Any() == true)
{
@@ -82,36 +50,62 @@
تگها:
@foreach (var tag in Message.Tags)
{
- @tag
+ @tag
}
}
+
+
+
+
+ @if (!string.IsNullOrEmpty(Message.TargetAudience))
+ {
+
+ مخاطب هدف:
+ @Message.TargetAudience
+
+ }
+
+ قابل رد کردن:
+ @(Message.IsDismissible ? "بله" : "خیر")
+
+
+
+
+
-
+
تاریخ ایجاد:
- @Message.CreatedAt.ToString("yyyy/MM/dd HH:mm")
+ @(Message.Created?.ToString("yyyy/MM/dd HH:mm") ?? "-")
+ @if (Message.StartsAt.HasValue)
+ {
+
+ شروع نمایش:
+ @Message.StartsAt.Value.ToString("yyyy/MM/dd HH:mm")
+
+ }
@if (Message.PublishedAt.HasValue)
{
-
+
تاریخ انتشار:
@Message.PublishedAt.Value.ToString("yyyy/MM/dd HH:mm")
}
@if (Message.ExpiresAt.HasValue)
{
-
+
تاریخ انقضا:
@Message.ExpiresAt.Value.ToString("yyyy/MM/dd")
@if (Message.ExpiresAt.Value < DateTime.Now)
{
- منقضی شده
+ منقضی شده
}
@@ -127,7 +121,7 @@
@code {
- [CascadingParameter] MudDialogInstance MudDialog { get; set; } = null!;
+ [CascadingParameter] IMudDialogInstance MudDialog { get; set; } = null!;
[Parameter] public PublicMessageDetailsDto Message { get; set; } = null!;
private void Close()
diff --git a/src/BackOffice/Pages/PublicMessages/PublicMessagesMainPage.razor b/src/BackOffice/Pages/PublicMessages/PublicMessagesMainPage.razor
index e5f0083..8f30828 100644
--- a/src/BackOffice/Pages/PublicMessages/PublicMessagesMainPage.razor
+++ b/src/BackOffice/Pages/PublicMessages/PublicMessagesMainPage.razor
@@ -78,76 +78,69 @@
Dense="true"
Class="mt-4">
-
+
-
- @GetTypeText(context.Item.Type)
+
+ @context.Item.TypeName
-
+
+ @context.Item.PriorityName
+
-
- @GetStatusText(context.Item.Status)
+
+ @context.Item.StatusName
-
+
-
-
-
- @context.Item.ViewCount
-
-
-
+
+ OnClick="@(() => ViewMessage(context.Item.Id))">
مشاهده
+ OnClick="@(() => OpenEditDialog(context.Item.Id))">
ویرایش
@if (context.Item.Status == MessageStatus.Draft)
{
+ OnClick="@(() => PublishMessage(context.Item.Id))">
انتشار
}
@if (context.Item.Status == MessageStatus.Published)
{
+ OnClick="@(() => ArchiveMessage(context.Item.Id))">
بایگانی
}
+ OnClick="@(() => DeleteMessage(context.Item.Id))">
حذف
@@ -198,12 +191,12 @@
{
var filter = new MessageFilterDto
{
- SearchQuery = _searchQuery,
Status = _statusFilter,
Type = _typeFilter
};
- _messages = await PublicMessageService.GetMessagesAsync(filter);
+ var (messages, totalCount) = await PublicMessageService.GetMessagesAsync(filter);
+ _messages = messages;
Snackbar.Add("پیامها بارگذاری شدند", Severity.Success);
}
catch (Exception ex)
@@ -224,17 +217,17 @@
private async Task OpenCreateDialog()
{
var model = new MessageFormModel();
- var parameters = new DialogParameters
+ var parameters = new DialogParameters
{
- { "Model", model },
- { "IsEditMode", false }
+ { x => x.Model, model },
+ { x => x.IsEditMode, false }
};
var options = new DialogOptions { MaxWidth = MaxWidth.Medium, FullWidth = true };
var dialog = await DialogService.ShowAsync("ایجاد پیام جدید", parameters, options);
var result = await dialog.Result;
- if (!result.Canceled && result.Data is MessageFormModel formData)
+ if (result is { Canceled: false, Data: MessageFormModel formData })
{
try
{
@@ -244,18 +237,15 @@
Content = formData.Content,
Type = formData.Type,
Priority = formData.Priority,
- ImageUrl = formData.ImageUrl,
- ActionUrl = formData.ActionUrl,
- ActionText = formData.ActionText,
+ StartsAt = formData.StartsAt,
ExpiresAt = formData.ExpiresAt,
- Tags = formData.Tags,
- PublishImmediately = formData.PublishImmediately
+ IsDismissible = formData.IsDismissible,
+ TargetAudience = formData.TargetAudience,
+ Tags = formData.Tags
};
await PublicMessageService.CreateAsync(dto);
- Snackbar.Add(
- formData.PublishImmediately ? "پیام با موفقیت ایجاد و منتشر شد" : "پیام به صورت پیشنویس ذخیره شد",
- Severity.Success);
+ Snackbar.Add("پیام به صورت پیشنویس ذخیره شد", Severity.Success);
await LoadMessages();
}
catch (Exception ex)
@@ -282,24 +272,24 @@
Content = message.Content,
Type = message.Type,
Priority = message.Priority,
- ImageUrl = message.ImageUrl,
- ActionUrl = message.ActionUrl,
- ActionText = message.ActionText,
+ StartsAt = message.StartsAt,
ExpiresAt = message.ExpiresAt,
+ IsDismissible = message.IsDismissible,
+ TargetAudience = message.TargetAudience,
Tags = message.Tags
};
- var parameters = new DialogParameters
+ var parameters = new DialogParameters
{
- { "Model", model },
- { "IsEditMode", true }
+ { x => x.Model, model },
+ { x => x.IsEditMode, true }
};
var options = new DialogOptions { MaxWidth = MaxWidth.Medium, FullWidth = true };
var dialog = await DialogService.ShowAsync("ویرایش پیام", parameters, options);
var result = await dialog.Result;
- if (!result.Canceled && result.Data is MessageFormModel formData)
+ if (result is { Canceled: false, Data: MessageFormModel formData })
{
var dto = new UpdatePublicMessageDto
{
@@ -307,10 +297,10 @@
Content = formData.Content,
Type = formData.Type,
Priority = formData.Priority,
- ImageUrl = formData.ImageUrl,
- ActionUrl = formData.ActionUrl,
- ActionText = formData.ActionText,
+ StartsAt = formData.StartsAt,
ExpiresAt = formData.ExpiresAt,
+ IsDismissible = formData.IsDismissible,
+ TargetAudience = formData.TargetAudience,
Tags = formData.Tags
};
@@ -336,7 +326,7 @@
return;
}
- var parameters = new DialogParameters { { "Message", message } };
+ var parameters = new DialogParameters { { x => x.Message, message } };
var options = new DialogOptions { MaxWidth = MaxWidth.Large, FullWidth = true };
await DialogService.ShowAsync("مشاهده پیام", parameters, options);
}
diff --git a/src/BackOffice/Pages/Tag/Components/AssignTagsDialog.razor b/src/BackOffice/Pages/Tag/Components/AssignTagsDialog.razor
index 3b8dff2..0c06714 100644
--- a/src/BackOffice/Pages/Tag/Components/AssignTagsDialog.razor
+++ b/src/BackOffice/Pages/Tag/Components/AssignTagsDialog.razor
@@ -10,7 +10,8 @@
@foreach (var tag in _currentTags)
{
-
@@ -21,7 +22,7 @@
}
else
{
-
+
هیچ تگی برای این محصول ثبت نشده است.
}
diff --git a/src/BackOffice/Pages/Tag/Components/AssignTagsDialog.razor.cs b/src/BackOffice/Pages/Tag/Components/AssignTagsDialog.razor.cs
index 2b646e6..987a7f2 100644
--- a/src/BackOffice/Pages/Tag/Components/AssignTagsDialog.razor.cs
+++ b/src/BackOffice/Pages/Tag/Components/AssignTagsDialog.razor.cs
@@ -6,7 +6,7 @@ namespace BackOffice.Pages.Tag.Components;
public partial class AssignTagsDialog
{
- [CascadingParameter] MudDialogInstance DialogInstance { get; set; } = default!;
+ [CascadingParameter] IMudDialogInstance DialogInstance { get; set; } = default!;
[Inject] public ITagService TagService { get; set; } = default!;
[Parameter] public long ProductId { get; set; }
diff --git a/src/BackOffice/Pages/Tag/Components/TagEditDialog.razor b/src/BackOffice/Pages/Tag/Components/TagEditDialog.razor
index bcac015..de5ba78 100644
--- a/src/BackOffice/Pages/Tag/Components/TagEditDialog.razor
+++ b/src/BackOffice/Pages/Tag/Components/TagEditDialog.razor
@@ -21,7 +21,7 @@
Text="@Model.Description" />
-
+
فعال
diff --git a/src/BackOffice/Pages/Tag/Components/TagEditDialog.razor.cs b/src/BackOffice/Pages/Tag/Components/TagEditDialog.razor.cs
index eb9e1f4..5fdeb70 100644
--- a/src/BackOffice/Pages/Tag/Components/TagEditDialog.razor.cs
+++ b/src/BackOffice/Pages/Tag/Components/TagEditDialog.razor.cs
@@ -6,7 +6,7 @@ namespace BackOffice.Pages.Tag.Components;
public partial class TagEditDialog
{
- [CascadingParameter] MudDialogInstance DialogInstance { get; set; } = default!;
+ [CascadingParameter] IMudDialogInstance DialogInstance { get; set; } = default!;
[Inject] public ITagService TagService { get; set; } = default!;
[Parameter] public TagEditDto Model { get; set; } = new();
diff --git a/src/BackOffice/Pages/Tag/TagManagementPage.razor b/src/BackOffice/Pages/Tag/TagManagementPage.razor
index 3d23c7e..6c57ff3 100644
--- a/src/BackOffice/Pages/Tag/TagManagementPage.razor
+++ b/src/BackOffice/Pages/Tag/TagManagementPage.razor
@@ -58,7 +58,7 @@
-
@(context.Item.IsActive ? "فعال" : "غیرفعال")
diff --git a/src/BackOffice/Pages/Tag/TagManagementPage.razor.cs b/src/BackOffice/Pages/Tag/TagManagementPage.razor.cs
index 43f45f3..e8a8bbe 100644
--- a/src/BackOffice/Pages/Tag/TagManagementPage.razor.cs
+++ b/src/BackOffice/Pages/Tag/TagManagementPage.razor.cs
@@ -1,12 +1,14 @@
using BackOffice.Services.Tag;
+using BackOffice.Pages.Tag.Components;
using Microsoft.AspNetCore.Components;
+using Microsoft.AspNetCore.Components.Web;
using MudBlazor;
namespace BackOffice.Pages.Tag;
public partial class TagManagementPage
{
- [Inject] public ITagService TagService { get; set; } = default!;
+ // TagService is injected in the .razor file
private MudDataGrid _grid = default!;
private string? _search;
@@ -51,8 +53,8 @@ public partial class TagManagementPage
{
var parameters = new DialogParameters
{
- { x => x.Model, new TagEditDto() },
- { x => x.IsEditMode, false }
+ { nameof(TagEditDialog.Model), new TagEditDto() },
+ { nameof(TagEditDialog.IsEditMode), false }
};
var dialog = await DialogService.ShowAsync("ایجاد تگ جدید", parameters,
@@ -79,9 +81,9 @@ public partial class TagManagementPage
var parameters = new DialogParameters
{
- { x => x.Model, dto },
- { x => x.TagId, item.Id },
- { x => x.IsEditMode, true }
+ { nameof(TagEditDialog.Model), dto },
+ { nameof(TagEditDialog.TagId), item.Id },
+ { nameof(TagEditDialog.IsEditMode), true }
};
var dialog = await DialogService.ShowAsync("ویرایش تگ", parameters,
diff --git a/src/BackOffice/Pages/UserOrder/Components/ApplyDiscountDialog.razor.cs b/src/BackOffice/Pages/UserOrder/Components/ApplyDiscountDialog.razor.cs
index 8ead1ba..31e6c55 100644
--- a/src/BackOffice/Pages/UserOrder/Components/ApplyDiscountDialog.razor.cs
+++ b/src/BackOffice/Pages/UserOrder/Components/ApplyDiscountDialog.razor.cs
@@ -8,7 +8,7 @@ public partial class ApplyDiscountDialog
{
[CascadingParameter] public IMudDialogInstance MudDialog { get; set; } = default!;
[Inject] public UserOrderContract.UserOrderContractClient UserOrderContract { get; set; } = default!;
- [Inject] public ISnackbar Snackbar { get; set; } = default!;
+ // Snackbar is injected via _Imports.razor
[Parameter] public long OrderId { get; set; }
diff --git a/src/BackOffice/Pages/UserOrder/Components/CancelOrderDialog.razor.cs b/src/BackOffice/Pages/UserOrder/Components/CancelOrderDialog.razor.cs
index 3a71a49..f3e5061 100644
--- a/src/BackOffice/Pages/UserOrder/Components/CancelOrderDialog.razor.cs
+++ b/src/BackOffice/Pages/UserOrder/Components/CancelOrderDialog.razor.cs
@@ -8,7 +8,7 @@ public partial class CancelOrderDialog
{
[CascadingParameter] public IMudDialogInstance MudDialog { get; set; } = default!;
[Inject] public UserOrderContract.UserOrderContractClient UserOrderContract { get; set; } = default!;
- [Inject] public ISnackbar Snackbar { get; set; } = default!;
+ // Snackbar is injected via _Imports.razor
[Parameter] public long OrderId { get; set; }
diff --git a/src/BackOffice/Pages/UserOrder/Components/ChangeOrderStatusDialog.razor.cs b/src/BackOffice/Pages/UserOrder/Components/ChangeOrderStatusDialog.razor.cs
index 4181565..30df047 100644
--- a/src/BackOffice/Pages/UserOrder/Components/ChangeOrderStatusDialog.razor.cs
+++ b/src/BackOffice/Pages/UserOrder/Components/ChangeOrderStatusDialog.razor.cs
@@ -8,7 +8,7 @@ public partial class ChangeOrderStatusDialog
{
[CascadingParameter] public IMudDialogInstance MudDialog { get; set; } = default!;
[Inject] public UserOrderContract.UserOrderContractClient UserOrderContract { get; set; } = default!;
- [Inject] public ISnackbar Snackbar { get; set; } = default!;
+ // Snackbar is injected via _Imports.razor
[Parameter] public long OrderId { get; set; }
[Parameter] public int CurrentStatus { get; set; }
diff --git a/src/BackOffice/Pages/UserOrder/Components/UserOrderDetailsDialog.razor.cs b/src/BackOffice/Pages/UserOrder/Components/UserOrderDetailsDialog.razor.cs
index 2e67de2..1314716 100644
--- a/src/BackOffice/Pages/UserOrder/Components/UserOrderDetailsDialog.razor.cs
+++ b/src/BackOffice/Pages/UserOrder/Components/UserOrderDetailsDialog.razor.cs
@@ -93,7 +93,8 @@ public partial class UserOrderDetailsDialog
new()
{
Title = "ثبت سفارش",
- State = _model.PaymentStatus == PaymentStatus.None && _model.DeliveryStatus == DeliveryStatus.None ? StepState.Active : StepState.Completed,
+ // PaymentStatus doesn't have None - using DeliveryStatus only for initial state
+ State = (int)_model.DeliveryStatus == 0 ? StepState.Active : StepState.Completed,
Icon = "1"
},
new()
diff --git a/src/BackOffice/Services/DiscountCategory/DiscountCategoryService.cs b/src/BackOffice/Services/DiscountCategory/DiscountCategoryService.cs
index f8e634e..c013e09 100644
--- a/src/BackOffice/Services/DiscountCategory/DiscountCategoryService.cs
+++ b/src/BackOffice/Services/DiscountCategory/DiscountCategoryService.cs
@@ -4,36 +4,25 @@ namespace BackOffice.Services.DiscountCategory;
public class DiscountCategoryService : IDiscountCategoryService
{
- private readonly DiscountCategoriesContract.DiscountCategoriesContractClient _client;
+ private readonly DiscountCategoryContract.DiscountCategoryContractClient _client;
- public DiscountCategoryService(DiscountCategoriesContract.DiscountCategoriesContractClient client)
+ public DiscountCategoryService(DiscountCategoryContract.DiscountCategoryContractClient client)
{
_client = client;
}
- public async Task> GetCategoriesAsync(bool? isActive = null)
+ public async Task> GetCategoriesAsync(long? parentCategoryId = null, bool? isActive = null)
{
- var request = new GetDiscountCategoriesRequest
- {
- IsActive = isActive
- };
+ var request = new GetDiscountCategoriesRequest();
+
+ if (parentCategoryId.HasValue)
+ request.ParentCategoryId = parentCategoryId.Value;
+ if (isActive.HasValue)
+ request.IsActive = isActive.Value;
var response = await _client.GetDiscountCategoriesAsync(request);
- var categories = response.Categories.Select(c => new DiscountCategoryDto
- {
- CategoryId = c.CategoryId,
- ParentCategoryId = c.ParentCategoryId > 0 ? c.ParentCategoryId : null,
- Title = c.Title,
- Description = c.Description,
- DisplayOrder = c.DisplayOrder,
- IsActive = c.IsActive,
- CreatedAt = c.CreatedAt.ToDateTime(),
- UpdatedAt = c.UpdatedAt?.ToDateTime()
- }).ToList();
-
- // Build tree structure
- return BuildCategoryTree(categories);
+ return MapCategories(response.Categories);
}
public async Task GetByIdAsync(long id)
@@ -47,13 +36,19 @@ public class DiscountCategoryService : IDiscountCategoryService
{
var request = new CreateDiscountCategoryRequest
{
- ParentCategoryId = dto.ParentCategoryId ?? 0,
+ Name = dto.Name,
Title = dto.Title,
- Description = dto.Description ?? string.Empty,
- DisplayOrder = dto.DisplayOrder,
+ SortOrder = dto.SortOrder,
IsActive = dto.IsActive
};
+ if (!string.IsNullOrEmpty(dto.Description))
+ request.Description = dto.Description;
+ if (!string.IsNullOrEmpty(dto.ImagePath))
+ request.ImagePath = dto.ImagePath;
+ if (dto.ParentCategoryId.HasValue)
+ request.ParentCategoryId = dto.ParentCategoryId.Value;
+
var response = await _client.CreateDiscountCategoryAsync(request);
return response.CategoryId;
}
@@ -63,13 +58,19 @@ public class DiscountCategoryService : IDiscountCategoryService
var request = new UpdateDiscountCategoryRequest
{
CategoryId = id,
- ParentCategoryId = dto.ParentCategoryId ?? 0,
+ Name = dto.Name,
Title = dto.Title,
- Description = dto.Description ?? string.Empty,
- DisplayOrder = dto.DisplayOrder,
+ SortOrder = dto.SortOrder,
IsActive = dto.IsActive
};
+ if (!string.IsNullOrEmpty(dto.Description))
+ request.Description = dto.Description;
+ if (!string.IsNullOrEmpty(dto.ImagePath))
+ request.ImagePath = dto.ImagePath;
+ if (dto.ParentCategoryId.HasValue)
+ request.ParentCategoryId = dto.ParentCategoryId.Value;
+
await _client.UpdateDiscountCategoryAsync(request);
}
@@ -79,27 +80,28 @@ public class DiscountCategoryService : IDiscountCategoryService
await _client.DeleteDiscountCategoryAsync(request);
}
- private List BuildCategoryTree(List categories)
+ private List MapCategories(IEnumerable protoCategories)
{
- var categoryDict = categories.ToDictionary(c => c.CategoryId);
-
- foreach (var category in categories)
+ return protoCategories.Select(c => new DiscountCategoryDto
{
- if (category.ParentCategoryId.HasValue &&
- categoryDict.TryGetValue(category.ParentCategoryId.Value, out var parent))
- {
- parent.Children.Add(category);
- }
- }
-
- return categories.Where(c => !c.ParentCategoryId.HasValue).ToList();
+ Id = c.Id,
+ Name = c.Name,
+ Title = c.Title,
+ Description = c.Description,
+ ImagePath = c.ImagePath,
+ ParentCategoryId = c.ParentCategoryId,
+ SortOrder = c.SortOrder,
+ IsActive = c.IsActive,
+ ProductCount = c.ProductCount,
+ Children = c.Children.Count > 0 ? MapCategories(c.Children) : new()
+ }).ToList();
}
private DiscountCategoryDto? FindCategoryById(List categories, long id)
{
foreach (var category in categories)
{
- if (category.CategoryId == id)
+ if (category.Id == id)
return category;
var found = FindCategoryById(category.Children.ToList(), id);
diff --git a/src/BackOffice/Services/DiscountCategory/IDiscountCategoryService.cs b/src/BackOffice/Services/DiscountCategory/IDiscountCategoryService.cs
index 234020b..366cbeb 100644
--- a/src/BackOffice/Services/DiscountCategory/IDiscountCategoryService.cs
+++ b/src/BackOffice/Services/DiscountCategory/IDiscountCategoryService.cs
@@ -2,7 +2,7 @@ namespace BackOffice.Services.DiscountCategory;
public interface IDiscountCategoryService
{
- Task> GetCategoriesAsync(bool? isActive = null);
+ Task> GetCategoriesAsync(long? parentCategoryId = null, bool? isActive = null);
Task GetByIdAsync(long id);
Task CreateAsync(CreateDiscountCategoryDto dto);
Task UpdateAsync(long id, UpdateDiscountCategoryDto dto);
@@ -11,34 +11,39 @@ public interface IDiscountCategoryService
public class DiscountCategoryDto
{
- public long CategoryId { get; set; }
- public long? ParentCategoryId { get; set; }
+ public long Id { get; set; }
+ public string Name { get; set; } = string.Empty;
public string Title { get; set; } = string.Empty;
public string? Description { get; set; }
- public int DisplayOrder { get; set; }
+ public string? ImagePath { get; set; }
+ public long? ParentCategoryId { get; set; }
+ public int SortOrder { get; set; }
public bool IsActive { get; set; }
- public DateTime CreatedAt { get; set; }
- public DateTime? UpdatedAt { get; set; }
+ public int ProductCount { get; set; }
// For UI tree view
public bool IsExpanded { get; set; } = false;
- public HashSet Children { get; set; } = new();
+ public List Children { get; set; } = new();
}
public class CreateDiscountCategoryDto
{
- public long? ParentCategoryId { get; set; }
+ public string Name { get; set; } = string.Empty;
public string Title { get; set; } = string.Empty;
public string? Description { get; set; }
- public int DisplayOrder { get; set; } = 0;
+ public string? ImagePath { get; set; }
+ public long? ParentCategoryId { get; set; }
+ public int SortOrder { get; set; } = 0;
public bool IsActive { get; set; } = true;
}
public class UpdateDiscountCategoryDto
{
- public long? ParentCategoryId { get; set; }
+ public string Name { get; set; } = string.Empty;
public string Title { get; set; } = string.Empty;
public string? Description { get; set; }
- public int DisplayOrder { get; set; }
+ public string? ImagePath { get; set; }
+ public long? ParentCategoryId { get; set; }
+ public int SortOrder { get; set; }
public bool IsActive { get; set; }
}
diff --git a/src/BackOffice/Services/DiscountOrder/DiscountOrderService.cs b/src/BackOffice/Services/DiscountOrder/DiscountOrderService.cs
index 211638c..8d89fef 100644
--- a/src/BackOffice/Services/DiscountOrder/DiscountOrderService.cs
+++ b/src/BackOffice/Services/DiscountOrder/DiscountOrderService.cs
@@ -1,119 +1,149 @@
using BackOffice.BFF.DiscountOrder.Protobuf.Protos.DiscountOrder;
-using Google.Protobuf.WellKnownTypes;
+using ProtoDeliveryStatus = BackOffice.BFF.DiscountOrder.Protobuf.Protos.DiscountOrder.DeliveryStatus;
namespace BackOffice.Services.DiscountOrder;
public class DiscountOrderService : IDiscountOrderService
{
- private readonly DiscountOrdersContract.DiscountOrdersContractClient _client;
+ private readonly DiscountOrderContract.DiscountOrderContractClient _client;
- public DiscountOrderService(DiscountOrdersContract.DiscountOrdersContractClient client)
+ public DiscountOrderService(DiscountOrderContract.DiscountOrderContractClient client)
{
_client = client;
}
- public async Task> GetOrdersAsync(OrderFilterDto? filter = null)
+ public async Task<(List Orders, int TotalCount, int TotalPages)> GetOrdersAsync(OrderFilterDto? filter = null)
{
filter ??= new OrderFilterDto();
var request = new GetUserOrdersRequest
{
- UserId = 0, // Admin gets all orders
+ UserId = filter.UserId ?? 0, // 0 = admin gets all orders
PageNumber = filter.PageNumber,
PageSize = filter.PageSize
};
- // Note: Current proto may not have all filter fields, adjust as needed
+ if (filter.PaymentCompleted.HasValue)
+ request.PaymentCompleted = filter.PaymentCompleted.Value;
+ if (filter.Status.HasValue)
+ request.DeliveryStatus = (int)MapToProtoStatus(filter.Status.Value);
+
var response = await _client.GetUserOrdersAsync(request);
- var orders = response.Orders.Select(o => new DiscountOrderDto
+ var orders = response.Models.Select(o => new DiscountOrderDto
{
- OrderId = o.OrderId,
- UserId = o.UserId,
- UserFullName = o.UserFullName ?? "N/A",
- CreatedAt = o.CreatedAt.ToDateTime(),
- TotalAmount = o.TotalAmount,
- TotalDiscount = o.TotalDiscount,
- FinalAmount = o.FinalAmount,
- Status = (OrderStatus)o.Status,
- IsPaid = o.IsPaid,
- PaidAt = o.PaidAt?.ToDateTime()
+ Id = o.Id,
+ OrderNumber = o.OrderNumber,
+ TotalPrice = o.TotalPrice,
+ DiscountBalanceUsed = o.DiscountBalanceUsed,
+ GatewayAmount = o.GatewayAmount,
+ PaymentCompleted = o.PaymentCompleted,
+ Status = MapFromProtoStatus(o.DeliveryStatus, o.PaymentCompleted),
+ TrackingCode = o.TrackingCode,
+ ItemsCount = o.ItemsCount,
+ Created = o.Created?.ToDateTime()
}).ToList();
- // Apply client-side filters (until proto supports them)
- if (!string.IsNullOrEmpty(filter.SearchQuery))
- {
- var query = filter.SearchQuery.ToLower();
- orders = orders.Where(o =>
- o.OrderId.ToString().Contains(query) ||
- o.UserFullName.ToLower().Contains(query)
- ).ToList();
- }
+ var totalCount = (int)(response.MetaData?.TotalCount ?? 0);
+ var totalPages = (int)(response.MetaData?.TotalPage ?? 0);
- if (filter.Status.HasValue)
- {
- orders = orders.Where(o => o.Status == filter.Status.Value).ToList();
- }
-
- if (filter.FromDate.HasValue)
- {
- orders = orders.Where(o => o.CreatedAt >= filter.FromDate.Value).ToList();
- }
-
- if (filter.ToDate.HasValue)
- {
- orders = orders.Where(o => o.CreatedAt <= filter.ToDate.Value).ToList();
- }
-
- return orders;
+ return (orders, totalCount, totalPages);
}
- public async Task GetByIdAsync(long id)
+ public async Task GetByIdAsync(long orderId, long? userId = null)
{
- var request = new GetOrderByIdRequest { OrderId = id };
+ var request = new GetOrderByIdRequest
+ {
+ OrderId = orderId,
+ UserId = userId ?? 0
+ };
var response = await _client.GetOrderByIdAsync(request);
- if (response.Order == null)
+ if (response == null || response.Id == 0)
return null;
return new DiscountOrderDetailsDto
{
- OrderId = response.Order.OrderId,
- UserId = response.Order.UserId,
- UserFullName = response.Order.UserFullName ?? "N/A",
- CreatedAt = response.Order.CreatedAt.ToDateTime(),
- TotalAmount = response.Order.TotalAmount,
- TotalDiscount = response.Order.TotalDiscount,
- FinalAmount = response.Order.FinalAmount,
- Status = (OrderStatus)response.Order.Status,
- IsPaid = response.Order.IsPaid,
- PaidAt = response.Order.PaidAt?.ToDateTime(),
- ShippingAddress = response.Order.ShippingAddress,
- PaymentTransactionCode = response.Order.PaymentTransactionCode,
- AdminNote = response.Order.AdminNote,
- Items = response.Order.Items.Select(item => new OrderItemDto
+ Id = response.Id,
+ UserId = response.UserId,
+ OrderNumber = response.OrderNumber,
+ Address = response.Address != null ? new AddressInfoDto
+ {
+ Id = response.Address.Id,
+ Title = response.Address.Title,
+ Address = response.Address.Address,
+ PostalCode = response.Address.PostalCode,
+ Phone = response.Address.Phone
+ } : null,
+ TotalPrice = response.TotalPrice,
+ DiscountBalanceUsed = response.DiscountBalanceUsed,
+ GatewayAmount = response.GatewayAmount,
+ PaymentCompleted = response.PaymentCompleted,
+ TransactionId = response.TransactionId,
+ Status = MapFromProtoStatus(response.DeliveryStatus, response.PaymentCompleted),
+ TrackingCode = response.TrackingCode,
+ Notes = response.Notes,
+ AdminNotes = response.AdminNotes,
+ Items = response.Items.Select(item => new OrderItemDto
{
ProductId = item.ProductId,
ProductTitle = item.ProductTitle,
- ProductThumbnail = item.ProductThumbnail,
- Quantity = item.Quantity,
UnitPrice = item.UnitPrice,
- DiscountPercent = item.DiscountPercent,
- DiscountedPrice = item.DiscountedPrice,
- TotalPrice = item.TotalPrice
- }).ToList()
+ MaxDiscountPercent = item.MaxDiscountPercent,
+ Count = item.Count,
+ TotalPrice = item.TotalPrice,
+ DiscountAmount = item.DiscountAmount,
+ FinalPrice = item.FinalPrice
+ }).ToList(),
+ Created = response.Created?.ToDateTime(),
+ LastModified = response.LastModified?.ToDateTime()
};
}
- public async Task UpdateStatusAsync(long id, UpdateOrderStatusDto dto)
+ public async Task UpdateStatusAsync(long orderId, UpdateOrderStatusDto dto)
{
var request = new UpdateOrderStatusRequest
{
- OrderId = id,
- Status = (int)dto.Status,
- AdminNote = dto.AdminNote ?? string.Empty
+ OrderId = orderId,
+ DeliveryStatus = MapToProtoStatus(dto.Status)
};
+ if (!string.IsNullOrEmpty(dto.TrackingCode))
+ request.TrackingCode = dto.TrackingCode;
+ if (!string.IsNullOrEmpty(dto.AdminNotes))
+ request.AdminNotes = dto.AdminNotes;
+
await _client.UpdateOrderStatusAsync(request);
}
+
+ // Map from UI OrderStatus to Proto DeliveryStatus
+ private static ProtoDeliveryStatus MapToProtoStatus(OrderStatus status)
+ {
+ return status switch
+ {
+ OrderStatus.Pending => ProtoDeliveryStatus.DeliveryPending,
+ OrderStatus.Paid => ProtoDeliveryStatus.DeliveryPending, // Paid but not processed yet
+ OrderStatus.Processing => ProtoDeliveryStatus.DeliveryProcessing,
+ OrderStatus.Shipped => ProtoDeliveryStatus.DeliveryShipped,
+ OrderStatus.Delivered => ProtoDeliveryStatus.DeliveryDelivered,
+ OrderStatus.Cancelled => ProtoDeliveryStatus.DeliveryCancelled,
+ OrderStatus.Returned => ProtoDeliveryStatus.DeliveryCancelled, // Treat as cancelled
+ _ => ProtoDeliveryStatus.DeliveryPending
+ };
+ }
+
+ // Map from Proto DeliveryStatus to UI OrderStatus
+ private static OrderStatus MapFromProtoStatus(ProtoDeliveryStatus status, bool paymentCompleted)
+ {
+ return status switch
+ {
+ ProtoDeliveryStatus.DeliveryPending when paymentCompleted => OrderStatus.Paid,
+ ProtoDeliveryStatus.DeliveryPending => OrderStatus.Pending,
+ ProtoDeliveryStatus.DeliveryProcessing => OrderStatus.Processing,
+ ProtoDeliveryStatus.DeliveryShipped => OrderStatus.Shipped,
+ ProtoDeliveryStatus.DeliveryDelivered => OrderStatus.Delivered,
+ ProtoDeliveryStatus.DeliveryCancelled => OrderStatus.Cancelled,
+ _ => OrderStatus.Pending
+ };
+ }
}
diff --git a/src/BackOffice/Services/DiscountOrder/IDiscountOrderService.cs b/src/BackOffice/Services/DiscountOrder/IDiscountOrderService.cs
index 1a549a0..91fbfa8 100644
--- a/src/BackOffice/Services/DiscountOrder/IDiscountOrderService.cs
+++ b/src/BackOffice/Services/DiscountOrder/IDiscountOrderService.cs
@@ -2,68 +2,90 @@ namespace BackOffice.Services.DiscountOrder;
public interface IDiscountOrderService
{
- Task> GetOrdersAsync(OrderFilterDto? filter = null);
- Task GetByIdAsync(long id);
- Task UpdateStatusAsync(long id, UpdateOrderStatusDto dto);
+ Task<(List Orders, int TotalCount, int TotalPages)> GetOrdersAsync(OrderFilterDto? filter = null);
+ Task GetByIdAsync(long orderId, long? userId = null);
+ Task UpdateStatusAsync(long orderId, UpdateOrderStatusDto dto);
}
public class OrderFilterDto
{
- public string? SearchQuery { get; set; }
+ public long? UserId { get; set; }
+ public bool? PaymentCompleted { get; set; }
public OrderStatus? Status { get; set; }
- public DateTime? FromDate { get; set; }
- public DateTime? ToDate { get; set; }
public int PageNumber { get; set; } = 1;
public int PageSize { get; set; } = 20;
}
+// For backward compatibility with UI - maps to proto DeliveryStatus
public enum OrderStatus
{
- Pending = 0,
- Paid = 1,
- Processing = 2,
- Shipped = 3,
- Delivered = 4,
- Cancelled = 5,
- Returned = 6
+ Pending = 0, // DELIVERY_PENDING
+ Paid = 1, // Not in proto - handle in service
+ Processing = 2, // DELIVERY_PROCESSING
+ Shipped = 3, // DELIVERY_SHIPPED
+ Delivered = 4, // DELIVERY_DELIVERED
+ Cancelled = 5, // DELIVERY_CANCELLED
+ Returned = 6 // Not in proto - handle in service
}
public class DiscountOrderDto
{
- public long OrderId { get; set; }
- public long UserId { get; set; }
- public string UserFullName { get; set; } = string.Empty;
- public DateTime CreatedAt { get; set; }
- public long TotalAmount { get; set; }
- public long TotalDiscount { get; set; }
- public long FinalAmount { get; set; }
+ public long Id { get; set; }
+ public string OrderNumber { get; set; } = string.Empty;
+ public long TotalPrice { get; set; }
+ public long DiscountBalanceUsed { get; set; }
+ public long GatewayAmount { get; set; }
+ public bool PaymentCompleted { get; set; }
public OrderStatus Status { get; set; }
- public bool IsPaid { get; set; }
- public DateTime? PaidAt { get; set; }
+ public string? TrackingCode { get; set; }
+ public int ItemsCount { get; set; }
+ public DateTime? Created { get; set; }
}
-public class DiscountOrderDetailsDto : DiscountOrderDto
+public class DiscountOrderDetailsDto
{
- public string? ShippingAddress { get; set; }
- public string? PaymentTransactionCode { get; set; }
- public string? AdminNote { get; set; }
+ public long Id { get; set; }
+ public long UserId { get; set; }
+ public string OrderNumber { get; set; } = string.Empty;
+ public AddressInfoDto? Address { get; set; }
+ public long TotalPrice { get; set; }
+ public long DiscountBalanceUsed { get; set; }
+ public long GatewayAmount { get; set; }
+ public bool PaymentCompleted { get; set; }
+ public string? TransactionId { get; set; }
+ public OrderStatus Status { get; set; }
+ public string? TrackingCode { get; set; }
+ public string? Notes { get; set; }
+ public string? AdminNotes { get; set; }
public List Items { get; set; } = new();
+ public DateTime? Created { get; set; }
+ public DateTime? LastModified { get; set; }
+}
+
+public class AddressInfoDto
+{
+ public long Id { get; set; }
+ public string Title { get; set; } = string.Empty;
+ public string Address { get; set; } = string.Empty;
+ public string PostalCode { get; set; } = string.Empty;
+ public string? Phone { get; set; }
}
public class OrderItemDto
{
public long ProductId { get; set; }
public string ProductTitle { get; set; } = string.Empty;
- public string? ProductThumbnail { get; set; }
- public int Quantity { get; set; }
public long UnitPrice { get; set; }
- public int DiscountPercent { get; set; }
- public long DiscountedPrice { get; set; }
+ public int MaxDiscountPercent { get; set; }
+ public int Count { get; set; }
public long TotalPrice { get; set; }
+ public long DiscountAmount { get; set; }
+ public long FinalPrice { get; set; }
}
public class UpdateOrderStatusDto
{
public OrderStatus Status { get; set; }
- public string? AdminNote { get; set; }
+ public string? TrackingCode { get; set; }
+ public string? AdminNotes { get; set; }
}
diff --git a/src/BackOffice/Services/DiscountProduct/DiscountProductService.cs b/src/BackOffice/Services/DiscountProduct/DiscountProductService.cs
index a36d304..06b6a86 100644
--- a/src/BackOffice/Services/DiscountProduct/DiscountProductService.cs
+++ b/src/BackOffice/Services/DiscountProduct/DiscountProductService.cs
@@ -1,73 +1,96 @@
using BackOffice.BFF.DiscountProduct.Protobuf.Protos.DiscountProduct;
+using Google.Protobuf.WellKnownTypes;
namespace BackOffice.Services.DiscountProduct;
public class DiscountProductService : IDiscountProductService
{
- private readonly DiscountProductsContract.DiscountProductsContractClient _client;
+ private readonly DiscountProductContract.DiscountProductContractClient _client;
- public DiscountProductService(DiscountProductsContract.DiscountProductsContractClient client)
+ public DiscountProductService(DiscountProductContract.DiscountProductContractClient client)
{
_client = client;
}
- public async Task> GetProductsAsync(ProductFilterDto? filter = null)
+ public async Task<(List Products, int TotalCount, int TotalPages)> GetProductsAsync(ProductFilterDto? filter = null)
{
filter ??= new ProductFilterDto();
var request = new GetDiscountProductsRequest
{
- SearchQuery = filter.SearchQuery ?? string.Empty,
- CategoryId = filter.CategoryId ?? 0,
- IsActive = filter.IsActive,
- InStock = filter.InStock,
PageNumber = filter.PageNumber,
PageSize = filter.PageSize
};
+ if (!string.IsNullOrEmpty(filter.SearchQuery))
+ request.SearchQuery = filter.SearchQuery;
+ if (filter.CategoryId.HasValue)
+ request.CategoryId = filter.CategoryId.Value;
+ if (filter.MinPrice.HasValue)
+ request.MinPrice = filter.MinPrice.Value;
+ if (filter.MaxPrice.HasValue)
+ request.MaxPrice = filter.MaxPrice.Value;
+ if (filter.IsActive.HasValue)
+ request.IsActive = filter.IsActive.Value;
+ if (filter.InStock.HasValue)
+ request.InStock = filter.InStock.Value;
+
var response = await _client.GetDiscountProductsAsync(request);
- return response.Products.Select(p => new DiscountProductDto
+ var products = response.Models.Select(p => new DiscountProductDto
{
- ProductId = p.ProductId,
+ Id = p.Id,
Title = p.Title,
- Description = p.Description,
- ThumbnailPath = p.ThumbnailPath,
+ ShortInformation = p.ShortInfomation,
Price = p.Price,
MaxDiscountPercent = p.MaxDiscountPercent,
- Stock = p.Stock,
- SaleCount = p.SaleCount,
+ ImagePath = p.ImagePath,
+ ThumbnailPath = p.ThumbnailPath,
+ RemainingCount = p.RemainingCount,
+ ViewCount = p.ViewCount,
IsActive = p.IsActive,
- CategoryId = p.CategoryId > 0 ? p.CategoryId : null,
- CategoryTitle = p.CategoryTitle,
- CreatedAt = p.CreatedAt.ToDateTime(),
- UpdatedAt = p.UpdatedAt?.ToDateTime()
+ Created = p.Created?.ToDateTime()
}).ToList();
+
+ var totalCount = (int)(response.MetaData?.TotalCount ?? 0);
+ var totalPages = (int)(response.MetaData?.TotalPage ?? 0);
+
+ return (products, totalCount, totalPages);
}
- public async Task GetByIdAsync(long id)
+ public async Task GetByIdAsync(long id, long? userId = null)
{
- var request = new GetDiscountProductByIdRequest { ProductId = id };
+ var request = new GetDiscountProductByIdRequest
+ {
+ ProductId = id,
+ UserId = userId ?? 0
+ };
var response = await _client.GetDiscountProductByIdAsync(request);
- if (response.Product == null)
+ if (response == null || response.Id == 0)
return null;
- return new DiscountProductDto
+ return new DiscountProductDetailDto
{
- ProductId = response.Product.ProductId,
- Title = response.Product.Title,
- Description = response.Product.Description,
- ThumbnailPath = response.Product.ThumbnailPath,
- Price = response.Product.Price,
- MaxDiscountPercent = response.Product.MaxDiscountPercent,
- Stock = response.Product.Stock,
- SaleCount = response.Product.SaleCount,
- IsActive = response.Product.IsActive,
- CategoryId = response.Product.CategoryId > 0 ? response.Product.CategoryId : null,
- CategoryTitle = response.Product.CategoryTitle,
- CreatedAt = response.Product.CreatedAt.ToDateTime(),
- UpdatedAt = response.Product.UpdatedAt?.ToDateTime()
+ Id = response.Id,
+ Title = response.Title,
+ ShortInformation = response.ShortInfomation,
+ FullInformation = response.FullInformation,
+ Price = response.Price,
+ MaxDiscountPercent = response.MaxDiscountPercent,
+ ImagePath = response.ImagePath,
+ ThumbnailPath = response.ThumbnailPath,
+ RemainingCount = response.RemainingCount,
+ ViewCount = response.ViewCount,
+ SortOrder = response.SortOrder,
+ IsActive = response.IsActive,
+ Categories = response.Categories.Select(c => new CategoryInfoDto
+ {
+ Id = c.Id,
+ Name = c.Name,
+ Title = c.Title
+ }).ToList(),
+ Created = response.Created?.ToDateTime()
};
}
@@ -76,18 +99,20 @@ public class DiscountProductService : IDiscountProductService
var request = new CreateDiscountProductRequest
{
Title = dto.Title,
- Description = dto.Description ?? string.Empty,
- ThumbnailPath = dto.ThumbnailPath ?? string.Empty,
+ ShortInfomation = dto.ShortInformation ?? string.Empty,
+ FullInformation = dto.FullInformation ?? string.Empty,
Price = dto.Price,
MaxDiscountPercent = dto.MaxDiscountPercent,
- Stock = dto.Stock,
- IsActive = dto.IsActive,
- CategoryId = dto.CategoryId ?? 0
+ ImagePath = dto.ImagePath ?? string.Empty,
+ ThumbnailPath = dto.ThumbnailPath ?? string.Empty,
+ InitialCount = dto.InitialCount,
+ SortOrder = dto.SortOrder,
+ IsActive = dto.IsActive
};
- if (dto.Tags != null)
+ if (dto.CategoryIds != null)
{
- request.Tags.AddRange(dto.Tags);
+ request.CategoryIds.AddRange(dto.CategoryIds);
}
var response = await _client.CreateDiscountProductAsync(request);
@@ -100,18 +125,19 @@ public class DiscountProductService : IDiscountProductService
{
ProductId = id,
Title = dto.Title,
- Description = dto.Description ?? string.Empty,
- ThumbnailPath = dto.ThumbnailPath ?? string.Empty,
+ ShortInfomation = dto.ShortInformation ?? string.Empty,
+ FullInformation = dto.FullInformation ?? string.Empty,
Price = dto.Price,
MaxDiscountPercent = dto.MaxDiscountPercent,
- Stock = dto.Stock,
- IsActive = dto.IsActive,
- CategoryId = dto.CategoryId ?? 0
+ ImagePath = dto.ImagePath ?? string.Empty,
+ ThumbnailPath = dto.ThumbnailPath ?? string.Empty,
+ SortOrder = dto.SortOrder,
+ IsActive = dto.IsActive
};
- if (dto.Tags != null)
+ if (dto.CategoryIds != null)
{
- request.Tags.AddRange(dto.Tags);
+ request.CategoryIds.AddRange(dto.CategoryIds);
}
await _client.UpdateDiscountProductAsync(request);
diff --git a/src/BackOffice/Services/DiscountProduct/IDiscountProductService.cs b/src/BackOffice/Services/DiscountProduct/IDiscountProductService.cs
index 5a6d7be..6600a2b 100644
--- a/src/BackOffice/Services/DiscountProduct/IDiscountProductService.cs
+++ b/src/BackOffice/Services/DiscountProduct/IDiscountProductService.cs
@@ -2,8 +2,8 @@ namespace BackOffice.Services.DiscountProduct;
public interface IDiscountProductService
{
- Task> GetProductsAsync(ProductFilterDto? filter = null);
- Task GetByIdAsync(long id);
+ Task<(List Products, int TotalCount, int TotalPages)> GetProductsAsync(ProductFilterDto? filter = null);
+ Task GetByIdAsync(long id, long? userId = null);
Task CreateAsync(CreateDiscountProductDto dto);
Task UpdateAsync(long id, UpdateDiscountProductDto dto);
Task DeleteAsync(long id);
@@ -13,6 +13,8 @@ public class ProductFilterDto
{
public string? SearchQuery { get; set; }
public long? CategoryId { get; set; }
+ public long? MinPrice { get; set; }
+ public long? MaxPrice { get; set; }
public bool? IsActive { get; set; }
public bool? InStock { get; set; }
public int PageNumber { get; set; } = 1;
@@ -21,43 +23,69 @@ public class ProductFilterDto
public class DiscountProductDto
{
- public long ProductId { get; set; }
+ public long Id { get; set; }
public string Title { get; set; } = string.Empty;
- public string? Description { get; set; }
- public string? ThumbnailPath { get; set; }
+ public string? ShortInformation { get; set; }
public long Price { get; set; }
public int MaxDiscountPercent { get; set; }
- public int Stock { get; set; }
- public int SaleCount { get; set; }
+ public string? ImagePath { get; set; }
+ public string? ThumbnailPath { get; set; }
+ public int RemainingCount { get; set; }
+ public int ViewCount { get; set; }
public bool IsActive { get; set; }
- public long? CategoryId { get; set; }
- public string? CategoryTitle { get; set; }
- public DateTime CreatedAt { get; set; }
- public DateTime? UpdatedAt { get; set; }
+ public DateTime? Created { get; set; }
+}
+
+public class DiscountProductDetailDto
+{
+ public long Id { get; set; }
+ public string Title { get; set; } = string.Empty;
+ public string? ShortInformation { get; set; }
+ public string? FullInformation { get; set; }
+ public long Price { get; set; }
+ public int MaxDiscountPercent { get; set; }
+ public string? ImagePath { get; set; }
+ public string? ThumbnailPath { get; set; }
+ public int RemainingCount { get; set; }
+ public int ViewCount { get; set; }
+ public int SortOrder { get; set; }
+ public bool IsActive { get; set; }
+ public List Categories { get; set; } = new();
+ public DateTime? Created { get; set; }
+}
+
+public class CategoryInfoDto
+{
+ public long Id { get; set; }
+ public string Name { get; set; } = string.Empty;
+ public string Title { get; set; } = string.Empty;
}
public class CreateDiscountProductDto
{
public string Title { get; set; } = string.Empty;
- public string? Description { get; set; }
- public string? ThumbnailPath { get; set; }
+ public string? ShortInformation { get; set; }
+ public string? FullInformation { get; set; }
public long Price { get; set; }
public int MaxDiscountPercent { get; set; }
- public int Stock { get; set; }
+ public string? ImagePath { get; set; }
+ public string? ThumbnailPath { get; set; }
+ public int InitialCount { get; set; }
+ public int SortOrder { get; set; }
public bool IsActive { get; set; } = true;
- public long? CategoryId { get; set; }
- public List? Tags { get; set; }
+ public List? CategoryIds { get; set; }
}
public class UpdateDiscountProductDto
{
public string Title { get; set; } = string.Empty;
- public string? Description { get; set; }
- public string? ThumbnailPath { get; set; }
+ public string? ShortInformation { get; set; }
+ public string? FullInformation { get; set; }
public long Price { get; set; }
public int MaxDiscountPercent { get; set; }
- public int Stock { get; set; }
+ public string? ImagePath { get; set; }
+ public string? ThumbnailPath { get; set; }
+ public int SortOrder { get; set; }
public bool IsActive { get; set; }
- public long? CategoryId { get; set; }
- public List? Tags { get; set; }
+ public List? CategoryIds { get; set; }
}
diff --git a/src/BackOffice/Services/PublicMessage/IPublicMessageService.cs b/src/BackOffice/Services/PublicMessage/IPublicMessageService.cs
index 9b7570f..2f06fa2 100644
--- a/src/BackOffice/Services/PublicMessage/IPublicMessageService.cs
+++ b/src/BackOffice/Services/PublicMessage/IPublicMessageService.cs
@@ -2,7 +2,7 @@ namespace BackOffice.Services.PublicMessage;
public interface IPublicMessageService
{
- Task> GetMessagesAsync(MessageFilterDto? filter = null);
+ Task<(List Messages, int TotalCount)> GetMessagesAsync(MessageFilterDto? filter = null);
Task GetByIdAsync(long id);
Task CreateAsync(CreatePublicMessageDto dto);
Task UpdateAsync(long id, UpdatePublicMessageDto dto);
@@ -13,7 +13,6 @@ public interface IPublicMessageService
public class MessageFilterDto
{
- public string? SearchQuery { get; set; }
public MessageStatus? Status { get; set; }
public MessageType? Type { get; set; }
public int PageNumber { get; set; } = 1;
@@ -37,24 +36,39 @@ public enum MessageStatus
public class PublicMessageDto
{
- public long MessageId { get; set; }
+ public long Id { get; set; }
public string Title { get; set; } = string.Empty;
public MessageType Type { get; set; }
+ public string TypeName { get; set; } = string.Empty;
public int Priority { get; set; }
+ public string PriorityName { get; set; } = string.Empty;
public MessageStatus Status { get; set; }
- public DateTime CreatedAt { get; set; }
- public DateTime? PublishedAt { get; set; }
+ public string StatusName { get; set; } = string.Empty;
+ public DateTime? StartsAt { get; set; }
public DateTime? ExpiresAt { get; set; }
- public int ViewCount { get; set; }
+ public DateTime? Created { get; set; }
}
-public class PublicMessageDetailsDto : PublicMessageDto
+public class PublicMessageDetailsDto
{
+ public long Id { get; set; }
+ public string Title { get; set; } = string.Empty;
public string Content { get; set; } = string.Empty;
- public string? ImageUrl { get; set; }
- public string? ActionUrl { get; set; }
- public string? ActionText { get; set; }
+ public MessageType Type { get; set; }
+ public string TypeName { get; set; } = string.Empty;
+ public int Priority { get; set; }
+ public string PriorityName { get; set; } = string.Empty;
+ public MessageStatus Status { get; set; }
+ public string StatusName { get; set; } = string.Empty;
+ public DateTime? StartsAt { get; set; }
+ public DateTime? ExpiresAt { get; set; }
+ public DateTime? PublishedAt { get; set; }
+ public DateTime? ArchivedAt { get; set; }
+ public bool IsDismissible { get; set; }
+ public string? TargetAudience { get; set; }
public List Tags { get; set; } = new();
+ public DateTime? Created { get; set; }
+ public DateTime? LastModified { get; set; }
}
public class CreatePublicMessageDto
@@ -63,12 +77,11 @@ public class CreatePublicMessageDto
public string Content { get; set; } = string.Empty;
public MessageType Type { get; set; }
public int Priority { get; set; } = 1;
- public string? ImageUrl { get; set; }
- public string? ActionUrl { get; set; }
- public string? ActionText { get; set; }
+ public DateTime? StartsAt { get; set; }
public DateTime? ExpiresAt { get; set; }
+ public bool IsDismissible { get; set; } = true;
+ public string? TargetAudience { get; set; }
public List? Tags { get; set; }
- public bool PublishImmediately { get; set; } = false;
}
public class UpdatePublicMessageDto
@@ -77,9 +90,9 @@ public class UpdatePublicMessageDto
public string Content { get; set; } = string.Empty;
public MessageType Type { get; set; }
public int Priority { get; set; }
- public string? ImageUrl { get; set; }
- public string? ActionUrl { get; set; }
- public string? ActionText { get; set; }
+ public DateTime? StartsAt { get; set; }
public DateTime? ExpiresAt { get; set; }
+ public bool IsDismissible { get; set; }
+ public string? TargetAudience { get; set; }
public List? Tags { get; set; }
}
diff --git a/src/BackOffice/Services/PublicMessage/PublicMessageService.cs b/src/BackOffice/Services/PublicMessage/PublicMessageService.cs
index 68a5403..b9e5bab 100644
--- a/src/BackOffice/Services/PublicMessage/PublicMessageService.cs
+++ b/src/BackOffice/Services/PublicMessage/PublicMessageService.cs
@@ -1,86 +1,85 @@
-using BackOffice.BFF.PublicMessage.Protobuf.Protos.PublicMessage;
+using BackOffice.BFF.PublicMessage.Protobuf;
using Google.Protobuf.WellKnownTypes;
namespace BackOffice.Services.PublicMessage;
public class PublicMessageService : IPublicMessageService
{
- private readonly PublicMessagesContract.PublicMessagesContractClient _client;
+ private readonly PublicMessageContract.PublicMessageContractClient _client;
- public PublicMessageService(PublicMessagesContract.PublicMessagesContractClient client)
+ public PublicMessageService(PublicMessageContract.PublicMessageContractClient client)
{
_client = client;
}
- public async Task> GetMessagesAsync(MessageFilterDto? filter = null)
+ public async Task<(List Messages, int TotalCount)> GetMessagesAsync(MessageFilterDto? filter = null)
{
filter ??= new MessageFilterDto();
- var request = new GetPublicMessagesRequest
+ var request = new GetAllMessagesRequest
{
PageNumber = filter.PageNumber,
PageSize = filter.PageSize
};
- var response = await _client.GetPublicMessagesAsync(request);
-
- var messages = response.Messages.Select(m => new PublicMessageDto
- {
- MessageId = m.MessageId,
- Title = m.Title,
- Type = (MessageType)m.Type,
- Priority = m.Priority,
- Status = (MessageStatus)m.Status,
- CreatedAt = m.CreatedAt.ToDateTime(),
- PublishedAt = m.PublishedAt?.ToDateTime(),
- ExpiresAt = m.ExpiresAt?.ToDateTime(),
- ViewCount = m.ViewCount
- }).ToList();
-
- // Apply client-side filters
- if (!string.IsNullOrEmpty(filter.SearchQuery))
- {
- var query = filter.SearchQuery.ToLower();
- messages = messages.Where(m => m.Title.ToLower().Contains(query)).ToList();
- }
-
if (filter.Status.HasValue)
{
- messages = messages.Where(m => m.Status == filter.Status.Value).ToList();
+ request.Status = (int)filter.Status.Value;
}
if (filter.Type.HasValue)
{
- messages = messages.Where(m => m.Type == filter.Type.Value).ToList();
+ request.MessageType = (int)filter.Type.Value;
}
- return messages;
+ var response = await _client.GetAllMessagesAsync(request);
+
+ var messages = response.Messages.Select(m => new PublicMessageDto
+ {
+ Id = m.MessageId,
+ Title = m.Title,
+ Type = (MessageType)m.MessageType,
+ TypeName = m.MessageTypeName,
+ Priority = m.Priority,
+ PriorityName = m.PriorityName,
+ Status = (MessageStatus)m.Status,
+ StatusName = m.StatusName,
+ StartsAt = m.StartsAt?.ToDateTime(),
+ ExpiresAt = m.ExpiresAt?.ToDateTime(),
+ Created = m.Created?.ToDateTime()
+ }).ToList();
+
+ return (messages, response.TotalCount);
}
public async Task GetByIdAsync(long id)
{
- var request = new GetPublicMessageByIdRequest { MessageId = id };
- var response = await _client.GetPublicMessageByIdAsync(request);
+ var request = new GetPublicMessageRequest { MessageId = id };
+ var response = await _client.GetPublicMessageAsync(request);
- if (response.Message == null)
+ if (response.MessageId == 0)
return null;
return new PublicMessageDetailsDto
{
- MessageId = response.Message.MessageId,
- Title = response.Message.Title,
- Content = response.Message.Content,
- Type = (MessageType)response.Message.Type,
- Priority = response.Message.Priority,
- Status = (MessageStatus)response.Message.Status,
- ImageUrl = response.Message.ImageUrl,
- ActionUrl = response.Message.ActionUrl,
- ActionText = response.Message.ActionText,
- CreatedAt = response.Message.CreatedAt.ToDateTime(),
- PublishedAt = response.Message.PublishedAt?.ToDateTime(),
- ExpiresAt = response.Message.ExpiresAt?.ToDateTime(),
- ViewCount = response.Message.ViewCount,
- Tags = response.Message.Tags.ToList()
+ Id = response.MessageId,
+ Title = response.Title,
+ Content = response.Content,
+ Type = (MessageType)response.MessageType,
+ TypeName = response.MessageTypeName,
+ Priority = response.Priority,
+ PriorityName = response.PriorityName,
+ Status = (MessageStatus)response.Status,
+ StatusName = response.StatusName,
+ StartsAt = response.StartsAt?.ToDateTime(),
+ ExpiresAt = response.ExpiresAt?.ToDateTime(),
+ PublishedAt = response.PublishedAt?.ToDateTime(),
+ ArchivedAt = response.ArchivedAt?.ToDateTime(),
+ IsDismissible = response.IsDismissible,
+ TargetAudience = response.TargetAudience,
+ Tags = response.Tags.ToList(),
+ Created = response.Created?.ToDateTime(),
+ LastModified = response.LastModified?.ToDateTime()
};
}
@@ -90,26 +89,28 @@ public class PublicMessageService : IPublicMessageService
{
Title = dto.Title,
Content = dto.Content,
- Type = (int)dto.Type,
+ MessageType = (int)dto.Type,
Priority = dto.Priority,
- ImageUrl = dto.ImageUrl ?? string.Empty,
- ActionUrl = dto.ActionUrl ?? string.Empty,
- ActionText = dto.ActionText ?? string.Empty,
- ExpiresAt = dto.ExpiresAt.HasValue ? Timestamp.FromDateTime(dto.ExpiresAt.Value.ToUniversalTime()) : null
+ IsDismissible = dto.IsDismissible,
+ TargetAudience = dto.TargetAudience ?? string.Empty
};
+ if (dto.StartsAt.HasValue)
+ {
+ request.StartsAt = Timestamp.FromDateTime(dto.StartsAt.Value.ToUniversalTime());
+ }
+
+ if (dto.ExpiresAt.HasValue)
+ {
+ request.ExpiresAt = Timestamp.FromDateTime(dto.ExpiresAt.Value.ToUniversalTime());
+ }
+
if (dto.Tags != null)
{
request.Tags.AddRange(dto.Tags);
}
var response = await _client.CreatePublicMessageAsync(request);
-
- if (dto.PublishImmediately && response.MessageId > 0)
- {
- await PublishAsync(response.MessageId);
- }
-
return response.MessageId;
}
@@ -120,14 +121,22 @@ public class PublicMessageService : IPublicMessageService
MessageId = id,
Title = dto.Title,
Content = dto.Content,
- Type = (int)dto.Type,
+ MessageType = (int)dto.Type,
Priority = dto.Priority,
- ImageUrl = dto.ImageUrl ?? string.Empty,
- ActionUrl = dto.ActionUrl ?? string.Empty,
- ActionText = dto.ActionText ?? string.Empty,
- ExpiresAt = dto.ExpiresAt.HasValue ? Timestamp.FromDateTime(dto.ExpiresAt.Value.ToUniversalTime()) : null
+ IsDismissible = dto.IsDismissible,
+ TargetAudience = dto.TargetAudience ?? string.Empty
};
+ if (dto.StartsAt.HasValue)
+ {
+ request.StartsAt = Timestamp.FromDateTime(dto.StartsAt.Value.ToUniversalTime());
+ }
+
+ if (dto.ExpiresAt.HasValue)
+ {
+ request.ExpiresAt = Timestamp.FromDateTime(dto.ExpiresAt.Value.ToUniversalTime());
+ }
+
if (dto.Tags != null)
{
request.Tags.AddRange(dto.Tags);
@@ -144,13 +153,13 @@ public class PublicMessageService : IPublicMessageService
public async Task PublishAsync(long id)
{
- var request = new PublishPublicMessageRequest { MessageId = id };
- await _client.PublishPublicMessageAsync(request);
+ var request = new PublishMessageRequest { MessageId = id };
+ await _client.PublishMessageAsync(request);
}
public async Task ArchiveAsync(long id)
{
- var request = new ArchivePublicMessageRequest { MessageId = id };
- await _client.ArchivePublicMessageAsync(request);
+ var request = new ArchiveMessageRequest { MessageId = id };
+ await _client.ArchiveMessageAsync(request);
}
}
diff --git a/src/BackOffice/Services/Tag/TagService.cs b/src/BackOffice/Services/Tag/TagService.cs
index 401d740..e603790 100644
--- a/src/BackOffice/Services/Tag/TagService.cs
+++ b/src/BackOffice/Services/Tag/TagService.cs
@@ -19,7 +19,7 @@ public class TagService : ITagService
{
var request = new BackOffice.BFF.Tag.Protobuf.Protos.Tag.GetAllTagByFilterRequest
{
- PaginationState = new CMSMicroservice.Protobuf.Protos.PaginationState
+ PaginationState = new BackOffice.BFF.Tag.Protobuf.Protos.Tag.PaginationState
{
PageNumber = filter.PageNumber,
PageSize = filter.PageSize
@@ -131,7 +131,7 @@ public class TagService : ITagService
{
var request = new BackOffice.BFF.ProductTag.Protobuf.Protos.ProductTag.GetAllProductTagByFilterRequest
{
- PaginationState = new CMSMicroservice.Protobuf.Protos.PaginationState
+ PaginationState = new BackOffice.BFF.Protobuf.Common.PaginationState
{
PageNumber = 1,
PageSize = 100