Compare commits

...

20 Commits

Author SHA1 Message Date
7fea71c08d feat(Articles.PutRequest): Erstellt für die Aktualisierung eines Artikels 2025-07-07 17:14:38 +02:00
b42dcc37ad feat(Articles.PostRequest): Erstellt für die Erstellung eines Artikels 2025-07-07 17:12:35 +02:00
89d0e6a38a feat(Articles.GetRequest): erstellt, um Get-Anfragen zum Lesen von Artikeln mit der mediar-Erweiterung und dem Request-Handler ohne Implementierung zu bearbeiten 2025-07-07 16:54:16 +02:00
4688883f2e refactor(GetRequest): Handler ohne Implementierung hinzufügen 2025-07-07 16:27:41 +02:00
67b2456032 refactor(GetRequest): aktualisiert, um von Request zu erben
- Hinzufügen der apiVersion-Eingabe zur IsAlive-Methode von MediatRExtensions
2025-07-07 16:22:08 +02:00
3b9b9f19b2 feat(Request): Erstellt, um allgemeine „Request“-Eigenschaften zu behandeln 2025-07-07 16:16:40 +02:00
dec10eeb79 feat(ClientOptions): Api-Versions-Eigenschaft hinzufügen 2025-07-07 16:10:19 +02:00
816b72bfc8 feat(Client): Hinzufügen einer statischen Eigenschaft zur Konfiguration von Optionen in lokalen 2025-07-07 16:08:52 +02:00
2fbd50d52e feat(DependencyInjection): Hinzufügen von ClientOptions zu Diensten über IOptions. 2025-07-07 15:49:58 +02:00
cf8f9d76e3 feat(ClientOptions): Hinzufügen zur Konfiguration des Clients 2025-07-07 15:47:47 +02:00
3377cc6121 feat(Client): statische Klasse zur Behandlung des Standarddienstanbieters mit „Lazy Loading“ erstellt 2025-07-07 15:36:48 +02:00
2c73022526 feat(Client): Erweiterung für Dependency Injection erstellen 2025-07-07 15:29:49 +02:00
1699cca53d Hinzufügen von „Get Alive“-Anfragen mit MediatR-Erweiterungsmethode ohne Handler 2025-07-07 15:25:07 +02:00
fd6e6d474d chore: Projektdokumentationsdateien hinzufügen 2025-07-07 15:05:53 +02:00
1e1ead5c49 chore(client): MediatR-Paket hinzufügen 2025-07-07 15:01:17 +02:00
89ace0de42 client-service erstellen 2025-07-07 14:55:17 +02:00
bb5c8d7ad2 chore(Domain): Aktualisiert, um sowohl .net8 als auch .net7 und .net9 zu unterstützen. 2025-07-07 14:33:41 +02:00
c74f5a9035 Erstellen von order-status-, tenant-, tenant-berth-, uom- and waste-Entitäten ohne Eigenschaft. 2025-07-07 14:29:59 +02:00
eeccbfb81a article-, aval-, business-partner-, documents-, notications-, notification-settings- and order-Entitäten ohne Eigenschaft erstellen. 2025-07-07 14:19:35 +02:00
c9a026577a Domänenprojekt erstellen 2025-07-07 14:08:14 +02:00
27 changed files with 4699 additions and 0 deletions

43
Leanetec.EConnect.sln Normal file
View File

@@ -0,0 +1,43 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.14.36221.1
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Leanetec.EConnect.Domain", "src\Leanetec.EConnect.Domain\Leanetec.EConnect.Domain.csproj", "{34DC964A-1905-7DFC-0125-D551D3EEFCDD}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{02EA681E-C7D8-13C7-8484-4AC65E1B71E8}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Leanetec.EConnect.Client", "src\Leanetec.EConnect.Client\Leanetec.EConnect.Client.csproj", "{9242EEA9-447B-44A6-A66D-D671DD16D0BB}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "docs", "docs", "{AC628874-E7B7-4CA6-8614-03DCCC9DE5CA}"
ProjectSection(SolutionItems) = preProject
docs\econnect-api_swagger.json = docs\econnect-api_swagger.json
docs\econnect-api_swagger.pdf = docs\econnect-api_swagger.pdf
EndProjectSection
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{34DC964A-1905-7DFC-0125-D551D3EEFCDD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{34DC964A-1905-7DFC-0125-D551D3EEFCDD}.Debug|Any CPU.Build.0 = Debug|Any CPU
{34DC964A-1905-7DFC-0125-D551D3EEFCDD}.Release|Any CPU.ActiveCfg = Release|Any CPU
{34DC964A-1905-7DFC-0125-D551D3EEFCDD}.Release|Any CPU.Build.0 = Release|Any CPU
{9242EEA9-447B-44A6-A66D-D671DD16D0BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{9242EEA9-447B-44A6-A66D-D671DD16D0BB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{9242EEA9-447B-44A6-A66D-D671DD16D0BB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{9242EEA9-447B-44A6-A66D-D671DD16D0BB}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(NestedProjects) = preSolution
{34DC964A-1905-7DFC-0125-D551D3EEFCDD} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
{9242EEA9-447B-44A6-A66D-D671DD16D0BB} = {02EA681E-C7D8-13C7-8484-4AC65E1B71E8}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {8C81AD6F-B903-4C78-873C-38EE216EFAD5}
EndGlobalSection
EndGlobal

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -0,0 +1,22 @@
using Leanetec.EConnect.Client.Models;
using MediatR;
namespace Leanetec.EConnect.Client.Alive;
public enum Role
{
User,
Admin
}
public record GetRequest(Role? Role = null) : Request<bool>, IRequest<bool>
{
}
public class GetRequestHandler : IRequestHandler<GetRequest, bool>
{
public Task<bool> Handle(GetRequest request, CancellationToken cancellationToken)
{
throw new NotImplementedException();
}
}

View File

@@ -0,0 +1,17 @@
using MediatR;
namespace Leanetec.EConnect.Client.Alive;
public static class MediatRExtensions
{
/// <summary>
/// Returns true if while the application is up.
/// </summary>
/// <param name="mediator"></param>
/// <param name="role">Role of logged user</param>
/// <returns></returns>
public static Task<bool> IsAliveAsync(this IMediator mediator, Role? role = null, int? apiVersion = null) => mediator.Send(new GetRequest(role)
{
ApiVersion = apiVersion
});
}

View File

@@ -0,0 +1,17 @@
using Leanetec.EConnect.Client.Models;
using Leanetec.EConnect.Domain.Entities;
using MediatR;
namespace Leanetec.EConnect.Client.Articles;
public record GetRequest(int? ArticleId = null) : Request<IEnumerable<Article>>, IRequest<IEnumerable<Article>>
{
}
public class GetRequestHandler : IRequestHandler<GetRequest, IEnumerable<Article>>
{
public Task<IEnumerable<Article>> Handle(GetRequest request, CancellationToken cancellationToken)
{
throw new NotImplementedException();
}
}

View File

@@ -0,0 +1,60 @@
using Leanetec.EConnect.Domain.Entities;
using MediatR;
namespace Leanetec.EConnect.Client.Articles;
/// <summary>
/// Extension methods for the <see cref="IMediator"/> interface to simplify working with <see cref="Article"/> entities.
/// </summary>
public static class MediatRExtensions
{
#region GetRequest
/// <summary>
/// Retrieves a single <see cref="Article"/> by its unique identifier.
/// </summary>
/// <param name="mediator">The <see cref="IMediator"/> instance used to send the request.</param>
/// <param name="id">The unique identifier of the article to retrieve.</param>
/// <param name="apiVersion">Optional API version to target the request.</param>
/// <returns>
/// A task that represents the asynchronous operation. The task result contains the matching <see cref="Article"/>, or <c>null</c> if not found.
/// </returns>
public static async Task<Article?> GetArticleByIdAsync(this IMediator mediator, int id, int? apiVersion = null)
{
var articles = await mediator.Send(new GetRequest(id) { ApiVersion = apiVersion });
return articles.FirstOrDefault();
}
/// <summary>
/// Retrieves all available <see cref="Article"/> entities.
/// </summary>
/// <param name="mediator">The <see cref="IMediator"/> instance used to send the request.</param>
/// <param name="apiVersion">Optional API version to target the request.</param>
/// <returns>
/// A task that represents the asynchronous operation. The task result contains a collection of all available <see cref="Article"/> entities.
/// </returns>
public static Task<IEnumerable<Article>> GetAllArticlesAsync(this IMediator mediator, int? apiVersion = null) => mediator.Send(new GetRequest()
{
ApiVersion = apiVersion
});
#endregion
#region PostRequest
public static Task CreateArticleAsync(this IMediator mediator, Article article, int? apiVersion = null) => mediator.Send(new PostRequest(article)
{
ApiVersion = apiVersion
});
#endregion
#region PutRequest
public static Task UpdateArticleAsync(this IMediator mediator, Article article, int? apiVersion = null) => mediator.Send(new PutRequest(article)
{
ApiVersion = apiVersion
});
#endregion
}

View File

@@ -0,0 +1,17 @@
using Leanetec.EConnect.Client.Models;
using Leanetec.EConnect.Domain.Entities;
using MediatR;
namespace Leanetec.EConnect.Client.Articles;
public record PostRequest(Article Article) : Request, IRequest
{
}
public class PostRequestHandler : IRequestHandler<PostRequest>
{
public Task Handle(PostRequest request, CancellationToken cancellationToken)
{
throw new NotImplementedException();
}
}

View File

@@ -0,0 +1,17 @@
using Leanetec.EConnect.Client.Models;
using Leanetec.EConnect.Domain.Entities;
using MediatR;
namespace Leanetec.EConnect.Client.Articles;
public record PutRequest(Article Article) : Request, IRequest
{
}
public class PutRequestHandler : IRequestHandler<PostRequest>
{
public Task Handle(PostRequest request, CancellationToken cancellationToken)
{
throw new NotImplementedException();
}
}

View File

@@ -0,0 +1,49 @@
using MediatR;
using Microsoft.Extensions.DependencyInjection;
namespace Leanetec.EConnect.Client;
/// <summary>
/// Provides a lazily initialized <see cref="IServiceProvider"/> for accessing the EConnect client services,
/// including an <see cref="IMediator"/> instance for sending and publishing messages.
/// </summary>
public static class Client
{
private static Action<ClientOptions>? _options = null;
/// <summary>
/// Gets or sets the configuration options for the EConnect client.
/// Can only be set once; subsequent attempts to set will result in an exception.
/// </summary>
public static Action<ClientOptions> Options
{
get => _options ?? throw new InvalidOperationException("EConnect Client options have not been configured. Please set the 'Client.Options' property before accessing client services.");
set
{
if (_options is null)
_options = value;
else
throw new InvalidOperationException("EConnect Client options have already been configured. Reassignment is not allowed.");
}
}
/// <summary>
/// Lazily initializes the <see cref="IServiceProvider"/> that registers and builds the EConnect client services.
/// </summary>
private static readonly Lazy<IServiceProvider> _serviceProvider = new(() =>
{
var services = new ServiceCollection();
services.AddEConnectClient(Options);
return services.BuildServiceProvider();
});
/// <summary>
/// Gets the initialized <see cref="IServiceProvider"/> that provides access to registered EConnect client services.
/// </summary>
public static IServiceProvider Provider => _serviceProvider.Value;
/// <summary>
/// Gets the <see cref="IMediator"/> instance used for sending commands, queries, and publishing events within the EConnect client.
/// </summary>
public static IMediator Mediator => Provider.GetRequiredService<IMediator>();
}

View File

@@ -0,0 +1,6 @@
namespace Leanetec.EConnect.Client;
public class ClientOptions
{
public int ApiVersion { get; set; } = 1;
}

View File

@@ -0,0 +1,13 @@
using Microsoft.Extensions.DependencyInjection;
namespace Leanetec.EConnect.Client;
public static class DependencyInjection
{
public static IServiceCollection AddEConnectClient(this IServiceCollection services, Action<ClientOptions> clientOptions)
{
services.Configure(clientOptions);
services.AddMediatR(cfg => cfg.RegisterServicesFromAssembly(typeof(DependencyInjection).Assembly));
return services;
}
}

View File

@@ -0,0 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="MediatR" Version="13.0.0" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Leanetec.EConnect.Domain\Leanetec.EConnect.Domain.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,16 @@
using MediatR;
namespace Leanetec.EConnect.Client.Models;
public record CommonRequest
{
public int? ApiVersion { get; set; }
}
public record Request : CommonRequest, IRequest
{
}
public record Request<TResponse> : CommonRequest, IRequest<TResponse>
{
}

View File

@@ -0,0 +1,8 @@
namespace Leanetec.EConnect.Domain.Entities;
/// <summary>
/// Represents business partner articles
/// </summary>
public class Article
{
}

View File

@@ -0,0 +1,8 @@
namespace Leanetec.EConnect.Domain.Entities;
/// <summary>
/// Represents aval containers with volume information
/// </summary>
public class Aval
{
}

View File

@@ -0,0 +1,8 @@
namespace Leanetec.EConnect.Domain.Entities;
/// <summary>
/// Represents business partners
/// </summary>
public class BusinessPartner
{
}

View File

@@ -0,0 +1,8 @@
namespace Leanetec.EConnect.Domain.Entities;
/// <summary>
/// Represents documents of service ordrers
/// </summary>
public class Documents
{
}

View File

@@ -0,0 +1,5 @@
namespace Leanetec.EConnect.Domain.Entities;
public class Notification
{
}

View File

@@ -0,0 +1,5 @@
namespace Leanetec.EConnect.Domain.Entities;
public class NotificationSettings
{
}

View File

@@ -0,0 +1,8 @@
namespace Leanetec.EConnect.Domain.Entities;
/// <summary>
/// Represents orders of tenants
/// </summary>
public class Order
{
}

View File

@@ -0,0 +1,8 @@
namespace Leanetec.EConnect.Domain.Entities;
/// <summary>
/// Represents service order states
/// </summary>
public class OrderStatus
{
}

View File

@@ -0,0 +1,8 @@
namespace Leanetec.EConnect.Domain.Entities;
/// <summary>
/// Represents tenants that are currently available for the service provider.
/// </summary>
public class Tenant
{
}

View File

@@ -0,0 +1,8 @@
namespace Leanetec.EConnect.Domain.Entities;
/// <summary>
/// Represents berths a specific tenant, with location details.
/// </summary>
public class TenantBerth
{
}

View File

@@ -0,0 +1,8 @@
namespace Leanetec.EConnect.Domain.Entities;
/// <summary>
/// Represent units of measurement
/// </summary>
public class Uom
{
}

View File

@@ -0,0 +1,5 @@
namespace Leanetec.EConnect.Domain.Entities;
public class Waste
{
}

View File

@@ -0,0 +1,9 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFrameworks>net7.0;net8.0;net9.0</TargetFrameworks>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
</Project>