Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 516da671c6 | |||
| 45a291b529 |
@@ -11,10 +11,15 @@ public partial class App
|
|||||||
{
|
{
|
||||||
[Inject] private ILocalStorageService LocalStorage { get; set; } = default!;
|
[Inject] private ILocalStorageService LocalStorage { get; set; } = default!;
|
||||||
[Inject] private AuthService AuthService { get; set; } = default!;
|
[Inject] private AuthService AuthService { get; set; } = default!;
|
||||||
|
[Inject] private AppVersionService AppVersionService { get; set; } = default!;
|
||||||
|
|
||||||
protected override async Task OnInitializedAsync()
|
protected override async Task OnInitializedAsync()
|
||||||
{
|
{
|
||||||
await base.OnInitializedAsync();
|
await base.OnInitializedAsync();
|
||||||
|
|
||||||
|
// Check app version and clear cache if needed
|
||||||
|
await AppVersionService.CheckVersionAndClearCacheIfNeededAsync();
|
||||||
|
|
||||||
// Check for referral code in URL query parameters
|
// Check for referral code in URL query parameters
|
||||||
var uri = Navigation.ToAbsoluteUri(Navigation.Uri);
|
var uri = Navigation.ToAbsoluteUri(Navigation.Uri);
|
||||||
var query = QueryHelpers.ParseQuery(uri.Query);
|
var query = QueryHelpers.ParseQuery(uri.Query);
|
||||||
|
|||||||
@@ -20,6 +20,7 @@ using FrontOffice.BFF.NetworkMembership.Protobuf.Protos.NetworkMembership;
|
|||||||
using FrontOffice.BFF.DiscountShop.Protobuf.Protos.DiscountShop;
|
using FrontOffice.BFF.DiscountShop.Protobuf.Protos.DiscountShop;
|
||||||
using FrontOffice.BFF.City.Protobuf;
|
using FrontOffice.BFF.City.Protobuf;
|
||||||
using FrontOffice.BFF.Configuration.Protobuf.Protos.Configuration;
|
using FrontOffice.BFF.Configuration.Protobuf.Protos.Configuration;
|
||||||
|
using FrontOffice.BFF.Configuration.Protobuf.Protos.AppVersion;
|
||||||
using FrontOffice.Main.Utilities;
|
using FrontOffice.Main.Utilities;
|
||||||
|
|
||||||
namespace Microsoft.Extensions.DependencyInjection;
|
namespace Microsoft.Extensions.DependencyInjection;
|
||||||
@@ -61,6 +62,8 @@ public static class ConfigureServices
|
|||||||
services.AddScoped<ClubConfigurationService>();
|
services.AddScoped<ClubConfigurationService>();
|
||||||
services.AddScoped<NetworkMembershipService>();
|
services.AddScoped<NetworkMembershipService>();
|
||||||
services.AddScoped<CommissionService>();
|
services.AddScoped<CommissionService>();
|
||||||
|
// App Version Service for cache invalidation
|
||||||
|
services.AddScoped<AppVersionService>();
|
||||||
// Device detection: very light, dependency-free
|
// Device detection: very light, dependency-free
|
||||||
services.AddTransient<IDeviceDetector, DeviceDetector>();
|
services.AddTransient<IDeviceDetector, DeviceDetector>();
|
||||||
// PDF generation (Chromium only)
|
// PDF generation (Chromium only)
|
||||||
@@ -110,6 +113,7 @@ public static class ConfigureServices
|
|||||||
services.AddScoped(CreateAuthenticatedClient<NetworkMembershipContract.NetworkMembershipContractClient>);
|
services.AddScoped(CreateAuthenticatedClient<NetworkMembershipContract.NetworkMembershipContractClient>);
|
||||||
services.AddScoped(CreateAuthenticatedClient<DiscountShopContract.DiscountShopContractClient>);
|
services.AddScoped(CreateAuthenticatedClient<DiscountShopContract.DiscountShopContractClient>);
|
||||||
services.AddScoped(CreateAuthenticatedClient<CityContract.CityContractClient>);
|
services.AddScoped(CreateAuthenticatedClient<CityContract.CityContractClient>);
|
||||||
|
services.AddScoped(CreateAuthenticatedClient<AppVersionContract.AppVersionContractClient>);
|
||||||
|
|
||||||
return services;
|
return services;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,7 +13,7 @@
|
|||||||
<PackageReference Include="Foursat.FrontOffice.BFF.City.Protobuf" Version="0.0.2" />
|
<PackageReference Include="Foursat.FrontOffice.BFF.City.Protobuf" Version="0.0.2" />
|
||||||
<PackageReference Include="Foursat.FrontOffice.BFF.ClubMembership.Protobuf" Version="0.0.4" />
|
<PackageReference Include="Foursat.FrontOffice.BFF.ClubMembership.Protobuf" Version="0.0.4" />
|
||||||
<PackageReference Include="Foursat.FrontOffice.BFF.Commission.Protobuf" Version="0.0.3" />
|
<PackageReference Include="Foursat.FrontOffice.BFF.Commission.Protobuf" Version="0.0.3" />
|
||||||
<PackageReference Include="Foursat.FrontOffice.BFF.Configuration.Protobuf" Version="0.0.3" />
|
<PackageReference Include="Foursat.FrontOffice.BFF.Configuration.Protobuf" Version="0.0.4" />
|
||||||
<!-- <PackageReference Include="Foursat.FrontOffice.BFF.ClubMembership.Protobuf" Version="0.0.3" /> -->
|
<!-- <PackageReference Include="Foursat.FrontOffice.BFF.ClubMembership.Protobuf" Version="0.0.3" /> -->
|
||||||
<!-- <PackageReference Include="Foursat.FrontOffice.BFF.Commission.Protobuf" Version="0.0.2" /> -->
|
<!-- <PackageReference Include="Foursat.FrontOffice.BFF.Commission.Protobuf" Version="0.0.2" /> -->
|
||||||
<PackageReference Include="Foursat.FrontOffice.BFF.DiscountShop.Protobuf" Version="0.0.3" />
|
<PackageReference Include="Foursat.FrontOffice.BFF.DiscountShop.Protobuf" Version="0.0.3" />
|
||||||
|
|||||||
@@ -123,23 +123,14 @@ public partial class PackageDetail : IDisposable
|
|||||||
|
|
||||||
private async Task LoadReviewsAsync()
|
private async Task LoadReviewsAsync()
|
||||||
{
|
{
|
||||||
// TODO: Load reviews from API
|
// TODO: Load reviews from API when endpoint is available
|
||||||
_reviews = new List<Review>
|
_reviews = new List<Review>();
|
||||||
{
|
|
||||||
new() { UserName = "علی احمدی", Rating = 5, Comment = "عالی! کارمزد رو دقیق حساب میکنه و گزارشها کامل هستن.", Date = "۱۴۰۲/۱۰/۰۵" },
|
|
||||||
new() { UserName = "مریم رضایی", Rating = 4, Comment = "رابط کاربری خوبی داره، فقط سرعت بارگذاری میتونه بهتر بشه.", Date = "۱۴۰۲/۰۹/۲۲" },
|
|
||||||
new() { UserName = "حسن کریمی", Rating = 5, Comment = "پشتیبانی فوقالعاده سریع و حرفهای داشتن. پیشنهاد میکنم.", Date = "۱۴۰۲/۰۹/۱۵" }
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task LoadRelatedPackagesAsync()
|
private async Task LoadRelatedPackagesAsync()
|
||||||
{
|
{
|
||||||
// TODO: Load related packages from API
|
// TODO: Load related packages from API when endpoint is available
|
||||||
_relatedPackages = new List<RelatedPackage>
|
_relatedPackages = new List<RelatedPackage>();
|
||||||
{
|
|
||||||
new() { Id = "2", Title = "پکیج رشد", ShortDescription = "مناسب برای تیمهای در حال توسعه", Image = "images/package1.jpg", Pricing = new PricingInfo { FinalPrice = 750000 } },
|
|
||||||
new() { Id = "3", Title = "پکیج حرفهای", ShortDescription = "برای کسبوکارهای بزرگ", Image = "images/package2.jpg", Pricing = new PricingInfo { FinalPrice = 1200000 } }
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private async Task PurchasePackage()
|
private async Task PurchasePackage()
|
||||||
|
|||||||
@@ -0,0 +1,156 @@
|
|||||||
|
using FrontOffice.BFF.Configuration.Protobuf.Protos.AppVersion;
|
||||||
|
using Blazored.LocalStorage;
|
||||||
|
|
||||||
|
namespace FrontOffice.Main.Utilities;
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// سرویس مدیریت نسخه اپلیکیشن و کش
|
||||||
|
/// وقتی نسخه جدید منتشر بشه، این سرویس متوجه میشه و کش رو پاک میکنه
|
||||||
|
/// </summary>
|
||||||
|
public class AppVersionService
|
||||||
|
{
|
||||||
|
private readonly AppVersionContract.AppVersionContractClient _client;
|
||||||
|
private readonly ILocalStorageService _localStorage;
|
||||||
|
private readonly ILogger<AppVersionService> _logger;
|
||||||
|
|
||||||
|
private const string APP_NAME = "FrontOffice";
|
||||||
|
private const string LOCAL_VERSION_KEY = "app_version";
|
||||||
|
private const string LAST_CHECK_KEY = "app_version_last_check";
|
||||||
|
|
||||||
|
public AppVersionService(
|
||||||
|
AppVersionContract.AppVersionContractClient client,
|
||||||
|
ILocalStorageService localStorage,
|
||||||
|
ILogger<AppVersionService> logger)
|
||||||
|
{
|
||||||
|
_client = client;
|
||||||
|
_localStorage = localStorage;
|
||||||
|
_logger = logger;
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// بررسی نسخه اپلیکیشن و پاک کردن کش در صورت نیاز
|
||||||
|
/// </summary>
|
||||||
|
public async Task CheckVersionAndClearCacheIfNeededAsync()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// دریافت نسخه فعلی از localStorage
|
||||||
|
var localVersion = await _localStorage.GetItemAsStringAsync(LOCAL_VERSION_KEY);
|
||||||
|
|
||||||
|
// بررسی نسخه از سرور
|
||||||
|
var response = await _client.GetAppVersionAsync(new GetAppVersionRequest
|
||||||
|
{
|
||||||
|
AppName = APP_NAME,
|
||||||
|
CurrentClientVersion = localVersion
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!response.Found)
|
||||||
|
{
|
||||||
|
_logger.LogWarning("App version not found on server for {AppName}", APP_NAME);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var serverVersion = response.CurrentVersion;
|
||||||
|
|
||||||
|
// اگر نسخه جدید باشه یا پاک کردن کش لازم باشه
|
||||||
|
if (localVersion != serverVersion || response.RequiresFullCacheClear)
|
||||||
|
{
|
||||||
|
_logger.LogInformation(
|
||||||
|
"New version detected: {OldVersion} -> {NewVersion}, CacheClear: {CacheClear}",
|
||||||
|
localVersion ?? "null", serverVersion, response.RequiresFullCacheClear);
|
||||||
|
|
||||||
|
// پاک کردن کش
|
||||||
|
await ClearAllCacheAsync();
|
||||||
|
|
||||||
|
// ذخیره نسخه جدید
|
||||||
|
await _localStorage.SetItemAsStringAsync(LOCAL_VERSION_KEY, serverVersion);
|
||||||
|
await _localStorage.SetItemAsStringAsync(LAST_CHECK_KEY, DateTime.UtcNow.ToString("O"));
|
||||||
|
|
||||||
|
_logger.LogInformation("Cache cleared and version updated to {Version}", serverVersion);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "Error checking app version");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// پاک کردن همه کشهای اپلیکیشن
|
||||||
|
/// </summary>
|
||||||
|
private async Task ClearAllCacheAsync()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
// لیست کلیدهایی که باید حفظ بشن (مثل توکن و اطلاعات کاربر)
|
||||||
|
var keysToKeep = new HashSet<string>
|
||||||
|
{
|
||||||
|
"access_token",
|
||||||
|
"refresh_token",
|
||||||
|
"user_info",
|
||||||
|
"user_roles"
|
||||||
|
};
|
||||||
|
|
||||||
|
// دریافت همه کلیدها
|
||||||
|
var allKeys = await _localStorage.KeysAsync();
|
||||||
|
|
||||||
|
// پاک کردن کلیدهایی که در لیست حفظ نیستن
|
||||||
|
foreach (var key in allKeys)
|
||||||
|
{
|
||||||
|
if (!keysToKeep.Contains(key) && key != LOCAL_VERSION_KEY)
|
||||||
|
{
|
||||||
|
await _localStorage.RemoveItemAsync(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_logger.LogInformation("Local storage cache cleared, {Count} keys removed",
|
||||||
|
allKeys.Count() - keysToKeep.Count);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "Error clearing cache");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// دریافت اطلاعات نسخه فعلی
|
||||||
|
/// </summary>
|
||||||
|
public async Task<AppVersionInfo?> GetCurrentVersionInfoAsync()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
var response = await _client.GetAppVersionAsync(new GetAppVersionRequest
|
||||||
|
{
|
||||||
|
AppName = APP_NAME
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!response.Found)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
return new AppVersionInfo
|
||||||
|
{
|
||||||
|
CurrentVersion = response.CurrentVersion,
|
||||||
|
MinRequiredVersion = response.MinRequiredVersion,
|
||||||
|
RequiresUpdate = response.RequiresUpdate,
|
||||||
|
UpdateMessage = response.UpdateMessage,
|
||||||
|
ReleaseNotes = response.ReleaseNotes,
|
||||||
|
LastUpdated = response.LastUpdated?.ToDateTime()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
_logger.LogError(ex, "Error getting version info");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public class AppVersionInfo
|
||||||
|
{
|
||||||
|
public string CurrentVersion { get; set; } = string.Empty;
|
||||||
|
public string MinRequiredVersion { get; set; } = string.Empty;
|
||||||
|
public bool RequiresUpdate { get; set; }
|
||||||
|
public string? UpdateMessage { get; set; }
|
||||||
|
public string? ReleaseNotes { get; set; }
|
||||||
|
public DateTime? LastUpdated { get; set; }
|
||||||
|
}
|
||||||
@@ -35,12 +35,12 @@ public class ClubMembershipService
|
|||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
// Fallback to mock data if backend is unavailable
|
// Return empty membership if backend is unavailable
|
||||||
return new ClubMembershipDto
|
return new ClubMembershipDto
|
||||||
{
|
{
|
||||||
UserId = 1,
|
UserId = 0,
|
||||||
IsActive = false,
|
IsActive = false,
|
||||||
Status = "Inactive",
|
Status = string.Empty,
|
||||||
DaysRemaining = null
|
DaysRemaining = null
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,8 +65,8 @@ public class CommissionService
|
|||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
// Fallback to mock data if backend is unavailable
|
// Return empty list if backend is unavailable
|
||||||
return GenerateMockWeekDefinitions();
|
return new List<WeekDefinitionDto>();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -129,8 +129,14 @@ public class CommissionService
|
|||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
// Fallback to mock data if backend is unavailable
|
// Return empty response if backend is unavailable
|
||||||
return GenerateMockPayoutsResponse(weekDefinitionId, status, pageNumber, pageSize);
|
return new CommissionPayoutsResponseDto
|
||||||
|
{
|
||||||
|
Payouts = new List<CommissionPayoutDto>(),
|
||||||
|
TotalCount = 0,
|
||||||
|
PageNumber = pageNumber,
|
||||||
|
PageSize = pageSize
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -175,22 +181,22 @@ public class CommissionService
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
return CreateMockWeeklyBalance();
|
return CreateEmptyWeeklyBalance();
|
||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
return CreateMockWeeklyBalance();
|
return CreateEmptyWeeklyBalance();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#region Helper Methods
|
#region Helper Methods
|
||||||
|
|
||||||
private static WeeklyBalanceDto CreateMockWeeklyBalance()
|
private static WeeklyBalanceDto CreateEmptyWeeklyBalance()
|
||||||
{
|
{
|
||||||
return new WeeklyBalanceDto
|
return new WeeklyBalanceDto
|
||||||
{
|
{
|
||||||
WeekDefinitionId = 0,
|
WeekDefinitionId = 0,
|
||||||
WeekDisplayName = "دادهای یافت نشد",
|
WeekDisplayName = string.Empty,
|
||||||
LeftBalance = 0,
|
LeftBalance = 0,
|
||||||
RightBalance = 0,
|
RightBalance = 0,
|
||||||
MinBalance = 0,
|
MinBalance = 0,
|
||||||
@@ -198,94 +204,10 @@ public class CommissionService
|
|||||||
CalculatedCommission = 0,
|
CalculatedCommission = 0,
|
||||||
LeftCarryover = 0,
|
LeftCarryover = 0,
|
||||||
RightCarryover = 0,
|
RightCarryover = 0,
|
||||||
StartDate = DateTime.Now.AddDays(-7),
|
StartDate = DateTime.MinValue,
|
||||||
EndDate = DateTime.Now
|
EndDate = DateTime.MinValue
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private static CommissionPayoutsResponseDto GenerateMockPayoutsResponse(
|
|
||||||
long? weekDefinitionId, string? status, int pageNumber, int pageSize)
|
|
||||||
{
|
|
||||||
var allPayouts = GenerateMockPayouts(50);
|
|
||||||
|
|
||||||
var filtered = allPayouts.AsEnumerable();
|
|
||||||
if (weekDefinitionId.HasValue)
|
|
||||||
filtered = filtered.Where(p => p.WeekDefinitionId == weekDefinitionId.Value);
|
|
||||||
if (!string.IsNullOrEmpty(status))
|
|
||||||
filtered = filtered.Where(p => p.Status == status);
|
|
||||||
|
|
||||||
var total = filtered.Count();
|
|
||||||
var paged = filtered.Skip((pageNumber - 1) * pageSize).Take(pageSize).ToList();
|
|
||||||
|
|
||||||
return new CommissionPayoutsResponseDto
|
|
||||||
{
|
|
||||||
Payouts = paged,
|
|
||||||
TotalCount = total,
|
|
||||||
PageNumber = pageNumber,
|
|
||||||
PageSize = pageSize
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
private static List<CommissionPayoutDto> GenerateMockPayouts(int count)
|
|
||||||
{
|
|
||||||
var payouts = new List<CommissionPayoutDto>();
|
|
||||||
var random = new Random();
|
|
||||||
var statusTexts = new[] { "ایجاد شده", "پرداخت شده", "درخواست برداشت", "برداشت شده", "لغو شده" };
|
|
||||||
var statusColors = new[] { "Info", "Success", "Warning", "Success", "Error" };
|
|
||||||
|
|
||||||
for (int i = 0; i < count; i++)
|
|
||||||
{
|
|
||||||
var statusIndex = random.Next(statusTexts.Length);
|
|
||||||
var weekNum = 50 - i;
|
|
||||||
var balances = random.Next(5, 20);
|
|
||||||
var amount = balances * 100_000;
|
|
||||||
|
|
||||||
payouts.Add(new CommissionPayoutDto
|
|
||||||
{
|
|
||||||
Id = i + 1,
|
|
||||||
WeekDefinitionId = i + 1,
|
|
||||||
WeekDisplayName = $"هفته {weekNum} - سال 1404",
|
|
||||||
BalancesEarned = balances,
|
|
||||||
TotalAmount = amount,
|
|
||||||
AmountFormatted = $"{amount:N0} تومان",
|
|
||||||
Status = statusTexts[statusIndex],
|
|
||||||
StatusBadgeColor = statusColors[statusIndex],
|
|
||||||
DatePersian = DateTime.Now.AddDays(-i * 7).ToString("yyyy/MM/dd")
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return payouts;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static List<WeekDefinitionDto> GenerateMockWeekDefinitions()
|
|
||||||
{
|
|
||||||
var weeks = new List<WeekDefinitionDto>();
|
|
||||||
var persianOrdinals = new[] { "یکم", "دوم", "سوم", "چهارم", "پنجم", "ششم", "هفتم", "هشتم", "نهم", "دهم" };
|
|
||||||
|
|
||||||
// Generate 10 weeks starting from week 46
|
|
||||||
for (int i = 0; i < 10; i++)
|
|
||||||
{
|
|
||||||
var weekOrder = i + 1;
|
|
||||||
var startDate = new DateTime(2025, 11, 8).AddDays(i * 7);
|
|
||||||
|
|
||||||
weeks.Add(new WeekDefinitionDto
|
|
||||||
{
|
|
||||||
Id = i + 1,
|
|
||||||
WeekOrder = weekOrder,
|
|
||||||
DisplayName = weekOrder <= 10 ? $"هفته {persianOrdinals[weekOrder - 1]}" : $"هفته {weekOrder}",
|
|
||||||
StartDate = startDate,
|
|
||||||
EndDate = startDate.AddDays(6),
|
|
||||||
GregorianYear = 2025,
|
|
||||||
PersianYear = 1404,
|
|
||||||
IsActive = true,
|
|
||||||
IsCurrentWeek = weekOrder == 6, // Assume week 6 is current
|
|
||||||
StartDatePersian = $"1404/{8 + i}/17",
|
|
||||||
EndDatePersian = $"1404/{8 + i}/23"
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return weeks;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,8 +36,13 @@ public class NetworkMembershipService
|
|||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
// Fallback to mock data if backend is unavailable
|
// Return empty tree if backend is unavailable
|
||||||
return CreateMockTree();
|
return new NetworkTreeDto
|
||||||
|
{
|
||||||
|
CurrentDepth = 0,
|
||||||
|
TotalMembers = 0,
|
||||||
|
RootNode = null
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,21 +107,15 @@ public class NetworkMembershipService
|
|||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
// Fallback to mock data if backend is unavailable
|
// Return empty statistics if backend is unavailable
|
||||||
return new NetworkStatisticsDto
|
return new NetworkStatisticsDto
|
||||||
{
|
{
|
||||||
LeftLegCount = 15,
|
LeftLegCount = 0,
|
||||||
RightLegCount = 12,
|
RightLegCount = 0,
|
||||||
TotalMembers = 27,
|
TotalMembers = 0,
|
||||||
TreeDepth = 4,
|
TreeDepth = 0,
|
||||||
WeakerLeg = "Right",
|
WeakerLeg = string.Empty,
|
||||||
LastMember = new LastMemberDto
|
LastMember = null
|
||||||
{
|
|
||||||
UserId = 28,
|
|
||||||
FullName = "محمد رضایی",
|
|
||||||
Position = "Left",
|
|
||||||
JoinedAt = DateTime.Now.AddHours(-2)
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -144,76 +143,5 @@ public class NetworkMembershipService
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
private static NetworkTreeDto CreateMockTree()
|
|
||||||
{
|
|
||||||
return new NetworkTreeDto
|
|
||||||
{
|
|
||||||
CurrentDepth = 3,
|
|
||||||
TotalMembers = 7,
|
|
||||||
RootNode = new NetworkNodeDto
|
|
||||||
{
|
|
||||||
UserId = 1,
|
|
||||||
FullName = "شما",
|
|
||||||
Mobile = "09121234567",
|
|
||||||
Position = "Root",
|
|
||||||
Level = 0,
|
|
||||||
IsActive = true,
|
|
||||||
IsClubActive = true,
|
|
||||||
LeftChild = new NetworkNodeDto
|
|
||||||
{
|
|
||||||
UserId = 2,
|
|
||||||
FullName = "علی محمدی",
|
|
||||||
Mobile = "09121234568",
|
|
||||||
Position = "Left",
|
|
||||||
Level = 1,
|
|
||||||
IsActive = true,
|
|
||||||
IsClubActive = true,
|
|
||||||
JoinedAt = DateTime.Now.AddDays(-30),
|
|
||||||
LeftChild = new NetworkNodeDto
|
|
||||||
{
|
|
||||||
UserId = 4,
|
|
||||||
FullName = "رضا کریمی",
|
|
||||||
Mobile = "09121234570",
|
|
||||||
Position = "Left",
|
|
||||||
Level = 2,
|
|
||||||
IsActive = true,
|
|
||||||
JoinedAt = DateTime.Now.AddDays(-15)
|
|
||||||
},
|
|
||||||
RightChild = new NetworkNodeDto
|
|
||||||
{
|
|
||||||
UserId = 5,
|
|
||||||
FullName = "زهرا احمدی",
|
|
||||||
Mobile = "09121234571",
|
|
||||||
Position = "Right",
|
|
||||||
Level = 2,
|
|
||||||
IsActive = false,
|
|
||||||
JoinedAt = DateTime.Now.AddDays(-10)
|
|
||||||
}
|
|
||||||
},
|
|
||||||
RightChild = new NetworkNodeDto
|
|
||||||
{
|
|
||||||
UserId = 3,
|
|
||||||
FullName = "فاطمه حسینی",
|
|
||||||
Mobile = "09121234569",
|
|
||||||
Position = "Right",
|
|
||||||
Level = 1,
|
|
||||||
IsActive = true,
|
|
||||||
JoinedAt = DateTime.Now.AddDays(-25),
|
|
||||||
LeftChild = new NetworkNodeDto
|
|
||||||
{
|
|
||||||
UserId = 6,
|
|
||||||
FullName = "محمد نوری",
|
|
||||||
Mobile = "09121234572",
|
|
||||||
Position = "Left",
|
|
||||||
Level = 2,
|
|
||||||
IsActive = true,
|
|
||||||
IsClubActive = true,
|
|
||||||
JoinedAt = DateTime.Now.AddDays(-5)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
#endregion
|
#endregion
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -104,12 +104,11 @@ public class PackageService
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Get user's package purchase status (Mock for now - needs BFF implementation)
|
/// Get user's package purchase status
|
||||||
/// </summary>
|
/// </summary>
|
||||||
public Task<UserPackageStatusDto> GetUserPackageStatusAsync(CancellationToken ct = default)
|
public Task<UserPackageStatusDto> GetUserPackageStatusAsync(CancellationToken ct = default)
|
||||||
{
|
{
|
||||||
// TODO: Connect to GetUserPackageStatus RPC when available in FrontOffice.BFF
|
// TODO: Connect to GetUserPackageStatus RPC when available in FrontOffice.BFF
|
||||||
// For now, return a mock status
|
|
||||||
return Task.FromResult(new UserPackageStatusDto(
|
return Task.FromResult(new UserPackageStatusDto(
|
||||||
HasPurchasedPackage: false,
|
HasPurchasedPackage: false,
|
||||||
PurchaseMethod: null,
|
PurchaseMethod: null,
|
||||||
|
|||||||
@@ -32,8 +32,8 @@ public class WalletService
|
|||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
// Fallback to mock data if backend is unavailable
|
// Return zero balances if backend is unavailable
|
||||||
return new WalletBalances(350_000, 0, 1_250_000);
|
return new WalletBalances(0, 0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -62,15 +62,8 @@ public class WalletService
|
|||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
// Fallback to mock data if backend is unavailable
|
// Return empty list if backend is unavailable
|
||||||
var _transactions = new List<WalletTransaction>
|
return new List<WalletTransaction>();
|
||||||
{
|
|
||||||
new(DateTime.Now.AddDays(-1).ToString(), 500_000, "درگاه بانکی", "شارژ کیف پول"),
|
|
||||||
new(DateTime.Now.AddDays(-2).ToString(), 200_000, "شبکه/معرف", "پاداش شبکه"),
|
|
||||||
new(DateTime.Now.AddDays(-4).ToString(), -120_000, "خرید", "برداشت بابت سفارش #1452"),
|
|
||||||
new(DateTime.Now.AddDays(-9).ToString(), 900_000, "کیف پول شرکای تجاری", "اعتبار خرید"),
|
|
||||||
};
|
|
||||||
return _transactions.OrderByDescending(t => t.Date).ToList();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -158,7 +151,8 @@ public class WalletService
|
|||||||
}
|
}
|
||||||
catch
|
catch
|
||||||
{
|
{
|
||||||
return new WithdrawalSettings(1_000_000);
|
// Return default settings if backend is unavailable
|
||||||
|
return new WithdrawalSettings(0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user