From cf5c9f29cf76088ce64916a5e191ed6e6f35b5e4 Mon Sep 17 00:00:00 2001 From: mahan Date: Sun, 16 Nov 2025 22:09:19 +0330 Subject: [PATCH] Enhance APK upload functionality by adding version name and code parameters, and update UI for better user input validation --- .../IAndroidApkVersionApplication.cs | 4 +- .../AndroidApkVersionApplication.cs | 70 +++++-------------- .../Pages/Company/AndroidApk/Index.cshtml | 56 ++++++++++----- .../Pages/Company/AndroidApk/Index.cshtml.cs | 13 +++- ServiceHost/Program.cs | 2 +- 5 files changed, 72 insertions(+), 73 deletions(-) diff --git a/CompanyManagment.App.Contracts/AndroidApkVersion/IAndroidApkVersionApplication.cs b/CompanyManagment.App.Contracts/AndroidApkVersion/IAndroidApkVersionApplication.cs index c84ed4f9..043ed9c0 100644 --- a/CompanyManagment.App.Contracts/AndroidApkVersion/IAndroidApkVersionApplication.cs +++ b/CompanyManagment.App.Contracts/AndroidApkVersion/IAndroidApkVersionApplication.cs @@ -8,8 +8,8 @@ public record AndroidApkVersionInfo(int LatestVersionCode, string LatestVersionN public interface IAndroidApkVersionApplication { - Task CreateAndActive(IFormFile file, ApkType apkType, bool isForce = false); - Task CreateAndDeActive(IFormFile file, ApkType apkType, bool isForce = false); + Task CreateAndActive(IFormFile file, ApkType apkType, string versionName, string versionCode, bool isForce = false); + Task CreateAndDeActive(IFormFile file, ApkType apkType, string versionName, string versionCode, bool isForce = false); Task GetLatestActiveVersionPath(ApkType apkType); Task GetLatestActiveInfo(ApkType apkType, int currentVersionCode); OperationResult Remove(long id); diff --git a/CompanyManagment.Application/AndroidApkVersionApplication.cs b/CompanyManagment.Application/AndroidApkVersionApplication.cs index 5def89fd..65b98e9d 100644 --- a/CompanyManagment.Application/AndroidApkVersionApplication.cs +++ b/CompanyManagment.Application/AndroidApkVersionApplication.cs @@ -22,7 +22,7 @@ public class AndroidApkVersionApplication : IAndroidApkVersionApplication _taskRepository = taskRepository; } - public async Task CreateAndActive(IFormFile file, ApkType apkType, bool isForce = false) + public async Task CreateAndActive(IFormFile file, string versionName, string versionCode, ApkType apkType, bool isForce = false) { OperationResult op = new OperationResult(); @@ -34,6 +34,12 @@ public class AndroidApkVersionApplication : IAndroidApkVersionApplication if (Path.GetExtension(file.FileName).ToLower() != ".apk") return op.Failed("لطفا فایلی با پسوند .apk وارد کنید"); + if (string.IsNullOrWhiteSpace(versionName)) + return op.Failed("لطفا نام ورژن را وارد کنید"); + + if (string.IsNullOrWhiteSpace(versionCode)) + return op.Failed("لطفا کد ورژن را وارد کنید"); + #endregion var activeApks = _androidApkVersionRepository.GetActives(apkType); @@ -47,30 +53,8 @@ public class AndroidApkVersionApplication : IAndroidApkVersionApplication Directory.CreateDirectory(path); - // Read APK metadata with error handling - ApkInfo apk; - try - { - apk = ApkHelper.ReadApkInfo(file.OpenReadStream()); - - // Validate APK info - if (string.IsNullOrEmpty(apk.VersionName) || string.IsNullOrEmpty(apk.VersionCode)) - { - return op.Failed("فایل APK معتبر نیست - اطلاعات نسخه یافت نشد"); - } - - // Validate version code is numeric - if (!int.TryParse(apk.VersionCode, out _)) - { - return op.Failed("فایل APK معتبر نیست - کد نسخه باید عددی باشد"); - } - } - catch (Exception ex) - { - return op.Failed("خطا در خواندن فایل APK: " + ex.Message); - } + string uniqueFileName = $"{Path.GetFileNameWithoutExtension(file.FileName)}.v{versionName}{Path.GetExtension(file.FileName)}"; - string uniqueFileName = $"{Path.GetFileNameWithoutExtension(file.FileName)}.v{apk.VersionName}{Path.GetExtension(file.FileName)}"; string filepath = Path.Combine(path, uniqueFileName); await using (var stream = new FileStream(filepath, FileMode.Create)) @@ -78,13 +62,13 @@ public class AndroidApkVersionApplication : IAndroidApkVersionApplication await file.CopyToAsync(stream); } - var entity = new AndroidApkVersion(apk.VersionName, apk.VersionCode, IsActive.True, filepath, apkType, isForce); + var entity = new AndroidApkVersion(versionName, versionCode, IsActive.True, filepath); _androidApkVersionRepository.Create(entity); _androidApkVersionRepository.SaveChanges(); return op.Succcedded(); } - public async Task CreateAndDeActive(IFormFile file, ApkType apkType, bool isForce = false) + public async Task CreateAndDeActive(IFormFile file, string versionName, string versionCode, ApkType apkType, bool isForce = false) { OperationResult op = new OperationResult(); @@ -96,6 +80,12 @@ public class AndroidApkVersionApplication : IAndroidApkVersionApplication if (Path.GetExtension(file.FileName).ToLower() != ".apk") return op.Failed("لطفا فایلی با پسوند .apk وارد کنید"); + if (string.IsNullOrWhiteSpace(versionName)) + return op.Failed("لطفا نام ورژن را وارد کنید"); + + if (string.IsNullOrWhiteSpace(versionCode)) + return op.Failed("لطفا کد ورژن را وارد کنید"); + #endregion @@ -105,31 +95,7 @@ public class AndroidApkVersionApplication : IAndroidApkVersionApplication Directory.CreateDirectory(path); - // Read APK metadata with error handling - ApkInfo apk; - try - { - apk = ApkHelper.ReadApkInfo(file.OpenReadStream()); - - // Validate APK info - if (string.IsNullOrEmpty(apk.VersionName) || string.IsNullOrEmpty(apk.VersionCode)) - { - return op.Failed("فایل APK معتبر نیست - اطلاعات نسخه یافت نشد"); - } - - // Validate version code is numeric - if (!int.TryParse(apk.VersionCode, out _)) - { - return op.Failed("فایل APK معتبر نیست - کد نسخه باید عددی باشد"); - } - } - catch (Exception ex) - { - return op.Failed("خطا در خواندن فایل APK: " + ex.Message); - } - - string uniqueFileName = $"{Path.GetFileNameWithoutExtension(file.FileName)}.v{apk.VersionName}{Path.GetExtension(file.FileName)}"; - + string uniqueFileName = $"{Path.GetFileNameWithoutExtension(file.FileName)}.v{versionName}{Path.GetExtension(file.FileName)}"; string filepath = Path.Combine(path, uniqueFileName); @@ -138,7 +104,7 @@ public class AndroidApkVersionApplication : IAndroidApkVersionApplication await file.CopyToAsync(stream); } - var entity = new AndroidApkVersion(apk.VersionName, apk.VersionCode, IsActive.False, filepath, apkType, isForce); + var entity = new AndroidApkVersion(versionName, versionCode, IsActive.False, filepath); _androidApkVersionRepository.Create(entity); _androidApkVersionRepository.SaveChanges(); return op.Succcedded(); diff --git a/ServiceHost/Areas/AdminNew/Pages/Company/AndroidApk/Index.cshtml b/ServiceHost/Areas/AdminNew/Pages/Company/AndroidApk/Index.cshtml index 6dcdeaf6..492572a1 100644 --- a/ServiceHost/Areas/AdminNew/Pages/Company/AndroidApk/Index.cshtml +++ b/ServiceHost/Areas/AdminNew/Pages/Company/AndroidApk/Index.cshtml @@ -4,24 +4,46 @@ ViewData["Title"] = "File Upload"; } -

Upload File

-
-
- - +

Upload APK File

+
+
+ +
+ + + Please select a valid APK file. + +
+ +
+ + + Enter the version name (e.g. 1.0.0, 2.1.3). + +
+ +
+ + + Enter the version code (numeric value). + +
+
+ + +
+
+ +
+
+ +
+
-
- - -
-
- -
- - +
diff --git a/ServiceHost/Areas/AdminNew/Pages/Company/AndroidApk/Index.cshtml.cs b/ServiceHost/Areas/AdminNew/Pages/Company/AndroidApk/Index.cshtml.cs index 61d9a062..84c82a00 100644 --- a/ServiceHost/Areas/AdminNew/Pages/Company/AndroidApk/Index.cshtml.cs +++ b/ServiceHost/Areas/AdminNew/Pages/Company/AndroidApk/Index.cshtml.cs @@ -27,6 +27,7 @@ using Microsoft.Extensions.Options; using Parbad; using Parbad.AspNetCore; using Parbad.Gateway.Sepehr; +using System.ComponentModel.DataAnnotations; using static ServiceHost.Areas.AdminNew.Pages.Company.AndroidApk.IndexModel2; namespace ServiceHost.Areas.AdminNew.Pages.Company.AndroidApk @@ -46,6 +47,16 @@ namespace ServiceHost.Areas.AdminNew.Pages.Company.AndroidApk [BindProperty] public IFormFile File { get; set; } + + [BindProperty] + [Required(ErrorMessage = "لطفا نام ورژن را وارد کنید")] + [Display(Name = "نام ورژن")] + public string VersionName { get; set; } + + [BindProperty] + [Required(ErrorMessage = "لطفا کد ورژن را وارد کنید")] + [Display(Name = "کد ورژن")] + public string VersionCode { get; set; } [BindProperty] public ApkType SelectedApkType { get; set; } [BindProperty] public bool IsForce { get; set; } @@ -70,7 +81,7 @@ namespace ServiceHost.Areas.AdminNew.Pages.Company.AndroidApk public async Task OnPostUpload() { - var result = await _application.CreateAndActive(File, SelectedApkType, IsForce); + var result = await _application.CreateAndActive(File, VersionName, VersionCode, SelectedApkType, IsForce); ViewData["message"] = result.Message; return Page(); } diff --git a/ServiceHost/Program.cs b/ServiceHost/Program.cs index 7d3d5596..d392bad1 100644 --- a/ServiceHost/Program.cs +++ b/ServiceHost/Program.cs @@ -408,7 +408,7 @@ app.MapHub("/trackingHub"); app.MapHub("/trackingSmsHub"); app.MapHub("/trackingHolidayHub"); app.MapHub("/trackingCheckoutHub"); -app.MapHub("/trackingFaceEmbeddingHub"); +// app.MapHub("/trackingFaceEmbeddingHub"); app.MapRazorPages(); app.MapControllers();