mirror of
https://github.com/2dust/v2rayN.git
synced 2026-11-15 17:05:03 +03:00
Centralize config access in database handlers
Remove Config parameters from ConfigDbHandler methods and use the current configuration where needed. Update desktop, WebAPI, and test callers.
This commit is contained in:
@@ -32,7 +32,7 @@ public class ConfigHandlerCustomSubscriptionTests
|
||||
oldProfile.IsSub = true;
|
||||
await SQLiteHelper.Instance.InsertAsync(oldProfile);
|
||||
|
||||
var count = await ConfigDbHandler.AddBatchServers(config, FullXrayConfigs, subId, true);
|
||||
var count = await ConfigDbHandler.AddBatchServers( FullXrayConfigs, subId, true);
|
||||
var profiles = await ConfigDbQuery.ProfileItems(subId) ?? [];
|
||||
|
||||
await count.Should().BeEqualTo(2);
|
||||
@@ -66,7 +66,7 @@ public class ConfigHandlerCustomSubscriptionTests
|
||||
await SQLiteHelper.Instance.InsertAsync(existing);
|
||||
|
||||
var invalidSubscription = Convert.ToBase64String(System.Text.Encoding.UTF8.GetBytes("not a valid profile"));
|
||||
var count = await ConfigDbHandler.AddBatchServers(config, invalidSubscription, subId, true);
|
||||
var count = await ConfigDbHandler.AddBatchServers( invalidSubscription, subId, true);
|
||||
var profiles = await ConfigDbQuery.ProfileItems(subId) ?? [];
|
||||
|
||||
await (count < 1).Should().BeTrue();
|
||||
|
||||
@@ -46,7 +46,7 @@ public class CoreConfigContextBuilder
|
||||
SimpleDnsItem = config.SimpleDNSItem,
|
||||
ProtectDomainList = [],
|
||||
RawDnsItem = await ConfigDbQuery.GetDNSItem(coreType),
|
||||
RoutingItem = await ConfigDbHandler.GetDefaultRouting(config),
|
||||
RoutingItem = await ConfigDbHandler.GetDefaultRouting(),
|
||||
IsWindows = Utils.IsWindows(),
|
||||
IsMacOS = Utils.IsMacOS(),
|
||||
IsLinux = Utils.IsLinux(),
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -106,7 +106,7 @@ public class SubscriptionHandler(
|
||||
await updateFunc?.Invoke(false, $"{hashCode}{ResUI.MsgStartParsingSubscription}");
|
||||
|
||||
// Add servers to configuration
|
||||
var ret = await ConfigDbHandler.AddBatchServers(_config, result, id, true);
|
||||
var ret = await ConfigDbHandler.AddBatchServers(result, id, true);
|
||||
if (ret <= 0)
|
||||
{
|
||||
Logging.SaveLog("FailedImportSubscription");
|
||||
|
||||
@@ -113,7 +113,7 @@ public class TaskManager
|
||||
});
|
||||
await handler.UpdateProcess(item.Id);
|
||||
item.UpdateTime = updateTime;
|
||||
await ConfigDbHandler.AddSubItem(_config, item);
|
||||
await ConfigDbHandler.AddSubItem(item);
|
||||
await Task.Delay(1000);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -245,7 +245,7 @@ public partial class AddGroupServerViewModel : MyReactiveObject, ICloseable
|
||||
|
||||
SelectedSource.SetProtocolExtra(protocolExtra);
|
||||
|
||||
if (await ConfigDbHandler.AddServerCommon(_config, SelectedSource) == 0)
|
||||
if (await ConfigDbHandler.AddServerCommon(SelectedSource) == 0)
|
||||
{
|
||||
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
||||
RequestClose?.Invoke(this, EventArgs.Empty);
|
||||
|
||||
@@ -71,7 +71,7 @@ public partial class AddServer2ViewModel : MyReactiveObject, ICloseable
|
||||
IsSingboxEndpoint = IsSingboxEndpoint ? true : null,
|
||||
});
|
||||
|
||||
if (await ConfigDbHandler.EditCustomServer(_config, SelectedSource) == 0)
|
||||
if (await ConfigDbHandler.EditCustomServer(SelectedSource) == 0)
|
||||
{
|
||||
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
||||
RequestClose?.Invoke(this, EventArgs.Empty);
|
||||
@@ -92,7 +92,7 @@ public partial class AddServer2ViewModel : MyReactiveObject, ICloseable
|
||||
var item = await ConfigDbQuery.GetProfileItem(SelectedSource.IndexId);
|
||||
item ??= SelectedSource;
|
||||
item.Address = fileName;
|
||||
var result = item.ConfigType == EConfigType.Outbound ? await ConfigDbHandler.AddCustomOutboundServer(_config, item, false) : await ConfigDbHandler.AddCustomServer(_config, item, false);
|
||||
var result = item.ConfigType == EConfigType.Outbound ? await ConfigDbHandler.AddCustomOutboundServer(item, false) : await ConfigDbHandler.AddCustomServer(item, false);
|
||||
if (result == 0)
|
||||
{
|
||||
NoticeManager.Instance.Enqueue(ResUI.SuccessfullyImportedCustomServer);
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
|
||||
|
||||
namespace ServiceLib.ViewModels;
|
||||
|
||||
public partial class AddServerViewModel : MyReactiveObject, ICloseable
|
||||
@@ -594,7 +592,7 @@ public partial class AddServerViewModel : MyReactiveObject, ICloseable
|
||||
});
|
||||
SelectedSource.SetTransportExtra(transport);
|
||||
|
||||
if (await ConfigDbHandler.AddServer(_config, SelectedSource) == 0)
|
||||
if (await ConfigDbHandler.AddServer(SelectedSource) == 0)
|
||||
{
|
||||
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
||||
RequestClose?.Invoke(this, EventArgs.Empty);
|
||||
@@ -625,6 +623,7 @@ public partial class AddServerViewModel : MyReactiveObject, ICloseable
|
||||
|
||||
XdriveS3PathStyle = true;
|
||||
break;
|
||||
|
||||
case "Google Drive":
|
||||
XdriveService = "google-drive";
|
||||
SelectedSource.StreamSecurity = Global.StreamSecurity;
|
||||
@@ -649,6 +648,7 @@ public partial class AddServerViewModel : MyReactiveObject, ICloseable
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case "AWS S3 (Global)":
|
||||
XdriveService = "s3";
|
||||
if (XdriveS3Region.IsNullOrEmpty())
|
||||
@@ -658,6 +658,7 @@ public partial class AddServerViewModel : MyReactiveObject, ICloseable
|
||||
|
||||
XdriveS3PathStyle = false;
|
||||
break;
|
||||
|
||||
case "Yandex Cloud S3":
|
||||
XdriveService = "s3";
|
||||
if (XdriveS3Region.IsNullOrEmpty())
|
||||
@@ -667,6 +668,7 @@ public partial class AddServerViewModel : MyReactiveObject, ICloseable
|
||||
|
||||
XdriveS3PathStyle = true;
|
||||
break;
|
||||
|
||||
case "ArvanCloud S3":
|
||||
XdriveService = "s3";
|
||||
if (XdriveS3Region.IsNullOrEmpty())
|
||||
@@ -676,6 +678,7 @@ public partial class AddServerViewModel : MyReactiveObject, ICloseable
|
||||
|
||||
XdriveS3PathStyle = true;
|
||||
break;
|
||||
|
||||
case "Custom S3":
|
||||
XdriveService = "s3";
|
||||
break;
|
||||
|
||||
@@ -207,7 +207,7 @@ public partial class DNSSettingViewModel : MyReactiveObject, ICloseable
|
||||
item1.UseSystemHosts = UseSystemHostsCompatible;
|
||||
item1.NormalDNS = NormalDNSCompatible;
|
||||
item1.TunDNS = TunDNSCompatible;
|
||||
await ConfigDbHandler.SaveDNSItems(_config, item1);
|
||||
await ConfigDbHandler.SaveDNSItems(item1);
|
||||
|
||||
var item2 = await ConfigDbQuery.GetDNSItem(ECoreType.sing_box);
|
||||
item2.Enabled = SBCustomDNSEnableCompatible;
|
||||
@@ -215,7 +215,7 @@ public partial class DNSSettingViewModel : MyReactiveObject, ICloseable
|
||||
item2.DomainDNSAddress = DomainDNSAddress2Compatible;
|
||||
item2.NormalDNS = JsonUtils.Serialize(JsonUtils.Deserialize<Dns4Sbox>(NormalDNS2Compatible));
|
||||
item2.TunDNS = JsonUtils.Serialize(JsonUtils.Deserialize<Dns4Sbox>(TunDNS2Compatible));
|
||||
await ConfigDbHandler.SaveDNSItems(_config, item2);
|
||||
await ConfigDbHandler.SaveDNSItems(item2);
|
||||
|
||||
await ConfigTextHandler.SaveConfig();
|
||||
RequestClose?.Invoke(this, EventArgs.Empty);
|
||||
|
||||
@@ -104,7 +104,7 @@ public partial class FullConfigTemplateViewModel : MyReactiveObject, ICloseable
|
||||
item.AddProxyOnly = AddProxyOnly4Ray;
|
||||
item.ProxyDetour = ProxyDetour4Ray;
|
||||
|
||||
await ConfigDbHandler.SaveFullConfigTemplate(_config, item);
|
||||
await ConfigDbHandler.SaveFullConfigTemplate(item);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -122,7 +122,7 @@ public partial class FullConfigTemplateViewModel : MyReactiveObject, ICloseable
|
||||
item.AddProxyOnly = AddProxyOnly4Singbox;
|
||||
item.ProxyDetour = ProxyDetour4Singbox;
|
||||
|
||||
await ConfigDbHandler.SaveFullConfigTemplate(_config, item);
|
||||
await ConfigDbHandler.SaveFullConfigTemplate(item);
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -331,8 +331,8 @@ public partial class MainWindowViewModel : MyReactiveObject
|
||||
}
|
||||
|
||||
//await ConfigHandler.InitBuiltinRouting(_config);
|
||||
await ConfigDbHandler.InitBuiltinDNS(_config);
|
||||
await ConfigDbHandler.InitBuiltinFullConfigTemplate(_config);
|
||||
await ConfigDbHandler.InitBuiltinDNS();
|
||||
await ConfigDbHandler.InitBuiltinFullConfigTemplate();
|
||||
await ProfileExManager.Instance.Init();
|
||||
await CoreManager.Instance.Init(_config, UpdateHandler);
|
||||
await CertPemManager.Instance.Init(_config);
|
||||
@@ -499,7 +499,7 @@ public partial class MainWindowViewModel : MyReactiveObject
|
||||
}
|
||||
stringData = result;
|
||||
}
|
||||
var ret = await ConfigDbHandler.AddBatchServers(_config, stringData, _config.SubIndexId, false);
|
||||
var ret = await ConfigDbHandler.AddBatchServers(stringData, _config.SubIndexId, false);
|
||||
if (ret > 0)
|
||||
{
|
||||
await RefreshSubscriptions();
|
||||
@@ -549,7 +549,7 @@ public partial class MainWindowViewModel : MyReactiveObject
|
||||
}
|
||||
else
|
||||
{
|
||||
var ret = await ConfigDbHandler.AddBatchServers(_config, result, _config.SubIndexId, false);
|
||||
var ret = await ConfigDbHandler.AddBatchServers(result, _config.SubIndexId, false);
|
||||
if (ret > 0)
|
||||
{
|
||||
await RefreshSubscriptions();
|
||||
@@ -610,7 +610,7 @@ public partial class MainWindowViewModel : MyReactiveObject
|
||||
var ret = await AppManager.Instance.WindowDialog.ShowDialogAsync(routingSettingViewModel);
|
||||
if (ret == true)
|
||||
{
|
||||
await ConfigDbHandler.InitBuiltinRouting(_config);
|
||||
await ConfigDbHandler.InitBuiltinRouting();
|
||||
RxSchedulers.MainThreadScheduler.Schedule(async () =>
|
||||
{
|
||||
await StatusBarViewModel.RefreshRoutingsMenu();
|
||||
@@ -788,8 +788,8 @@ public partial class MainWindowViewModel : MyReactiveObject
|
||||
|
||||
public async Task ApplyRegionalPreset(EPresetType type)
|
||||
{
|
||||
await ConfigDbHandler.ApplyRegionalPreset(_config, type);
|
||||
await ConfigDbHandler.InitRouting(_config);
|
||||
await ConfigDbHandler.ApplyRegionalPreset(type);
|
||||
await ConfigDbHandler.InitRouting();
|
||||
RxSchedulers.MainThreadScheduler.Schedule(async () =>
|
||||
{
|
||||
await StatusBarViewModel.RefreshRoutingsMenu();
|
||||
|
||||
@@ -514,7 +514,7 @@ public partial class ProfilesViewModel : MyReactiveObject
|
||||
}
|
||||
var exists = lstSelected.Exists(t => t.IndexId == _config.IndexId);
|
||||
|
||||
await ConfigDbHandler.RemoveServers(_config, lstSelected);
|
||||
await ConfigDbHandler.RemoveServers(lstSelected);
|
||||
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
||||
if (lstSelected.Count == ProfileItems.Count)
|
||||
{
|
||||
@@ -534,7 +534,7 @@ public partial class ProfilesViewModel : MyReactiveObject
|
||||
return;
|
||||
}
|
||||
|
||||
var tuple = await ConfigDbHandler.DedupServerList(_config, _config.SubIndexId);
|
||||
var tuple = await ConfigDbHandler.DedupServerList(_config.SubIndexId);
|
||||
if (tuple.Item1 > 0 || tuple.Item2 > 0)
|
||||
{
|
||||
await RefreshServers();
|
||||
@@ -550,7 +550,7 @@ public partial class ProfilesViewModel : MyReactiveObject
|
||||
{
|
||||
return;
|
||||
}
|
||||
if (await ConfigDbHandler.CopyServer(_config, lstSelected) == 0)
|
||||
if (await ConfigDbHandler.CopyServer(lstSelected) == 0)
|
||||
{
|
||||
await RefreshServers();
|
||||
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
||||
@@ -609,7 +609,7 @@ public partial class ProfilesViewModel : MyReactiveObject
|
||||
|
||||
private async Task GenGroupAllServer()
|
||||
{
|
||||
var ret = await ConfigDbHandler.AddGroupAllServer(_config, SelectedSub);
|
||||
var ret = await ConfigDbHandler.AddGroupAllServer( SelectedSub);
|
||||
if (ret.Success != true)
|
||||
{
|
||||
NoticeManager.Instance.Enqueue(ResUI.OperationFailed);
|
||||
@@ -621,7 +621,7 @@ public partial class ProfilesViewModel : MyReactiveObject
|
||||
|
||||
private async Task GenGroupRegionServer()
|
||||
{
|
||||
var ret = await ConfigDbHandler.AddGroupRegionServer(_config, SelectedSub);
|
||||
var ret = await ConfigDbHandler.AddGroupRegionServer( SelectedSub);
|
||||
if (ret.Success != true)
|
||||
{
|
||||
NoticeManager.Instance.Enqueue(ResUI.OperationFailed);
|
||||
@@ -641,7 +641,7 @@ public partial class ProfilesViewModel : MyReactiveObject
|
||||
|
||||
_dicHeaderSort.TryAdd(colName, true);
|
||||
_dicHeaderSort.TryGetValue(colName, out var asc);
|
||||
if (await ConfigDbHandler.SortServers(_config, _config.SubIndexId, colName, asc) != 0)
|
||||
if (await ConfigDbHandler.SortServers( _config.SubIndexId, colName, asc) != 0)
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -651,7 +651,7 @@ public partial class ProfilesViewModel : MyReactiveObject
|
||||
|
||||
public async Task RemoveInvalidServerResult()
|
||||
{
|
||||
var count = await ConfigDbHandler.RemoveInvalidServerResult(_config, _config.SubIndexId);
|
||||
var count = await ConfigDbHandler.RemoveInvalidServerResult( _config.SubIndexId);
|
||||
await RefreshServers();
|
||||
NoticeManager.Instance.Enqueue(string.Format(ResUI.RemoveInvalidServerResultTip, count));
|
||||
}
|
||||
@@ -665,7 +665,7 @@ public partial class ProfilesViewModel : MyReactiveObject
|
||||
return;
|
||||
}
|
||||
|
||||
await ConfigDbHandler.MoveToGroup(_config, lstSelected, SelectedMoveToGroup.Id);
|
||||
await ConfigDbHandler.MoveToGroup( lstSelected, SelectedMoveToGroup.Id);
|
||||
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
||||
|
||||
await RefreshServers();
|
||||
@@ -683,7 +683,7 @@ public partial class ProfilesViewModel : MyReactiveObject
|
||||
return;
|
||||
}
|
||||
|
||||
if (await ConfigDbHandler.MoveServer(_config, lstProfile, index, eMove) == 0)
|
||||
if (await ConfigDbHandler.MoveServer( lstProfile, index, eMove) == 0)
|
||||
{
|
||||
await RefreshServers();
|
||||
}
|
||||
@@ -695,7 +695,7 @@ public partial class ProfilesViewModel : MyReactiveObject
|
||||
if (startIndex >= 0 && targetIndex >= 0 && startIndex != targetIndex)
|
||||
{
|
||||
var lstProfile = ProfileItems?.Select(t => t.IndexId).ToList() ?? [];
|
||||
if (await ConfigDbHandler.MoveServer(_config, lstProfile, startIndex, EMove.Position, targetIndex) == 0)
|
||||
if (await ConfigDbHandler.MoveServer( lstProfile, startIndex, EMove.Position, targetIndex) == 0)
|
||||
{
|
||||
await RefreshServers();
|
||||
}
|
||||
@@ -717,8 +717,7 @@ public partial class ProfilesViewModel : MyReactiveObject
|
||||
.Select(item => item.IndexId)
|
||||
.ToList();
|
||||
|
||||
var result = await ConfigDbHandler.MoveServersTo(
|
||||
_config,
|
||||
var result = await ConfigDbHandler.MoveServersTo(
|
||||
orderedProfileIds,
|
||||
sourceIndices,
|
||||
insertIndex);
|
||||
@@ -921,7 +920,7 @@ public partial class ProfilesViewModel : MyReactiveObject
|
||||
{
|
||||
return;
|
||||
}
|
||||
await ConfigDbHandler.DeleteSubItem(_config, item.Id);
|
||||
await ConfigDbHandler.DeleteSubItem( item.Id);
|
||||
|
||||
await RefreshSubscriptions();
|
||||
await SubSelectedChangedAsync();
|
||||
|
||||
@@ -233,7 +233,7 @@ public partial class RoutingRuleSettingViewModel : MyReactiveObject, ICloseable
|
||||
item.RuleNum = _rules.Count;
|
||||
item.RuleSet = JsonUtils.Serialize(_rules, false);
|
||||
|
||||
if (await ConfigDbHandler.SaveRoutingItem(_config, item) == 0)
|
||||
if (await ConfigDbHandler.SaveRoutingItem( item) == 0)
|
||||
{
|
||||
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
||||
RequestClose?.Invoke(this, EventArgs.Empty);
|
||||
|
||||
@@ -77,7 +77,7 @@ public partial class RoutingSettingViewModel : MyReactiveObject
|
||||
DomainStrategy = _config.RoutingBasicItem.DomainStrategy;
|
||||
DomainStrategy4Singbox = _config.RoutingBasicItem.DomainStrategy4Singbox;
|
||||
|
||||
await ConfigDbHandler.InitBuiltinRouting(_config);
|
||||
await ConfigDbHandler.InitBuiltinRouting();
|
||||
await RefreshRoutingItems();
|
||||
}
|
||||
|
||||
@@ -174,7 +174,7 @@ public partial class RoutingSettingViewModel : MyReactiveObject
|
||||
return;
|
||||
}
|
||||
|
||||
if (await ConfigDbHandler.SetDefaultRouting(_config, item) == 0)
|
||||
if (await ConfigDbHandler.SetDefaultRouting( item) == 0)
|
||||
{
|
||||
await RefreshRoutingItems();
|
||||
IsModified = true;
|
||||
@@ -183,7 +183,7 @@ public partial class RoutingSettingViewModel : MyReactiveObject
|
||||
|
||||
private async Task RoutingAdvancedImportRules()
|
||||
{
|
||||
if (await ConfigDbHandler.InitRouting(_config, true) == 0)
|
||||
if (await ConfigDbHandler.InitRouting(true) == 0)
|
||||
{
|
||||
await RefreshRoutingItems();
|
||||
IsModified = true;
|
||||
|
||||
@@ -218,7 +218,7 @@ public partial class StatusBarViewModel : MyReactiveObject
|
||||
|
||||
private async Task Init()
|
||||
{
|
||||
await ConfigDbHandler.InitBuiltinRouting(_config);
|
||||
await ConfigDbHandler.InitBuiltinRouting();
|
||||
await RefreshRoutingsMenu();
|
||||
await InboundDisplayStatus();
|
||||
// The view refreshes its icon on initialization; interaction handlers are not registered yet.
|
||||
@@ -413,7 +413,7 @@ public partial class StatusBarViewModel : MyReactiveObject
|
||||
return;
|
||||
}
|
||||
|
||||
if (await ConfigDbHandler.SetDefaultRouting(_config, item) == 0)
|
||||
if (await ConfigDbHandler.SetDefaultRouting(item) == 0)
|
||||
{
|
||||
NoticeManager.Instance.SendMessageEx(ResUI.TipChangeRouting);
|
||||
ReloadRequested.Publish();
|
||||
|
||||
@@ -89,7 +89,7 @@ public partial class SubEditViewModel : MyReactiveObject, ICloseable
|
||||
SelectedSource.PrevProfile = PrevProfile;
|
||||
SelectedSource.NextProfile = NextProfile;
|
||||
|
||||
if (await ConfigDbHandler.AddSubItem(_config, SelectedSource) == 0)
|
||||
if (await ConfigDbHandler.AddSubItem( SelectedSource) == 0)
|
||||
{
|
||||
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
||||
RequestClose?.Invoke(this, EventArgs.Empty);
|
||||
|
||||
@@ -92,7 +92,7 @@ public partial class SubSettingViewModel : MyReactiveObject
|
||||
|
||||
foreach (var it in SelectedSources ?? [SelectedSource])
|
||||
{
|
||||
await ConfigDbHandler.DeleteSubItem(_config, it.Id);
|
||||
await ConfigDbHandler.DeleteSubItem( it.Id);
|
||||
}
|
||||
await RefreshSubItems();
|
||||
NoticeManager.Instance.Enqueue(ResUI.OperationSuccess);
|
||||
|
||||
@@ -9,9 +9,8 @@ internal static class BuiltinDnsProfileBootstrap
|
||||
];
|
||||
|
||||
public static async Task EnsureAsync(
|
||||
Config config,
|
||||
Func<Task<IReadOnlyList<DNSItem>>> load,
|
||||
Func<Config, DNSItem, Task<int>> save)
|
||||
Func<DNSItem, Task<int>> save)
|
||||
{
|
||||
var existing = await load();
|
||||
foreach (var (coreType, remarks) in BuiltinProfiles)
|
||||
@@ -27,7 +26,7 @@ internal static class BuiltinDnsProfileBootstrap
|
||||
CoreType = coreType,
|
||||
Enabled = false,
|
||||
};
|
||||
if (await save(config, item) != 0)
|
||||
if (await save(item) != 0)
|
||||
{
|
||||
throw new IOException($"The built-in {coreType} DNS profile could not be created.");
|
||||
}
|
||||
|
||||
@@ -60,7 +60,7 @@ public sealed partial class V2rayRuntime
|
||||
|
||||
var count = await _mutations.RunAsync(async () =>
|
||||
{
|
||||
var imported = await ConfigDbHandler.AddBatchServers(Config, request.Content, groupId, request.IsSubscription);
|
||||
var imported = await ConfigDbHandler.AddBatchServers(request.Content, groupId, request.IsSubscription);
|
||||
if (imported > 0)
|
||||
{
|
||||
await EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.SaveConfig());
|
||||
@@ -160,13 +160,13 @@ public sealed partial class V2rayRuntime
|
||||
try
|
||||
{
|
||||
result = await _mutations.RunAsync(() => profile.ConfigType.IsGroupType()
|
||||
? ConfigDbHandler.AddServerCommon(Config, profile)
|
||||
? ConfigDbHandler.AddServerCommon(profile)
|
||||
: profile.ConfigType switch
|
||||
{
|
||||
EConfigType.Custom when isNew => ConfigDbHandler.AddCustomServer(Config, profile, blDelete: false),
|
||||
EConfigType.Outbound when isNew => ConfigDbHandler.AddCustomOutboundServer(Config, profile, blDelete: false, toFile: true),
|
||||
EConfigType.Custom or EConfigType.Outbound => ConfigDbHandler.EditCustomServer(Config, profile),
|
||||
_ => ConfigDbHandler.AddServer(Config, profile),
|
||||
EConfigType.Custom when isNew => ConfigDbHandler.AddCustomServer(profile, blDelete: false),
|
||||
EConfigType.Outbound when isNew => ConfigDbHandler.AddCustomOutboundServer(profile, blDelete: false, toFile: true),
|
||||
EConfigType.Custom or EConfigType.Outbound => ConfigDbHandler.EditCustomServer(profile),
|
||||
_ => ConfigDbHandler.AddServer(profile),
|
||||
});
|
||||
}
|
||||
catch (Exception exception)
|
||||
@@ -263,7 +263,7 @@ public sealed partial class V2rayRuntime
|
||||
|
||||
await _mutations.RunAsync(async () =>
|
||||
{
|
||||
if (await ConfigDbHandler.RemoveServers(Config, selected) != 0)
|
||||
if (await ConfigDbHandler.RemoveServers(selected) != 0)
|
||||
{
|
||||
throw new IOException("ServiceLib could not remove the selected profiles.");
|
||||
}
|
||||
@@ -297,7 +297,7 @@ public sealed partial class V2rayRuntime
|
||||
return OperationView.Fail("profile_not_found", ApiMessageKeys.ProfileNotFound);
|
||||
}
|
||||
|
||||
if (await _mutations.RunAsync(() => ConfigDbHandler.CopyServer(Config, items)) != 0)
|
||||
if (await _mutations.RunAsync(() => ConfigDbHandler.CopyServer(items)) != 0)
|
||||
{
|
||||
return OperationView.Fail("profile_copy_failed", ApiMessageKeys.CommonInvalidInput);
|
||||
}
|
||||
@@ -319,7 +319,7 @@ public sealed partial class V2rayRuntime
|
||||
return OperationView.Fail("profile_not_found", ApiMessageKeys.ProfileNotFound);
|
||||
}
|
||||
|
||||
if (await _mutations.RunAsync(() => ConfigDbHandler.MoveToGroup(Config, items, request.SubscriptionId ?? string.Empty)) != 0)
|
||||
if (await _mutations.RunAsync(() => ConfigDbHandler.MoveToGroup(items, request.SubscriptionId ?? string.Empty)) != 0)
|
||||
{
|
||||
return OperationView.Fail("profile_move_failed", ApiMessageKeys.CommonInvalidInput);
|
||||
}
|
||||
@@ -338,7 +338,7 @@ public sealed partial class V2rayRuntime
|
||||
return OperationView.Fail("profile_not_in_group", ApiMessageKeys.ProfileNotInGroup);
|
||||
}
|
||||
|
||||
var result = await _mutations.RunAsync(() => ConfigDbHandler.MoveServer(Config, orderedIds, index, request.Direction, request.Position));
|
||||
var result = await _mutations.RunAsync(() => ConfigDbHandler.MoveServer(orderedIds, index, request.Direction, request.Position));
|
||||
_events.Publish("profiles-changed", new { subscriptionId = groupId });
|
||||
return result == 0
|
||||
? OperationView.Ok(ApiMessageKeys.ProfileOrderSaved)
|
||||
@@ -353,7 +353,7 @@ public sealed partial class V2rayRuntime
|
||||
return OperationView.Fail("profile_sort_column_invalid", ApiMessageKeys.CommonInvalidInput);
|
||||
}
|
||||
|
||||
var result = await _mutations.RunAsync(() => ConfigDbHandler.SortServers(Config, groupId, request.Column, request.Ascending));
|
||||
var result = await _mutations.RunAsync(() => ConfigDbHandler.SortServers(groupId, request.Column, request.Ascending));
|
||||
_events.Publish("profiles-changed", new { subscriptionId = groupId });
|
||||
return result == 0
|
||||
? OperationView.Ok(ApiMessageKeys.ProfileOrderSaved)
|
||||
@@ -362,14 +362,14 @@ public sealed partial class V2rayRuntime
|
||||
|
||||
public async Task<OperationView> RemoveDuplicateProfilesAsync(string? subscriptionId)
|
||||
{
|
||||
var result = await _mutations.RunAsync(() => ConfigDbHandler.DedupServerList(Config, subscriptionId ?? Config.SubIndexId ?? string.Empty));
|
||||
var result = await _mutations.RunAsync(() => ConfigDbHandler.DedupServerList(subscriptionId ?? Config.SubIndexId ?? string.Empty));
|
||||
_events.Publish("profiles-changed", new { subscriptionId = subscriptionId ?? Config.SubIndexId });
|
||||
return OperationView.Ok(ApiMessageKeys.ProfileDeduplicated, new { removed = result.Item1 - result.Item2 });
|
||||
}
|
||||
|
||||
public async Task<OperationView> RemoveInvalidProfilesAsync(string? subscriptionId)
|
||||
{
|
||||
var count = await _mutations.RunAsync(() => ConfigDbHandler.RemoveInvalidServerResult(Config, subscriptionId ?? Config.SubIndexId ?? string.Empty));
|
||||
var count = await _mutations.RunAsync(() => ConfigDbHandler.RemoveInvalidServerResult(subscriptionId ?? Config.SubIndexId ?? string.Empty));
|
||||
_events.Publish("profiles-changed", new { subscriptionId = subscriptionId ?? Config.SubIndexId });
|
||||
return count < 0
|
||||
? OperationView.Ok(ApiMessageKeys.CommonCompleted, new { removed = 0 })
|
||||
@@ -389,8 +389,8 @@ public sealed partial class V2rayRuntime
|
||||
}
|
||||
|
||||
var result = await _mutations.RunAsync(() => byRegion
|
||||
? ConfigDbHandler.AddGroupRegionServer(Config, subscription)
|
||||
: ConfigDbHandler.AddGroupAllServer(Config, subscription));
|
||||
? ConfigDbHandler.AddGroupRegionServer(subscription)
|
||||
: ConfigDbHandler.AddGroupAllServer(subscription));
|
||||
if (!result.Success)
|
||||
{
|
||||
return OperationView.Fail("profile_group_empty", ApiMessageKeys.ProfileGrouped, result.Data);
|
||||
|
||||
@@ -563,7 +563,7 @@ public sealed partial class V2rayRuntime
|
||||
|| current.DomainDNSAddress != input.DomainDNSAddress
|
||||
|| current.Remarks != (input.Remarks ?? current.Remarks);
|
||||
var item = ApplyDnsProfileInput(current, coreType, input);
|
||||
return (Result: await ConfigDbHandler.SaveDNSItems(Config, item), Changed: changed);
|
||||
return (Result: await ConfigDbHandler.SaveDNSItems( item), Changed: changed);
|
||||
});
|
||||
if (result.Result == -2)
|
||||
{
|
||||
@@ -696,7 +696,7 @@ public sealed partial class V2rayRuntime
|
||||
item.RuleNum = parsedRules.Count;
|
||||
}
|
||||
var result = parsedRules.Count == 0
|
||||
? await ConfigDbHandler.SaveRoutingItem(Config, item)
|
||||
? await ConfigDbHandler.SaveRoutingItem( item)
|
||||
: await ConfigDbHandler.AddBatchRoutingRules(item, JsonUtils.Serialize(parsedRules, false));
|
||||
return (Result: result, Item: (RoutingItem?)item, Changed: changed);
|
||||
});
|
||||
@@ -735,7 +735,7 @@ public sealed partial class V2rayRuntime
|
||||
var fallback = remaining.FirstOrDefault();
|
||||
if (fallback is not null)
|
||||
{
|
||||
if (await ConfigDbHandler.SetDefaultRouting(Config, fallback) != 0)
|
||||
if (await ConfigDbHandler.SetDefaultRouting( fallback) != 0)
|
||||
{
|
||||
throw new IOException("ServiceLib could not select the fallback routing profile.");
|
||||
}
|
||||
@@ -772,7 +772,7 @@ public sealed partial class V2rayRuntime
|
||||
return (Result: -2, Changed: false);
|
||||
}
|
||||
var changed = !item.IsActive;
|
||||
return (Result: changed ? await ConfigDbHandler.SetDefaultRouting(Config, item) : 0, Changed: changed);
|
||||
return (Result: changed ? await ConfigDbHandler.SetDefaultRouting( item) : 0, Changed: changed);
|
||||
});
|
||||
if (result.Result == -2)
|
||||
{
|
||||
@@ -993,7 +993,7 @@ public sealed partial class V2rayRuntime
|
||||
}
|
||||
|
||||
var before = await GetActiveRoutingSignatureAsync();
|
||||
var result = await _mutations.RunAsync(() => ConfigDbHandler.InitRouting(Config, true));
|
||||
var result = await _mutations.RunAsync(() => ConfigDbHandler.InitRouting( true));
|
||||
if (result != 0)
|
||||
{
|
||||
return OperationView.Fail("routing_import_failed", ApiMessageKeys.RoutingSaveFailed);
|
||||
@@ -1048,7 +1048,7 @@ public sealed partial class V2rayRuntime
|
||||
return -2;
|
||||
}
|
||||
var item = ApplyCoreConfigTemplateInput(current, coreType, input);
|
||||
return await ConfigDbHandler.SaveFullConfigTemplate(Config, item);
|
||||
return await ConfigDbHandler.SaveFullConfigTemplate( item);
|
||||
});
|
||||
if (result == -2)
|
||||
{
|
||||
@@ -1160,7 +1160,7 @@ public sealed partial class V2rayRuntime
|
||||
await SQLiteHelper.Instance.DeleteAllAsync<DNSItem>();
|
||||
foreach (var item in stage.DnsItems)
|
||||
{
|
||||
if (await ConfigDbHandler.SaveDNSItems(Config, item) != 0)
|
||||
if (await ConfigDbHandler.SaveDNSItems( item) != 0)
|
||||
{
|
||||
throw new IOException($"The {item.CoreType} DNS profile could not be saved.");
|
||||
}
|
||||
@@ -1168,7 +1168,7 @@ public sealed partial class V2rayRuntime
|
||||
|
||||
// Default routing uses embedded data only; this call performs no network I/O
|
||||
// because the route template source was cleared in the staged plan.
|
||||
if (await ConfigDbHandler.InitRouting(Config, false) != 0)
|
||||
if (await ConfigDbHandler.InitRouting( false) != 0)
|
||||
{
|
||||
throw new IOException("The built-in routing profiles could not be initialized.");
|
||||
}
|
||||
@@ -1177,7 +1177,7 @@ public sealed partial class V2rayRuntime
|
||||
{
|
||||
foreach (var item in stage.DnsItems)
|
||||
{
|
||||
if (await ConfigDbHandler.SaveDNSItems(Config, item) != 0)
|
||||
if (await ConfigDbHandler.SaveDNSItems( item) != 0)
|
||||
{
|
||||
throw new IOException($"The {item.CoreType} DNS profile could not be saved.");
|
||||
}
|
||||
@@ -1216,7 +1216,7 @@ public sealed partial class V2rayRuntime
|
||||
var defaultItem = stage.Routing.DefaultRemarks is { } remarks
|
||||
? stage.Routing.Items.FirstOrDefault(item => item.Remarks == remarks)
|
||||
: null;
|
||||
if (defaultItem is not null && await ConfigDbHandler.SetDefaultRouting(Config, defaultItem) != 0)
|
||||
if (defaultItem is not null && await ConfigDbHandler.SetDefaultRouting( defaultItem) != 0)
|
||||
{
|
||||
throw new IOException("The first staged routing profile could not be activated.");
|
||||
}
|
||||
@@ -1226,7 +1226,7 @@ public sealed partial class V2rayRuntime
|
||||
{
|
||||
var existingDefault = currentRoutes.FirstOrDefault(item => item.Id == existingDefaultId);
|
||||
if (existingDefault is not null && !existingDefault.IsActive
|
||||
&& await ConfigDbHandler.SetDefaultRouting(Config, existingDefault) != 0)
|
||||
&& await ConfigDbHandler.SetDefaultRouting( existingDefault) != 0)
|
||||
{
|
||||
throw new IOException("The migrated default routing profile could not be activated.");
|
||||
}
|
||||
|
||||
@@ -247,17 +247,16 @@ public sealed partial class V2rayRuntime(
|
||||
}
|
||||
await EnsureConfigSaveSucceededAsync(() => ConfigTextHandler.SaveConfig());
|
||||
});
|
||||
await ConfigDbHandler.InitBuiltinDNS(Config);
|
||||
await ConfigDbHandler.InitBuiltinDNS();
|
||||
await BuiltinDnsProfileBootstrap.EnsureAsync(
|
||||
Config,
|
||||
async () => await ConfigDbQuery.DNSItems() ?? [],
|
||||
ConfigDbHandler.SaveDNSItems);
|
||||
await ConfigDbHandler.InitBuiltinFullConfigTemplate(Config);
|
||||
await ConfigDbHandler.InitBuiltinFullConfigTemplate();
|
||||
// Keep startup aligned with Desktop's StatusBarViewModel. In particular,
|
||||
// InitBuiltinRouting owns the RoutingIndexId -> IsActive migration and must
|
||||
// run even when a restored Desktop database already has routing rows.
|
||||
await ConfigDbHandler.InitBuiltinRouting(Config);
|
||||
_ = await ConfigDbHandler.GetDefaultRouting(Config);
|
||||
await ConfigDbHandler.InitBuiltinRouting();
|
||||
_ = await ConfigDbHandler.GetDefaultRouting();
|
||||
var restoredSubscriptions = await ConfigDbQuery.SubItems() ?? [];
|
||||
var normalizedSubIndexId = NormalizeSelectedSubscriptionId(
|
||||
Config.SubIndexId,
|
||||
@@ -437,7 +436,7 @@ public sealed partial class V2rayRuntime(
|
||||
}
|
||||
|
||||
var item = ToSubItem(input, null);
|
||||
var result = await _mutations.RunAsync(() => ConfigDbHandler.AddSubItem(Config, item));
|
||||
var result = await _mutations.RunAsync(() => ConfigDbHandler.AddSubItem(item));
|
||||
if (result != 0)
|
||||
{
|
||||
return new(false, "subscription_save_failed", ApiMessageKeys.SubscriptionSaveFailed, null);
|
||||
@@ -466,7 +465,7 @@ public sealed partial class V2rayRuntime(
|
||||
|
||||
var item = ToSubItem(input, existing);
|
||||
item.Id = id;
|
||||
var result = await ConfigDbHandler.AddSubItem(Config, item);
|
||||
var result = await ConfigDbHandler.AddSubItem(item);
|
||||
if (result != 0)
|
||||
{
|
||||
return new SubscriptionMutationResult(false, "subscription_save_failed", ApiMessageKeys.SubscriptionSaveFailed, null);
|
||||
@@ -496,7 +495,7 @@ public sealed partial class V2rayRuntime(
|
||||
|
||||
await _mutations.RunAsync(async () =>
|
||||
{
|
||||
if (await ConfigDbHandler.DeleteSubItem(Config, id) != 0)
|
||||
if (await ConfigDbHandler.DeleteSubItem(id) != 0)
|
||||
{
|
||||
throw new IOException("ServiceLib could not delete the subscription.");
|
||||
}
|
||||
@@ -1178,7 +1177,7 @@ public sealed partial class V2rayRuntime(
|
||||
if (item is not null)
|
||||
{
|
||||
item.UpdateTime = updateTime;
|
||||
if (await ConfigDbHandler.AddSubItem(Config, item) != 0)
|
||||
if (await ConfigDbHandler.AddSubItem(item) != 0)
|
||||
{
|
||||
throw new IOException("ServiceLib could not save the subscription timestamp.");
|
||||
}
|
||||
@@ -1191,7 +1190,7 @@ public sealed partial class V2rayRuntime(
|
||||
if (item.Enabled)
|
||||
{
|
||||
item.UpdateTime = updateTime;
|
||||
if (await ConfigDbHandler.AddSubItem(Config, item) != 0)
|
||||
if (await ConfigDbHandler.AddSubItem(item) != 0)
|
||||
{
|
||||
throw new IOException("ServiceLib could not save the subscription timestamp.");
|
||||
}
|
||||
|
||||
@@ -57,9 +57,8 @@ public class BuiltinDnsProfileBootstrapTests
|
||||
var rows = new List<DNSItem>(initial);
|
||||
var savedTypes = new List<ECoreType>();
|
||||
await BuiltinDnsProfileBootstrap.EnsureAsync(
|
||||
new Config(),
|
||||
() => Task.FromResult<IReadOnlyList<DNSItem>>(rows.ToArray()),
|
||||
(_, item) =>
|
||||
(item) =>
|
||||
{
|
||||
rows.Add(item);
|
||||
savedTypes.Add(item.CoreType);
|
||||
|
||||
@@ -24,7 +24,7 @@ public class ParityValidationTests
|
||||
await code.Should().BeEqualTo("ok");
|
||||
await profile.IsValid().Should().BeFalse();
|
||||
|
||||
var result = await ConfigDbHandler.AddShadowsocksServer(new Config(), profile, toFile: false);
|
||||
var result = await ConfigDbHandler.AddShadowsocksServer( profile, toFile: false);
|
||||
|
||||
await result.Should().BeEqualTo(0);
|
||||
await profile.ConfigVersion.Should().BeEqualTo(4);
|
||||
@@ -41,7 +41,7 @@ public class ParityValidationTests
|
||||
await code.Should().BeEqualTo("ok");
|
||||
await profile.IsValid().Should().BeTrue();
|
||||
|
||||
var result = await ConfigDbHandler.AddShadowsocksServer(new Config(), profile, toFile: false);
|
||||
var result = await ConfigDbHandler.AddShadowsocksServer( profile, toFile: false);
|
||||
|
||||
await result.Should().BeEqualTo(0);
|
||||
}
|
||||
@@ -54,7 +54,7 @@ public class ParityValidationTests
|
||||
var valid = V2rayRuntime.TryValidateProfile(profile, out _, out _);
|
||||
await valid.Should().BeTrue();
|
||||
|
||||
var result = await ConfigDbHandler.AddShadowsocksServer(new Config(), profile, toFile: false);
|
||||
var result = await ConfigDbHandler.AddShadowsocksServer(profile, toFile: false);
|
||||
|
||||
await result.Should().BeEqualTo(-1);
|
||||
}
|
||||
|
||||
@@ -55,7 +55,7 @@ public sealed class WindowsManager
|
||||
{
|
||||
try
|
||||
{
|
||||
var item = await ConfigDbHandler.GetDefaultRouting(config);
|
||||
var item = await ConfigDbHandler.GetDefaultRouting();
|
||||
if (item == null || item.CustomIcon.IsNullOrEmpty() || !File.Exists(item.CustomIcon))
|
||||
{
|
||||
return null;
|
||||
|
||||
Reference in New Issue
Block a user