using System.Collections.ObjectModel;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using NewLife.Studio.Core.DTOs;
using NewLife.Studio.Data;
using NewLife.Studio.Store;
using NewLife.Log;
namespace NewLife.Studio.Modules.DataStudio.ViewModels;
/// <summary>连接列表 ViewModel</summary>
public partial class ConnectionListViewModel : ObservableObject
{
private readonly IStoreService _storeService;
private readonly IDataProvider _dataProvider;
[ObservableProperty]
private ObservableCollection<ConnectionInfo> _connections = [];
[ObservableProperty]
private ConnectionInfo? _selectedConnection;
public event EventHandler<IDbSession>? ConnectionOpened;
public ConnectionListViewModel(IStoreService storeService, IDataProvider dataProvider)
{
_storeService = storeService;
_dataProvider = dataProvider;
}
public async Task LoadAsync()
{
var list = await _storeService.ListConnectionsAsync();
Connections = new ObservableCollection<ConnectionInfo>(list);
XTrace.WriteLine($"ConnectionList: Loaded {Connections.Count} connections");
}
[RelayCommand]
private async Task AddConnection()
{
// 简单实现:添加一个 SQLite 文件连接
var conn = new ConnectionInfo
{
Name = $"SQLite-{DateTime.Now:yyyyMMdd-HHmmss}",
ConnectionString = "Data Source=:memory:",
ProviderType = "sqlite"
};
await _storeService.SaveConnectionAsync(conn);
Connections.Add(conn);
SelectedConnection = conn;
}
[RelayCommand]
private async Task EditConnection()
{
if (SelectedConnection == null) return;
await _storeService.SaveConnectionAsync(SelectedConnection);
}
[RelayCommand]
private async Task DeleteConnection()
{
if (SelectedConnection == null) return;
await _storeService.DeleteConnectionAsync(SelectedConnection.Id);
Connections.Remove(SelectedConnection);
SelectedConnection = null;
}
[RelayCommand]
private async Task TestConnection()
{
if (SelectedConnection == null) return;
var ok = await _dataProvider.TestConnectionAsync(SelectedConnection);
var msg = ok ? "连接测试成功" : "连接测试失败";
XTrace.WriteLine($"TestConnection: {SelectedConnection.Name} -> {msg}");
}
[RelayCommand]
private async Task OpenConnection()
{
if (SelectedConnection == null) return;
try
{
var session = await _dataProvider.OpenSessionAsync(SelectedConnection);
SelectedConnection.LastUsedAt = DateTime.Now;
await _storeService.SaveConnectionAsync(SelectedConnection);
ConnectionOpened?.Invoke(this, session);
XTrace.WriteLine($"ConnectionList: Opened {SelectedConnection.Name}");
}
catch (Exception ex)
{
XTrace.WriteLine($"ConnectionList: Failed to open {SelectedConnection.Name}: {ex.Message}");
}
}
}
|