From 14c70888e4af6d0abf16869fe86a5c023f0a3026 Mon Sep 17 00:00:00 2001 From: Rok Rejc Date: Mon, 8 Jun 2026 13:07:56 +0200 Subject: [PATCH 01/16] Add nuget config and add local-packages directory to it --- src/.gitignore | 2 +- src/Rsdo.Concordancer.sln | 6 ++++++ src/nuget.config | 6 ++++++ 3 files changed, 13 insertions(+), 1 deletion(-) create mode 100644 src/nuget.config diff --git a/src/.gitignore b/src/.gitignore index 34c8dee..26ab8f4 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -207,7 +207,7 @@ PublishScripts/ *.nuget.targets # Nuget personal access tokens and Credentials -nuget.config +# nuget.config # Microsoft Azure Build Output csx/ diff --git a/src/Rsdo.Concordancer.sln b/src/Rsdo.Concordancer.sln index abc14fc..a652314 100644 --- a/src/Rsdo.Concordancer.sln +++ b/src/Rsdo.Concordancer.sln @@ -24,6 +24,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rsdo.Concordancer.Data", "c EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rsdo.Concordancer.SystemManager", "apps\Rsdo.Concordancer.SystemManager\Rsdo.Concordancer.SystemManager.csproj", "{41B26AD1-C0A5-4796-95D0-CB84FB574A83}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{0BC9D8CB-3F46-40F4-B769-E2605F03E0F6}" + ProjectSection(SolutionItems) = preProject + nuget.config = nuget.config + .gitignore = .gitignore + EndProjectSection +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU diff --git a/src/nuget.config b/src/nuget.config new file mode 100644 index 0000000..a6e71a4 --- /dev/null +++ b/src/nuget.config @@ -0,0 +1,6 @@ + + + + + + From a0691c2ccda58c718162faa9c4aba210dd7799b6 Mon Sep 17 00:00:00 2001 From: Rok Rejc Date: Mon, 8 Jun 2026 13:14:02 +0200 Subject: [PATCH 02/16] Add Directory.Build.props file --- src/Directory.Build.props | 8 ++++++++ src/Rsdo.Concordancer.sln | 1 + .../Rsdo.Concordancer.Api/Rsdo.Concordancer.Api.csproj | 7 ------- .../Rsdo.Concordancer.SystemManager.csproj | 4 ---- .../Rsdo.Concordancer.Core/Rsdo.Concordancer.Core.csproj | 7 ------- .../Rsdo.Concordancer.Data/Rsdo.Concordancer.Data.csproj | 7 ------- .../Rsdo.Concordancer.Infrastructure.csproj | 7 ------- .../Rsdo.Concordancer.ServiceModel.csproj | 7 ------- .../Rsdo.Concordancer.Services.csproj | 7 ------- .../Rsdo.Concordancer.Tests.Integration.csproj | 3 --- .../Rsdo.Concordancer.Tests.Unit.csproj | 3 --- 11 files changed, 9 insertions(+), 52 deletions(-) create mode 100644 src/Directory.Build.props diff --git a/src/Directory.Build.props b/src/Directory.Build.props new file mode 100644 index 0000000..d4706e3 --- /dev/null +++ b/src/Directory.Build.props @@ -0,0 +1,8 @@ + + + net6.0 + true + false + 1.0.4 + + diff --git a/src/Rsdo.Concordancer.sln b/src/Rsdo.Concordancer.sln index a652314..7f67f60 100644 --- a/src/Rsdo.Concordancer.sln +++ b/src/Rsdo.Concordancer.sln @@ -26,6 +26,7 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Rsdo.Concordancer.SystemMan EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{0BC9D8CB-3F46-40F4-B769-E2605F03E0F6}" ProjectSection(SolutionItems) = preProject + Directory.Build.props = Directory.Build.props nuget.config = nuget.config .gitignore = .gitignore EndProjectSection diff --git a/src/apps/Rsdo.Concordancer.Api/Rsdo.Concordancer.Api.csproj b/src/apps/Rsdo.Concordancer.Api/Rsdo.Concordancer.Api.csproj index 53e5433..26c1644 100644 --- a/src/apps/Rsdo.Concordancer.Api/Rsdo.Concordancer.Api.csproj +++ b/src/apps/Rsdo.Concordancer.Api/Rsdo.Concordancer.Api.csproj @@ -1,12 +1,5 @@ - - net6.0 - true - false - 1.0.4 - - diff --git a/src/apps/Rsdo.Concordancer.SystemManager/Rsdo.Concordancer.SystemManager.csproj b/src/apps/Rsdo.Concordancer.SystemManager/Rsdo.Concordancer.SystemManager.csproj index 4e225c1..27f7bfd 100644 --- a/src/apps/Rsdo.Concordancer.SystemManager/Rsdo.Concordancer.SystemManager.csproj +++ b/src/apps/Rsdo.Concordancer.SystemManager/Rsdo.Concordancer.SystemManager.csproj @@ -2,10 +2,6 @@ Exe - net6.0 - true - false - 1.0.4 diff --git a/src/core/Rsdo.Concordancer.Core/Rsdo.Concordancer.Core.csproj b/src/core/Rsdo.Concordancer.Core/Rsdo.Concordancer.Core.csproj index c48fb2e..16d710f 100644 --- a/src/core/Rsdo.Concordancer.Core/Rsdo.Concordancer.Core.csproj +++ b/src/core/Rsdo.Concordancer.Core/Rsdo.Concordancer.Core.csproj @@ -1,12 +1,5 @@ - - net6.0 - true - false - 1.0.4 - - diff --git a/src/core/Rsdo.Concordancer.Data/Rsdo.Concordancer.Data.csproj b/src/core/Rsdo.Concordancer.Data/Rsdo.Concordancer.Data.csproj index 0e640da..fd5ced7 100644 --- a/src/core/Rsdo.Concordancer.Data/Rsdo.Concordancer.Data.csproj +++ b/src/core/Rsdo.Concordancer.Data/Rsdo.Concordancer.Data.csproj @@ -1,12 +1,5 @@ - - net6.0 - true - false - 1.0.4 - - diff --git a/src/core/Rsdo.Concordancer.Infrastructure/Rsdo.Concordancer.Infrastructure.csproj b/src/core/Rsdo.Concordancer.Infrastructure/Rsdo.Concordancer.Infrastructure.csproj index eaf8368..bae4505 100644 --- a/src/core/Rsdo.Concordancer.Infrastructure/Rsdo.Concordancer.Infrastructure.csproj +++ b/src/core/Rsdo.Concordancer.Infrastructure/Rsdo.Concordancer.Infrastructure.csproj @@ -1,12 +1,5 @@ - - net6.0 - true - false - 1.0.4 - - diff --git a/src/core/Rsdo.Concordancer.ServiceModel/Rsdo.Concordancer.ServiceModel.csproj b/src/core/Rsdo.Concordancer.ServiceModel/Rsdo.Concordancer.ServiceModel.csproj index af24a0a..bc00f3e 100644 --- a/src/core/Rsdo.Concordancer.ServiceModel/Rsdo.Concordancer.ServiceModel.csproj +++ b/src/core/Rsdo.Concordancer.ServiceModel/Rsdo.Concordancer.ServiceModel.csproj @@ -1,12 +1,5 @@ - - net6.0 - true - false - 1.0.4 - - diff --git a/src/core/Rsdo.Concordancer.Services/Rsdo.Concordancer.Services.csproj b/src/core/Rsdo.Concordancer.Services/Rsdo.Concordancer.Services.csproj index 87194bb..ff5f865 100644 --- a/src/core/Rsdo.Concordancer.Services/Rsdo.Concordancer.Services.csproj +++ b/src/core/Rsdo.Concordancer.Services/Rsdo.Concordancer.Services.csproj @@ -1,12 +1,5 @@ - - net6.0 - true - false - 1.0.4 - - diff --git a/src/tests/Rsdo.Concordancer.Tests.Integration/Rsdo.Concordancer.Tests.Integration.csproj b/src/tests/Rsdo.Concordancer.Tests.Integration/Rsdo.Concordancer.Tests.Integration.csproj index fc95c63..b4a5c51 100644 --- a/src/tests/Rsdo.Concordancer.Tests.Integration/Rsdo.Concordancer.Tests.Integration.csproj +++ b/src/tests/Rsdo.Concordancer.Tests.Integration/Rsdo.Concordancer.Tests.Integration.csproj @@ -1,10 +1,7 @@ - net6.0 false - true - false diff --git a/src/tests/Rsdo.Concordancer.Tests.Unit/Rsdo.Concordancer.Tests.Unit.csproj b/src/tests/Rsdo.Concordancer.Tests.Unit/Rsdo.Concordancer.Tests.Unit.csproj index fc95c63..b4a5c51 100644 --- a/src/tests/Rsdo.Concordancer.Tests.Unit/Rsdo.Concordancer.Tests.Unit.csproj +++ b/src/tests/Rsdo.Concordancer.Tests.Unit/Rsdo.Concordancer.Tests.Unit.csproj @@ -1,10 +1,7 @@ - net6.0 false - true - false From 5bd50d1f55749a38b52b05f540ecfe1fb33ae0ec Mon Sep 17 00:00:00 2001 From: Rok Rejc Date: Mon, 8 Jun 2026 13:18:31 +0200 Subject: [PATCH 03/16] Add central package management. --- src/Directory.Packages.props | 43 +++++++++++++++++++ src/Rsdo.Concordancer.sln | 1 + .../Rsdo.Concordancer.Api.csproj | 28 ++++++------ .../Rsdo.Concordancer.SystemManager.csproj | 6 +-- .../Rsdo.Concordancer.Core.csproj | 2 +- .../Rsdo.Concordancer.Data.csproj | 12 +++--- .../Rsdo.Concordancer.Infrastructure.csproj | 10 ++--- .../Rsdo.Concordancer.ServiceModel.csproj | 4 +- .../Rsdo.Concordancer.Services.csproj | 24 +++++------ ...Rsdo.Concordancer.Tests.Integration.csproj | 10 ++--- .../Rsdo.Concordancer.Tests.Unit.csproj | 10 ++--- 11 files changed, 97 insertions(+), 53 deletions(-) create mode 100644 src/Directory.Packages.props diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props new file mode 100644 index 0000000..3ff24ff --- /dev/null +++ b/src/Directory.Packages.props @@ -0,0 +1,43 @@ + + + true + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Rsdo.Concordancer.sln b/src/Rsdo.Concordancer.sln index 7f67f60..23919e7 100644 --- a/src/Rsdo.Concordancer.sln +++ b/src/Rsdo.Concordancer.sln @@ -27,6 +27,7 @@ EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{0BC9D8CB-3F46-40F4-B769-E2605F03E0F6}" ProjectSection(SolutionItems) = preProject Directory.Build.props = Directory.Build.props + Directory.Packages.props = Directory.Packages.props nuget.config = nuget.config .gitignore = .gitignore EndProjectSection diff --git a/src/apps/Rsdo.Concordancer.Api/Rsdo.Concordancer.Api.csproj b/src/apps/Rsdo.Concordancer.Api/Rsdo.Concordancer.Api.csproj index 26c1644..87d2af8 100644 --- a/src/apps/Rsdo.Concordancer.Api/Rsdo.Concordancer.Api.csproj +++ b/src/apps/Rsdo.Concordancer.Api/Rsdo.Concordancer.Api.csproj @@ -1,20 +1,20 @@ - - - - - - - - - - - - - - + + + + + + + + + + + + + + diff --git a/src/apps/Rsdo.Concordancer.SystemManager/Rsdo.Concordancer.SystemManager.csproj b/src/apps/Rsdo.Concordancer.SystemManager/Rsdo.Concordancer.SystemManager.csproj index 27f7bfd..7f81ff0 100644 --- a/src/apps/Rsdo.Concordancer.SystemManager/Rsdo.Concordancer.SystemManager.csproj +++ b/src/apps/Rsdo.Concordancer.SystemManager/Rsdo.Concordancer.SystemManager.csproj @@ -5,9 +5,9 @@ - - - + + + diff --git a/src/core/Rsdo.Concordancer.Core/Rsdo.Concordancer.Core.csproj b/src/core/Rsdo.Concordancer.Core/Rsdo.Concordancer.Core.csproj index 16d710f..af2c713 100644 --- a/src/core/Rsdo.Concordancer.Core/Rsdo.Concordancer.Core.csproj +++ b/src/core/Rsdo.Concordancer.Core/Rsdo.Concordancer.Core.csproj @@ -1,7 +1,7 @@ - + diff --git a/src/core/Rsdo.Concordancer.Data/Rsdo.Concordancer.Data.csproj b/src/core/Rsdo.Concordancer.Data/Rsdo.Concordancer.Data.csproj index fd5ced7..e73dba2 100644 --- a/src/core/Rsdo.Concordancer.Data/Rsdo.Concordancer.Data.csproj +++ b/src/core/Rsdo.Concordancer.Data/Rsdo.Concordancer.Data.csproj @@ -1,12 +1,12 @@ - - - - - - + + + + + + diff --git a/src/core/Rsdo.Concordancer.Infrastructure/Rsdo.Concordancer.Infrastructure.csproj b/src/core/Rsdo.Concordancer.Infrastructure/Rsdo.Concordancer.Infrastructure.csproj index bae4505..32eb669 100644 --- a/src/core/Rsdo.Concordancer.Infrastructure/Rsdo.Concordancer.Infrastructure.csproj +++ b/src/core/Rsdo.Concordancer.Infrastructure/Rsdo.Concordancer.Infrastructure.csproj @@ -1,11 +1,11 @@ - - - - - + + + + + diff --git a/src/core/Rsdo.Concordancer.ServiceModel/Rsdo.Concordancer.ServiceModel.csproj b/src/core/Rsdo.Concordancer.ServiceModel/Rsdo.Concordancer.ServiceModel.csproj index bc00f3e..f024d4a 100644 --- a/src/core/Rsdo.Concordancer.ServiceModel/Rsdo.Concordancer.ServiceModel.csproj +++ b/src/core/Rsdo.Concordancer.ServiceModel/Rsdo.Concordancer.ServiceModel.csproj @@ -1,8 +1,8 @@ - - + + diff --git a/src/core/Rsdo.Concordancer.Services/Rsdo.Concordancer.Services.csproj b/src/core/Rsdo.Concordancer.Services/Rsdo.Concordancer.Services.csproj index ff5f865..003f45f 100644 --- a/src/core/Rsdo.Concordancer.Services/Rsdo.Concordancer.Services.csproj +++ b/src/core/Rsdo.Concordancer.Services/Rsdo.Concordancer.Services.csproj @@ -1,18 +1,18 @@ - - - - - - - - - - - - + + + + + + + + + + + + diff --git a/src/tests/Rsdo.Concordancer.Tests.Integration/Rsdo.Concordancer.Tests.Integration.csproj b/src/tests/Rsdo.Concordancer.Tests.Integration/Rsdo.Concordancer.Tests.Integration.csproj index b4a5c51..9bab8c2 100644 --- a/src/tests/Rsdo.Concordancer.Tests.Integration/Rsdo.Concordancer.Tests.Integration.csproj +++ b/src/tests/Rsdo.Concordancer.Tests.Integration/Rsdo.Concordancer.Tests.Integration.csproj @@ -5,14 +5,14 @@ - - - - + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/src/tests/Rsdo.Concordancer.Tests.Unit/Rsdo.Concordancer.Tests.Unit.csproj b/src/tests/Rsdo.Concordancer.Tests.Unit/Rsdo.Concordancer.Tests.Unit.csproj index b4a5c51..9bab8c2 100644 --- a/src/tests/Rsdo.Concordancer.Tests.Unit/Rsdo.Concordancer.Tests.Unit.csproj +++ b/src/tests/Rsdo.Concordancer.Tests.Unit/Rsdo.Concordancer.Tests.Unit.csproj @@ -5,14 +5,14 @@ - - - - + + + + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all From 227c46827f28a62e4c301487af935c3dd2e5443c Mon Sep 17 00:00:00 2001 From: Rok Rejc Date: Mon, 8 Jun 2026 13:40:48 +0200 Subject: [PATCH 04/16] Upgrade packages to .net 10 --- src/Directory.Build.props | 2 +- src/Directory.Packages.props | 66 +++++++++---------- .../Controllers/ServiceApiInfo.cs | 2 +- .../Framework/SerilogExtensions.cs | 26 ++++---- src/apps/Rsdo.Concordancer.Api/Startup.cs | 8 ++- .../Framework/VersionInfoTableMetadata.cs | 2 + 6 files changed, 56 insertions(+), 50 deletions(-) diff --git a/src/Directory.Build.props b/src/Directory.Build.props index d4706e3..a235a53 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -1,6 +1,6 @@ - net6.0 + net10.0 true false 1.0.4 diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index 3ff24ff..746a91f 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -4,40 +4,40 @@ - - + + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - + + + + + + + + + + diff --git a/src/apps/Rsdo.Concordancer.Api/Controllers/ServiceApiInfo.cs b/src/apps/Rsdo.Concordancer.Api/Controllers/ServiceApiInfo.cs index c7db546..2ce7293 100644 --- a/src/apps/Rsdo.Concordancer.Api/Controllers/ServiceApiInfo.cs +++ b/src/apps/Rsdo.Concordancer.Api/Controllers/ServiceApiInfo.cs @@ -1,5 +1,5 @@ using System; -using Microsoft.OpenApi.Models; +using Microsoft.OpenApi; namespace Rsdo.Concordancer.Api.Controllers; diff --git a/src/apps/Rsdo.Concordancer.Api/Framework/SerilogExtensions.cs b/src/apps/Rsdo.Concordancer.Api/Framework/SerilogExtensions.cs index a604bff..314b1ae 100644 --- a/src/apps/Rsdo.Concordancer.Api/Framework/SerilogExtensions.cs +++ b/src/apps/Rsdo.Concordancer.Api/Framework/SerilogExtensions.cs @@ -1,9 +1,9 @@ using System; using System.Net; +using MailKit.Security; using Serilog; using Serilog.Configuration; using Serilog.Events; -using Serilog.Sinks.Email; namespace Rsdo.Concordancer.Api.Framework; @@ -23,25 +23,25 @@ public static class SerilogExtensions int batchPostingLimit = 100, string mailSubject = "Log Email") { - var connectionInfo = new EmailConnectionInfo() - { - FromEmail = fromEmail, - ToEmail = toEmail, - EmailSubject = mailSubject, - MailServer = mailServer, - Port = port, - EnableSsl = enableSsl, - }; - + NetworkCredential credentials = null; if (!string.IsNullOrEmpty(userName) && !string.IsNullOrEmpty(password)) { - connectionInfo.NetworkCredentials = new NetworkCredential() + credentials = new NetworkCredential() { UserName = userName, Password = password, }; } - return sinkConfiguration.Email(connectionInfo: connectionInfo, restrictedToMinimumLevel: restrictedToMinimumLevel); + return sinkConfiguration.Email( + from: fromEmail, + to: toEmail, + host: mailServer, + port: port, + connectionSecurity: enableSsl ? SecureSocketOptions.Auto : SecureSocketOptions.None, + credentials: credentials, + subject: mailSubject, + body: outputTemplate, + restrictedToMinimumLevel: restrictedToMinimumLevel); } } \ No newline at end of file diff --git a/src/apps/Rsdo.Concordancer.Api/Startup.cs b/src/apps/Rsdo.Concordancer.Api/Startup.cs index 40f9f0a..147e9c5 100644 --- a/src/apps/Rsdo.Concordancer.Api/Startup.cs +++ b/src/apps/Rsdo.Concordancer.Api/Startup.cs @@ -12,7 +12,7 @@ using Microsoft.AspNetCore.Hosting; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; -using Microsoft.OpenApi.Models; +using Microsoft.OpenApi; using Rsdo.Concordancer.Api.Controllers; using Rsdo.Concordancer.Api.Framework; using Rsdo.Concordancer.Core.Constants; @@ -85,7 +85,11 @@ public class Startup // we would have to build the container which would (at this point) double singletons. // So we are duplicated code from ConnectionStringProvider var connectionString = Configuration[ConfigurationKey.Database.MasterConnectionString]; - x.UsePostgreSqlStorage(connectionString); + x.UsePostgreSqlStorage( + options => + { + options.UseNpgsqlConnection(connectionString); + }); x.UseMediator(); }); services.AddHangfireServer(); diff --git a/src/core/Rsdo.Concordancer.Data/Framework/VersionInfoTableMetadata.cs b/src/core/Rsdo.Concordancer.Data/Framework/VersionInfoTableMetadata.cs index 5c4d28f..ba3347d 100644 --- a/src/core/Rsdo.Concordancer.Data/Framework/VersionInfoTableMetadata.cs +++ b/src/core/Rsdo.Concordancer.Data/Framework/VersionInfoTableMetadata.cs @@ -14,6 +14,8 @@ public class VersionInfoTableMetadata : IVersionTableMetaData public string UniqueIndexName => "uc_version"; + public bool CreateWithPrimaryKey => true; + public object ApplicationContext { get; set; } public bool OwnsSchema => true; From 5b89d794caed0418901479cd87ee7c2420cd6fed Mon Sep 17 00:00:00 2001 From: Rok Rejc Date: Mon, 8 Jun 2026 14:24:00 +0200 Subject: [PATCH 05/16] Upgrade to top-level program.cs --- src/apps/Rsdo.Concordancer.Api/Program.cs | 178 +++++++++++++----- .../Properties/launchSettings.json | 52 +++-- src/apps/Rsdo.Concordancer.Api/Startup.cs | 154 --------------- .../Framework/VersionInfoTableMetadata.cs | 2 +- 4 files changed, 160 insertions(+), 226 deletions(-) delete mode 100644 src/apps/Rsdo.Concordancer.Api/Startup.cs diff --git a/src/apps/Rsdo.Concordancer.Api/Program.cs b/src/apps/Rsdo.Concordancer.Api/Program.cs index 507919a..54578a4 100644 --- a/src/apps/Rsdo.Concordancer.Api/Program.cs +++ b/src/apps/Rsdo.Concordancer.Api/Program.cs @@ -1,52 +1,146 @@ using System; +using System.Collections.Generic; using System.IO; +using System.Reflection; +using System.Text.Json.Serialization; +using Autofac; using Autofac.Extensions.DependencyInjection; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; +using Hangfire; +using Hangfire.PostgreSql; +using Microsoft.AspNetCore.Builder; +using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; +using Microsoft.OpenApi; +using Rsdo.Concordancer.Api.Controllers; +using Rsdo.Concordancer.Api.Framework; +using Rsdo.Concordancer.Core.Constants; +using Rsdo.Concordancer.Data.CompositionRoot; +using Rsdo.Concordancer.Infrastructure.CompositionRoot; +using Rsdo.Concordancer.ServiceModel.Shared; +using Rsdo.Concordancer.Services.CompositionRoot; +using Rsdo.Concordancer.Services.Framework.Cache; using Serilog; -namespace Rsdo.Concordancer.Api; - -public class Program -{ - public static int Main(string[] args) +var builder = WebApplication.CreateBuilder( + new WebApplicationOptions() { - // Read configuration file - var configuration = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()) - .AddJsonFile("appsettings.json") - .AddJsonFile($"appsettings.{Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT") ?? "Production"}.json", true) - .Build(); + Args = args, + WebRootPath = "./WebApp/build", + }); - // Create logger - Log.Logger = new LoggerConfiguration().ReadFrom.Configuration(configuration).CreateLogger(); +builder.Host.UseSerilog( + (context, _, loggerConfiguration) => + { + loggerConfiguration.ReadFrom.Configuration(context.Configuration); + }); - // Run application - try - { - Log.Information("Starting web host"); - CreateHostBuilder(args).Build().Run(); - return 0; - } - catch (Exception e) - { - Log.Fatal(e, "Host terminated unexpectedly"); - return 1; - } - finally - { - Log.CloseAndFlush(); - } - } - - public static IHostBuilder CreateHostBuilder(string[] args) => - Host.CreateDefaultBuilder(args) - .UseSerilog() - .UseServiceProviderFactory(new AutofacServiceProviderFactory()) - .ConfigureWebHostDefaults( - webBuilder => +builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory()); +builder.Host.ConfigureContainer( + containerBuilder => + { + containerBuilder.RegisterModule(new ServicesModule()); + containerBuilder.RegisterModule(new InfrastructureModule()); + containerBuilder.RegisterModule(new DataModule()); + containerBuilder.RegisterBuildCallback( + (c) => + { + var warmUps = c.Resolve>(); + foreach (var warmUp in warmUps) { - webBuilder.UseStartup(); - webBuilder.UseWebRoot("./WebApp/build"); - }); -} \ No newline at end of file + warmUp.WarmUp(); + } + }); + }); + +builder.Services.AddCors( + opt => + { + opt.AddPolicy( + "CorsPolicy", + policy => + { + policy.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader(); + }); + }); + +builder.Services.AddControllers() + .AddJsonOptions( + opts => + { + // Bind strings to enums + opts.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); + }); + +builder.Services.AddSwaggerGen( + c => + { + c.SwaggerDoc( + ServiceApiInfo.ApiGroupConcordancer, + info: new OpenApiInfo() + { + Title = $"{ServiceApiInfo.ServiceName} Concordancer API", + Version = $"v{ServiceApiInfo.ServiceVersion.ToString(3)}", + }); + c.SwaggerDoc( + ServiceApiInfo.ApiGroupDashboard, + info: new OpenApiInfo() + { + Title = $"{ServiceApiInfo.ServiceName} Dashboard API", + Version = $"v{ServiceApiInfo.ServiceVersion.ToString(3)}", + }); + + // enable attribute annotations + c.EnableAnnotations(); + + // include code documentation to the swagger doc + foreach (var assembly in new[] { Assembly.GetExecutingAssembly(), typeof(ExecutionResult).Assembly }) + { + var xmlFile = $"{assembly.GetName().Name}.xml"; + var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); + c.IncludeXmlComments(xmlPath); + } + }); + +builder.Services.AddHangfire( + x => + { + // It would be better to use ConnectionStringProvider, but in this case + // we would have to build the container which would (at this point) double singletons. + // So we are duplicated code from ConnectionStringProvider + var connectionString = builder.Configuration[ConfigurationKey.Database.MasterConnectionString]; + x.UsePostgreSqlStorage( + options => + { + options.UseNpgsqlConnection(connectionString); + }); + x.UseMediator(); + }); + +builder.Services.AddHangfireServer(); +builder.Services.AddHttpClient(); + +var app = builder.Build(); + +if (app.Environment.IsDevelopment()) +{ + app.UseDeveloperExceptionPage(); +} + +app.UseSwagger(); +app.UseSwaggerUI( + c => + { + c.SwaggerEndpoint($"{ServiceApiInfo.ApiGroupConcordancer}/swagger.json", $"{ServiceApiInfo.ServiceName} Concordancer API"); + c.SwaggerEndpoint($"{ServiceApiInfo.ApiGroupDashboard}/swagger.json", $"{ServiceApiInfo.ServiceName} Dashboard API"); + }); + +app.UseStaticFiles(); +app.UseRouting(); +app.UseCors("CorsPolicy"); +app.UseAuthorization(); + +app.MapControllers(); +app.MapHangfireDashboard("/hangfire"); +app.MapFallbackToFile("index.html"); + +app.Run(); \ No newline at end of file diff --git a/src/apps/Rsdo.Concordancer.Api/Properties/launchSettings.json b/src/apps/Rsdo.Concordancer.Api/Properties/launchSettings.json index 1312489..ba901d4 100644 --- a/src/apps/Rsdo.Concordancer.Api/Properties/launchSettings.json +++ b/src/apps/Rsdo.Concordancer.Api/Properties/launchSettings.json @@ -1,31 +1,25 @@ { - "$schema": "http://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:9184", - "sslPort": 44312 + "$schema": "https://json.schemastore.org/launchsettings.json", + "profiles": { + "http": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger/index.html", + "applicationUrl": "http://localhost:5000", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + }, + "https": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": true, + "launchUrl": "swagger/index.html", + "applicationUrl": "https://localhost:5001;http://localhost:5000", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "launchUrl": "swagger", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "Rsdo.Concordancer.Api": { - "commandName": "Project", - "dotnetRunMessages": "true", - "launchBrowser": true, - "launchUrl": "swagger", - "applicationUrl": "https://localhost:5001;http://localhost:5000", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} +} \ No newline at end of file diff --git a/src/apps/Rsdo.Concordancer.Api/Startup.cs b/src/apps/Rsdo.Concordancer.Api/Startup.cs deleted file mode 100644 index 147e9c5..0000000 --- a/src/apps/Rsdo.Concordancer.Api/Startup.cs +++ /dev/null @@ -1,154 +0,0 @@ -using System; -using System.Collections.Generic; -using System.IO; -using System.Linq; -using System.Reflection; -using System.Text.Json.Serialization; -using Autofac; -using Hangfire; -using Hangfire.PostgreSql; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Configuration; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Hosting; -using Microsoft.OpenApi; -using Rsdo.Concordancer.Api.Controllers; -using Rsdo.Concordancer.Api.Framework; -using Rsdo.Concordancer.Core.Constants; -using Rsdo.Concordancer.Data.CompositionRoot; -using Rsdo.Concordancer.Infrastructure.CompositionRoot; -using Rsdo.Concordancer.ServiceModel.Shared; -using Rsdo.Concordancer.Services.CompositionRoot; -using Rsdo.Concordancer.Services.Framework.Cache; -using Swashbuckle.AspNetCore.SwaggerGen; - -namespace Rsdo.Concordancer.Api; - -public class Startup -{ - public Startup(IConfiguration configuration) - { - Configuration = configuration; - } - - public IConfiguration Configuration { get; } - - // This method gets called by the runtime. Use this method to add services to the container. - public void ConfigureServices(IServiceCollection services) - { - services.AddCors( - opt => - { - opt.AddPolicy( - "CorsPolicy", - policy => - { - policy.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader(); - }); - }); - services.AddControllers() - .AddJsonOptions( - opts => - { - // Bind strings to enums - opts.JsonSerializerOptions.Converters.Add(new JsonStringEnumConverter()); - }); - services.AddSwaggerGen( - c => - { - c.SwaggerDoc( - ServiceApiInfo.ApiGroupConcordancer, - info: new OpenApiInfo() - { - Title = $"{ServiceApiInfo.ServiceName} Concordancer API", - Version = $"v{ServiceApiInfo.ServiceVersion.ToString(3)}", - }); - c.SwaggerDoc( - ServiceApiInfo.ApiGroupDashboard, - info: new OpenApiInfo() - { - Title = $"{ServiceApiInfo.ServiceName} Dashboard API", - Version = $"v{ServiceApiInfo.ServiceVersion.ToString(3)}", - }); - - // enable attribute annotations - c.EnableAnnotations(); - - // include code documentation to the swagger doc - ConfigureSwaggerApiDoc(c, Assembly.GetExecutingAssembly(), typeof(ExecutionResult).Assembly); - }); - services.AddHangfire( - x => - { - // It would be better to use ConnectionStringProvider, but in this case - // we would have to build the container which would (at this point) double singletons. - // So we are duplicated code from ConnectionStringProvider - var connectionString = Configuration[ConfigurationKey.Database.MasterConnectionString]; - x.UsePostgreSqlStorage( - options => - { - options.UseNpgsqlConnection(connectionString); - }); - x.UseMediator(); - }); - services.AddHangfireServer(); - services.AddHttpClient(); - } - - public void ConfigureSwaggerApiDoc(SwaggerGenOptions options, params Assembly[] assemblies) - { - foreach (var assembly in assemblies) - { - var xmlFile = $"{assembly.GetName().Name}.xml"; - var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); - options.IncludeXmlComments(xmlPath); - } - } - - public void ConfigureContainer(ContainerBuilder builder) - { - builder.RegisterModule(new ServicesModule()); - builder.RegisterModule(new InfrastructureModule()); - builder.RegisterModule(new DataModule()); - builder.RegisterBuildCallback( - (c) => - { - var warmUps = c.Resolve>(); - foreach (var warmUp in warmUps) - { - warmUp.WarmUp(); - } - }); - } - - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IWebHostEnvironment env) - { - if (env.IsDevelopment()) - { - app.UseDeveloperExceptionPage(); - } - - app.UseSwagger(); - app.UseSwaggerUI( - c => - { - c.SwaggerEndpoint($"{ServiceApiInfo.ApiGroupConcordancer}/swagger.json", $"{ServiceApiInfo.ServiceName} Concordancer API"); - c.SwaggerEndpoint($"{ServiceApiInfo.ApiGroupDashboard}/swagger.json", $"{ServiceApiInfo.ServiceName} Dashboard API"); - }); - - app.UseStaticFiles(); - app.UseRouting(); - app.UseCors("CorsPolicy"); - app.UseAuthorization(); - - app.UseEndpoints( - endpoints => - { - endpoints.MapControllers(); - endpoints.MapHangfireDashboard("/hangfire"); - endpoints.MapFallbackToFile("index.html"); - }); - } -} \ No newline at end of file diff --git a/src/core/Rsdo.Concordancer.Data/Framework/VersionInfoTableMetadata.cs b/src/core/Rsdo.Concordancer.Data/Framework/VersionInfoTableMetadata.cs index ba3347d..1b225fd 100644 --- a/src/core/Rsdo.Concordancer.Data/Framework/VersionInfoTableMetadata.cs +++ b/src/core/Rsdo.Concordancer.Data/Framework/VersionInfoTableMetadata.cs @@ -14,7 +14,7 @@ public class VersionInfoTableMetadata : IVersionTableMetaData public string UniqueIndexName => "uc_version"; - public bool CreateWithPrimaryKey => true; + public bool CreateWithPrimaryKey => false; public object ApplicationContext { get; set; } From 8a80499d736724e6fd78c4aeefc4cf655eaa7c04 Mon Sep 17 00:00:00 2001 From: Rok Rejc Date: Mon, 8 Jun 2026 15:25:44 +0200 Subject: [PATCH 06/16] Remove old StyleCop and use built-in analyzer. --- local-packages/Rsdo.StyleCop.1.0.0.nupkg | Bin 10664 -> 0 bytes src/Directory.Build.props | 5 ++++- src/Directory.Packages.props | 1 - src/Rsdo.Concordancer.sln | 1 - src/apps/Rsdo.Concordancer.Api/Dockerfile | 9 +-------- .../Rsdo.Concordancer.Api.csproj | 1 - .../Rsdo.Concordancer.SystemManager/Dockerfile | 9 +-------- .../Rsdo.Concordancer.SystemManager.csproj | 1 - .../Rsdo.Concordancer.Core.csproj | 4 ---- .../Rsdo.Concordancer.Data.csproj | 1 - .../Rsdo.Concordancer.Infrastructure.csproj | 1 - .../Rsdo.Concordancer.ServiceModel.csproj | 1 - .../Rsdo.Concordancer.Services.csproj | 1 - src/nuget.config | 6 ------ .../Rsdo.Concordancer.Tests.Integration.csproj | 1 - .../Rsdo.Concordancer.Tests.Unit.csproj | 1 - 16 files changed, 6 insertions(+), 37 deletions(-) delete mode 100644 local-packages/Rsdo.StyleCop.1.0.0.nupkg delete mode 100644 src/nuget.config diff --git a/local-packages/Rsdo.StyleCop.1.0.0.nupkg b/local-packages/Rsdo.StyleCop.1.0.0.nupkg deleted file mode 100644 index 39accc077e3b299b0b73feba745a4ac770baec4e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10664 zcmcI~WmFx_wk;am0vmUCXX73S?(Q4kxCXc2?h-5nceg-rcMb0D1b29R@7(debIv{Q z{=3~{byru_nl*aXsx^9aO(j`q7%T_~2zUsnTsc(|bPq2gNC=3hcSCxwHFPqwab{uu z>zWk5Yz4)J9&(Q46B_5my+~y)@0eTxcTjPP)O%uz!UdN=dvi)q3|oM;Gy>Xty7x10 zf3E)Q5|S3>MpVfVfx)v2x80BWy*7LFkJH6H>w1^+o>L+!HKiJ9DxdctuK-5EEM&P{ zGTO$lw5a2)+z&coV8#IsB@})G}2kS{WDpvKkJ7l4obCpS zD$V5^7kLZS;od?+AJ@#pRuX2Rcb?wfpdpn0g~gg+uNnCFma%vHi(3_EQ+sAr7Y`dV zaeD`5J6C51GZPo3DVbhYbZ?yJ&^Wic3Ub1PJ)Uc2^s{zS%4O?nd1GL5S;t=B_Z=48 zhGZvFkMyjelN0ZDzrj=R!6E~-Qy2FyY=FgqeDyd9fzaNqRZr8=rI@5`_6>%1yqA@G zs`D>s(wWU1Y2@*Ikso8-L6E);eUO!9j~_~P|4>M9ZhcC@;ppG-*VfItL8D*LZlEFP zB~uh!3#I)bXKtrZB*UXDt+g?F#O6j8zeGZuP046UjoBW>yqU*wfZ*0|G`d8fR&jy3-?IMCY>oxkeou!68>{v}n@o+q%c?u3^k zxtd;a+$`@A>ff2mh?i59|7k^U^UfL!Gz0|7J9Ex|k!JEvnw7J?U9ifCLJuqYFNzB^ z%$5l6W_He5H;k=^j}hUID9DAfrLf2@9+^@h zFne%P3O`RV&>b84u>@0iZS1K%BrCR#H_!-TIB=0$l`ApuJr^7}b(M(}q)yS-1#ROB2Y z2?+#*Neu)9;J*d5ldFxHvzg17{<+h#l+#;w=`ZLl?*+ls9WH6*!qQ(}R3l#$!fkm| z+Pq52$}pv(D9fe&k^EDV^|BdBE~PwzpIi3PK9KtFNjW*`y1HU7;y$+&6}1)>6+H;Q z-KK5Dwb&1DPdHW{=~VPcThl&Bhgan-Wxk#s-`Tu{wejrSXI&kTYa8h zXV(l6P$`3R!LEbz;9a6&mSjF<+fGL=qU3dNU9*CoVwt5$U#1e5VpY>+(lq57BYKzX z-ezEo>`BxgIb!|FDw|7KMVIT+Fdj)iUTXQxumI_mTG`AqS)!EoGS~a#i*9@P@UeHD z+$a(Ny^t!e|Ck;MV9|szsrgX)iYsy<3D86=2jFw#KBzO5UJm6Qm}Ikze9y8hiesY0 z+Z0YQ$0M@1xV&9gcT9i2Kd^0~y=3nw&t6a*p|Rg)Y*!gV_|!#`LYFTaJ58B%?Ed3< z-(Bu0$|uoF_Y(^*FR`Fc1fGz=!O#O0Gduj9^0m0|18vkZZJ0OK2XjtT3Snf5@38T) z@1{r%+JOV@fXa!3#*RdB(*i|UL0<*nRcpX$5%N8h94Iq`;Ixl~As}Jo9$#E|YB>bd zqWA86&bWmfp&;2OR=K`xSos;s(R_vM4?{keoKk0rMWSCb1yDZjP!6`og1(AN3d1{_ z!TrdCV~P!|2J^vZ6b7<>_FzRM6qG_J1o3eoB|e>iEPa4}+M1WU+%76m#zb6Q?R ze~%HX4is>>MvsPh0HxJEgtUVN5OtQem6eQm`UQgHLk~vX34!w4)nNQsF%8T?w2l%} zbC8jwpKQW6Us=%)eK4eGSf-PgxUuiAk7~j-=oK}P$V!zKR8c6sQ2xR8S(F%9mRPMV z2(RlcnvJ#t`id;0<1Zk0Cd!K%7drGp`d2CDf^t+cx<_XzYZfXxdBvFlDy5&|=)d9v5obR`m2jF&+N=h!+}1}oaUm)7J{t@%cHWJRsq%6 zu$|EFx%+R`9VBh?BOlZ9gxh^E52q_4%2MYtc!!Hqnx<0g<&+}<>P^;w&B$b(G4%_| zh}%22-AjRqt#04R0X-UJ8pVAcEe+nOcX2*Xh z0#_9?ROANTJB?m=yWzi1e3fq<%ASAEY?E+PV`cn`=S+84dQeZ)V@UzN$>tp!ZTs#{B@Yl6j`c7SD6|(OF_r3>ou++P&ymxXfKn&0D>d(E zP$MU9>i43D%^GdOkNm3fStS_4vC`gg#@nksCzkL}qsd%USzGPGNTK9Nq3OYQ!D2*z zpc=VZydy7|;YjX3;uj>~G;v{e{=Cgzv{*l0jB4-*Ss7!N`W`Oz9h`3=X^SGmbU6Ru z^lkkfUV1+(L|3mpX*E?T)A-u}LU+g!pT!@_OIZ#|Hj#o^?s*4rs{=bG?>AnBgXKF% zNE8ti_oY_2Bf2Q| z&p-=$E}`E%*b|U?DECHAlrBjuQ3<1u-C&|c=)0s)95XhcyY-%#zM}ky6msFT3(FEI z)9;lx5|lm1yK0355FJ=f$JId04&DB6jEHe|nM6MjE|CKql8eMwU1Me)IS8NRrV`2% zu&)7HF>jj!nLP)lK;kC@>gxGd@&IE|S8G;TFt%SxP29jCg{U5Exm8Gu+v`Q8fSGQzMazY_6-o}0WU=w z$3B!9#Cp7+{P=*c*QO4EXdHw5524W1d?PikDOw}_{aHH;$Ayc_W3@8#vNw^-p_%3b zB$osx0`3H;(Xd+Dq~V@F%EuY?(7Eu`gcH!dCSHC@g3oqB_=Ln4sv2a*GI?b?r8 zy>!#)nhgrSAF#`1&E?Fb582T^)qX}k!w7wBacYVf`(2>Gd-G;h0 z#!G;95ht|05wcZ%)TR$Fv{u)oTC-l_i+s{VBEi4fRL%mD5 z&R422?g9_Fvf9G2+4%@C>}Wz0j0BB25ND6YP$ND1@f!MrA{z~-<}p=99gtt=MGZO6 z_`b<``@k^_bC-LOnNXS;6HBnp$UtZ?Mq7}7VsNZsxTT#8=@T#o6;F`mvk6MZP<+}L zY@Z-5VQ0ZUSeF}``m=ij9yr9Is5}M=bnnq_oZnuJ%T$efqAH8S1ABrc#hcm%sd< z33b=JC>0ak`XGYqQ@@w;8@jPftqhwqWi~d%h)u$4?c3T9hhuV@`1pG>)Nt-TvqAtd zHfdKUZ|&Un(ywE-p;%kY(@c?bV4+6hDE2r3yrj5#zh1wdhcgcBk;UDN=JG#O22!Hg zTo=n8=WlLwT|R;R!x&`p>#&g~KVnvK%5Kt(Zjl z-{#M9Ve4*%nud1D#kVoC$aZ(cWJfZq9>sxin0Srom4eA$ZtJed*?{KzX_m;mtbXbd zhhpUvwp-kGFGBbDv{^WbQv(}0>lu-HzP3T#&*ennQMz|#!Jk94aX7AX9Ka1Y87|sc z=1BkngF;q11M}!R5Y{b$NsK9s0yJdObf7sTUpb`^buQ!`0w>yM?C(N_pJ5h^cT6yE z{e5D3YEB}Ww5qPUZ5j^pZiPlT4`-ej$ph6%`A%HoO~vrzMi2V(KI1^~u!T8jdya?4 zr@lheMVnF-_*c7XBQAFq8#x`*XeD_#m2E?2q0NfJi%5jpar{BX%H?FGGU~RLa06c* zb9&5sh{_6e%|6gXVfVE5(`|84TPm<=eC^eg1cT>*>}!;iORtL;AGSr=A0xCt z8o^;ls57X0Af3M9>rWyK4xIbZ;D%-|&k_%YJ3@BeQ5%dU-s^SvPv~zkPS|N;b>X>^ z>FGG2D6tll9gqj$bq16~v{#vgu1maOywKEc{Q^hStmkXqOV<+II`ORCi~V%CS*8xg zb#dC^le{kOnfY)Wz3KNHzRud*?x~}HuTs1^4u=&x{ZY6E_JDdbwd&7OJ>?*JHzJ_W zE)rmJ6p?faWoFe`SmFZbnJsa&JY1(sf;OvIJ|EEsPHL2@sx0%V#gj6o8t?f{PGGL? zqMle&lLo+i45QZC6-X0uOpUQpWVA$(?rD)u5K^q#J3hm6#a$ zPz8_oX)V|KdTu%O*_veC8>s1sRC6^tS6kBGXK3fB0m6y#Ii z=xE1&Fxi_t`{?O3&kB-5tC>(9QsM9#rIxi9Q>{!>*|UuP={eTAW=_moak4WR7aR#=eX z0(@!{yAHr<+Z}^x^=N8pmu&l~iwM4svfREWsr8#P_P{xm;1xa=0sovT0?lX$tQ2+c zyXguxqDF_oReEyK%o;GW)HNRi^STMeYiMK=mfU)?moXmO2!da7)oCIOk99Rx_J6OLJPc$JsXD^rY`kjUwJgD7JYk z(#&Q11O!Y{UQwmA6$0(}zD5~vQc+=H=du;?)lUGB*5D$k(xj(xt>*+lsU_oeCULB@ z@+-Da+(4;$2g8=!o7$yaiC2(4ob7C*Bl*=L?>u4wJ-ZV!Kj~(sRUEQ#$3PSmd8*gB zyFNVipxftsao7NsgvP|lnoxuRI@sy*X^-;tyM-%!K6>Wp%&j;K6P6%H=v%v#&>boX zj+{S)v_(%XeSO-`An@t&wZTlyV@h!3B#%cu4i}5p zYaS;E8e;vxZta2wdU{OW9f?qI!3w?tH*(k9BmD~tk)bt5rCTql2(}5d7x4KAX>K3g z;FqxUBP5Ph-<|1l+9tlGDP$oo*@CLhaM{k{Wh0AZXNf{aP_TX)T3dA?h1|wup)@@N z&P#=$hH2LPg?y}h=~4AVv}O~b{();bbXKH6B-U|HcLq6JO_}+t0lS)BNXh;rF}R*K zqzwGzx&27)P92fsyqeLsHt?1;|3o!?&L>J=`Otow!{wG^X+w;ES0^mWfn<~Un*d9% zH7sJSlqk=oNFWl(*)7yKz2J0(3#B*oDWH3;v&$$|N#GVAWwuD4M^$z`Jc*nBg0BMo z)iQIc#9yseF0sEd*o}5si3+mS7LjL?VSTskjKXY4FQ8iwW4P`P)@cer6EswMP@#d2 zX__?WnY0vR%ke4F)c*&WZ~hnxEvN7pcoOcT--7AFTA`!4s-!NmWezJRvp&kA^BGk7 z4zZgwrRaUa5Ud1_7R?#=!&pvpbf{6#s_n;vTi>u2DeR9})Ci+%iF~N5qVg^?jtz*0oQK&eRTmnhbslE$8_7Kr;_I z_?&nxJt`-qV2FuYGUc@V2eZ`8mRu=t>asVUBPQ@PdQg8l(q|RMr?}tzUZeYyNcN!> z%$fH?q>(G7VA~}xCL{vHK(_=?Ny}gM2G}kbD9A2(tL3IjUeFNAa8sDO-#$n!>&NjM z8;TYDGf)g-ugL9-c$4l{;raZMx6PS~^Qy-MVaU?#$4Sna&3)nRH#YmVwPfN+l$+w= zNukRWdi1Jas&}5>me(_*^9*0QU_RvE1F(R{g6n!jsZWHt40A^P&HXI34QW*81y@#!sK>-Fs7!5MQRAvPiWb`{`R^nkC_ zGm+tg^0aL1^~b~lW=U$drWWoDx5`{0(O0bHQGaXw4y@t`Y^aE+9FH)#($}|Wz*!}) zSp1a~A`ugy4=5YBo=mwBi82tKqA$Nd+&vmQE@~ld@rW;0cAD|9?y_hYGvOOuAhl2t zK|&-*y_z~zNgmiOI&v}>gLq2Zz2zJ@H~e$Bef;t*CU>t%5A)OFs=A&xwn+Hdh-8^s zA?WP&*dVj0#U)$j%P$qVtmNIVZmX4(Rc+T>w9DBu22ME{=Cp#^2o4gldtz#c+s(i` z&b(Jz$A&JQ@?(!@tw{+VJz|9qjV_8>qu!p&VTf??3Vj=BSbJNvZs_6?HJJNzOe!6w zqa7;Jut9AveJd&}bcK6(KI6tv?Pw26Btx9-52(}5n-)@HDp5!g*>hn6-&{#%a7K8Z^l(xlh(6wVW7e4A z;g8AX@kX~rD#%Q+(BfN{PR-w;t$cHXTRZAWUd4Y}%OauU%N~|TBD}4g@&&h=1gNLu zuf+JI78?J02W?EQNO4CI9a&`vbsaoEARu+7+eV7`0hsC;ZPV;sZN@P9qLfzhGX%f5 zmsjqLmaN8%*a{b{Pj6eL7_tQrY(?qx3&2xjxtixiEI@>$rW3doQPUpTxmEMZ)>Ln2 z|NZHqof^!UQL(roBs(TAiEEMD;Re}!CGh%tfGm-7_Q&$-L2DVt$3Pb)o2s)f8OLz? zi@K+kZWfYJ@HX)4=VUgIH5OUxUHoYu)ZMh#bKe^8PMhkj;-ZPTj)*%YG;I_2$1cHM znt3QZ4}kQ1#U1^UI)=sOJf@Fr=f(3+a|U+{D_0%)Obs;>t`W)hU{BO}TqRAVTy;+p!ngb#0GfB>Y zPSKoQI){ffhd^Evdq=|T3p8G!u`m`t(%0N3yLKeKR=d~s`+R5$rP;eF+9w&e+?=mj z5OiF*8uHxQ!gHPJ5`KD2=TKUgkvRu|m0a#%2~b}$QwSE?uB;OCJ(6th*-?tVDQTLV=eeWw!FUjce>pGK9$DiZ@D_Em zVAvX-Z<D#Ajike98qQe&v=(JS-V=;5{XCR`_nx9!%BoZD`!Z2rTU4yLbo)Gx z0V7&QtcsaSF_+9+&8G&&f}H z^ftjFD3~42`k0(;2??Z0f>lD9)B26xF<#m)Nl}81w+v-kn9SK6%_$g{&)lO*MP|0m zuFM0a6GCl)5yK2~R`5DT`pDWkx(~i{4-sulp3P{j{LRRI18a2(MJNj-STRr>Kn5Qq z*P@%xNR=BkF0#0R(sCiQ`yj>3yBdr zh8~k^*s9{zvzri7-x-Cf+B_@?S}++tRj_=t^C*LQ4k)jJ6<#dr9FZT+!k3svWQkNqlmdHw3^%pYvT?jBXkthzW}YD-mfgwiw*i7e58w~isvkIG&|$#@H+=Q|p2zk&x? zn2Sd0?=~HW01D_!QqPuls-x)|g zJ5P$P>tk;}M|`w}zA^Xy&+8xabUVyqZW1%bUj9Ad&9NDyOGZrHXFNqnehkK~>%Z<1 z2y28-f2@mEhj!()OH7W&uM=^RfLYYV$y==HjF*kR5c!Xtz_hGJBeFN8ZN`g#D4tRW&|1ZBKYUWVNk)o_2b%-`oA3Bn5z% zk3d-)K8ZwLEN(uyGdP9wKBEZ_$FU8w^lt=MXhYfVPG5}VR!Uw$;;aSQqEW*&@ei4H zL23Epea=@DVH-p?kKxFm(*Ws&ktVlh0T0rrrs_@-uBU4TZLyTKN%^E z>Jz!|MPqAHyiEgVqccW{tgUvxWIl$H@bL%zItgNogc6e^0jBu4WtRI+^`_uM$QzoU9s+Zsum!+aP)AG z6ZX^#K(q<4JOtmpvNL@O%KOSq=Ax;RV3kuLT`%cDsrTVWbu#{(Q4KVUuIFL&?@NIZ zX7^8ZS_mW-pysOux8*%^RtXeL&E){(F)t)Q(B;AXj~0a}36q04t!6f%mLDVvLGIa! zlFGqd-B|pa+o+<0yF!ydy))Sf3&G35x`X=D5lP9 zdkyimjLwZuIFZ}w@N$>?Z|?pQDOs3B`|rGSrtvNz!F<2#ird?{nAy1)s(Cn=IqNgK z+uCF%h${55B1_y!t&k04H_$Pni=B=_HACWr={2F`#{gRMHgEGe%Hs}lv~}K|1Q}#n zg~z7|S!JbW7oS>cJ|L)&Se~5Zir<*twJvAezC8|jOLvMuhJjkEM52ESMg)qCxTpb2kcAnGvzgNuu!)&7 zi>;Xp$Q0xPVllCIGGqEHw#=Md!0!!gth}to>_B!CE_QBCAg4Kqlh@pw7sLbNW;f>L zf!^tU=&e?Q%tVFmvBq0fVkQt?1!)FG6|57taYksyCe(>R`vdn zuaP%8%Pf!68=r(ADu{|g;}gkC%WMZk8WG%8k&;4RjSL0+z7ssG>ui-uNb(gBW_rNJ z2c|5M%@CrNif%%kg!z@;N}1X8Ou~kyT%_9?opa`)kYXa^tttZTLZ^&{ZLxO0PW*%o z=})mAd7976CL~0FB5bOaAklx=3nG(Up=;)_HG1Duh6~0L!qJxgQ|SjoW3)k{L+3+B zIdteqP>uhkt)@Gfmna2NX>_x$YGOHTS^r^L5F%k&fnHQ&^mh!SH+aJQYA)ucp9W!Z@pp9y(}JZXl({`I`;YhI9mpRdfr zyWr^`^9l)t^?!9^|5=mwKDqyN{F6dYN%mhI|6PXmx0mF5p!{pD`G+X&pAr6(9P4ic z|MxKa7jf1ZMv h{(Wiv4bVdMzp&7hWMM!2H3Z!I3Gq&I0?l7f{|E3!qnZE! diff --git a/src/Directory.Build.props b/src/Directory.Build.props index a235a53..a88c9a0 100644 --- a/src/Directory.Build.props +++ b/src/Directory.Build.props @@ -2,7 +2,10 @@ net10.0 true - false + true + 10-recommended + true + $(NoWarn);CS1591 1.0.4 diff --git a/src/Directory.Packages.props b/src/Directory.Packages.props index 746a91f..5f9772f 100644 --- a/src/Directory.Packages.props +++ b/src/Directory.Packages.props @@ -28,7 +28,6 @@ - diff --git a/src/Rsdo.Concordancer.sln b/src/Rsdo.Concordancer.sln index 23919e7..9f046a7 100644 --- a/src/Rsdo.Concordancer.sln +++ b/src/Rsdo.Concordancer.sln @@ -28,7 +28,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution ProjectSection(SolutionItems) = preProject Directory.Build.props = Directory.Build.props Directory.Packages.props = Directory.Packages.props - nuget.config = nuget.config .gitignore = .gitignore EndProjectSection EndProject diff --git a/src/apps/Rsdo.Concordancer.Api/Dockerfile b/src/apps/Rsdo.Concordancer.Api/Dockerfile index ede4bf3..1f001c9 100644 --- a/src/apps/Rsdo.Concordancer.Api/Dockerfile +++ b/src/apps/Rsdo.Concordancer.Api/Dockerfile @@ -10,13 +10,6 @@ RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - \ nodejs \ && rm -rf /var/lib/apt/lists/* -# COPY LOCAL NUGET PACKAGES -WORKDIR /nuget -COPY local-packages/. . - -# ADD LOCAL NUGET SOURCE -RUN dotnet nuget add source /nuget - # RESTORE PACKAGES (with project files only) WORKDIR /src/apps COPY src/apps/Rsdo.Concordancer.Api/Rsdo.Concordancer.Api.csproj Rsdo.Concordancer.Api/Rsdo.Concordancer.Api.csproj @@ -57,4 +50,4 @@ RUN dotnet publish "Rsdo.Concordancer.Api.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . -ENTRYPOINT ["dotnet", "Rsdo.Concordancer.Api.dll"] \ No newline at end of file +ENTRYPOINT ["dotnet", "Rsdo.Concordancer.Api.dll"] diff --git a/src/apps/Rsdo.Concordancer.Api/Rsdo.Concordancer.Api.csproj b/src/apps/Rsdo.Concordancer.Api/Rsdo.Concordancer.Api.csproj index 87d2af8..8824262 100644 --- a/src/apps/Rsdo.Concordancer.Api/Rsdo.Concordancer.Api.csproj +++ b/src/apps/Rsdo.Concordancer.Api/Rsdo.Concordancer.Api.csproj @@ -6,7 +6,6 @@ - diff --git a/src/apps/Rsdo.Concordancer.SystemManager/Dockerfile b/src/apps/Rsdo.Concordancer.SystemManager/Dockerfile index cfb042d..7fa205d 100644 --- a/src/apps/Rsdo.Concordancer.SystemManager/Dockerfile +++ b/src/apps/Rsdo.Concordancer.SystemManager/Dockerfile @@ -3,13 +3,6 @@ WORKDIR /app FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build -# COPY LOCAL NUGET PACKAGES -WORKDIR /nuget -COPY local-packages/. . - -# ADD LOCAL NUGET SOURCE -RUN dotnet nuget add source /nuget - # RESTORE PACKAGES (with project files only) WORKDIR /src/apps COPY src/apps/Rsdo.Concordancer.SystemManager/Rsdo.Concordancer.SystemManager.csproj Rsdo.Concordancer.SystemManager/Rsdo.Concordancer.SystemManager.csproj @@ -44,4 +37,4 @@ RUN dotnet publish "Rsdo.Concordancer.SystemManager.csproj" -c Release -o /app/p FROM base AS final WORKDIR /app COPY --from=publish /app/publish . -CMD tail -f /dev/null \ No newline at end of file +CMD tail -f /dev/null diff --git a/src/apps/Rsdo.Concordancer.SystemManager/Rsdo.Concordancer.SystemManager.csproj b/src/apps/Rsdo.Concordancer.SystemManager/Rsdo.Concordancer.SystemManager.csproj index 7f81ff0..c41de05 100644 --- a/src/apps/Rsdo.Concordancer.SystemManager/Rsdo.Concordancer.SystemManager.csproj +++ b/src/apps/Rsdo.Concordancer.SystemManager/Rsdo.Concordancer.SystemManager.csproj @@ -7,7 +7,6 @@ - diff --git a/src/core/Rsdo.Concordancer.Core/Rsdo.Concordancer.Core.csproj b/src/core/Rsdo.Concordancer.Core/Rsdo.Concordancer.Core.csproj index af2c713..df332b2 100644 --- a/src/core/Rsdo.Concordancer.Core/Rsdo.Concordancer.Core.csproj +++ b/src/core/Rsdo.Concordancer.Core/Rsdo.Concordancer.Core.csproj @@ -1,9 +1,5 @@ - - - - diff --git a/src/core/Rsdo.Concordancer.Data/Rsdo.Concordancer.Data.csproj b/src/core/Rsdo.Concordancer.Data/Rsdo.Concordancer.Data.csproj index e73dba2..0bd9599 100644 --- a/src/core/Rsdo.Concordancer.Data/Rsdo.Concordancer.Data.csproj +++ b/src/core/Rsdo.Concordancer.Data/Rsdo.Concordancer.Data.csproj @@ -6,7 +6,6 @@ - diff --git a/src/core/Rsdo.Concordancer.Infrastructure/Rsdo.Concordancer.Infrastructure.csproj b/src/core/Rsdo.Concordancer.Infrastructure/Rsdo.Concordancer.Infrastructure.csproj index 32eb669..461cdc7 100644 --- a/src/core/Rsdo.Concordancer.Infrastructure/Rsdo.Concordancer.Infrastructure.csproj +++ b/src/core/Rsdo.Concordancer.Infrastructure/Rsdo.Concordancer.Infrastructure.csproj @@ -5,7 +5,6 @@ - diff --git a/src/core/Rsdo.Concordancer.ServiceModel/Rsdo.Concordancer.ServiceModel.csproj b/src/core/Rsdo.Concordancer.ServiceModel/Rsdo.Concordancer.ServiceModel.csproj index f024d4a..5e10e1c 100644 --- a/src/core/Rsdo.Concordancer.ServiceModel/Rsdo.Concordancer.ServiceModel.csproj +++ b/src/core/Rsdo.Concordancer.ServiceModel/Rsdo.Concordancer.ServiceModel.csproj @@ -1,7 +1,6 @@ - diff --git a/src/core/Rsdo.Concordancer.Services/Rsdo.Concordancer.Services.csproj b/src/core/Rsdo.Concordancer.Services/Rsdo.Concordancer.Services.csproj index 003f45f..024eb0d 100644 --- a/src/core/Rsdo.Concordancer.Services/Rsdo.Concordancer.Services.csproj +++ b/src/core/Rsdo.Concordancer.Services/Rsdo.Concordancer.Services.csproj @@ -12,7 +12,6 @@ - diff --git a/src/nuget.config b/src/nuget.config deleted file mode 100644 index a6e71a4..0000000 --- a/src/nuget.config +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/src/tests/Rsdo.Concordancer.Tests.Integration/Rsdo.Concordancer.Tests.Integration.csproj b/src/tests/Rsdo.Concordancer.Tests.Integration/Rsdo.Concordancer.Tests.Integration.csproj index 9bab8c2..12e3c27 100644 --- a/src/tests/Rsdo.Concordancer.Tests.Integration/Rsdo.Concordancer.Tests.Integration.csproj +++ b/src/tests/Rsdo.Concordancer.Tests.Integration/Rsdo.Concordancer.Tests.Integration.csproj @@ -6,7 +6,6 @@ - runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/tests/Rsdo.Concordancer.Tests.Unit/Rsdo.Concordancer.Tests.Unit.csproj b/src/tests/Rsdo.Concordancer.Tests.Unit/Rsdo.Concordancer.Tests.Unit.csproj index 9bab8c2..12e3c27 100644 --- a/src/tests/Rsdo.Concordancer.Tests.Unit/Rsdo.Concordancer.Tests.Unit.csproj +++ b/src/tests/Rsdo.Concordancer.Tests.Unit/Rsdo.Concordancer.Tests.Unit.csproj @@ -6,7 +6,6 @@ - runtime; build; native; contentfiles; analyzers; buildtransitive From d3e773fe48967316a0d174d2c86c894884ca8d26 Mon Sep 17 00:00:00 2001 From: Rok Rejc Date: Mon, 8 Jun 2026 15:26:51 +0200 Subject: [PATCH 07/16] Remove DotSettings. --- src/Rsdo.Concordancer.sln.DotSettings | 357 -------------------------- 1 file changed, 357 deletions(-) delete mode 100644 src/Rsdo.Concordancer.sln.DotSettings diff --git a/src/Rsdo.Concordancer.sln.DotSettings b/src/Rsdo.Concordancer.sln.DotSettings deleted file mode 100644 index 02b8531..0000000 --- a/src/Rsdo.Concordancer.sln.DotSettings +++ /dev/null @@ -1,357 +0,0 @@ - - C65+,E16+,FF58+,IE11+ - VISIBLE_FILES - DO_NOT_SHOW - DO_NOT_SHOW - <?xml version="1.0" encoding="utf-16"?><Profile name="Reformat Code IDE"><CSReorderTypeMembers>True</CSReorderTypeMembers><CSCodeStyleAttributes ArrangeTypeAccessModifier="True" ArrangeTypeMemberAccessModifier="True" SortModifiers="True" RemoveRedundantParentheses="False" AddMissingParentheses="True" ArrangeBraces="True" ArrangeAttributes="True" ArrangeArgumentsStyle="False" ArrangeCodeBodyStyle="False" /><CSArrangeQualifiers>True</CSArrangeQualifiers><CSOptimizeUsings><OptimizeUsings>True</OptimizeUsings><EmbraceInRegion>False</EmbraceInRegion><RegionName></RegionName></CSOptimizeUsings><CSReformatCode>True</CSReformatCode><CSFixBuiltinTypeReferences>True</CSFixBuiltinTypeReferences><CSShortenReferences>True</CSShortenReferences><XAMLCollapseEmptyTags>False</XAMLCollapseEmptyTags></Profile> - <?xml version="1.0" encoding="utf-16"?><Profile name="StyleCop"><CSUpdateFileHeader>False</CSUpdateFileHeader><CSArrangeQualifiers>True</CSArrangeQualifiers><CSOptimizeUsings><OptimizeUsings>True</OptimizeUsings><EmbraceInRegion>False</EmbraceInRegion><RegionName></RegionName></CSOptimizeUsings><CSReformatCode>True</CSReformatCode><CSReorderTypeMembers>True</CSReorderTypeMembers></Profile> - Required - Required - Required - Required - None - <?xml version="1.0" encoding="utf-16"?> -<Patterns xmlns="urn:schemas-jetbrains-com:member-reordering-patterns"> - <TypePattern DisplayName="Non-reorderable types"> - <TypePattern.Match> - <Or> - <And> - <Kind Is="Interface" /> - <Or> - <HasAttribute Name="System.Runtime.InteropServices.InterfaceTypeAttribute" /> - <HasAttribute Name="System.Runtime.InteropServices.ComImport" /> - </Or> - </And> - <Kind Is="Struct" /> - <HasAttribute Name="JetBrains.Annotations.NoReorderAttribute" /> - <HasAttribute Name="JetBrains.Annotations.NoReorder" /> - </Or> - </TypePattern.Match> - </TypePattern> - <TypePattern DisplayName="xUnit.net Test Classes" RemoveRegions="All"> - <TypePattern.Match> - <And> - <Kind Is="Class" /> - <HasMember> - <And> - <Kind Is="Method" /> - <HasAttribute Name="Xunit.FactAttribute" Inherited="True" /> - </And> - </HasMember> - </And> - </TypePattern.Match> - <Entry DisplayName="Setup/Teardown Methods"> - <Entry.Match> - <Or> - <Kind Is="Constructor" /> - <And> - <Kind Is="Method" /> - <ImplementsInterface Name="System.IDisposable" /> - </And> - </Or> - </Entry.Match> - <Entry.SortBy> - <Kind Order="Constructor" /> - </Entry.SortBy> - </Entry> - <Entry DisplayName="All other members" /> - <Entry DisplayName="Test Methods" Priority="100"> - <Entry.Match> - <And> - <Kind Is="Method" /> - <HasAttribute Name="Xunit.FactAttribute" /> - </And> - </Entry.Match> - <Entry.SortBy> - <Name /> - </Entry.SortBy> - </Entry> - </TypePattern> - <TypePattern DisplayName="NUnit Test Fixtures" RemoveRegions="All"> - <TypePattern.Match> - <And> - <Kind Is="Class" /> - <HasAttribute Name="NUnit.Framework.TestFixtureAttribute" Inherited="True" /> - </And> - </TypePattern.Match> - <Entry DisplayName="Setup/Teardown Methods"> - <Entry.Match> - <And> - <Kind Is="Method" /> - <Or> - <HasAttribute Name="NUnit.Framework.SetUpAttribute" Inherited="True" /> - <HasAttribute Name="NUnit.Framework.TearDownAttribute" Inherited="True" /> - <HasAttribute Name="NUnit.Framework.FixtureSetUpAttribute" Inherited="True" /> - <HasAttribute Name="NUnit.Framework.FixtureTearDownAttribute" Inherited="True" /> - </Or> - </And> - </Entry.Match> - </Entry> - <Entry DisplayName="All other members" /> - <Entry DisplayName="Test Methods" Priority="100"> - <Entry.Match> - <And> - <Kind Is="Method" /> - <HasAttribute Name="NUnit.Framework.TestAttribute" /> - </And> - </Entry.Match> - <Entry.SortBy> - <Name /> - </Entry.SortBy> - </Entry> - </TypePattern> - <TypePattern DisplayName="Default Pattern (StyleCop)" RemoveRegions="All"> - <Entry DisplayName="Constants"> - <Entry.Match> - <Kind Is="Constant" /> - </Entry.Match> - <Entry.SortBy> - <Access Order="Public Internal ProtectedInternal Protected Private" /> - <Name /> - </Entry.SortBy> - </Entry> - <Entry DisplayName="Static fields"> - <Entry.Match> - <And> - <Kind Is="Field" /> - <Static /> - </And> - </Entry.Match> - <Entry.SortBy> - <Access Order="Public Internal ProtectedInternal Protected Private" /> - <Readonly /> - <Name /> - </Entry.SortBy> - </Entry> - <Entry DisplayName="Fields"> - <Entry.Match> - <Kind Is="Field" /> - </Entry.Match> - <Entry.SortBy> - <Access Order="Public Internal ProtectedInternal Protected Private" /> - <Readonly /> - <Name /> - </Entry.SortBy> - </Entry> - <Entry DisplayName="Constructors and Destructors" Priority="200"> - <Entry.Match> - <Or> - <Kind Is="Constructor" /> - <Kind Is="Destructor" /> - </Or> - </Entry.Match> - <Entry.SortBy> - <Static /> - <Kind Order="Constructor Destructor" /> - <Access Order="Public Internal ProtectedInternal Protected Private" /> - </Entry.SortBy> - </Entry> - <Entry DisplayName="Delegates"> - <Entry.Match> - <Kind Is="Delegate" /> - </Entry.Match> - <Entry.SortBy> - <Access Order="Public Internal ProtectedInternal Protected Private" /> - <Static /> - <Name /> - </Entry.SortBy> - </Entry> - <Entry DisplayName="Public events"> - <Entry.Match> - <And> - <Kind Is="Event" /> - <Access Is="Public" /> - </And> - </Entry.Match> - <Entry.SortBy> - <Access Order="Public" /> - <Static /> - <Name /> - </Entry.SortBy> - </Entry> - <Entry DisplayName="Interface events"> - <Entry.Match> - <And> - <Kind Is="Event" /> - <ImplementsInterface /> - </And> - </Entry.Match> - <Entry.SortBy> - <ImplementsInterface Immediate="True" /> - <Name /> - </Entry.SortBy> - </Entry> - <Entry DisplayName="Other events"> - <Entry.Match> - <Kind Is="Event" /> - </Entry.Match> - <Entry.SortBy> - <Access Order="Public Internal ProtectedInternal Protected Private" /> - <Static /> - <Name /> - </Entry.SortBy> - </Entry> - <Entry DisplayName="Enums"> - <Entry.Match> - <Kind Is="Enum" /> - </Entry.Match> - <Entry.SortBy> - <Access Order="Public Internal ProtectedInternal Protected Private" /> - <Name /> - </Entry.SortBy> - </Entry> - <Entry DisplayName="Interfaces"> - <Entry.Match> - <Kind Is="Interface" /> - </Entry.Match> - <Entry.SortBy> - <Access Order="Public Internal ProtectedInternal Protected Private" /> - <Name /> - </Entry.SortBy> - </Entry> - <Entry DisplayName="Public properties"> - <Entry.Match> - <And> - <Kind Is="Property" /> - <Access Is="Public" /> - </And> - </Entry.Match> - <Entry.SortBy> - <Static /> - <Name /> - </Entry.SortBy> - </Entry> - <Entry DisplayName="Interface properties"> - <Entry.Match> - <And> - <Kind Is="Property" /> - <ImplementsInterface /> - </And> - </Entry.Match> - <Entry.SortBy> - <ImplementsInterface Immediate="True" /> - <Name /> - </Entry.SortBy> - </Entry> - <Entry DisplayName="Other properties"> - <Entry.Match> - <Kind Is="Property" /> - </Entry.Match> - <Entry.SortBy> - <Access Order="Public Internal ProtectedInternal Protected Private" /> - <Static /> - <Name /> - </Entry.SortBy> - </Entry> - <Entry DisplayName="Public indexers" Priority="1000"> - <Entry.Match> - <And> - <Kind Is="Indexer" /> - <Access Is="Public" /> - </And> - </Entry.Match> - <Entry.SortBy> - <Static /> - <Name /> - </Entry.SortBy> - </Entry> - <Entry DisplayName="Interface indexers" Priority="1000"> - <Entry.Match> - <And> - <Kind Is="Indexer" /> - <ImplementsInterface /> - </And> - </Entry.Match> - <Entry.SortBy> - <ImplementsInterface Immediate="True" /> - <Name /> - </Entry.SortBy> - </Entry> - <Entry DisplayName="Other indexers" Priority="1000"> - <Entry.Match> - <Kind Is="Indexer" /> - </Entry.Match> - <Entry.SortBy> - <Access Order="Public Internal ProtectedInternal Protected Private" /> - <Static /> - <Name /> - </Entry.SortBy> - </Entry> - <Entry DisplayName="Public methods and operators"> - <Entry.Match> - <And> - <Or> - <Kind Is="Method" /> - <Kind Is="Operator" /> - </Or> - <Access Is="Public" /> - </And> - </Entry.Match> - <Entry.SortBy> - <Static /> - <Name /> - </Entry.SortBy> - </Entry> - <Entry DisplayName="Interface methods"> - <Entry.Match> - <And> - <Kind Is="Method" /> - <ImplementsInterface /> - </And> - </Entry.Match> - <Entry.SortBy> - <ImplementsInterface Immediate="True" /> - <Name /> - </Entry.SortBy> - </Entry> - <Entry DisplayName="Other methods"> - <Entry.Match> - <Kind Is="Method" /> - </Entry.Match> - <Entry.SortBy> - <Access Order="Public Internal ProtectedInternal Protected Private" /> - <Static /> - <Name /> - </Entry.SortBy> - </Entry> - <Entry DisplayName="Operators"> - <Entry.Match> - <Kind Is="Operator" /> - </Entry.Match> - <Entry.SortBy> - <Access Order="Public Internal ProtectedInternal Protected Private" /> - <Static /> - <Name /> - </Entry.SortBy> - </Entry> - <Entry DisplayName="Nested structs" Priority="600"> - <Entry.Match> - <Kind Is="Struct" /> - </Entry.Match> - <Entry.SortBy> - <Static /> - <Access Order="Public Internal ProtectedInternal Protected Private" /> - <Name /> - </Entry.SortBy> - </Entry> - <Entry DisplayName="Nested classes" Priority="700"> - <Entry.Match> - <Kind Is="Class" /> - </Entry.Match> - <Entry.SortBy> - <Static /> - <Access Order="Public Internal ProtectedInternal Protected Private" /> - <Name /> - </Entry.SortBy> - </Entry> - <Entry DisplayName="All other members" /> - </TypePattern> -</Patterns> - System - System.Linq - MB - <Policy Inspect="True" Prefix="" Suffix="" Style="AaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - <Policy Inspect="True" Prefix="" Suffix="" Style="aaBb" /> - True - True \ No newline at end of file From cff72f167aa38aecdd6804732406fb8043023bd3 Mon Sep 17 00:00:00 2001 From: Rok Rejc Date: Mon, 8 Jun 2026 15:30:52 +0200 Subject: [PATCH 08/16] Updated .gitignore file --- src/.gitignore | 80 ++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 62 insertions(+), 18 deletions(-) diff --git a/src/.gitignore b/src/.gitignore index 26ab8f4..80fa0fa 100644 --- a/src/.gitignore +++ b/src/.gitignore @@ -1,7 +1,7 @@ ## Ignore Visual Studio temporary files, build results, and ## files generated by popular Visual Studio add-ons. ## -## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore +## Get latest from https://github.com/github/gitignore/blob/main/VisualStudio.gitignore # User-specific files *.rsuser @@ -9,6 +9,7 @@ *.user *.userosscache *.sln.docstates +*.env # User-specific files (MonoDevelop/Xamarin Studio) *.userprefs @@ -21,17 +22,37 @@ mono_crash.* [Dd]ebugPublic/ [Rr]elease/ [Rr]eleases/ -x64/ -x86/ + +[Dd]ebug/x64/ +[Dd]ebugPublic/x64/ +[Rr]elease/x64/ +[Rr]eleases/x64/ +bin/x64/ +obj/x64/ + +[Dd]ebug/x86/ +[Dd]ebugPublic/x86/ +[Rr]elease/x86/ +[Rr]eleases/x86/ +bin/x86/ +obj/x86/ + [Ww][Ii][Nn]32/ [Aa][Rr][Mm]/ [Aa][Rr][Mm]64/ +[Aa][Rr][Mm]64[Ee][Cc]/ bld/ -[Bb]in/ [Oo]bj/ +[Oo]ut/ [Ll]og/ [Ll]ogs/ +# Build results on 'Bin' directories +**/[Bb]in/* +# Uncomment if you have tasks that rely on *.refresh files to move binaries +# (https://github.com/github/gitignore/pull/3736) +#!**/[Bb]in/*.refresh + # Visual Studio 2015/2017 cache/options directory .vs/ # Uncomment if you have tasks that create the project's static files in wwwroot @@ -43,12 +64,16 @@ Generated\ Files/ # MSTest test Results [Tt]est[Rr]esult*/ [Bb]uild[Ll]og.* +*.trx # NUnit *.VisualState.xml TestResult.xml nunit-*.xml +# Approval Tests result files +*.received.* + # Build Results of an ATL Project [Dd]ebugPS/ [Rr]eleasePS/ @@ -61,6 +86,7 @@ BenchmarkDotNet.Artifacts/ project.lock.json project.fragment.lock.json artifacts/ +.artifacts/ # ASP.NET Scaffolding ScaffoldingReadMe.txt @@ -75,6 +101,7 @@ StyleCopReport.xml *.ilk *.meta *.obj +*.idb *.iobj *.pch *.pdb @@ -82,6 +109,8 @@ StyleCopReport.xml *.pgc *.pgd *.rsp +# but not Directory.Build.rsp, as it configures directory-level build defaults +!Directory.Build.rsp *.sbr *.tlb *.tli @@ -153,6 +182,7 @@ coverage*.info # NCrunch _NCrunch_* +.NCrunch_* .*crunch*.local.xml nCrunchTemp_* @@ -206,9 +236,6 @@ PublishScripts/ *.nuget.props *.nuget.targets -# Nuget personal access tokens and Credentials -# nuget.config - # Microsoft Azure Build Output csx/ *.build.csdef @@ -297,6 +324,14 @@ node_modules/ # Visual Studio 6 auto-generated workspace file (contains which files were open etc.) *.vbw +# Visual Studio 6 workspace and project file (working project files containing files to include in project) +*.dsw +*.dsp + +# Visual Studio 6 technical files +*.ncb +*.aps + # Visual Studio LightSwitch build output **/*.HTMLClient/GeneratedArtifacts **/*.DesktopClient/GeneratedArtifacts @@ -306,22 +341,22 @@ node_modules/ _Pvt_Extensions # Paket dependency manager -.paket/paket.exe +**/.paket/paket.exe paket-files/ # FAKE - F# Make -.fake/ +**/.fake/ # CodeRush personal settings -.cr/personal +**/.cr/personal # Python Tools for Visual Studio (PTVS) -__pycache__/ +**/__pycache__/ *.pyc # Cake - Uncomment if you are using it -# tools/** -# !tools/packages.config +#tools/** +#!tools/packages.config # Tabs Studio *.tss @@ -343,15 +378,22 @@ ASALocalRun/ # MSBuild Binary and Structured Log *.binlog +MSBuild_Logs/ + +# AWS SAM Build and Temporary Artifacts folder +.aws-sam # NVidia Nsight GPU debugger configuration file *.nvuser # MFractors (Xamarin productivity tool) working folder -.mfractor/ +**/.mfractor/ # Local History for Visual Studio -.localhistory/ +**/.localhistory/ + +# Visual Studio History (VSHistory) files +.vshistory/ # BeatPulse healthcheck temp database healthchecksdb @@ -360,7 +402,7 @@ healthchecksdb MigrationBackup/ # Ionide (cross platform F# VS Code tools) working folder -.ionide/ +**/.ionide/ # Fody - auto-generated XML schema FodyWeavers.xsd @@ -371,11 +413,14 @@ FodyWeavers.xsd !.vscode/tasks.json !.vscode/launch.json !.vscode/extensions.json -*.code-workspace +!.vscode/*.code-snippets # Local History for Visual Studio Code .history/ +# Built Visual Studio Code Extensions +*.vsix + # Windows Installer files from build outputs *.cab *.msi @@ -385,4 +430,3 @@ FodyWeavers.xsd # JetBrains Rider .idea/ -*.sln.iml From 18fd3950c99e69d91ddac46c70787cd3c32be317 Mon Sep 17 00:00:00 2001 From: Rok Rejc Date: Sat, 20 Jun 2026 06:33:16 +0200 Subject: [PATCH 09/16] Enable wildcard search in terms list --- .../Extensions/StringExtensions.cs | 9 +++++ .../Extensions/ElasticQueryExtensions.cs | 34 +++++++++++++++++ .../QueryBuilders/TermListQueryBuilder.cs | 14 +------ .../CompositionRoot/ServicesModule.cs | 38 ++++++++++++++++++- .../InputQueryParser/InputQueryParser.cs | 7 ++++ .../LemmatizationService/LemmatizationType.cs | 7 ++++ ...rvice.cs => SimpleLemmatizationService.cs} | 7 ++-- 7 files changed, 99 insertions(+), 17 deletions(-) create mode 100644 src/core/Rsdo.Concordancer.Core/Extensions/StringExtensions.cs create mode 100644 src/core/Rsdo.Concordancer.Services/Services/LemmatizationService/LemmatizationType.cs rename src/core/Rsdo.Concordancer.Services/Services/LemmatizationService/{LemmatizationService.cs => SimpleLemmatizationService.cs} (71%) diff --git a/src/core/Rsdo.Concordancer.Core/Extensions/StringExtensions.cs b/src/core/Rsdo.Concordancer.Core/Extensions/StringExtensions.cs new file mode 100644 index 0000000..62b92f9 --- /dev/null +++ b/src/core/Rsdo.Concordancer.Core/Extensions/StringExtensions.cs @@ -0,0 +1,9 @@ +namespace Rsdo.Concordancer.Core.Extensions; + +public static class StringExtensions +{ + public static bool IsWildcardSearch(this string value) + { + return !string.IsNullOrEmpty(value) && (value.Contains('*') || value.Contains('?')); + } +} \ No newline at end of file diff --git a/src/core/Rsdo.Concordancer.Infrastructure/Extensions/ElasticQueryExtensions.cs b/src/core/Rsdo.Concordancer.Infrastructure/Extensions/ElasticQueryExtensions.cs index 674afd1..239a183 100644 --- a/src/core/Rsdo.Concordancer.Infrastructure/Extensions/ElasticQueryExtensions.cs +++ b/src/core/Rsdo.Concordancer.Infrastructure/Extensions/ElasticQueryExtensions.cs @@ -1,5 +1,7 @@ using System.Collections.Generic; +using System.Linq; using OpenSearch.Client; +using Rsdo.Concordancer.Core.Extensions; namespace Rsdo.Concordancer.Infrastructure.Extensions; @@ -30,4 +32,36 @@ public static class ElasticQueryExtensions }, }; } + + public static QueryContainer ToQuery(this string value, string field) + { + if (value.IsWildcardSearch()) + { + return new WildcardQuery() + { + Field = field, + Value = value, + }; + } + + return new TermQuery() + { + Field = field, + Value = value, + }; + } + + public static QueryContainer ToQuery(this List values, string field) + { + if (values.Any(v => v.IsWildcardSearch())) + { + return values.Select(value => value.ToQuery(field)).ToList().ToBooleanOrQuery(); + } + + return new TermsQuery() + { + Field = field, + Terms = values, + }; + } } \ No newline at end of file diff --git a/src/core/Rsdo.Concordancer.Infrastructure/Search/QueryBuilders/TermListQueryBuilder.cs b/src/core/Rsdo.Concordancer.Infrastructure/Search/QueryBuilders/TermListQueryBuilder.cs index 806cbda..36886e9 100644 --- a/src/core/Rsdo.Concordancer.Infrastructure/Search/QueryBuilders/TermListQueryBuilder.cs +++ b/src/core/Rsdo.Concordancer.Infrastructure/Search/QueryBuilders/TermListQueryBuilder.cs @@ -35,22 +35,12 @@ public class TermListQueryBuilder : IQueryBuilder if (!string.IsNullOrEmpty(wordQuery.Form)) { - queries.Add( - new TermQuery() - { - Field = $"{tokenField}.formLower", - Value = wordQuery.Form.ToLower(), - }); + queries.Add(wordQuery.Form.ToLower().ToQuery($"{tokenField}.formLower")); } if (!wordQuery.Lemmas.IsNullOrEmpty()) { - queries.Add( - new TermsQuery() - { - Field = $"{tokenField}.lemma", - Terms = wordQuery.Lemmas, - }); + queries.Add(wordQuery.Lemmas.ToQuery($"{tokenField}.lemma")); } return queries.Count == 0 ? new MatchNoneQuery() : queries.ToBooleanAndQuery(); diff --git a/src/core/Rsdo.Concordancer.Services/CompositionRoot/ServicesModule.cs b/src/core/Rsdo.Concordancer.Services/CompositionRoot/ServicesModule.cs index c371d2f..66b0061 100644 --- a/src/core/Rsdo.Concordancer.Services/CompositionRoot/ServicesModule.cs +++ b/src/core/Rsdo.Concordancer.Services/CompositionRoot/ServicesModule.cs @@ -1,10 +1,14 @@ using System; using System.Reflection; using Autofac; +using Autofac.Core; using FluentValidation; using Microsoft.Extensions.Caching.Memory; using Rsdo.Concordancer.Core.Interfaces; +using Rsdo.Concordancer.Core.Search.Queries.Concordances; +using Rsdo.Concordancer.Core.Search.Queries.TermLists; using Rsdo.Concordancer.ServiceModel.Requests.Concordances; +using Rsdo.Concordancer.ServiceModel.Requests.TermLists; using Rsdo.Concordancer.ServiceModel.Types; using Rsdo.Concordancer.Services.Framework; using Rsdo.Concordancer.Services.Framework.BulkLoaders; @@ -15,6 +19,8 @@ using Rsdo.Concordancer.Services.Framework.Decorators; using Rsdo.Concordancer.Services.Search.Aggregations; using Rsdo.Concordancer.Services.Search.AlternateSearches; using Rsdo.Concordancer.Services.Search.QueryFactories; +using Rsdo.Concordancer.Services.Search.QueryFactories.Concordances; +using Rsdo.Concordancer.Services.Search.QueryFactories.TermLists; using Rsdo.Concordancer.Services.Services.InputQueryParser; using Rsdo.Concordancer.Services.Services.LemmatizationService; using Rsdo.Concordancer.Services.Services.ParagraphService; @@ -83,7 +89,8 @@ public class ServicesModule : Module builder.RegisterType().Keyed(TokenizerType.Default).SingleInstance(); builder.RegisterType().As().SingleInstance(); builder.RegisterType().As().InstancePerLifetimeScope(); - builder.RegisterType().As().InstancePerLifetimeScope(); + builder.RegisterType().Keyed(LemmatizationType.Simple).InstancePerLifetimeScope(); + builder.RegisterType().Keyed(LemmatizationType.Wildcard).InstancePerLifetimeScope(); builder.RegisterType().As().InstancePerLifetimeScope(); } @@ -103,7 +110,33 @@ public class ServicesModule : Module private void RegisterSearch(ContainerBuilder builder) { // Query factories - builder.RegisterAssemblyTypes(ServicesAssembly).AsClosedTypesOf(typeof(IQueryFactory<,>)).AsImplementedInterfaces().InstancePerLifetimeScope(); + var wildcardLemmatizationServiceParameter = new ResolvedParameter( + (p, ctx) => p.ParameterType == typeof(ILemmatizationService), + (p, ctx) => ctx.ResolveKeyed(LemmatizationType.Wildcard)); + var simpleLemmatizationServiceParameter = new ResolvedParameter( + (p, ctx) => p.ParameterType == typeof(ILemmatizationService), + (p, ctx) => ctx.ResolveKeyed(LemmatizationType.Simple)); + + builder.RegisterType() + .As>() + .WithParameter(simpleLemmatizationServiceParameter) + .InstancePerLifetimeScope(); + builder.RegisterType() + .As>() + .WithParameter(simpleLemmatizationServiceParameter) + .InstancePerLifetimeScope(); + builder.RegisterType() + .As>() + .WithParameter(simpleLemmatizationServiceParameter) + .InstancePerLifetimeScope(); + builder.RegisterType() + .As>() + .WithParameter(wildcardLemmatizationServiceParameter) + .InstancePerLifetimeScope(); + builder.RegisterType() + .As>() + .WithParameter(wildcardLemmatizationServiceParameter) + .InstancePerLifetimeScope(); // Aggregations builder.RegisterType().As().InstancePerLifetimeScope(); @@ -112,6 +145,7 @@ public class ServicesModule : Module // Alternate searches builder.RegisterType() .As>() + .WithParameter(simpleLemmatizationServiceParameter) .InstancePerLifetimeScope(); } } \ No newline at end of file diff --git a/src/core/Rsdo.Concordancer.Services/Services/InputQueryParser/InputQueryParser.cs b/src/core/Rsdo.Concordancer.Services/Services/InputQueryParser/InputQueryParser.cs index 213ea9a..7c78f0c 100644 --- a/src/core/Rsdo.Concordancer.Services/Services/InputQueryParser/InputQueryParser.cs +++ b/src/core/Rsdo.Concordancer.Services/Services/InputQueryParser/InputQueryParser.cs @@ -4,6 +4,7 @@ using System.Linq; using System.Text; using System.Threading.Tasks; using Autofac.Features.Indexed; +using Rsdo.Concordancer.Core.Extensions; using Rsdo.Concordancer.ServiceModel.Requests.Concordances; using Rsdo.Concordancer.ServiceModel.Types; using Rsdo.Concordancer.Services.Services.TokenizerService; @@ -21,6 +22,12 @@ public class InputQueryParser : IInputQueryParser public async Task> Tokenize(string query) { + if (query.IsWildcardSearch()) + { + // Classla tokenizer doesn't support wildcards, so use default tokenizer + return await tokenizers[TokenizerType.Default].Tokenize(query); + } + try { return await tokenizers[TokenizerType.Classla].Tokenize(query); diff --git a/src/core/Rsdo.Concordancer.Services/Services/LemmatizationService/LemmatizationType.cs b/src/core/Rsdo.Concordancer.Services/Services/LemmatizationService/LemmatizationType.cs new file mode 100644 index 0000000..82e0a0b --- /dev/null +++ b/src/core/Rsdo.Concordancer.Services/Services/LemmatizationService/LemmatizationType.cs @@ -0,0 +1,7 @@ +namespace Rsdo.Concordancer.Services.Services.LemmatizationService; + +public enum LemmatizationType +{ + Simple, + Wildcard, +} \ No newline at end of file diff --git a/src/core/Rsdo.Concordancer.Services/Services/LemmatizationService/LemmatizationService.cs b/src/core/Rsdo.Concordancer.Services/Services/LemmatizationService/SimpleLemmatizationService.cs similarity index 71% rename from src/core/Rsdo.Concordancer.Services/Services/LemmatizationService/LemmatizationService.cs rename to src/core/Rsdo.Concordancer.Services/Services/LemmatizationService/SimpleLemmatizationService.cs index db25879..40cf37a 100644 --- a/src/core/Rsdo.Concordancer.Services/Services/LemmatizationService/LemmatizationService.cs +++ b/src/core/Rsdo.Concordancer.Services/Services/LemmatizationService/SimpleLemmatizationService.cs @@ -7,17 +7,18 @@ using Rsdo.Concordancer.Services.Framework.DbContext; namespace Rsdo.Concordancer.Services.Services.LemmatizationService; -public class LemmatizationService : ILemmatizationService +public class SimpleLemmatizationService : ILemmatizationService { private readonly MasterDbContext dbContext; - public LemmatizationService(MasterDbContext dbContext) + public SimpleLemmatizationService(MasterDbContext dbContext) { this.dbContext = dbContext; } - public async Task> GetLemmas(string form) + public virtual async Task> GetLemmas(string form) { + // Retrieving lemmas without support for wildcard search var lemmas = await dbContext.LemmaFormPair.Where(f => f.Form.ToLower() == form.ToLower()).Select(f => f.Lemma).Distinct().ToListAsync(); if (lemmas.IsNullOrEmpty()) { From 3776aa3f4ef693c5554008e68fcd0daa93e02b43 Mon Sep 17 00:00:00 2001 From: Rok Rejc Date: Sat, 20 Jun 2026 06:33:42 +0200 Subject: [PATCH 10/16] Enable wildcard search in terms list (missing file). --- .../WildcardLemmatizationService.cs | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) create mode 100644 src/core/Rsdo.Concordancer.Services/Services/LemmatizationService/WildcardLemmatizationService.cs diff --git a/src/core/Rsdo.Concordancer.Services/Services/LemmatizationService/WildcardLemmatizationService.cs b/src/core/Rsdo.Concordancer.Services/Services/LemmatizationService/WildcardLemmatizationService.cs new file mode 100644 index 0000000..85fa43c --- /dev/null +++ b/src/core/Rsdo.Concordancer.Services/Services/LemmatizationService/WildcardLemmatizationService.cs @@ -0,0 +1,38 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Microsoft.EntityFrameworkCore; +using Rsdo.Concordancer.Core.Extensions; +using Rsdo.Concordancer.Services.Framework.DbContext; + +namespace Rsdo.Concordancer.Services.Services.LemmatizationService; + +public class WildcardLemmatizationService : SimpleLemmatizationService +{ + private readonly MasterDbContext dbContext; + + public WildcardLemmatizationService(MasterDbContext dbContext) + : base(dbContext) + { + this.dbContext = dbContext; + } + + public override async Task> GetLemmas(string form) + { + if (!form.IsWildcardSearch()) + { + return await base.GetLemmas(form); + } + + var lemmas = await dbContext.LemmaFormPair.Where(f => EF.Functions.Like(f.Form.ToLower(), form.Replace("*", "%").Replace("?", "_").ToLower())) + .Select(f => f.Lemma) + .Distinct() + .ToListAsync(); + if (lemmas.IsNullOrEmpty()) + { + lemmas.Add(form); + } + + return lemmas; + } +} \ No newline at end of file From 6d554f190dcbb15b07254dca9ef37960a069146d Mon Sep 17 00:00:00 2001 From: Rok Rejc Date: Sat, 20 Jun 2026 07:03:21 +0200 Subject: [PATCH 11/16] Fix help display in concordance and list results. --- .../WebApp/src/pages/concordance/ConcordanceResults.js | 2 +- .../WebApp/src/pages/list/ListResults.js | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/apps/Rsdo.Concordancer.Api/WebApp/src/pages/concordance/ConcordanceResults.js b/src/apps/Rsdo.Concordancer.Api/WebApp/src/pages/concordance/ConcordanceResults.js index 33472c6..7eb8480 100644 --- a/src/apps/Rsdo.Concordancer.Api/WebApp/src/pages/concordance/ConcordanceResults.js +++ b/src/apps/Rsdo.Concordancer.Api/WebApp/src/pages/concordance/ConcordanceResults.js @@ -73,7 +73,7 @@ const ConcordanceResults = () => { content =

{t('shared.noResults')}

} return ( - + }>
{content} diff --git a/src/apps/Rsdo.Concordancer.Api/WebApp/src/pages/list/ListResults.js b/src/apps/Rsdo.Concordancer.Api/WebApp/src/pages/list/ListResults.js index af5983d..bc04a96 100644 --- a/src/apps/Rsdo.Concordancer.Api/WebApp/src/pages/list/ListResults.js +++ b/src/apps/Rsdo.Concordancer.Api/WebApp/src/pages/list/ListResults.js @@ -11,6 +11,7 @@ import ResultsHeader from '../../components/results/ResultsHeader'; import ResultsPager from '../../components/results/ResultsPager'; import ResultsExport from '../../components/results/ResultsExport'; import ListItems from '../../components/list/ListItems'; +import ListHelp from '../../components/list/ListHelp'; import Spinner from '../../components/shared/Spinner'; const ListResults = () => { @@ -48,7 +49,7 @@ const ListResults = () => { if (!isLoading && isSuccess && data.items.length > 0) { return ( - + }>
setIsVisible(prevIsVisible => !prevIsVisible)} /> @@ -69,7 +70,7 @@ const ListResults = () => { content =

{t('shared.noResults')}

} return ( - + }>
{content} From 5215ca95fb6d69297d053463f92a8547b10e36af Mon Sep 17 00:00:00 2001 From: Rok Rejc Date: Mon, 22 Jun 2026 11:19:39 +0200 Subject: [PATCH 12/16] Change icon used in aggregations. --- .../WebApp/src/assets/chevron-right.svg | 3 +++ .../WebApp/src/assets/square-checkbox-solid.svg | 4 ++++ .../concordance/ConcordanceAggregationItem.js | 16 ++++++++++++++-- .../ConcordanceAggregationItem.module.scss | 9 +++------ .../Rsdo.Concordancer.Api/WebApp/src/i18n.js | 10 +++++++--- 5 files changed, 31 insertions(+), 11 deletions(-) create mode 100644 src/apps/Rsdo.Concordancer.Api/WebApp/src/assets/chevron-right.svg create mode 100644 src/apps/Rsdo.Concordancer.Api/WebApp/src/assets/square-checkbox-solid.svg diff --git a/src/apps/Rsdo.Concordancer.Api/WebApp/src/assets/chevron-right.svg b/src/apps/Rsdo.Concordancer.Api/WebApp/src/assets/chevron-right.svg new file mode 100644 index 0000000..424b5d0 --- /dev/null +++ b/src/apps/Rsdo.Concordancer.Api/WebApp/src/assets/chevron-right.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/apps/Rsdo.Concordancer.Api/WebApp/src/assets/square-checkbox-solid.svg b/src/apps/Rsdo.Concordancer.Api/WebApp/src/assets/square-checkbox-solid.svg new file mode 100644 index 0000000..4502e84 --- /dev/null +++ b/src/apps/Rsdo.Concordancer.Api/WebApp/src/assets/square-checkbox-solid.svg @@ -0,0 +1,4 @@ + + + + diff --git a/src/apps/Rsdo.Concordancer.Api/WebApp/src/components/concordance/ConcordanceAggregationItem.js b/src/apps/Rsdo.Concordancer.Api/WebApp/src/components/concordance/ConcordanceAggregationItem.js index e0fc648..0bf5ece 100644 --- a/src/apps/Rsdo.Concordancer.Api/WebApp/src/components/concordance/ConcordanceAggregationItem.js +++ b/src/apps/Rsdo.Concordancer.Api/WebApp/src/components/concordance/ConcordanceAggregationItem.js @@ -1,15 +1,27 @@ import { Link } from 'react-router-dom'; import useSearch from '../../hooks/use-search'; import styles from './ConcordanceAggregationItem.module.scss'; +import { useTranslation } from 'react-i18next'; + +import selectIcon from '../../assets/chevron-right.svg'; +import selectedIcon from '../../assets/square-checkbox-solid.svg'; const ConcordanceAggregationItem = (props) => { + const { t } = useTranslation(); const search = useSearch(); const isSelected = search.isFiltered('TextIds', props.filterKey) === true; const link = isSelected ? search.getClearFilterLink('TextIds', props.filterKey) : search.getFilterLink('TextIds', props.filterKey); + let icon; + if (isSelected) { + icon = {t('shared.unselect')}; + } else { + icon = {t('shared.select')}; + } + return ( -
  • {isSelected && X}{props.title}{props.count}
  • +
  • {icon}{props.title}{props.count}
  • ); }; -export default ConcordanceAggregationItem; \ No newline at end of file +export default ConcordanceAggregationItem; diff --git a/src/apps/Rsdo.Concordancer.Api/WebApp/src/components/concordance/ConcordanceAggregationItem.module.scss b/src/apps/Rsdo.Concordancer.Api/WebApp/src/components/concordance/ConcordanceAggregationItem.module.scss index f61b0ac..3c2caa4 100644 --- a/src/apps/Rsdo.Concordancer.Api/WebApp/src/components/concordance/ConcordanceAggregationItem.module.scss +++ b/src/apps/Rsdo.Concordancer.Api/WebApp/src/components/concordance/ConcordanceAggregationItem.module.scss @@ -9,16 +9,13 @@ color: $text-color; display: flex; text-decoration: none; - - .remove { - margin-right: 0.8rem; - } - + .title { + margin-left: 1.2rem; flex-grow: 1; margin-right: 0.8rem; overflow: hidden; text-overflow: clip; } } -} \ No newline at end of file +} diff --git a/src/apps/Rsdo.Concordancer.Api/WebApp/src/i18n.js b/src/apps/Rsdo.Concordancer.Api/WebApp/src/i18n.js index 722fd3a..cbc2a2d 100644 --- a/src/apps/Rsdo.Concordancer.Api/WebApp/src/i18n.js +++ b/src/apps/Rsdo.Concordancer.Api/WebApp/src/i18n.js @@ -22,7 +22,9 @@ const resources = { 'searchError': 'Server returned error when searching.', 'searchHelp': 'Help', 'searchHistory': 'Search history', - 'searchRecords': 'Showing {{start}}-{{end}} from {{total}} records.' + 'searchRecords': 'Showing {{start}}-{{end}} from {{total}} records.', + 'select': 'Select', + 'unselect': 'Remove selected' }, concordance: { 'title': 'Search concordances', @@ -63,7 +65,9 @@ const resources = { 'searchError': 'Strežnik je vrnil napako pri iskanju.', 'searchHelp': 'Pomoč', 'searchHistory': 'Zgodovina iskanj', - 'searchRecords': 'Prikazujem {{start}}-{{end}} od {{total}} zapisov.' + 'searchRecords': 'Prikazujem {{start}}-{{end}} od {{total}} zapisov.', + 'select': 'Izberi', + 'unselect': 'Odstrani izbrano' }, concordance: { 'title': 'Iskanje po konkordancah', @@ -96,4 +100,4 @@ i18n } }); -export default i18n; \ No newline at end of file +export default i18n; From 4996fa7baaac141dfae3892273cf5d844ccea0cf Mon Sep 17 00:00:00 2001 From: Rok Rejc Date: Mon, 22 Jun 2026 11:27:38 +0200 Subject: [PATCH 13/16] Change logo link to slovenscina.eu --- .../WebApp/src/components/index/IndexMenu.js | 4 ++-- .../Rsdo.Concordancer.Api/WebApp/src/layout/ResultsLayout.js | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/apps/Rsdo.Concordancer.Api/WebApp/src/components/index/IndexMenu.js b/src/apps/Rsdo.Concordancer.Api/WebApp/src/components/index/IndexMenu.js index c1d1321..220ebb6 100644 --- a/src/apps/Rsdo.Concordancer.Api/WebApp/src/components/index/IndexMenu.js +++ b/src/apps/Rsdo.Concordancer.Api/WebApp/src/components/index/IndexMenu.js @@ -18,7 +18,7 @@ const IndexTopBar = () => {
    -
    Logo
    +
    Logo
    @@ -26,4 +26,4 @@ const IndexTopBar = () => { ); }; -export default IndexTopBar; \ No newline at end of file +export default IndexTopBar; diff --git a/src/apps/Rsdo.Concordancer.Api/WebApp/src/layout/ResultsLayout.js b/src/apps/Rsdo.Concordancer.Api/WebApp/src/layout/ResultsLayout.js index bfba73b..c828129 100644 --- a/src/apps/Rsdo.Concordancer.Api/WebApp/src/layout/ResultsLayout.js +++ b/src/apps/Rsdo.Concordancer.Api/WebApp/src/layout/ResultsLayout.js @@ -49,7 +49,7 @@ const ResultsLayout = (props) => {
    - Logo + Logo
    • Concordance
    • List
    • From cc226d6ce6b53200f18ec223beac9aec3c6da9db Mon Sep 17 00:00:00 2001 From: Rok Rejc Date: Thu, 3 Sep 2026 16:11:13 +0200 Subject: [PATCH 14/16] Update readme --- README.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 8999244..eaad68d 100644 --- a/README.md +++ b/README.md @@ -2,8 +2,8 @@ This repository contains the source code of the concordancer which is a part of the [Terminology Portal](https://github.com/clarinsi/rsdo_term_portal). There are two main parts: -- Web application with backend (API interface) written in ASP.NET Core 6 and frontend written in React -- System Manager which is written in .NET 6 and is used to initially set up the system +- Web application with backend (API interface) written in ASP.NET Core 10 and frontend written in React +- System Manager which is written in .NET 10 and is used to initially set up the system ## Prerequisites Web application requires following external dependencies @@ -16,7 +16,7 @@ To build a frontend application successfully, first, [Node.js](https://nodejs.or Use `npm install` to install all required dependencies, and `npm run build` to build the application. For more info see the [Readme](src/apps/Rsdo.Concordancer.Api/WebApp/README.md) inside the frontend [root](src/apps/Rsdo.Concordancer.Api/WebApp) folder. -### Backend (ASP.NET Core 6) and System Manager (.NET 6) +### Backend (ASP.NET Core 10) and System Manager (.NET 10) Open [Rsdo.Concordancer.sln](src/Rsdo.Concordancer.sln) inside of your IDE and build the solution, or use `dotnet build` command to build the solution. All required dependencies will be installed via NuGet packages. ## Creating docker images @@ -38,13 +38,13 @@ Use following [Dockerfile](src/apps/Rsdo.Concordancer.SystemManager/Dockerfile) ### Web application Web application must be configured with the following Environment variables and values: -- `RSDO:Database:MasterConnectionString` holds connection string to the main database; e.g.: `rsdo_db;Username=rsdo;Password=strongpassword;Database=Concordancer` +- `RSDO:Database:MasterConnectionString` holds connection string to the main database; e.g.: `Host=rsdo_db;Username=rsdo;Password=strongpassword;Database=Concordancer` - `RSDO:Elastic:ConnectionString` holds connection string to OpenSearch server; e.g.: `http://rsdo_opensearch:9200` - `RSDO:Tokenizer:ClasslaUrl` holds and url to external service which is used for tokenizing search strings; e.g.: `https://orodja.cjvt.si/oznacevalnik/ajax_api/v1/slv/process` ### System Manager System manager must be configured with the following Environment variables and values: -- `RSDO:Database:MasterConnectionString` holds connection string to the main database; e.g.: `rsdo_db;Username=rsdo;Password=strongpassword;Database=Concordancer` +- `RSDO:Database:MasterConnectionString` holds connection string to the main database; e.g.: `Host=rsdo_db;Username=rsdo;Password=strongpassword;Database=Concordancer` - `RSDO:Elastic:ConnectionString` holds connection string to OpenSearch server; e.g.: `http://rsdo_opensearch:9200` ## Using System Manager From 1d85f4ccf8b1bbfe6eaf9948e697e8e5445d8436 Mon Sep 17 00:00:00 2001 From: Rok Rejc Date: Thu, 3 Sep 2026 16:15:38 +0200 Subject: [PATCH 15/16] Upgrade docker images to .net 10 --- src/apps/Rsdo.Concordancer.Api/Dockerfile | 4 ++-- src/apps/Rsdo.Concordancer.SystemManager/Dockerfile | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/apps/Rsdo.Concordancer.Api/Dockerfile b/src/apps/Rsdo.Concordancer.Api/Dockerfile index 1f001c9..71e27af 100644 --- a/src/apps/Rsdo.Concordancer.Api/Dockerfile +++ b/src/apps/Rsdo.Concordancer.Api/Dockerfile @@ -1,8 +1,8 @@ -FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base +FROM mcr.microsoft.com/dotnet/aspnet:10.0 AS base WORKDIR /app EXPOSE 80 -FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build # INSTALL NODE.JS RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - \ diff --git a/src/apps/Rsdo.Concordancer.SystemManager/Dockerfile b/src/apps/Rsdo.Concordancer.SystemManager/Dockerfile index 7fa205d..b78d326 100644 --- a/src/apps/Rsdo.Concordancer.SystemManager/Dockerfile +++ b/src/apps/Rsdo.Concordancer.SystemManager/Dockerfile @@ -1,7 +1,7 @@ -FROM mcr.microsoft.com/dotnet/sdk:6.0 AS base +FROM mcr.microsoft.com/dotnet/sdk:10.0 AS base WORKDIR /app -FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build +FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build # RESTORE PACKAGES (with project files only) WORKDIR /src/apps From 551b8469e4f363d213f6d32f1ff776cdd3bd354d Mon Sep 17 00:00:00 2001 From: Rok Rejc Date: Thu, 3 Sep 2026 16:25:37 +0200 Subject: [PATCH 16/16] Add shared MSBuild configuration to Dockerfiles --- src/apps/Rsdo.Concordancer.Api/Dockerfile | 4 ++++ src/apps/Rsdo.Concordancer.SystemManager/Dockerfile | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/src/apps/Rsdo.Concordancer.Api/Dockerfile b/src/apps/Rsdo.Concordancer.Api/Dockerfile index 71e27af..118f711 100644 --- a/src/apps/Rsdo.Concordancer.Api/Dockerfile +++ b/src/apps/Rsdo.Concordancer.Api/Dockerfile @@ -4,6 +4,10 @@ EXPOSE 80 FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build +# COPY SHARED MSBUILD CONFIGURATION +COPY src/Directory.Build.props /src/Directory.Build.props +COPY src/Directory.Packages.props /src/Directory.Packages.props + # INSTALL NODE.JS RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash - \ && apt-get install -y \ diff --git a/src/apps/Rsdo.Concordancer.SystemManager/Dockerfile b/src/apps/Rsdo.Concordancer.SystemManager/Dockerfile index b78d326..33bafc3 100644 --- a/src/apps/Rsdo.Concordancer.SystemManager/Dockerfile +++ b/src/apps/Rsdo.Concordancer.SystemManager/Dockerfile @@ -3,6 +3,10 @@ WORKDIR /app FROM mcr.microsoft.com/dotnet/sdk:10.0 AS build +# COPY SHARED MSBUILD CONFIGURATION +COPY src/Directory.Build.props /src/Directory.Build.props +COPY src/Directory.Packages.props /src/Directory.Packages.props + # RESTORE PACKAGES (with project files only) WORKDIR /src/apps COPY src/apps/Rsdo.Concordancer.SystemManager/Rsdo.Concordancer.SystemManager.csproj Rsdo.Concordancer.SystemManager/Rsdo.Concordancer.SystemManager.csproj