using CMSMicroservice.Domain.Entities.Configuration; namespace CMSMicroservice.Application.AppVersionCQ.Queries.GetAppVersion; /// /// Handler برای دریافت آخرین نسخه اپلیکیشن /// public class GetAppVersionQueryHandler : IRequestHandler { private readonly IApplicationDbContext _context; public GetAppVersionQueryHandler(IApplicationDbContext context) { _context = context; } public async Task Handle(GetAppVersionQuery request, CancellationToken cancellationToken) { var appVersion = await _context.AppVersions .Where(v => v.AppName == request.AppName && v.IsActive && !v.IsDeleted) .FirstOrDefaultAsync(cancellationToken); if (appVersion == null) { return new AppVersionDto { Found = false, AppName = request.AppName }; } // مقایسه ورژن کلاینت با حداقل نسخه مورد نیاز bool requiresUpdate = false; if (!string.IsNullOrEmpty(request.CurrentClientVersion) && !string.IsNullOrEmpty(appVersion.MinRequiredVersion)) { requiresUpdate = CompareVersions(request.CurrentClientVersion, appVersion.MinRequiredVersion) < 0; } return new AppVersionDto { Found = true, AppName = appVersion.AppName, CurrentVersion = appVersion.CurrentVersion, MinRequiredVersion = appVersion.MinRequiredVersion, RequiresFullCacheClear = appVersion.RequiresFullCacheClear, RequiresUpdate = requiresUpdate, UpdateMessage = appVersion.UpdateMessage, ReleaseNotes = appVersion.ReleaseNotes, LastUpdated = appVersion.LastModified ?? appVersion.Created }; } /// /// مقایسه دو نسخه (مثلاً 1.2.3 با 1.3.0) /// برگشت: منفی = اولی کوچکتر، مثبت = اولی بزرگتر، صفر = برابر /// private static int CompareVersions(string version1, string version2) { var v1Parts = version1.Split('.').Select(s => int.TryParse(s, out var n) ? n : 0).ToArray(); var v2Parts = version2.Split('.').Select(s => int.TryParse(s, out var n) ? n : 0).ToArray(); var maxLen = Math.Max(v1Parts.Length, v2Parts.Length); for (int i = 0; i < maxLen; i++) { var v1 = i < v1Parts.Length ? v1Parts[i] : 0; var v2 = i < v2Parts.Length ? v2Parts[i] : 0; if (v1 != v2) return v1.CompareTo(v2); } return 0; } }