feat(backoffice): Add App Version management UI
Build and Deploy to Production / build-and-deploy (push) Successful in 5m47s
Build and Deploy to Production / build-and-deploy (push) Successful in 5m47s
- Add IAppVersionService interface and implementation - Add AppVersions.razor page for managing app versions - Add AppVersionEditDialog component for editing versions - Register AppVersion gRPC client and service in DI - Update Foursat.BackOffice.BFF.Configuration.Protobuf to 1.0.20
This commit is contained in:
@@ -116,7 +116,7 @@
|
|||||||
<PackageReference Include="Foursat.BackOffice.BFF.ClubMembership.Protobuf" Version="0.0.7"/>
|
<PackageReference Include="Foursat.BackOffice.BFF.ClubMembership.Protobuf" Version="0.0.7"/>
|
||||||
<PackageReference Include="Foursat.BackOffice.BFF.Commission.Protobuf" Version="0.0.13"/>
|
<PackageReference Include="Foursat.BackOffice.BFF.Commission.Protobuf" Version="0.0.13"/>
|
||||||
<PackageReference Include="Foursat.BackOffice.BFF.Common.Protobuf" Version="0.0.3"/>
|
<PackageReference Include="Foursat.BackOffice.BFF.Common.Protobuf" Version="0.0.3"/>
|
||||||
<PackageReference Include="Foursat.BackOffice.BFF.Configuration.Protobuf" Version="1.0.7"/>
|
<PackageReference Include="Foursat.BackOffice.BFF.Configuration.Protobuf" Version="1.0.20"/>
|
||||||
<PackageReference Include="Foursat.BackOffice.BFF.DiscountCategory.Protobuf" Version="0.0.3"/>
|
<PackageReference Include="Foursat.BackOffice.BFF.DiscountCategory.Protobuf" Version="0.0.3"/>
|
||||||
<PackageReference Include="Foursat.BackOffice.BFF.DiscountOrder.Protobuf" Version="0.0.3"/>
|
<PackageReference Include="Foursat.BackOffice.BFF.DiscountOrder.Protobuf" Version="0.0.3"/>
|
||||||
<PackageReference Include="Foursat.BackOffice.BFF.DiscountProduct.Protobuf" Version="0.0.3"/>
|
<PackageReference Include="Foursat.BackOffice.BFF.DiscountProduct.Protobuf" Version="0.0.3"/>
|
||||||
|
|||||||
@@ -12,6 +12,7 @@ using Foursat.BackOffice.BFF.ClubMembership.Protos;
|
|||||||
using Foursat.BackOffice.BFF.Configuration.Protos;
|
using Foursat.BackOffice.BFF.Configuration.Protos;
|
||||||
using Foursat.BackOffice.BFF.NetworkMembership.Protos;
|
using Foursat.BackOffice.BFF.NetworkMembership.Protos;
|
||||||
using Foursat.BackOffice.BFF.Health.Protobuf;
|
using Foursat.BackOffice.BFF.Health.Protobuf;
|
||||||
|
using BackOffice.BFF.Configuration.Protobuf.Protos.AppVersion;
|
||||||
|
|
||||||
// TODO: Create these proto projects - temporarily disabled
|
// TODO: Create these proto projects - temporarily disabled
|
||||||
// using BackOffice.BFF.DiscountProduct.Protobuf.Protos.DiscountProduct;
|
// using BackOffice.BFF.DiscountProduct.Protobuf.Protos.DiscountProduct;
|
||||||
@@ -68,6 +69,7 @@ public static class ConfigureServices
|
|||||||
|
|
||||||
// Application Services
|
// Application Services
|
||||||
services.AddScoped<BackOffice.Services.Authorization.IAuthorizationService, BackOffice.Services.Authorization.AuthorizationService>();
|
services.AddScoped<BackOffice.Services.Authorization.IAuthorizationService, BackOffice.Services.Authorization.AuthorizationService>();
|
||||||
|
services.AddScoped<BackOffice.Services.AppVersion.IAppVersionService, BackOffice.Services.AppVersion.AppVersionService>();
|
||||||
// TODO: Re-enable when proto projects are created
|
// TODO: Re-enable when proto projects are created
|
||||||
// services.AddScoped<IDiscountProductService, DiscountProductService>();
|
// services.AddScoped<IDiscountProductService, DiscountProductService>();
|
||||||
// services.AddScoped<IDiscountCategoryService, DiscountCategoryService>();
|
// services.AddScoped<IDiscountCategoryService, DiscountCategoryService>();
|
||||||
@@ -116,6 +118,7 @@ public static class ConfigureServices
|
|||||||
services.AddTransient(sp => new ClubMembershipContract.ClubMembershipContractClient(sp.GetRequiredService<CallInvoker>()));
|
services.AddTransient(sp => new ClubMembershipContract.ClubMembershipContractClient(sp.GetRequiredService<CallInvoker>()));
|
||||||
services.AddTransient(sp => new ConfigurationContract.ConfigurationContractClient(sp.GetRequiredService<CallInvoker>()));
|
services.AddTransient(sp => new ConfigurationContract.ConfigurationContractClient(sp.GetRequiredService<CallInvoker>()));
|
||||||
services.AddTransient(sp => new HealthContract.HealthContractClient(sp.GetRequiredService<CallInvoker>()));
|
services.AddTransient(sp => new HealthContract.HealthContractClient(sp.GetRequiredService<CallInvoker>()));
|
||||||
|
services.AddTransient(sp => new AppVersionContract.AppVersionContractClient(sp.GetRequiredService<CallInvoker>()));
|
||||||
|
|
||||||
// TODO: Re-enable when proto projects are created
|
// TODO: Re-enable when proto projects are created
|
||||||
// Discount Shop Services
|
// Discount Shop Services
|
||||||
|
|||||||
@@ -0,0 +1,310 @@
|
|||||||
|
@page "/settings/app-versions"
|
||||||
|
@attribute [Authorize]
|
||||||
|
|
||||||
|
@using BackOffice.Services.AppVersion
|
||||||
|
@using BackOffice.Pages.Settings.Components
|
||||||
|
@inject IAppVersionService AppVersionService
|
||||||
|
@inject IDialogService DialogService
|
||||||
|
@inject ISnackbar Snackbar
|
||||||
|
|
||||||
|
<PageTitle>مدیریت نسخه اپلیکیشنها</PageTitle>
|
||||||
|
|
||||||
|
<MudContainer MaxWidth="MaxWidth.ExtraLarge" Class="mt-4">
|
||||||
|
<MudText Typo="Typo.h4" GutterBottom="true">
|
||||||
|
<MudIcon Icon="@Icons.Material.Filled.PhoneAndroid" Class="ml-2" />
|
||||||
|
مدیریت نسخه اپلیکیشنها
|
||||||
|
</MudText>
|
||||||
|
<MudText Typo="Typo.body1" Color="Color.Secondary" Class="mb-4">
|
||||||
|
مدیریت نسخههای اپلیکیشنهای موبایل و کنترل بهروزرسانی اجباری
|
||||||
|
</MudText>
|
||||||
|
|
||||||
|
<MudPaper Class="pa-4">
|
||||||
|
<MudStack Row="true" Justify="Justify.SpaceBetween" AlignItems="AlignItems.Center" Class="mb-4">
|
||||||
|
<MudSwitch Value="_includeInactive"
|
||||||
|
Color="Color.Primary"
|
||||||
|
Label="نمایش نسخههای غیرفعال"
|
||||||
|
T="bool"
|
||||||
|
ValueChanged="@(async (bool val) => { _includeInactive = val; await LoadVersions(); })" />
|
||||||
|
|
||||||
|
<MudButton Variant="Variant.Outlined"
|
||||||
|
Color="Color.Primary"
|
||||||
|
StartIcon="@Icons.Material.Filled.Refresh"
|
||||||
|
OnClick="@LoadVersions">
|
||||||
|
بارگذاری مجدد
|
||||||
|
</MudButton>
|
||||||
|
</MudStack>
|
||||||
|
|
||||||
|
@if (_loading)
|
||||||
|
{
|
||||||
|
<MudProgressLinear Color="Color.Primary" Indeterminate="true" Class="mb-4" />
|
||||||
|
}
|
||||||
|
|
||||||
|
<MudDataGrid T="AppVersionDto"
|
||||||
|
Items="@_versions"
|
||||||
|
Loading="@_loading"
|
||||||
|
Hover="true"
|
||||||
|
Dense="true">
|
||||||
|
<Columns>
|
||||||
|
<PropertyColumn Property="x => x.Id" Title="شناسه" />
|
||||||
|
|
||||||
|
<TemplateColumn Title="اپلیکیشن">
|
||||||
|
<CellTemplate>
|
||||||
|
<MudStack Row="true" AlignItems="AlignItems.Center" Spacing="2">
|
||||||
|
<MudIcon Icon="@GetAppIcon(context.Item.AppName)"
|
||||||
|
Color="@GetAppColor(context.Item.AppName)"
|
||||||
|
Size="Size.Small" />
|
||||||
|
<MudText>@context.Item.AppNameDisplay</MudText>
|
||||||
|
</MudStack>
|
||||||
|
</CellTemplate>
|
||||||
|
</TemplateColumn>
|
||||||
|
|
||||||
|
<TemplateColumn Title="نسخه فعلی">
|
||||||
|
<CellTemplate>
|
||||||
|
<MudChip T="string" Color="Color.Primary" Size="Size.Small" Variant="Variant.Outlined">
|
||||||
|
v@context.Item.CurrentVersion
|
||||||
|
</MudChip>
|
||||||
|
</CellTemplate>
|
||||||
|
</TemplateColumn>
|
||||||
|
|
||||||
|
<TemplateColumn Title="حداقل نسخه">
|
||||||
|
<CellTemplate>
|
||||||
|
@if (!string.IsNullOrEmpty(context.Item.MinRequiredVersion))
|
||||||
|
{
|
||||||
|
<MudChip T="string" Color="Color.Warning" Size="Size.Small" Variant="Variant.Outlined">
|
||||||
|
v@context.Item.MinRequiredVersion
|
||||||
|
</MudChip>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<MudText Typo="Typo.body2" Color="Color.Default">-</MudText>
|
||||||
|
}
|
||||||
|
</CellTemplate>
|
||||||
|
</TemplateColumn>
|
||||||
|
|
||||||
|
<TemplateColumn Title="پاکسازی کش">
|
||||||
|
<CellTemplate>
|
||||||
|
@if (context.Item.RequiresFullCacheClear)
|
||||||
|
{
|
||||||
|
<MudIcon Icon="@Icons.Material.Filled.Warning" Color="Color.Warning" Size="Size.Small" />
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<MudIcon Icon="@Icons.Material.Filled.CheckCircle" Color="Color.Success" Size="Size.Small" />
|
||||||
|
}
|
||||||
|
</CellTemplate>
|
||||||
|
</TemplateColumn>
|
||||||
|
|
||||||
|
<TemplateColumn Title="وضعیت">
|
||||||
|
<CellTemplate>
|
||||||
|
@if (context.Item.IsActive)
|
||||||
|
{
|
||||||
|
<MudChip T="string" Color="Color.Success" Size="Size.Small">فعال</MudChip>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<MudChip T="string" Color="Color.Default" Size="Size.Small">غیرفعال</MudChip>
|
||||||
|
}
|
||||||
|
</CellTemplate>
|
||||||
|
</TemplateColumn>
|
||||||
|
|
||||||
|
<PropertyColumn Property="x => x.LastModified" Title="آخرین تغییر" Format="yyyy/MM/dd HH:mm" />
|
||||||
|
|
||||||
|
<TemplateColumn Title="عملیات" Sortable="false">
|
||||||
|
<CellTemplate>
|
||||||
|
<MudIconButton Icon="@Icons.Material.Filled.Edit"
|
||||||
|
Color="Color.Primary"
|
||||||
|
Size="Size.Small"
|
||||||
|
OnClick="@(() => OpenEditDialog(context.Item))" />
|
||||||
|
<MudIconButton Icon="@Icons.Material.Filled.Visibility"
|
||||||
|
Color="Color.Info"
|
||||||
|
Size="Size.Small"
|
||||||
|
OnClick="@(() => OpenDetailsDialog(context.Item))" />
|
||||||
|
</CellTemplate>
|
||||||
|
</TemplateColumn>
|
||||||
|
</Columns>
|
||||||
|
</MudDataGrid>
|
||||||
|
</MudPaper>
|
||||||
|
|
||||||
|
@* Info Cards *@
|
||||||
|
<MudGrid Class="mt-4">
|
||||||
|
@foreach (var version in _versions.Where(v => v.IsActive))
|
||||||
|
{
|
||||||
|
<MudItem xs="12" md="6">
|
||||||
|
<MudCard Elevation="2">
|
||||||
|
<MudCardHeader>
|
||||||
|
<CardHeaderAvatar>
|
||||||
|
<MudAvatar Color="@GetAppColor(version.AppName)">
|
||||||
|
<MudIcon Icon="@GetAppIcon(version.AppName)" />
|
||||||
|
</MudAvatar>
|
||||||
|
</CardHeaderAvatar>
|
||||||
|
<CardHeaderContent>
|
||||||
|
<MudText Typo="Typo.h6">@version.AppNameDisplay</MudText>
|
||||||
|
<MudText Typo="Typo.body2" Color="Color.Secondary">@version.AppName</MudText>
|
||||||
|
</CardHeaderContent>
|
||||||
|
<CardHeaderActions>
|
||||||
|
<MudIconButton Icon="@Icons.Material.Filled.Edit"
|
||||||
|
Color="Color.Primary"
|
||||||
|
OnClick="@(() => OpenEditDialog(version))" />
|
||||||
|
</CardHeaderActions>
|
||||||
|
</MudCardHeader>
|
||||||
|
<MudCardContent>
|
||||||
|
<MudStack Spacing="2">
|
||||||
|
<MudStack Row="true" Justify="Justify.SpaceBetween">
|
||||||
|
<MudText Typo="Typo.body2">نسخه فعلی:</MudText>
|
||||||
|
<MudChip T="string" Color="Color.Primary" Size="Size.Small">v@version.CurrentVersion</MudChip>
|
||||||
|
</MudStack>
|
||||||
|
|
||||||
|
<MudStack Row="true" Justify="Justify.SpaceBetween">
|
||||||
|
<MudText Typo="Typo.body2">حداقل نسخه:</MudText>
|
||||||
|
@if (!string.IsNullOrEmpty(version.MinRequiredVersion))
|
||||||
|
{
|
||||||
|
<MudChip T="string" Color="Color.Warning" Size="Size.Small">v@version.MinRequiredVersion</MudChip>
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
<MudText Typo="Typo.body2" Color="Color.Default">تنظیم نشده</MudText>
|
||||||
|
}
|
||||||
|
</MudStack>
|
||||||
|
|
||||||
|
@if (version.RequiresFullCacheClear)
|
||||||
|
{
|
||||||
|
<MudAlert Severity="Severity.Warning" Dense="true" Class="mt-2">
|
||||||
|
نیاز به پاکسازی کامل کش دارد
|
||||||
|
</MudAlert>
|
||||||
|
}
|
||||||
|
|
||||||
|
@if (!string.IsNullOrEmpty(version.UpdateMessage))
|
||||||
|
{
|
||||||
|
<MudDivider Class="my-2" />
|
||||||
|
<MudText Typo="Typo.caption" Color="Color.Secondary">پیام بهروزرسانی:</MudText>
|
||||||
|
<MudText Typo="Typo.body2">@version.UpdateMessage</MudText>
|
||||||
|
}
|
||||||
|
</MudStack>
|
||||||
|
</MudCardContent>
|
||||||
|
</MudCard>
|
||||||
|
</MudItem>
|
||||||
|
}
|
||||||
|
</MudGrid>
|
||||||
|
</MudContainer>
|
||||||
|
|
||||||
|
@code {
|
||||||
|
private List<AppVersionDto> _versions = new();
|
||||||
|
private bool _loading = false;
|
||||||
|
private bool _includeInactive = false;
|
||||||
|
|
||||||
|
protected override async Task OnInitializedAsync()
|
||||||
|
{
|
||||||
|
await LoadVersions();
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task LoadVersions()
|
||||||
|
{
|
||||||
|
_loading = true;
|
||||||
|
try
|
||||||
|
{
|
||||||
|
_versions = await AppVersionService.GetAllAsync(_includeInactive);
|
||||||
|
Snackbar.Add("اطلاعات نسخهها بارگذاری شد", Severity.Success);
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Snackbar.Add($"خطا در بارگذاری: {ex.Message}", Severity.Error);
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
_loading = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task OpenEditDialog(AppVersionDto version)
|
||||||
|
{
|
||||||
|
var parameters = new DialogParameters<AppVersionEditDialog>
|
||||||
|
{
|
||||||
|
{ x => x.Model, new UpdateAppVersionDto
|
||||||
|
{
|
||||||
|
AppName = version.AppName,
|
||||||
|
CurrentVersion = version.CurrentVersion,
|
||||||
|
MinRequiredVersion = version.MinRequiredVersion,
|
||||||
|
RequiresFullCacheClear = version.RequiresFullCacheClear,
|
||||||
|
UpdateMessage = version.UpdateMessage,
|
||||||
|
ReleaseNotes = version.ReleaseNotes
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var options = new DialogOptions
|
||||||
|
{
|
||||||
|
CloseButton = true,
|
||||||
|
MaxWidth = MaxWidth.Medium,
|
||||||
|
FullWidth = true
|
||||||
|
};
|
||||||
|
|
||||||
|
var dialog = await DialogService.ShowAsync<AppVersionEditDialog>(
|
||||||
|
$"ویرایش نسخه {version.AppNameDisplay}",
|
||||||
|
parameters,
|
||||||
|
options);
|
||||||
|
|
||||||
|
var result = await dialog.Result;
|
||||||
|
|
||||||
|
if (result is { Canceled: false, Data: UpdateAppVersionDto dto })
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
await AppVersionService.UpdateAsync(dto);
|
||||||
|
Snackbar.Add("نسخه با موفقیت بهروزرسانی شد", Severity.Success);
|
||||||
|
await LoadVersions();
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Snackbar.Add($"خطا در بهروزرسانی: {ex.Message}", Severity.Error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void OpenDetailsDialog(AppVersionDto version)
|
||||||
|
{
|
||||||
|
var parameters = new DialogParameters
|
||||||
|
{
|
||||||
|
{ "ContentText", BuildDetailsContent(version) },
|
||||||
|
{ "ButtonText", "بستن" },
|
||||||
|
{ "Color", Color.Primary }
|
||||||
|
};
|
||||||
|
|
||||||
|
DialogService.Show<MudMessageBox>($"جزئیات {version.AppNameDisplay}", parameters);
|
||||||
|
}
|
||||||
|
|
||||||
|
private string BuildDetailsContent(AppVersionDto version)
|
||||||
|
{
|
||||||
|
var lines = new List<string>
|
||||||
|
{
|
||||||
|
$"نام اپلیکیشن: {version.AppName}",
|
||||||
|
$"نسخه فعلی: {version.CurrentVersion}",
|
||||||
|
$"حداقل نسخه: {version.MinRequiredVersion ?? "تنظیم نشده"}",
|
||||||
|
$"نیاز به پاکسازی کش: {(version.RequiresFullCacheClear ? "بله" : "خیر")}",
|
||||||
|
$"وضعیت: {(version.IsActive ? "فعال" : "غیرفعال")}",
|
||||||
|
"",
|
||||||
|
"پیام بهروزرسانی:",
|
||||||
|
version.UpdateMessage ?? "ندارد",
|
||||||
|
"",
|
||||||
|
"یادداشتهای انتشار:",
|
||||||
|
version.ReleaseNotes ?? "ندارد",
|
||||||
|
"",
|
||||||
|
$"تاریخ ایجاد: {version.Created?.ToString("yyyy/MM/dd HH:mm") ?? "-"}",
|
||||||
|
$"آخرین تغییر: {version.LastModified?.ToString("yyyy/MM/dd HH:mm") ?? "-"}"
|
||||||
|
};
|
||||||
|
return string.Join(Environment.NewLine, lines);
|
||||||
|
}
|
||||||
|
|
||||||
|
private string GetAppIcon(string appName) => appName switch
|
||||||
|
{
|
||||||
|
"FoursatMarketApp" => Icons.Material.Filled.ShoppingCart,
|
||||||
|
"FoursatClubApp" => Icons.Material.Filled.Groups,
|
||||||
|
_ => Icons.Material.Filled.PhoneAndroid
|
||||||
|
};
|
||||||
|
|
||||||
|
private Color GetAppColor(string appName) => appName switch
|
||||||
|
{
|
||||||
|
"FoursatMarketApp" => Color.Primary,
|
||||||
|
"FoursatClubApp" => Color.Secondary,
|
||||||
|
_ => Color.Default
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -0,0 +1,83 @@
|
|||||||
|
@using BackOffice.Services.AppVersion
|
||||||
|
@inject ISnackbar Snackbar
|
||||||
|
|
||||||
|
<MudDialog>
|
||||||
|
<DialogContent>
|
||||||
|
<MudForm @ref="_form" @bind-IsValid="_isValid">
|
||||||
|
<MudStack Spacing="3">
|
||||||
|
<MudTextField @bind-Value="Model.AppName"
|
||||||
|
Label="نام اپلیکیشن"
|
||||||
|
Variant="Variant.Outlined"
|
||||||
|
ReadOnly="true"
|
||||||
|
Disabled="true" />
|
||||||
|
|
||||||
|
<MudTextField @bind-Value="Model.CurrentVersion"
|
||||||
|
Label="نسخه فعلی"
|
||||||
|
Variant="Variant.Outlined"
|
||||||
|
Required="true"
|
||||||
|
RequiredError="نسخه فعلی اجباری است"
|
||||||
|
HelperText="مثال: 1.2.0" />
|
||||||
|
|
||||||
|
<MudTextField @bind-Value="Model.MinRequiredVersion"
|
||||||
|
Label="حداقل نسخه مورد نیاز"
|
||||||
|
Variant="Variant.Outlined"
|
||||||
|
HelperText="کاربران با نسخههای پایینتر مجبور به آپدیت میشوند" />
|
||||||
|
|
||||||
|
<MudSwitch @bind-Value="Model.RequiresFullCacheClear"
|
||||||
|
Color="Color.Warning"
|
||||||
|
Label="نیاز به پاکسازی کامل کش" />
|
||||||
|
|
||||||
|
<MudTextField @bind-Value="Model.UpdateMessage"
|
||||||
|
Label="پیام بهروزرسانی"
|
||||||
|
Variant="Variant.Outlined"
|
||||||
|
Lines="2"
|
||||||
|
HelperText="پیامی که به کاربر نمایش داده میشود" />
|
||||||
|
|
||||||
|
<MudTextField @bind-Value="Model.ReleaseNotes"
|
||||||
|
Label="یادداشتهای انتشار"
|
||||||
|
Variant="Variant.Outlined"
|
||||||
|
Lines="4"
|
||||||
|
HelperText="توضیحات تغییرات این نسخه" />
|
||||||
|
|
||||||
|
<MudDivider Class="my-2" />
|
||||||
|
|
||||||
|
<MudTextField @bind-Value="Model.UpdateReason"
|
||||||
|
Label="دلیل تغییر (برای لاگ)"
|
||||||
|
Variant="Variant.Outlined"
|
||||||
|
Required="true"
|
||||||
|
RequiredError="دلیل تغییر اجباری است"
|
||||||
|
Lines="2"
|
||||||
|
HelperText="این متن در لاگ ذخیره میشود" />
|
||||||
|
</MudStack>
|
||||||
|
</MudForm>
|
||||||
|
</DialogContent>
|
||||||
|
<DialogActions>
|
||||||
|
<MudButton OnClick="Cancel" Color="Color.Default" Variant="Variant.Text">
|
||||||
|
انصراف
|
||||||
|
</MudButton>
|
||||||
|
<MudButton OnClick="Submit" Color="Color.Primary" Variant="Variant.Filled" Disabled="@(!_isValid)">
|
||||||
|
ذخیره
|
||||||
|
</MudButton>
|
||||||
|
</DialogActions>
|
||||||
|
</MudDialog>
|
||||||
|
|
||||||
|
@code {
|
||||||
|
[CascadingParameter]
|
||||||
|
private IMudDialogInstance MudDialog { get; set; } = null!;
|
||||||
|
|
||||||
|
[Parameter]
|
||||||
|
public UpdateAppVersionDto Model { get; set; } = new();
|
||||||
|
|
||||||
|
private MudForm? _form;
|
||||||
|
private bool _isValid;
|
||||||
|
|
||||||
|
private void Cancel() => MudDialog.Cancel();
|
||||||
|
|
||||||
|
private void Submit()
|
||||||
|
{
|
||||||
|
if (_isValid)
|
||||||
|
{
|
||||||
|
MudDialog.Close(DialogResult.Ok(Model));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,90 @@
|
|||||||
|
using BackOffice.BFF.Configuration.Protobuf.Protos.AppVersion;
|
||||||
|
using Google.Protobuf.WellKnownTypes;
|
||||||
|
|
||||||
|
namespace BackOffice.Services.AppVersion;
|
||||||
|
|
||||||
|
public class AppVersionService : IAppVersionService
|
||||||
|
{
|
||||||
|
private readonly AppVersionContract.AppVersionContractClient _client;
|
||||||
|
|
||||||
|
public AppVersionService(AppVersionContract.AppVersionContractClient client)
|
||||||
|
{
|
||||||
|
_client = client;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<List<AppVersionDto>> GetAllAsync(bool includeInactive = false)
|
||||||
|
{
|
||||||
|
var request = new GetAllAppVersionsRequest
|
||||||
|
{
|
||||||
|
IncludeInactive = includeInactive
|
||||||
|
};
|
||||||
|
|
||||||
|
var response = await _client.GetAllAppVersionsAsync(request);
|
||||||
|
|
||||||
|
return response.Items.Select(item => new AppVersionDto
|
||||||
|
{
|
||||||
|
Id = item.Id,
|
||||||
|
AppName = item.AppName,
|
||||||
|
CurrentVersion = item.CurrentVersion,
|
||||||
|
MinRequiredVersion = item.MinRequiredVersion,
|
||||||
|
RequiresFullCacheClear = item.RequiresFullCacheClear,
|
||||||
|
UpdateMessage = item.UpdateMessage,
|
||||||
|
ReleaseNotes = item.ReleaseNotes,
|
||||||
|
IsActive = item.IsActive,
|
||||||
|
Created = item.Created?.ToDateTime(),
|
||||||
|
LastModified = item.LastModified?.ToDateTime()
|
||||||
|
}).ToList();
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<AppVersionDto?> GetByNameAsync(string appName)
|
||||||
|
{
|
||||||
|
var request = new GetAppVersionRequest
|
||||||
|
{
|
||||||
|
AppName = appName
|
||||||
|
};
|
||||||
|
|
||||||
|
var response = await _client.GetAppVersionAsync(request);
|
||||||
|
|
||||||
|
if (!response.Found || response.Item == null)
|
||||||
|
return null;
|
||||||
|
|
||||||
|
var item = response.Item;
|
||||||
|
return new AppVersionDto
|
||||||
|
{
|
||||||
|
Id = item.Id,
|
||||||
|
AppName = item.AppName,
|
||||||
|
CurrentVersion = item.CurrentVersion,
|
||||||
|
MinRequiredVersion = item.MinRequiredVersion,
|
||||||
|
RequiresFullCacheClear = item.RequiresFullCacheClear,
|
||||||
|
UpdateMessage = item.UpdateMessage,
|
||||||
|
ReleaseNotes = item.ReleaseNotes,
|
||||||
|
IsActive = item.IsActive,
|
||||||
|
Created = item.Created?.ToDateTime(),
|
||||||
|
LastModified = item.LastModified?.ToDateTime()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task UpdateAsync(UpdateAppVersionDto dto)
|
||||||
|
{
|
||||||
|
var request = new UpdateAppVersionRequest
|
||||||
|
{
|
||||||
|
AppName = dto.AppName,
|
||||||
|
CurrentVersion = dto.CurrentVersion,
|
||||||
|
RequiresFullCacheClear = dto.RequiresFullCacheClear
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(dto.MinRequiredVersion))
|
||||||
|
request.MinRequiredVersion = dto.MinRequiredVersion;
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(dto.UpdateMessage))
|
||||||
|
request.UpdateMessage = dto.UpdateMessage;
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(dto.ReleaseNotes))
|
||||||
|
request.ReleaseNotes = dto.ReleaseNotes;
|
||||||
|
|
||||||
|
if (!string.IsNullOrWhiteSpace(dto.UpdateReason))
|
||||||
|
request.UpdateReason = dto.UpdateReason;
|
||||||
|
|
||||||
|
await _client.UpdateAppVersionAsync(request);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
namespace BackOffice.Services.AppVersion;
|
||||||
|
|
||||||
|
public interface IAppVersionService
|
||||||
|
{
|
||||||
|
Task<List<AppVersionDto>> GetAllAsync(bool includeInactive = false);
|
||||||
|
Task<AppVersionDto?> GetByNameAsync(string appName);
|
||||||
|
Task UpdateAsync(UpdateAppVersionDto dto);
|
||||||
|
}
|
||||||
|
|
||||||
|
public class AppVersionDto
|
||||||
|
{
|
||||||
|
public long Id { get; set; }
|
||||||
|
public string AppName { get; set; } = string.Empty;
|
||||||
|
public string AppNameDisplay => GetDisplayName(AppName);
|
||||||
|
public string CurrentVersion { get; set; } = string.Empty;
|
||||||
|
public string MinRequiredVersion { get; set; } = string.Empty;
|
||||||
|
public bool RequiresFullCacheClear { get; set; }
|
||||||
|
public string UpdateMessage { get; set; } = string.Empty;
|
||||||
|
public string ReleaseNotes { get; set; } = string.Empty;
|
||||||
|
public bool IsActive { get; set; }
|
||||||
|
public DateTime? Created { get; set; }
|
||||||
|
public DateTime? LastModified { get; set; }
|
||||||
|
|
||||||
|
private static string GetDisplayName(string appName) => appName switch
|
||||||
|
{
|
||||||
|
"FoursatMarketApp" => "اپ مارکت فورست",
|
||||||
|
"FoursatClubApp" => "اپ باشگاه فورست",
|
||||||
|
_ => appName
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
public class UpdateAppVersionDto
|
||||||
|
{
|
||||||
|
public string AppName { get; set; } = string.Empty;
|
||||||
|
public string CurrentVersion { get; set; } = string.Empty;
|
||||||
|
public string? MinRequiredVersion { get; set; }
|
||||||
|
public bool RequiresFullCacheClear { get; set; }
|
||||||
|
public string? UpdateMessage { get; set; }
|
||||||
|
public string? ReleaseNotes { get; set; }
|
||||||
|
public string? UpdateReason { get; set; }
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user