Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
36 commits
Select commit Hold shift + click to select a range
b0b3a4f
Bump pretty much ALL packages for .NET 10
rmunn May 12, 2026
846f23b
Include version bump that dotnet missed
rmunn May 12, 2026
4f23cd2
Go back to CommandLine pkg before breaking changes
rmunn May 13, 2026
81edc09
Deal with OpenApi breaking changes
rmunn May 13, 2026
4e248ce
Deal with Linq2Db and EF Core breaking changes
rmunn May 13, 2026
43d0777
Deal with FluentAssertion breaking changes
rmunn May 13, 2026
7a3b771
SetDbStatementForText = true is now default
rmunn May 13, 2026
c00ea7d
Use version 10 of DataAnnotatedModelValidations
rmunn May 13, 2026
09e1f91
Fix more OpenApi breaking changes
rmunn May 13, 2026
2068937
Fix another possible-null-reference error
rmunn May 13, 2026
ad92d31
Fix another Linq2DB breaking change
rmunn May 13, 2026
2651878
Fix another possible null reference
rmunn May 13, 2026
774ce9a
Fix MongoDB breaking change
rmunn May 13, 2026
fe67b6a
Adjust to two more breaking changes
rmunn May 13, 2026
187b95f
Fix two FluentAssertions breaking changes
rmunn May 13, 2026
63c1b11
Fix Linq2Db breaking changes in logging
rmunn May 13, 2026
48f2222
Pull in Harmony build for .NET 10
rmunn May 14, 2026
25eba58
Update EF tools to 10.0.7 to match NuGet pkg
rmunn May 14, 2026
cd557de
One more FluentValidation breaking change
rmunn May 14, 2026
e9c8436
Add LexBoxDbContext migration for Quartz changes
rmunn May 14, 2026
e22ee0f
Fix "UPSERT not implemented for virtual table"
rmunn May 14, 2026
d849ff2
Apply more .NET 10 / Linq2Db / OpenAPI breaking-change fixes
myieye May 15, 2026
a7347d8
Work around Linq2Db v6 regressions in CRDT and Merge
myieye May 15, 2026
65aa70a
Fix small CRDT test failures left over from .NET 10 bumps
myieye May 15, 2026
8726123
Wrap empty CommitMetadata in Sql.Expr in old-commit query test
myieye May 15, 2026
558ef6f
Use raw SQL ExecuteAsync for old-format commit insert in test
myieye May 15, 2026
810d6cd
Use correct EF column names for HybridDateTime in raw SQL insert
myieye May 15, 2026
2ac278f
Restore ExpressionMethodAttribute on jsonb collection props, .ToList()'d
myieye May 15, 2026
c346afb
Bump FW Lite test job timeout 40 -> 60 minutes
myieye May 15, 2026
809039d
Document Linq2Db v6 regression workarounds in LcmCrdt
myieye May 15, 2026
620e4dc
Use shadow properties for json_each rewrite in v6
myieye May 18, 2026
3b38e58
Bump FluentAssertions 8.9.0 -> 8.10.0
myieye May 18, 2026
2d47dac
Exclude shadow rewrite properties from FA equivalency
myieye May 19, 2026
443c056
Hide PublishInRows / SemanticDomainRows shadow properties
myieye May 19, 2026
73d26c4
Pin FluentAssertions to 7.0.0-alpha.5
myieye May 19, 2026
d21394f
Revert HaveProperty -> ContainKey for FA 7.x pin
myieye May 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .config/dotnet-tools.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"isRoot": true,
"tools": {
"dotnet-ef": {
"version": "9.0.6",
"version": "10.0.7",
"commands": [
"dotnet-ef"
],
Expand Down
5 changes: 4 additions & 1 deletion .github/workflows/fw-lite.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,10 @@ env:
jobs:
build-and-test:
name: Build FW Lite and run tests
timeout-minutes: 40
#bumped from 40 -> 60: with the .NET 10 / Linq2Db v6 upgrade many tests that
#used to fast-fail now run to completion (passing), so total test step time
#went up. Hits Windows-CI variance; 60 leaves some headroom.
timeout-minutes: 60
runs-on: windows-latest
outputs:
version: ${{ steps.setVersion.outputs.VERSION }}
Expand Down
197 changes: 100 additions & 97 deletions backend/Directory.Packages.props

Large diffs are not rendered by default.

1 change: 0 additions & 1 deletion backend/FwHeadless/FwHeadless.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@
<PackageReference Include="SIL.ChorusPlugin.LfMergeBridge" />
<PackageReference Include="SIL.Chorus.Mercurial" />
<PackageReference Include="SIL.Chorus.ChorusMerge" GeneratePathProperty="true" />
<PackageReference Include="System.Security.Cryptography.Xml" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="../harmony/src/SIL.Harmony/SIL.Harmony.csproj" />
Expand Down
1 change: 0 additions & 1 deletion backend/FwHeadless/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@
{
//never emit traces for sqlite as there's way too much noise and it'll crash servers and overrun honeycomb
c.Filter = (provider, command) => provider is not "Microsoft.EntityFrameworkCore.Sqlite";
c.SetDbStatementForText = true;
})
.AddSource(FwHeadlessActivitySource.ActivitySourceName,
FwLiteProjectSyncActivitySource.ActivitySourceName,
Expand Down
2 changes: 1 addition & 1 deletion backend/FwHeadless/Routes/MediaFileRoutes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ public static class MediaFileRoutes
public const string RootRoute = "/api/media";
public static IEndpointConventionBuilder MapMediaFileRoutes(this WebApplication app)
{
var group = app.MapGroup(RootRoute).WithOpenApi();
var group = app.MapGroup(RootRoute);
group.MapGet("/list/{projectId:guid}", MediaFileController.ListFiles);
group.MapGet("/metadata/{fileId:guid}", MediaFileMetadataController.GetFileMetadata);
group.MapGet("/{fileId:guid}", MediaFileController.GetFile);
Expand Down
2 changes: 1 addition & 1 deletion backend/FwHeadless/Routes/MergeRoutes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public static class MergeRoutes
{
public static IEndpointConventionBuilder MapMergeRoutes(this WebApplication app)
{
var group = app.MapGroup("/api/merge").WithOpenApi();
var group = app.MapGroup("/api/merge");

group.MapPost("/execute", ExecuteMergeRequest);
group.MapPost("/sync-harmony", SyncHarmonyProject);
Expand Down
2 changes: 1 addition & 1 deletion backend/FwLite/FwLiteShared/Auth/AuthService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public class AuthService(LexboxProjectService lexboxProjectService, OAuthClientF
[JSInvokable]
public async Task<ServerStatus[]> Servers()
{
return await lexboxProjectService.Servers().ToAsyncEnumerable().SelectAwait(async s =>
return await lexboxProjectService.Servers().ToAsyncEnumerable().Select(async (LexboxServer s, CancellationToken _) =>
{
var currentName = await clientFactory.GetClient(s).GetCurrentName();
return new ServerStatus(s.DisplayName,
Expand Down
8 changes: 4 additions & 4 deletions backend/FwLite/FwLiteWeb/Routes/ActivityRoutes.cs
Original file line number Diff line number Diff line change
@@ -1,22 +1,22 @@
using LcmCrdt;
using FwLiteWeb.Hubs;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi;

namespace FwLiteWeb.Routes;

public static class ActivityRoutes
{
public static IEndpointConventionBuilder MapActivities(this WebApplication app)
{
var group = app.MapGroup("/api/activity/{project}").WithOpenApi(operation =>
var group = app.MapGroup("/api/activity/{project}").AddOpenApiOperationTransformer((operation, _, _) =>
{
operation.Parameters.Add(new OpenApiParameter()
operation.Parameters?.Add(new OpenApiParameter()
{
Name = CrdtMiniLcmApiHub.ProjectRouteKey,
In = ParameterLocation.Path,
Required = true
});
return operation;
return Task.CompletedTask;
});
group.MapGet("/", (HistoryService historyService, int skip, int take) => historyService.ProjectActivity(skip, take));
return group;
Expand Down
2 changes: 1 addition & 1 deletion backend/FwLite/FwLiteWeb/Routes/AuthRoutes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ public static class AuthRoutes
public record ServerStatus(string DisplayName, bool LoggedIn, string? LoggedInAs, string? Authority);
public static IEndpointConventionBuilder MapAuthRoutes(this WebApplication app)
{
var group = app.MapGroup("/api/auth").WithOpenApi();
var group = app.MapGroup("/api/auth");
group.MapGet("/servers", (AuthService authService) => authService.Servers());
group.MapGet("/login/{authority}",
async (AuthService authService, string authority, IOptions<AuthConfig> options, [FromHeader] string referer) =>
Expand Down
10 changes: 5 additions & 5 deletions backend/FwLite/FwLiteWeb/Routes/FwIntegrationRoutes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,22 +3,22 @@
using FwLiteWeb.Hubs;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.SignalR;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi;

namespace FwLiteWeb.Routes;

public static class FwIntegrationRoutes
{
public static IEndpointConventionBuilder MapFwIntegrationRoutes(this WebApplication app)
{
var group = app.MapGroup($"/api/fw/{{{FwDataMiniLcmHub.ProjectRouteKey}}}").WithOpenApi(
operation =>
var group = app.MapGroup($"/api/fw/{{{FwDataMiniLcmHub.ProjectRouteKey}}}").AddOpenApiOperationTransformer(
(operation, _, _) =>
{
operation.Parameters.Add(new OpenApiParameter()
operation.Parameters?.Add(new OpenApiParameter()
{
Name = FwDataMiniLcmHub.ProjectRouteKey, In = ParameterLocation.Path, Required = true
});
return operation;
return Task.CompletedTask;
});
group.MapGet("/link/entry/{id}",
async ([FromServices] FwDataProjectContext context,
Expand Down
8 changes: 4 additions & 4 deletions backend/FwLite/FwLiteWeb/Routes/HistoryRoutes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
using LinqToDB;
using LinqToDB.EntityFrameworkCore;
using FwLiteWeb.Hubs;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi;
using MiniLcm.Models;

namespace FwLiteWeb.Routes;
Expand All @@ -16,13 +16,13 @@ public static class HistoryRoutes
{
public static IEndpointConventionBuilder MapHistoryRoutes(this WebApplication app)
{
var group = app.MapGroup("/api/history/{project}").WithOpenApi(operation =>
var group = app.MapGroup("/api/history/{project}").AddOpenApiOperationTransformer((operation, _, _) =>
{
operation.Parameters.Add(new OpenApiParameter()
operation.Parameters?.Add(new OpenApiParameter()
{
Name = CrdtMiniLcmApiHub.ProjectRouteKey, In = ParameterLocation.Path, Required = true
});
return operation;
return Task.CompletedTask;
});
group.MapGet("/snapshot/{snapshotId:guid}",
async (Guid snapshotId, HistoryService historyService) => await historyService.GetSnapshot(snapshotId));
Expand Down
2 changes: 1 addition & 1 deletion backend/FwLite/FwLiteWeb/Routes/ImportRoutes.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
using FwLiteShared.Projects;
using SIL.Harmony.Db;
using FwLiteWeb.Services;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi;
using MiniLcm;

namespace FwLiteWeb.Routes;
Expand Down
18 changes: 9 additions & 9 deletions backend/FwLite/FwLiteWeb/Routes/MiniLcmRoutes.cs
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
using System.ComponentModel;
using System.Diagnostics.CodeAnalysis;
using Microsoft.AspNetCore.Mvc;
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi;
using MiniLcm;
using MiniLcm.Filtering;
using MiniLcm.Models;
using MiniLcm.Project;
using MiniLcm.Validators;
using System.Text.Json.Nodes;

namespace FwLiteWeb.Routes;

Expand All @@ -31,9 +31,9 @@ internal IMiniLcmApi MiniLcmApi
public static IEndpointConventionBuilder MapMiniLcmRoutes(this IEndpointRouteBuilder app, [StringSyntax("route")] string prefix)
{
var api = app.MapGroup(prefix + "/{projectType}/{projectCode}")
.WithOpenApi(operation =>
.AddOpenApiOperationTransformer((operation, _, _) =>
{
operation.Parameters.Add(new()
operation.Parameters?.Add(new OpenApiParameter()
{
Name = "projectType",
In = ParameterLocation.Path,
Expand All @@ -42,19 +42,19 @@ public static IEndpointConventionBuilder MapMiniLcmRoutes(this IEndpointRouteBui
{
Enum =
[
new OpenApiString(ProjectDataFormat.FwData.ToString()),
new OpenApiString(ProjectDataFormat.Harmony.ToString())
JsonValue.Create(ProjectDataFormat.FwData.ToString()),
JsonValue.Create(ProjectDataFormat.Harmony.ToString())
],
Type = "string"
Type = JsonSchemaType.String
},
});
operation.Parameters.Add(new()
operation.Parameters?.Add(new OpenApiParameter()
{
Name = "projectCode",
In = ParameterLocation.Path,
Required = true
});
return operation;
return Task.CompletedTask;
})
.AddEndpointFilter(async (context, next) =>
{
Expand Down
2 changes: 1 addition & 1 deletion backend/FwLite/FwLiteWeb/Routes/ProjectRoutes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public static class ProjectRoutes
{
public static IEndpointConventionBuilder MapProjectRoutes(this WebApplication app)
{
var group = app.MapGroup("/api").WithOpenApi();
var group = app.MapGroup("/api");
group.MapGet("/remoteProjects",
async (CombinedProjectsService combinedProjectsService) =>
{
Expand Down
8 changes: 4 additions & 4 deletions backend/FwLite/FwLiteWeb/Routes/TestRoutes.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
using LcmCrdt;
using FwLiteWeb.Hubs;
using FwLiteWeb.Services;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi;
using MiniLcm;
using MiniLcm.Models;

Expand All @@ -13,15 +13,15 @@ public static class TestRoutes
{
public static IEndpointConventionBuilder MapTest(this WebApplication app)
{
var group = app.MapGroup("/api/test/{project}").WithOpenApi(operation =>
var group = app.MapGroup("/api/test/{project}").AddOpenApiOperationTransformer((operation, _, _) =>
{
operation.Parameters.Add(new OpenApiParameter()
operation.Parameters?.Add(new OpenApiParameter()
{
Name = CrdtMiniLcmApiHub.ProjectRouteKey,
In = ParameterLocation.Path,
Required = true
});
return operation;
return Task.CompletedTask;
});
group.MapGet("/entries",
(IMiniLcmApi api) =>
Expand Down
Loading
Loading