using FrontOffice.BFF.Configuration.Protobuf.Protos.AppVersion; using Blazored.LocalStorage; namespace FrontOffice.Main.Utilities; /// /// سرویس مدیریت نسخه اپلیکیشن و کش /// وقتی نسخه جدید منتشر بشه، این سرویس متوجه میشه و کش رو پاک می‌کنه /// public class AppVersionService { private readonly AppVersionContract.AppVersionContractClient _client; private readonly ILocalStorageService _localStorage; private readonly ILogger _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 logger) { _client = client; _localStorage = localStorage; _logger = logger; } /// /// بررسی نسخه اپلیکیشن و پاک کردن کش در صورت نیاز /// 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"); } } /// /// پاک کردن همه کش‌های اپلیکیشن /// private async Task ClearAllCacheAsync() { try { // لیست کلیدهایی که باید حفظ بشن (مثل توکن و اطلاعات کاربر) var keysToKeep = new HashSet { "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"); } } /// /// دریافت اطلاعات نسخه فعلی /// public async Task 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; } }