Skip to content

Commit

Permalink
Revisit filenames we use for CrdtMerge
Browse files Browse the repository at this point in the history
Use project code and ID in root folder name, use "crdt" and "fw" inside
root folder no matter what the project's actual code or name is.
  • Loading branch information
rmunn committed Oct 28, 2024
1 parent 6a0d473 commit 07f43ba
Show file tree
Hide file tree
Showing 8 changed files with 59 additions and 24 deletions.
1 change: 1 addition & 0 deletions backend/CrdtMerge/CrdtMerge.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
<ProjectReference Include="../FwLite/LcmCrdt/LcmCrdt.csproj" />
<ProjectReference Include="../FwLite/FwLiteProjectSync/FwLiteProjectSync.csproj" />
<ProjectReference Include="../FixFwData/FixFwData.csproj" />
<ProjectReference Include="../LexData/LexData.csproj" />
</ItemGroup>

<ItemGroup>
Expand Down
1 change: 1 addition & 0 deletions backend/CrdtMerge/CrdtMergeKernel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ public static void AddCrdtMerge(this IServiceCollection services)
.ValidateDataAnnotations()
.ValidateOnStart();
services.AddScoped<SendReceiveService>();
services.AddScoped<ProjectLookupService>();
services
.AddLcmCrdtClient()
.AddFwDataBridge()
Expand Down
41 changes: 26 additions & 15 deletions backend/CrdtMerge/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
using FwDataMiniLcmBridge;
using FwLiteProjectSync;
using LcmCrdt;
using LexData;
using Microsoft.AspNetCore.Http.HttpResults;
using Microsoft.Extensions.Options;
using MiniLcm;
using Scalar.AspNetCore;
Expand All @@ -12,6 +14,11 @@
// Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
builder.Services.AddOpenApi();

builder.Services.AddLexData(
autoApplyMigrations: false,
useOpenIddict: false
);

builder.Services.AddCrdtMerge();

var app = builder.Build();
Expand All @@ -30,56 +37,60 @@

app.Run();

static async Task<CrdtFwdataProjectSyncService.SyncResult> ExecuteMergeRequest(
static async Task<Results<Ok<CrdtFwdataProjectSyncService.SyncResult>, NotFound>> ExecuteMergeRequest(
ILogger<Program> logger,
IServiceProvider services,
SendReceiveService srService,
IOptions<CrdtMergeConfig> config,
FwDataFactory fwDataFactory,
ProjectsService projectsService,
ProjectLookupService projectLookupService,
CrdtFwdataProjectSyncService syncService,
string projectCode,
// string projectName, // TODO: Add this to the API eventually
bool dryRun = false)
{
logger.LogInformation("About to execute sync request for {projectCode}", projectCode);
if (dryRun)
{
logger.LogInformation("Dry run, not actually syncing");
return new(0, 0);
return TypedResults.Ok(new CrdtFwdataProjectSyncService.SyncResult(0, 0));
}

var projectId = await projectLookupService.GetProjectId(projectCode);
if (projectId is null)
{
logger.LogError("Project code {projectCode} not found", projectCode);
return TypedResults.NotFound();
}

// TODO: Instead of projectCode here, we'll evetually look up project ID and use $"{projectName}-{projectId}" as the project folder
var projectFolder = Path.Join(config.Value.ProjectStorageRoot, projectCode);
var projectFolder = Path.Join(config.Value.ProjectStorageRoot, $"{projectCode}-{projectId}");
if (!Directory.Exists(projectFolder)) Directory.CreateDirectory(projectFolder);

// TODO: add projectName parameter and use it instead of projectCode here
var crdtFile = Path.Join(projectFolder, $"{projectCode}.sqlite");
var crdtFile = Path.Join(projectFolder, "crdt.sqlite");

var fwDataProject = new FwDataProject(projectCode, projectFolder); // TODO: use projectName (once we have it) instead of projectCode here
var fwDataProject = new FwDataProject("fw", projectFolder);
logger.LogDebug("crdtFile: {crdtFile}", crdtFile);
logger.LogDebug("fwDataFile: {fwDataFile}", fwDataProject.FilePath);

if (File.Exists(fwDataProject.FilePath))
{
var srResult = srService.SendReceive(fwDataProject);
var srResult = srService.SendReceive(fwDataProject, projectCode);
logger.LogInformation("Send/Receive result: {srResult}", srResult.Output);
}
else
{
var srResult = srService.Clone(fwDataProject);
var srResult = srService.Clone(fwDataProject, projectCode);
logger.LogInformation("Send/Receive result: {srResult}", srResult.Output);
}
var fwdataApi = fwDataFactory.GetFwDataMiniLcmApi(fwDataProject, true);
// var crdtProject = projectsService.GetProject(crdtProjectName);
var crdtProject = File.Exists(crdtFile) ?
new CrdtProject(projectCode, crdtFile) : // TODO: use projectName (once we have it) instead of projectCode here
await projectsService.CreateProject(new(projectCode, fwdataApi.ProjectId, SeedNewProjectData: false, Path: projectFolder));
new CrdtProject("crdt", crdtFile) :
await projectsService.CreateProject(new("crdt", fwdataApi.ProjectId, SeedNewProjectData: false, Path: projectFolder));
var miniLcmApi = await services.OpenCrdtProject(crdtProject);
var result = await syncService.Sync(miniLcmApi, fwdataApi, dryRun);
logger.LogInformation("Sync result, CrdtChanges: {CrdtChanges}, FwdataChanges: {FwdataChanges}", result.CrdtChanges, result.FwdataChanges);
var srResult2 = srService.SendReceive(fwDataProject);
var srResult2 = srService.SendReceive(fwDataProject, projectCode);
logger.LogInformation("Send/Receive result after CRDT sync: {srResult2}", srResult2.Output);
return result;
return TypedResults.Ok(result);
}

16 changes: 16 additions & 0 deletions backend/CrdtMerge/ProjectLookupService.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
using LexData;
using Microsoft.EntityFrameworkCore;

namespace CrdtMerge;

public class ProjectLookupService(LexBoxDbContext dbContext)
{
public async ValueTask<Guid?> GetProjectId(string projectCode)
{
var projectId = await dbContext.Projects
.Where(p => p.Code == projectCode)
.Select(p => p.Id)
.FirstOrDefaultAsync();
return projectId;
}
}
12 changes: 6 additions & 6 deletions backend/CrdtMerge/SendReceiveHelpers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,14 +45,14 @@ private static Uri BuildSendReceiveUrl(string baseUrl, string projectCode, SendR
return builder.Uri;
}

public static LfMergeBridgeResult SendReceive(FwDataProject project, string baseUrl = "http://localhost", SendReceiveAuth? auth = null, string fdoDataModelVersion = "7000072", string? commitMessage = null)
public static LfMergeBridgeResult SendReceive(FwDataProject project, string? projectCode = null, string baseUrl = "http://localhost", SendReceiveAuth? auth = null, string fdoDataModelVersion = "7000072", string? commitMessage = null)
{
// If projectCode not given, calculate it from the fwdataPath
projectCode ??= project.Name;
var fwdataInfo = new FileInfo(project.FilePath);
if (fwdataInfo.Directory is null) throw new InvalidOperationException(
$"Not allowed to Send/Receive root-level directories like C:\\, was '{project.FilePath}'");

var repoUrl = BuildSendReceiveUrl(baseUrl, project.Name, auth);
var repoUrl = BuildSendReceiveUrl(baseUrl, projectCode, auth);

var flexBridgeOptions = new Dictionary<string, string>
{
Expand All @@ -68,13 +68,13 @@ public static LfMergeBridgeResult SendReceive(FwDataProject project, string base
return CallLfMergeBridge("Language_Forge_Send_Receive", flexBridgeOptions);
}

public static LfMergeBridgeResult CloneProject(FwDataProject project, string baseUrl = "http://localhost", SendReceiveAuth? auth = null, string fdoDataModelVersion = "7000072")
public static LfMergeBridgeResult CloneProject(FwDataProject project, string? projectCode = null, string baseUrl = "http://localhost", SendReceiveAuth? auth = null, string fdoDataModelVersion = "7000072")
{
// If projectCode not given, calculate it from the fwdataPath
projectCode ??= project.Name;
var fwdataInfo = new FileInfo(project.FilePath);
if (fwdataInfo.Directory is null) throw new InvalidOperationException($"Not allowed to Send/Receive root-level directories like C:\\ '{project.FilePath}'");

var repoUrl = BuildSendReceiveUrl(baseUrl, project.Name, auth);
var repoUrl = BuildSendReceiveUrl(baseUrl, projectCode, auth);

var flexBridgeOptions = new Dictionary<string, string>
{
Expand Down
6 changes: 4 additions & 2 deletions backend/CrdtMerge/SendReceiveService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,23 @@ namespace CrdtMerge;

public class SendReceiveService(IOptions<CrdtMergeConfig> config)
{
public SendReceiveHelpers.LfMergeBridgeResult SendReceive(FwDataProject project, string? commitMessage = null)
public SendReceiveHelpers.LfMergeBridgeResult SendReceive(FwDataProject project, string? projectCode, string? commitMessage = null)
{
return SendReceiveHelpers.SendReceive(
project: project,
projectCode: projectCode,
baseUrl: config.Value.HgWebUrl,
auth: new SendReceiveHelpers.SendReceiveAuth(config.Value),
fdoDataModelVersion: config.Value.FdoDataModelVersion,
commitMessage: commitMessage
);
}

public SendReceiveHelpers.LfMergeBridgeResult Clone(FwDataProject project)
public SendReceiveHelpers.LfMergeBridgeResult Clone(FwDataProject project, string? projectCode)
{
return SendReceiveHelpers.CloneProject(
project: project,
projectCode: projectCode,
baseUrl: config.Value.HgWebUrl,
auth: new SendReceiveHelpers.SendReceiveAuth(config.Value),
fdoDataModelVersion: config.Value.FdoDataModelVersion
Expand Down
3 changes: 3 additions & 0 deletions backend/CrdtMerge/appsettings.Development.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
"LexboxPassword": "pass",
"FdoDataModelVersion": "7000072"
},
"DbConfig": {
"LexBoxConnectionString": "Host=localhost;Port=5433;Username=postgres;Password=972b722e63f549938d07bd8c4ee5086c;Database=lexbox;Include Error Detail=true"
},
"Logging": {
"LogLevel": {
"Default": "Information",
Expand Down
3 changes: 2 additions & 1 deletion backend/LexData/DataKernel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ public static class DataKernel
{
public static void AddLexData(this IServiceCollection services,
bool autoApplyMigrations,
bool useOpenIddict = true,
ServiceLifetime dbContextLifeTime = ServiceLifetime.Scoped)
{
services.AddScoped<SeedingData>();
Expand All @@ -17,7 +18,7 @@ public static void AddLexData(this IServiceCollection services,
options.EnableDetailedErrors();
options.UseNpgsql(serviceProvider.GetRequiredService<IOptions<DbConfig>>().Value.LexBoxConnectionString);
options.UseProjectables();
options.UseOpenIddict();
if (useOpenIddict) options.UseOpenIddict();
#if DEBUG
options.EnableSensitiveDataLogging();
#endif
Expand Down

0 comments on commit 07f43ba

Please sign in to comment.