diff --git a/backend/FwLite/FwLiteProjectSync/Program.cs b/backend/FwLite/FwLiteProjectSync/Program.cs index bc516bdaf..4c009a12e 100644 --- a/backend/FwLite/FwLiteProjectSync/Program.cs +++ b/backend/FwLite/FwLiteProjectSync/Program.cs @@ -1,99 +1,105 @@ using System.CommandLine; using FwDataMiniLcmBridge; -using FwLiteProjectSync; using LcmCrdt; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Logging; using MiniLcm; +namespace FwLiteProjectSync; -var rootCommand = new RootCommand("CRDT to FwData sync tool"); -var crdtOption = new Option("--crdt", "CRDT sqlite file") { IsRequired = true }; -rootCommand.AddGlobalOption(crdtOption); -var fwDataOption = new Option("--fwdata", "FwData file") { IsRequired = true }; -rootCommand.AddGlobalOption(fwDataOption); -var beforeSyncCommand = new Command("before-sync", "Run before sync"); -beforeSyncCommand.SetHandler((crdtFile, fwDataFile) => - { - Console.WriteLine($"crdtFile: {crdtFile}"); - Console.WriteLine($"fwDataFile: {fwDataFile}"); - }, - crdtOption, - fwDataOption); -rootCommand.Add(beforeSyncCommand); -var afterSyncCommand = new Command("after-sync", "Run after sync"); -afterSyncCommand.SetHandler((crdtFile, fwDataFile) => - { - Console.WriteLine($"crdtFile: {crdtFile}"); - Console.WriteLine($"fwDataFile: {fwDataFile}"); - }, - crdtOption, - fwDataOption); -rootCommand.Add(afterSyncCommand); -var syncCommand = new Command("sync", "Synchronize CRDT with FwData"); -var createCrdtDirOption = new Option("--create-crdt-dir", "Create CRDT directory"); -var dryRunOption = new Option("--dry-run", () => false, "Dry run"); -syncCommand.Add(createCrdtDirOption); -syncCommand.Add(dryRunOption); -syncCommand.SetHandler(async (crdtFile, fwDataFile, createCrdtDir, dryRun) => +public class Program +{ + public static Task Main(string[] args) { - Console.WriteLine($"crdtFile: {crdtFile}"); - Console.WriteLine($"fwDataFile: {fwDataFile}"); - var fwProjectName = Path.GetFileNameWithoutExtension(fwDataFile); - var crdtProjectName = Path.GetFileNameWithoutExtension(crdtFile); + var rootCommand = new RootCommand("CRDT to FwData sync tool"); + var crdtOption = new Option("--crdt", "CRDT sqlite file") { IsRequired = true }; + rootCommand.AddGlobalOption(crdtOption); + var fwDataOption = new Option("--fwdata", "FwData file") { IsRequired = true }; + rootCommand.AddGlobalOption(fwDataOption); + var beforeSyncCommand = new Command("before-sync", "Run before sync"); + beforeSyncCommand.SetHandler((crdtFile, fwDataFile) => + { + Console.WriteLine($"crdtFile: {crdtFile}"); + Console.WriteLine($"fwDataFile: {fwDataFile}"); + }, + crdtOption, + fwDataOption); + rootCommand.Add(beforeSyncCommand); + var afterSyncCommand = new Command("after-sync", "Run after sync"); + afterSyncCommand.SetHandler((crdtFile, fwDataFile) => + { + Console.WriteLine($"crdtFile: {crdtFile}"); + Console.WriteLine($"fwDataFile: {fwDataFile}"); + }, + crdtOption, + fwDataOption); + rootCommand.Add(afterSyncCommand); + var syncCommand = new Command("sync", "Synchronize CRDT with FwData"); + var createCrdtDirOption = new Option("--create-crdt-dir", "Create CRDT directory"); + var dryRunOption = new Option("--dry-run", () => false, "Dry run"); + syncCommand.Add(createCrdtDirOption); + syncCommand.Add(dryRunOption); + syncCommand.SetHandler(async (crdtFile, fwDataFile, createCrdtDir, dryRun) => + { + Console.WriteLine($"crdtFile: {crdtFile}"); + Console.WriteLine($"fwDataFile: {fwDataFile}"); + var fwProjectName = Path.GetFileNameWithoutExtension(fwDataFile); + var crdtProjectName = Path.GetFileNameWithoutExtension(crdtFile); - await using var serviceRoot = SyncServices(crdtFile, fwDataFile, createCrdtDir); - await using var scope = serviceRoot.CreateAsyncScope(); - var services = scope.ServiceProvider; - var logger = services.GetRequiredService>(); - var fwdataApi = services.GetRequiredService().GetFwDataMiniLcmApi(fwProjectName, true); - var projectsService = services.GetRequiredService(); - var crdtProject = projectsService.GetProject(crdtProjectName); - if (crdtProject is null) - { - crdtProject = await projectsService.CreateProject(new(crdtProjectName, fwdataApi.ProjectId, SeedNewProjectData: false)); - } - projectsService.SetProjectScope(crdtProject); - await services.GetRequiredService().PopulateProjectDataCache(); - var syncService = services.GetRequiredService(); + await using var serviceRoot = SyncServices(crdtFile, fwDataFile, createCrdtDir); + await using var scope = serviceRoot.CreateAsyncScope(); + var services = scope.ServiceProvider; + var logger = services.GetRequiredService>(); + var fwdataApi = services.GetRequiredService().GetFwDataMiniLcmApi(fwProjectName, true); + var projectsService = services.GetRequiredService(); + var crdtProject = projectsService.GetProject(crdtProjectName); + if (crdtProject is null) + { + crdtProject = await projectsService.CreateProject(new(crdtProjectName, fwdataApi.ProjectId, SeedNewProjectData: false)); + } + projectsService.SetProjectScope(crdtProject); + await services.GetRequiredService().PopulateProjectDataCache(); + var syncService = services.GetRequiredService(); - var result = await syncService.Sync(services.GetRequiredService(), fwdataApi, dryRun); - logger.LogInformation("Sync result, CrdtChanges: {CrdtChanges}, FwdataChanges: {FwdataChanges}", result.CrdtChanges, result.FwdataChanges); - }, - crdtOption, - fwDataOption, - createCrdtDirOption, - dryRunOption); -rootCommand.Add(syncCommand); -await rootCommand.InvokeAsync(args); + var result = await syncService.Sync(services.GetRequiredService(), fwdataApi, dryRun); + logger.LogInformation("Sync result, CrdtChanges: {CrdtChanges}, FwdataChanges: {FwdataChanges}", result.CrdtChanges, result.FwdataChanges); + }, + crdtOption, + fwDataOption, + createCrdtDirOption, + dryRunOption); + rootCommand.Add(syncCommand); + return rootCommand.InvokeAsync(args); -static ServiceProvider SyncServices(string crdtFile, string fwDataFile, bool createCrdtDir) -{ - if (!File.Exists(fwDataFile)) throw new InvalidOperationException("Could not find fwdata file " + fwDataFile); + static ServiceProvider SyncServices(string crdtFile, string fwDataFile, bool createCrdtDir) + { + if (!File.Exists(fwDataFile)) throw new InvalidOperationException("Could not find fwdata file " + fwDataFile); - var fwDataProjectsFolder = Directory.GetParent(fwDataFile)?.Parent; - if (fwDataProjectsFolder is null) throw new InvalidOperationException("Could not find parent folder of fwdata dir " + fwDataFile); - var crdtFolder = Directory.GetParent(crdtFile); - if (crdtFolder is null) throw new InvalidOperationException("Could not find parent folder of crdt file " + crdtFile); - if (!crdtFolder.Exists && createCrdtDir) - { - crdtFolder.Create(); - } else if (!crdtFolder.Exists) - { - throw new InvalidOperationException("Could not find crdt folder " + crdtFolder); - } + var fwDataProjectsFolder = Directory.GetParent(fwDataFile)?.Parent; + if (fwDataProjectsFolder is null) throw new InvalidOperationException("Could not find parent folder of fwdata dir " + fwDataFile); + var crdtFolder = Directory.GetParent(crdtFile); + if (crdtFolder is null) throw new InvalidOperationException("Could not find parent folder of crdt file " + crdtFile); + if (!crdtFolder.Exists && createCrdtDir) + { + crdtFolder.Create(); + } else if (!crdtFolder.Exists) + { + throw new InvalidOperationException("Could not find crdt folder " + crdtFolder); + } - var crdtServices = new ServiceCollection() - .AddLcmCrdtClient() - .AddFwDataBridge() - .AddFwLiteProjectSync() - .Configure(c => c.ProjectsFolder = fwDataProjectsFolder.FullName) - .Configure(c => c.ProjectPath = crdtFolder.FullName) - .AddLogging(builder => builder.AddConsole().AddDebug().AddConfiguration(new ConfigurationManager().AddInMemoryCollection(new Dictionary - { - ["Logging:LogLevel:Microsoft.EntityFrameworkCore"] = "Warning" - }).Build())) - .BuildServiceProvider(true); - return crdtServices; + var crdtServices = new ServiceCollection() + .AddLcmCrdtClient() + .AddFwDataBridge() + .AddFwLiteProjectSync() + .Configure(c => c.ProjectsFolder = fwDataProjectsFolder.FullName) + .Configure(c => c.ProjectPath = crdtFolder.FullName) + .AddLogging(builder => builder.AddConsole().AddDebug().AddConfiguration(new ConfigurationManager().AddInMemoryCollection(new Dictionary + { + ["Logging:LogLevel:Microsoft.EntityFrameworkCore"] = "Warning" + }).Build())) + .BuildServiceProvider(true); + return crdtServices; + } + } }