InkForge/app/InkForge.Desktop/Managers/WorkspaceManager.cs

92 lines
2.3 KiB
C#
Raw Normal View History

using InkForge.Data;
using InkForge.Desktop.Data.Options;
using InkForge.Desktop.Models;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using ReactiveUI;
namespace InkForge.Desktop.Managers;
public class WorkspaceManager(IServiceProvider serviceProvider) : ReactiveObject
{
private readonly IServiceProvider _serviceProvider = serviceProvider;
private Workspace? _workspace;
public Workspace? Workspace
{
get => _workspace;
private set => this.RaiseAndSetIfChanged(ref _workspace, value);
}
2024-03-17 22:27:01 +01:00
public ValueTask CloseWorkspace()
{
_workspace?.Dispose();
Workspace = null;
2024-03-17 22:27:01 +01:00
return ValueTask.CompletedTask;
}
2024-03-17 22:27:01 +01:00
public async ValueTask OpenWorkspace(string path, bool createFile = false)
{
await CloseWorkspace().ConfigureAwait(false);
if (await CreateLocalWorkspace(path, createFile).ConfigureAwait(false) is { } workspace)
{
Workspace = workspace;
}
}
private async ValueTask<Workspace?> CreateLocalWorkspace(string path, bool createFile)
{
FileInfo file = new(path);
if (!(createFile || file.Exists))
{
return null;
}
file.Directory!.Create();
IServiceScope? scope = null;
2024-02-26 18:08:18 +01:00
IWorkspaceContext workspaceContext;
try
{
scope = _serviceProvider.CreateScope();
var serviceProvider = scope.ServiceProvider;
var options = serviceProvider.GetRequiredService<LocalWorkspaceOptions>();
options.DbPath = path;
2024-02-26 18:08:18 +01:00
workspaceContext = serviceProvider.GetRequiredService<IWorkspaceContext>();
workspaceContext.Workspace = new Workspace(scope)
{
Name = Path.GetFileNameWithoutExtension(file.Name),
Options = options,
};
var dbFactory = serviceProvider.GetRequiredService<IDbContextFactory<NoteDbContext>>();
2024-04-05 12:31:34 +02:00
await using var dbContext = await dbFactory.CreateDbContextAsync().ConfigureAwait(false);
var db = dbContext.Database;
if ((await db.GetPendingMigrationsAsync().ConfigureAwait(false)).Any())
{
2024-04-05 12:31:34 +02:00
if (file.Exists)
{
2024-04-05 12:31:34 +02:00
file.CopyTo(Path.ChangeExtension(file.FullName, $"{DateTime.Now:s}{file.Extension}"));
}
2024-04-05 12:31:34 +02:00
await db.MigrateAsync().ConfigureAwait(false);
}
scope = null;
}
2024-04-05 12:31:34 +02:00
catch (Exception)
{
// Show Error through TopLevels.ActiveTopLevel
return null;
}
finally
{
scope?.Dispose();
}
2024-02-26 18:08:18 +01:00
return workspaceContext.Workspace;
}
}