Skip to content
Snippets Groups Projects
Commit 6195ff90 authored by Petar Hristov's avatar Petar Hristov 💬
Browse files

WIP: Refactored to use DI and Service Collection

parent e1804f8c
No related branches found
No related tags found
2 merge requests!29Fix: Working new version,!27BREAKING: Migrated SQL2Linked to the APIv2 infrastructure
Pipeline #1188675 failed
using Coscine.ApiClient;
using Coscine.ApiClient.Core.Model;
using Microsoft.Extensions.Configuration;
using VDS.RDF;
namespace SQL2Linked.Implementations;
public class ProjectStructuralData : StructuralData<ProjectAdminDto>
public class ProjectStructuralData(IConfiguration configuration) : StructuralData<ProjectAdminDto>
{
public readonly Uri org = new("http://www.w3.org/ns/org#");
public readonly Uri dcat = new("http://www.w3.org/ns/dcat#");
......@@ -18,13 +19,13 @@ public class ProjectStructuralData : StructuralData<ProjectAdminDto>
public override async Task<IEnumerable<ProjectAdminDto>> GetAll()
{
return await RequestUtil.WrapPagedRequest<ProjectAdminDtoPagedResponse, ProjectAdminDto>(
(currentPage) => AdminApi.GetAllProjectsAsync(includeDeleted: true, pageNumber: currentPage, pageSize: 150));
(currentPage) => _adminApi.GetAllProjectsAsync(includeDeleted: true, pageNumber: currentPage, pageSize: 150));
}
public override IEnumerable<IGraph> ConvertToLinkedData(IEnumerable<ProjectAdminDto> entries)
{
var graphs = new List<IGraph>();
var projectUrlHandlePrefix = "https://hdl.handle.net/" + Prefix;
var projectUrlHandlePrefix = "https://hdl.handle.net/" + _pidConfiguration?.Prefix;
var projectUrlPrefix = "https://purl.org/coscine/projects";
var resourceUrlPrefix = "https://purl.org/coscine/resources";
......
......
using Coscine.ApiClient;
using Coscine.ApiClient.Core.Model;
using Microsoft.Extensions.Configuration;
using Newtonsoft.Json;
using VDS.RDF;
namespace SQL2Linked.Implementations;
public class ResourceStructuralData : StructuralData<ResourceAdminDto>
public class ResourceStructuralData(IConfiguration configuration) : StructuralData<ResourceAdminDto>
{
public readonly Uri org = new("http://www.w3.org/ns/org#");
public readonly Uri dcat = new("http://www.w3.org/ns/dcat#");
......@@ -20,13 +21,13 @@ public class ResourceStructuralData : StructuralData<ResourceAdminDto>
public override async Task<IEnumerable<ResourceAdminDto>> GetAll()
{
return await RequestUtil.WrapPagedRequest<ResourceAdminDtoPagedResponse, ResourceAdminDto>(
(currentPage) => AdminApi.GetAllResourcesAsync(includeDeleted: true, pageNumber: currentPage, pageSize: 150));
(currentPage) => _adminApi.GetAllResourcesAsync(includeDeleted: true, pageNumber: currentPage, pageSize: 150));
}
public override IEnumerable<IGraph> ConvertToLinkedData(IEnumerable<ResourceAdminDto> entries)
{
var graphs = new List<IGraph>();
var resourceUrlHandlePrefix = "https://hdl.handle.net/" + Prefix;
var resourceUrlHandlePrefix = "https://hdl.handle.net/" + _pidConfiguration?.Prefix;
var projectUrlPrefix = "https://purl.org/coscine/projects";
var resourceUrlPrefix = "https://purl.org/coscine/resources";
......
......
using Coscine.ApiClient.Core.Api;
using Coscine.ApiClient.Core.Model;
using Microsoft.Extensions.Configuration;
using VDS.RDF;
using VDS.RDF.Parsing;
namespace SQL2Linked.Implementations;
public class ResourceTypeStructuralData : StructuralData<ResourceTypeInformationDto>
public class ResourceTypeStructuralData(IConfiguration configuration) : StructuralData<ResourceTypeInformationDto>
{
public readonly string ResourceTypeUrlPrefix = "https://purl.org/coscine/resourcetypes";
public readonly Uri rdf = new("http://www.w3.org/1999/02/22-rdf-syntax-ns#");
......@@ -28,7 +29,7 @@ public class ResourceTypeStructuralData : StructuralData<ResourceTypeInformation
foreach (var entry in entries)
{
var resourceTypeGraphName = $"{ResourceTypeUrlPrefix}/{entry.Id}";
var response = AdminApi.GetMetadataGraph(resourceTypeGraphName, RdfFormat.TextTurtle);
var response = _adminApi.GetMetadataGraph(resourceTypeGraphName, RdfFormat.TextTurtle);
var graph = new Graph()
{
BaseUri = new Uri(resourceTypeGraphName)
......
......
using Coscine.ApiClient;
using Coscine.ApiClient.Core.Api;
using Coscine.ApiClient.Core.Model;
using Microsoft.Extensions.Configuration;
using VDS.RDF;
using VDS.RDF.Parsing;
namespace SQL2Linked.Implementations;
public class RoleStructuralData : StructuralData<RoleDto>
public class RoleStructuralData(IConfiguration configuration) : StructuralData<RoleDto>
{
public readonly string RoleUrlPrefix = "https://purl.org/coscine/roles";
public readonly Uri cosc = new("https://purl.org/coscine/");
......@@ -29,7 +30,7 @@ public class RoleStructuralData : StructuralData<RoleDto>
foreach (var entry in entries)
{
var roleGraphName = $"{RoleUrlPrefix}/{entry.Id}";
var response = AdminApi.GetMetadataGraph(roleGraphName, RdfFormat.TextTurtle);
var response = _adminApi.GetMetadataGraph(roleGraphName, RdfFormat.TextTurtle);
var graph = new Graph()
{
BaseUri = new Uri(roleGraphName)
......
......
using Coscine.ApiClient;
using Coscine.ApiClient.Core.Model;
using Microsoft.Extensions.Configuration;
using VDS.RDF;
using VDS.RDF.Parsing;
namespace SQL2Linked.Implementations;
public class UserStructuralData : StructuralData<UserDto>
public class UserStructuralData(IConfiguration configuration) : StructuralData<UserDto>
{
public readonly string UserUrlPrefix = "https://purl.org/coscine/users";
public readonly Uri rdf = new("http://www.w3.org/1999/02/22-rdf-syntax-ns#");
......@@ -15,7 +16,7 @@ public class UserStructuralData : StructuralData<UserDto>
public override async Task<IEnumerable<UserDto>> GetAll()
{
return await RequestUtil.WrapPagedRequest<UserDtoPagedResponse, UserDto>(
(currentPage) => AdminApi.GetAllUsersAsync(tosAccepted: true, pageNumber: currentPage, pageSize: 150));
(currentPage) => _adminApi.GetAllUsersAsync(tosAccepted: true, pageNumber: currentPage, pageSize: 150));
}
public override IEnumerable<IGraph> ConvertToLinkedData(IEnumerable<UserDto> entries)
......@@ -25,7 +26,7 @@ public class UserStructuralData : StructuralData<UserDto>
foreach (var entry in entries)
{
var userGraphName = $"{UserUrlPrefix}/{entry.Id}";
var response = AdminApi.GetMetadataGraph(userGraphName, RdfFormat.TextTurtle);
var response = _adminApi.GetMetadataGraph(userGraphName, RdfFormat.TextTurtle);
var graph = new Graph()
{
BaseUri = new Uri(userGraphName)
......
......
namespace SQL2Linked.Models.ConfigurationModels;
/// <summary>
/// Represents the configuration settings for the PID ePIC API used in the application.
/// </summary>
public class PidConfiguration
{
/// <summary>
/// The section name in the configuration file.
/// </summary>
public static readonly string Section = "PidConfiguration";
/// <summary>
/// Prefix for the PID ePIC API.
/// </summary>
public string Prefix { get; init; } = null!;
}
namespace Coscine.KpiGenerator.Models.ConfigurationModels;
/// <summary>
/// Represents the configuration settings used in the application.
/// </summary>
public class SQL2LinkedConfiguration
{
/// <summary>
/// The section name in the configuration file.
/// </summary>
public static readonly string Section = "SQL2LinkedConfiguration";
/// <summary>
/// Value indicating whether SQL2Linked is enabled.
/// </summary>
public bool IsEnabled { get; init; }
}
\ No newline at end of file
using SQL2Linked.Implementations;
using Coscine.KpiGenerator.Models.ConfigurationModels;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using SQL2Linked.Implementations;
using Winton.Extensions.Configuration.Consul;
namespace SQL2Linked;
public class Program
{
private static IServiceProvider _serviceProvider = null!;
private static async Task Main(string[] args)
{
InitializeServices();
var dummyMode = !(args.Length > 0 && args[0] == "--noDryRun");
if (dummyMode)
......@@ -9,19 +23,73 @@ if (dummyMode)
Console.WriteLine("\nBegin SQL 2 Linked Data migration");
var roleStructuralData = new RoleStructuralData();
var roleStructuralData = _serviceProvider.GetRequiredService<RoleStructuralData>();
await roleStructuralData.Migrate(dummyMode);
var userStructuralData = new UserStructuralData();
var userStructuralData = _serviceProvider.GetRequiredService<UserStructuralData>();
await userStructuralData.Migrate(dummyMode);
var resourceTypeStructuralData = new ResourceTypeStructuralData();
var resourceTypeStructuralData = _serviceProvider.GetRequiredService<ResourceTypeStructuralData>();
await resourceTypeStructuralData.Migrate(dummyMode);
var projectStructuralData = new ProjectStructuralData();
var projectStructuralData = _serviceProvider.GetRequiredService<ProjectStructuralData>();
await projectStructuralData.Migrate(dummyMode);
var resourceStructuralData = new ResourceStructuralData();
var resourceStructuralData = _serviceProvider.GetRequiredService<ResourceStructuralData>();
await resourceStructuralData.Migrate(dummyMode);
Console.WriteLine("\n Finished.");
}
private static void InitializeServices()
{
// Register custom layout renderers for NLog
//ConfigurationItemFactory.Default.LayoutRenderers.RegisterDefinition("assembly-name", typeof(AssemblyNameLayoutRenderer));
//ConfigurationItemFactory.Default.LayoutRenderers.RegisterDefinition("assembly-version", typeof(AssemblyVersionLayoutRenderer));
// Create a new instance of ConfigurationBuilder
var configBuilder = new ConfigurationBuilder();
// Define the Consul URL
var consulUrl = Environment.GetEnvironmentVariable("CONSUL_URL") ?? "http://localhost:8500";
// Remove the default sources
configBuilder.Sources.Clear();
// Add Consul as a configuration source
var configuration = configBuilder
.AddConsul(
"coscine/Coscine.Infrastructure/SQL2Linked/appsettings",
options =>
{
options.ConsulConfigurationOptions =
cco => cco.Address = new Uri(consulUrl);
options.Optional = true;
options.ReloadOnChange = true;
options.PollWaitTime = TimeSpan.FromSeconds(5);
options.OnLoadException = exceptionContext => exceptionContext.Ignore = true;
}
)
.AddEnvironmentVariables()
.Build();
var services = new ServiceCollection()
.AddSingleton<IConfiguration>(configuration);
// Add the configuration to the service collection
services.Configure<SQL2LinkedConfiguration>(settings =>
{
configuration.GetSection(SQL2LinkedConfiguration.Section).Bind(settings);
});
// Add the services to the service collection
services.AddTransient<ProjectStructuralData>();
services.AddTransient<ResourceStructuralData>();
services.AddTransient<ResourceTypeStructuralData>();
services.AddTransient<RoleStructuralData>();
services.AddTransient<UserStructuralData>();
_serviceProvider = services.BuildServiceProvider();
}
}
\ No newline at end of file
......@@ -18,6 +18,13 @@
<ItemGroup>
<PackageReference Include="Coscine.ApiClient" Version="1.3.0-issue-2666-admin0007" />
<PackageReference Include="dotNetRdf" Version="3.1.1" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="8.0.0" />
<PackageReference Include="Microsoft.Extensions.Options" Version="8.0.0" />
<PackageReference Include="NLog" Version="5.2.7" />
</ItemGroup>
<ItemGroup>
<Folder Include="Utils\" />
</ItemGroup>
</Project>
......@@ -2,23 +2,32 @@
using Coscine.ApiClient.Core.Api;
using Coscine.ApiClient.Core.Client;
using Coscine.ApiClient.Core.Model;
using Microsoft.Extensions.Configuration;
using SQL2Linked.Models.ConfigurationModels;
using VDS.RDF;
namespace SQL2Linked
{
namespace SQL2Linked;
public abstract class StructuralData<S>
{
public ConsulConfiguration Configuration { get; init; }
public static string Prefix { get; set; }
public static string AdminToken { get; set; }
public AdminApi AdminApi { get; init; }
public static string AdminToken { get; set; } = "";
protected readonly AdminApi _adminApi;
protected readonly PidConfiguration _pidConfiguration; // Comes from the API Client, not from the application's own configuration
public StructuralData()
{
Prefix = Configuration.GetStringAndWait("coscine/global/epic/prefix");
// Retrieve the configuration settings for the PID ePIC API from the API Client
var apiConfiguration = ApiConfigurationUtil.RetrieveApiConfiguration();
_pidConfiguration = apiConfiguration.GetSection(PidConfiguration.Section).Get<PidConfiguration>() ?? new();
// Ensiure that the prefix is not null or empty.
ArgumentException.ThrowIfNullOrWhiteSpace(_pidConfiguration.Prefix, nameof(_pidConfiguration.Prefix));
// Generate an admin token for the API Client
var jwtConfiguration = ApiConfigurationUtil.RetrieveJwtConfiguration();
AdminToken = ApiConfigurationUtil.GenerateAdminToken(jwtConfiguration);
AdminApi = new AdminApi(new Configuration()
_adminApi = new AdminApi(new Configuration()
{
ApiKeyPrefix = { { "Authorization", "Bearer" } },
ApiKey = { { "Authorization", AdminToken } },
......@@ -57,21 +66,22 @@ namespace SQL2Linked
var assert = VDS.RDF.Writing.StringWriter.Write((graph as WrapperGraph)?.AssertGraph, rdfWriter);
var retract = VDS.RDF.Writing.StringWriter.Write((graph as WrapperGraph)?.RetractGraph, rdfWriter);
await AdminApi.PatchMetadataGraphAsync(
new MetadataPatchAdminParameters
(
graph.BaseUri.AbsoluteUri,
new RdfDefinitionForManipulationDto(assert, formatEnum),
new RdfDefinitionForManipulationDto(retract, formatEnum)
)
);
throw new NotImplementedException();
//await _adminApi.PatchMetadataGraphAsync(
// new MetadataPatchAdminParameters
// (
// graph.BaseUri.AbsoluteUri,
// new RdfDefinitionForManipulationDto(assert, formatEnum),
// new RdfDefinitionForManipulationDto(retract, formatEnum)
// )
//);
}
else
{
var rdfWriter = MimeTypesHelper.GetWriter(format);
var content = VDS.RDF.Writing.StringWriter.Write(graph, rdfWriter);
await AdminApi.UpdateMetadataGraphAsync(
await _adminApi.UpdateMetadataGraphAsync(
new MetadataUpdateAdminParameters
(
graph.BaseUri.AbsoluteUri,
......@@ -136,4 +146,3 @@ namespace SQL2Linked
}
}
}
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment