Skip to content

Commit 771e80e

Browse files
authored
Merge pull request #13 from deveel/10-aspnet-core-middleware
ASP.NET Core Receiver Middleware
2 parents abce0bb + 1a9f733 commit 771e80e

File tree

75 files changed

+4593
-1283
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

75 files changed

+4593
-1283
lines changed

Deveel.Webhooks.sln

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Deveel.Webhooks.Model", "sr
77
EndProject
88
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Deveel.Webhooks.XUnit", "test\Deveel.Events.Webhooks.XUnit\Deveel.Webhooks.XUnit.csproj", "{CF170566-4653-4E7A-AC54-5A1F7594B71F}"
99
EndProject
10-
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Deveel.Webhooks.Receiver", "src\Deveel.Webhooks.Receiver\Deveel.Webhooks.Receiver.csproj", "{954A1901-CD16-4DD0-A6F3-D0D7E7F1B9A4}"
11-
EndProject
1210
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Deveel.Webhooks", "src\Deveel.Webhooks\Deveel.Webhooks.csproj", "{6435EBAE-5E0A-446D-B4E4-D75FE89DFC99}"
1311
EndProject
1412
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Deveel.Webhooks.Service", "src\Deveel.Webhooks.Service\Deveel.Webhooks.Service.csproj", "{D2A74CD1-202E-4F64-BAD8-88F37EB3805A}"
@@ -23,7 +21,11 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{57F6404B-1FC
2321
EndProject
2422
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{07F23FF6-2FE1-4072-BF37-9238E3750AA1}"
2523
EndProject
26-
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Deveel.Webhooks.Receiver.XUnit", "test\Deveel.Webhooks.Receiver.XUnit\Deveel.Webhooks.Receiver.XUnit.csproj", "{4BC8323C-74F7-407A-8A5A-EA595B5C5585}"
24+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Deveel.Webhooks.Receiver.XUnit", "test\Deveel.Webhooks.Receiver.XUnit\Deveel.Webhooks.Receiver.XUnit.csproj", "{4BC8323C-74F7-407A-8A5A-EA595B5C5585}"
25+
EndProject
26+
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Deveel.Webhooks.Receiver.TestApi", "test\Deveel.Webhooks.Receiver.TestApi\Deveel.Webhooks.Receiver.TestApi.csproj", "{CBAC02DA-EFF9-4458-99A2-DAF7ACFE607F}"
27+
EndProject
28+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Deveel.Webhooks.Receiver.AspNetCore.NewtonsoftJson", "src\Deveel.Webhooks.Receiver.AspNetCore.NewtonsoftJson\Deveel.Webhooks.Receiver.AspNetCore.NewtonsoftJson.csproj", "{F23E99C7-8228-4AEE-894B-CAA303686239}"
2729
EndProject
2830
Global
2931
GlobalSection(SolutionConfigurationPlatforms) = preSolution
@@ -39,10 +41,6 @@ Global
3941
{CF170566-4653-4E7A-AC54-5A1F7594B71F}.Debug|Any CPU.Build.0 = Debug|Any CPU
4042
{CF170566-4653-4E7A-AC54-5A1F7594B71F}.Release|Any CPU.ActiveCfg = Release|Any CPU
4143
{CF170566-4653-4E7A-AC54-5A1F7594B71F}.Release|Any CPU.Build.0 = Release|Any CPU
42-
{954A1901-CD16-4DD0-A6F3-D0D7E7F1B9A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
43-
{954A1901-CD16-4DD0-A6F3-D0D7E7F1B9A4}.Debug|Any CPU.Build.0 = Debug|Any CPU
44-
{954A1901-CD16-4DD0-A6F3-D0D7E7F1B9A4}.Release|Any CPU.ActiveCfg = Release|Any CPU
45-
{954A1901-CD16-4DD0-A6F3-D0D7E7F1B9A4}.Release|Any CPU.Build.0 = Release|Any CPU
4644
{6435EBAE-5E0A-446D-B4E4-D75FE89DFC99}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
4745
{6435EBAE-5E0A-446D-B4E4-D75FE89DFC99}.Debug|Any CPU.Build.0 = Debug|Any CPU
4846
{6435EBAE-5E0A-446D-B4E4-D75FE89DFC99}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -67,20 +65,29 @@ Global
6765
{4BC8323C-74F7-407A-8A5A-EA595B5C5585}.Debug|Any CPU.Build.0 = Debug|Any CPU
6866
{4BC8323C-74F7-407A-8A5A-EA595B5C5585}.Release|Any CPU.ActiveCfg = Release|Any CPU
6967
{4BC8323C-74F7-407A-8A5A-EA595B5C5585}.Release|Any CPU.Build.0 = Release|Any CPU
68+
{CBAC02DA-EFF9-4458-99A2-DAF7ACFE607F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
69+
{CBAC02DA-EFF9-4458-99A2-DAF7ACFE607F}.Debug|Any CPU.Build.0 = Debug|Any CPU
70+
{CBAC02DA-EFF9-4458-99A2-DAF7ACFE607F}.Release|Any CPU.ActiveCfg = Release|Any CPU
71+
{CBAC02DA-EFF9-4458-99A2-DAF7ACFE607F}.Release|Any CPU.Build.0 = Release|Any CPU
72+
{F23E99C7-8228-4AEE-894B-CAA303686239}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
73+
{F23E99C7-8228-4AEE-894B-CAA303686239}.Debug|Any CPU.Build.0 = Debug|Any CPU
74+
{F23E99C7-8228-4AEE-894B-CAA303686239}.Release|Any CPU.ActiveCfg = Release|Any CPU
75+
{F23E99C7-8228-4AEE-894B-CAA303686239}.Release|Any CPU.Build.0 = Release|Any CPU
7076
EndGlobalSection
7177
GlobalSection(SolutionProperties) = preSolution
7278
HideSolutionNode = FALSE
7379
EndGlobalSection
7480
GlobalSection(NestedProjects) = preSolution
7581
{9D710920-2A08-466C-94F0-3FD90E752A20} = {57F6404B-1FCC-473F-A189-ABC9D640CC0E}
7682
{CF170566-4653-4E7A-AC54-5A1F7594B71F} = {07F23FF6-2FE1-4072-BF37-9238E3750AA1}
77-
{954A1901-CD16-4DD0-A6F3-D0D7E7F1B9A4} = {57F6404B-1FCC-473F-A189-ABC9D640CC0E}
7883
{6435EBAE-5E0A-446D-B4E4-D75FE89DFC99} = {57F6404B-1FCC-473F-A189-ABC9D640CC0E}
7984
{D2A74CD1-202E-4F64-BAD8-88F37EB3805A} = {57F6404B-1FCC-473F-A189-ABC9D640CC0E}
8085
{9796303D-5EFF-4942-A563-6B53C4FE6904} = {57F6404B-1FCC-473F-A189-ABC9D640CC0E}
8186
{6E1CC992-53F1-4536-96C5-751C8AFBD015} = {57F6404B-1FCC-473F-A189-ABC9D640CC0E}
8287
{69EA8584-6336-4A62-BE73-DE04DC6EE8E1} = {57F6404B-1FCC-473F-A189-ABC9D640CC0E}
8388
{4BC8323C-74F7-407A-8A5A-EA595B5C5585} = {07F23FF6-2FE1-4072-BF37-9238E3750AA1}
89+
{CBAC02DA-EFF9-4458-99A2-DAF7ACFE607F} = {07F23FF6-2FE1-4072-BF37-9238E3750AA1}
90+
{F23E99C7-8228-4AEE-894B-CAA303686239} = {57F6404B-1FCC-473F-A189-ABC9D640CC0E}
8491
EndGlobalSection
8592
GlobalSection(ExtensibilityGlobals) = postSolution
8693
SolutionGuid = {E682A9F5-43D7-4D4C-82EA-953545B8F4DE}

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ Although this integration model is widely adopted by major service providers (li
99
Anyway, a typical implementation consists of the following elements:
1010

1111
* Webhooks are transported through _HTTP POST_ callbacks
12-
* The webhook payload is represented as a JSON object (or alternatively as XML or Form)
12+
* The webhook payload is formatted as a JSON object (or alternatively, in lesser common scenarios, as XML or Form)
1313
* The webhook payload includes properties that describe the type of event and the time-stamp of the occurrence
1414
* An optional signature in the header of the request or a query-string parameter ensures the authenticity of the caller
1515

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
// Copyright 2022 Deveel
1+
extensions: .cs
2+
// Copyright 2022-2023 Deveel
23
//
34
// Licensed under the Apache License, Version 2.0 (the "License");
45
// you may not use this file except in compliance with the License.
@@ -11,12 +12,3 @@
1112
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1213
// See the License for the specific language governing permissions and
1314
// limitations under the License.
14-
15-
using System;
16-
17-
namespace Deveel.Webhooks {
18-
public enum WebhookSignatureLocation {
19-
Header,
20-
QueryString
21-
}
22-
}

docs/README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,9 +16,12 @@
1616

1717
# Deveel Webhooks Documentation
1818

19+
Here you can find a documentation of the `Deveel Webhooks` framework, to help you getting started with the libraries and functions that compose it and to understand how it works.
20+
21+
1922
## Basic Concepts
2023

21-
| Concept | Description |
24+
| Topic | Description |
2225
| ---------------------------------------------------- | ------------------------------------------ |
2326
| **[Webhook](concept_webhook.md)** | What is it a 'Webhook' and why I need it? |
2427
| **[Subscriptions](concept_webhook_subscription.md)** | How does a subscription to an event works? |
@@ -32,6 +35,7 @@
3235
| **[Basic Usage - Sending Webhooks](basic_usage_send.md)** | Manually sending webhooks (no subscriptions) |
3336
| **[Basic Usage - Subscription Management](basic_usage_management.md)** | Manage subscriptions to events (no sending) |
3437
| **[Basic Usage - Notify Webhooks](basic_usage_notify.md)** | Notify webhooks subscribers (management, transformations and sending) |
38+
| **[Basic Usage - Receiving Webhooks](basic_usage_receive.md)** | Receive webhooks from external sources |
3539

3640
## Extending
3741

docs/basic_usage_receive.md

Lines changed: 128 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,128 @@
1+
# Receive Webhooks from External Sources
2+
3+
## Installations
4+
5+
When receiving webhooks from external sources, you can use the `Deveel.Webhooks.Receiver.AspNetCore` library, that allows the registration of a webhook receiver in an ASP.NET Core application.
6+
7+
To enable this function you must first install the NuGet package:
8+
9+
```bash
10+
dotnet add package Deveel.Webhooks.Receiver.AspNetCore
11+
```
12+
13+
14+
## Registering the Webhook Receiver
15+
16+
Then, in the `Startup` class of your application, you can register the webhook receiver as follows:
17+
18+
```csharp
19+
public class Startup {
20+
public void ConfigureServices(IServiceCollection services) {
21+
services.AddWebhooks<MyWebhook>();
22+
}
23+
}
24+
```
25+
26+
Or alternatively, if you are using the mininal API pattern, you can use the following code:
27+
28+
```csharp
29+
var builder = WebApplication.CreateBuilder(args);
30+
31+
builder.Services.AddWebhooks<MyWebhook>();
32+
```
33+
34+
This simple call registers the webhook receiver in the application, and allows to receive webhooks of type `MyWebhook`: receivers are segregated by the type of webhook they can handle, and you can register multiple receivers for different types of webhooks.
35+
36+
By default the registration of the webhook receiver adds a set of default services, that are required to handle the webhooks, such as the `IWebhookReceiver<MyWebhook>`, `IWebhookHandler<MyWebhook>`, `IWebhookJsonParser<MyWebhook>` and a default set of options: you can control further the services and configurations by using the builder instance returned by the `AddWebhooks` method.
37+
38+
## Receiving Webhooks - Using Controllers
39+
40+
Following the registration of the webhook receiver, you can receive webhooks by using the `IWebhookReceiver<MyWebhook>` service, that is registered in the application, if you want to handle the receive process directly.
41+
42+
This approach is typical in MVC APIs that implement the request processing in the controller, and can be used as follows:
43+
44+
```csharp
45+
namespace Demo {
46+
[ApiController]
47+
[Route("webhook")]
48+
public class WebhookController : ControllerBase {
49+
private readonly IWebhookReceiver<MyWebhook> webhookReceiver;
50+
private readonly IWebhookHandler<MyWebhook> webhookHandler;
51+
52+
public WebhookController(IWebhookReceiver<MyWebhook> webhookReceiver, IWebhookHandler<MyWebhook> webhookHandler) {
53+
this.webhookReceiver = webhookReceiver;
54+
this.webhookHandler = webhookHandler;
55+
}
56+
57+
[HttpPost]
58+
public async Task<IActionResult> ReceiveWebhook() {
59+
var result = await webhookReceiver.ReceiveAsync(Request, HttpContext.RequestAborted);
60+
if (!result.IsValid)
61+
return BadRequest(result.Error);
62+
63+
var webhook = result.Webhook;
64+
await webhookHandler.HandleAsync(webhook, HttpContext.RequestAborted);
65+
66+
return Ok();
67+
}
68+
}
69+
}
70+
```
71+
72+
Mind that in the above scenario you must also inject the `IWebhookHandler<MyWebhook>` service, that is used to handle the received webhook.
73+
74+
## Receiving Webhooks - Using Middleware
75+
76+
Alternatively the `Deveel.Webhooks.Receiver.AspNetCore` library provides a middleware that can be used to receive webhooks, and handle them automatically.
77+
78+
To use the middleware, you must first register it in the `Startup` class of your application:
79+
80+
```csharp
81+
public class Startup {
82+
public void ConfigureServices(IServiceCollection services) {
83+
services.AddWebhooks<MyWebhook>();
84+
}
85+
86+
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {
87+
app.UseWebhooks<MyWebhook>("/webhook");
88+
}
89+
}
90+
```
91+
92+
If you are using the minimal API pattern, you can use the following code:
93+
94+
```csharp
95+
96+
var builder = WebApplication.CreateBuilder(args);
97+
builder.Services.AddWebhooks<MyWebhook>();
98+
99+
var app = builder.Build();
100+
101+
app.UseWebhooks<MyWebhook>("/webhook");
102+
103+
app.Run();
104+
```
105+
106+
The above code registers the middleware in the application, and allows to receive webhooks of type `MyWebhook` at the `/webhook` endpoint, using the configurations defined when registering the receiver,
107+
108+
The middlware will automatically scan for all the registered webhook receivers, and will handle the received webhooks by using the `IWebhookHandler<MyWebhook>` service.
109+
110+
The middleware design allows to handle the webhooks without any prior registered handler, by specifying an handling delegate in the `UseWebhooks` method:
111+
112+
```csharp
113+
[...]
114+
115+
app.UseWebhooks<MyWebhook>("/webhook", (context, webhook, cancellationToken) => {
116+
// Handle the webhook here
117+
});
118+
```
119+
120+
Or a alternatively a synchronous handling delegate:
121+
122+
```csharp
123+
[...]
124+
125+
app.UseWebhooks<MyWebhook>("/webhook", (context, webhook) => {
126+
// Handle the webhook here
127+
});
128+
```

docs/getting_started.md

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616

1717
# Getting Started
1818

19-
The overall design of this little framework is open and extensible (implementing the traditional [Open-Closed Principle](https://en.wikipedia.org/wiki/Open%E2%80%93closed_principle)), that means base contracts can be extended, composed or replaced.
19+
The overall design of this framework is open and extensible (implementing the traditional [Open-Closed Principle](https://en.wikipedia.org/wiki/Open%E2%80%93closed_principle)), that means base contracts can be extended, composed or replaced.
2020

2121
It is possible to use its components as they are provided, or use the base contracts to extend single functions, while still using the rest of the provisioning.
2222

@@ -38,13 +38,13 @@ Or by editing your `.csproj` file and adding a `<PackageReference>` entry.
3838
<Project Sdk="Microsoft.NET.Sdk">
3939

4040
<PropertyGroup>
41-
<TargetFramework>netcoreapp3.1</TargetFramework>
41+
<TargetFramework>ne5.0</TargetFramework>
4242
...
4343

4444
</PropertyGroup>
4545

4646
<ItemGroup>
47-
<PackageReference Include="Deveel.Webhooks" Version="1.0.1-alpha1" />
47+
<PackageReference Include="Deveel.Webhooks" Version="1.1.6" />
4848
...
4949
</ItemGroup>
5050
</Project>
@@ -56,17 +56,17 @@ This provides all the functions that are needed to send webhooks to a given dest
5656

5757
The libraries currently provided by the framework are the following:
5858

59-
| Library | Description | NuGet |
60-
| ----------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- |
61-
| **Deveel.Webhooks.Model** | The foundation library that defines the webhooks information model | [Package](https://www.nuget.org/packages/Deveel.Webhooks.Model/) |
62-
| **Deveel.Webhooks** | Provides the foundation contracts of the webhook service and basic implementations for the sending functions | [Package](https://www.nuget.org/packages/Deveel.Webhooks/) |
63-
| **Deveel.Webhooks.Service** | Implements the functions to manage and resolve webhook subscriptions | [Package](https://www.nuget.org/packages/Deveel.Webhooks.Service/) |
64-
| **Deveel.Webhooks.Service.MongoDb** | An implementation of the webhoom management data layer that is backed by [MongoDB](https://mongodb.com) databases | [Package](https://www.nuget.org/packages/Deveel.Webhooks.MongoDb/) |
65-
| **Deveel.Webhooks.DynamicLinq** | The webhook subscription filtering engine that uses the [Dynamic LINQ](https://dynamic-linq.net/) expressions | [Package](https://www.nuget.org/packages/Deveel.Webhooks.DynamicLinq/) |
59+
| Library | Description | NuGet | GitHub (prerelease) |
60+
| ----------------------------------- | ----------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------- |---------------------|
61+
| **Deveel.Webhooks** | Provides the foundation contracts of the webhook service and basic implementations for the sending functions | ![Nuget](https://img.shields.io/nuget/dt/Deveel.Webhooks?label=Deveel.Webhooks&logo=nuget) | [![GitHub](https://img.shields.io/static/v1?label=Deveel.Webhooks&message=Pre-Release&color=yellow&logo=github)](https://github.com/deveel/deveel.webhooks/pkgs/nuget/Deveel.Webhooks) |
62+
| **Deveel.Webhooks.Service** | Implements the functions to manage and resolve webhook subscriptions | ![Nuget](https://img.shields.io/nuget/dt/Deveel.Webhooks.Service?label=Deveel.Webhooks.Service&logo=nuget)| [![GitHub](https://img.shields.io/static/v1?label=Deveel.Webhooks.Service&message=Pre-Release&color=yellow&logo=github)](https://github.com/deveel/deveel.webhooks/pkgs/nuget/Deveel.Webhooks.Service) |
63+
| **Deveel.Webhooks.MongoDb** | An implementation of the webhoom management data layer that is backed by [MongoDB](https://mongodb.com) databases | ![Nuget](https://img.shields.io/nuget/dt/Deveel.Webhooks.MongoDb?label=Deveel.Webhooks.MongoDb&logo=nuget) | [![GitHub](https://img.shields.io/static/v1?label=Deveel.Webhooks.MongoDb&message=Pre-Release&color=yellow&logo=github)](https://github.com/deveel/deveel.webhooks/pkgs/nuget/Deveel.Webhooks.MongoDb) |
64+
| **Deveel.Webhooks.DynamicLinq** | The webhook subscription filtering engine that uses the [Dynamic LINQ](https://dynamic-linq.net/) expressions | ![Nuget](https://img.shields.io/nuget/dt/Deveel.Webhooks.DynamicLinq?label=Deveel.Webhooks.DynamicLinq&logo=nuget) | [![GitHub](https://img.shields.io/static/v1?label=Deveel.Webhooks.DynamicLinq&message=Pre-Release&color=yellow&logo=github)](https://github.com/deveel/deveel.webhooks/pkgs/nuget/Deveel.Webhooks.DynamicLinq) |
65+
| **Deveel.Webhooks.Receiver.AspNetCore** | An implementation of the webhook receiver that is backed by [ASP.NET Core](https://dotnet.microsoft.com/apps/aspnet) | ![Nuget](https://img.shields.io/nuget/dt/Deveel.Webhooks?label=Deveel.Webhooks.Receiver.AspNetCore&logo=nuget) | [![GitHub](https://img.shields.io/static/v1?label=Deveel.Webhooks.Receiver.AspNetCore&message=Pre-Release&color=yellow&logo=github)](https://github.com/deveel/deveel.webhooks/pkgs/nuget/Deveel.Webhooks.Receiver.AspNetCore) |
6666

6767
You can obtain the stable versions of these libraries from the [NuGet Official](https://nuget.org) channel.
6868

69-
For the _nighly builds_ and previews you can restore from the [Deveel Package Manager](https://github.com/orgs/deveel/packages).
69+
To get the latest pre-release versions of the packages you can restore from the [Deveel Package Manager](https://github.com/orgs/deveel/packages).
7070

7171
## Adding the Webhook Service
7272

src/Deveel.Webhooks.DynamicLinq/Deveel.Webhooks.DynamicLinq.csproj

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,14 @@
22

33
<PropertyGroup>
44
<TargetFramework>net6.0</TargetFramework>
5-
<VersionPrefix>1.1.6</VersionPrefix>
5+
<VersionPrefix>1.1.7</VersionPrefix>
66
<RootNamespace>Deveel</RootNamespace>
77
<GeneratePackageOnBuild>false</GeneratePackageOnBuild>
88
<PackageRequireLicenseAcceptance>true</PackageRequireLicenseAcceptance>
99
<Authors>antonello</Authors>
10-
<Company>Deveel</Company>
10+
<Company>Deveel AS</Company>
1111
<Description>An engine of the Deveel Webhooks framework that uses the Dynamic LINQ expressions to evaluate filters</Description>
12-
<Copyright>Copyright (C) 2021-2022 Deveel</Copyright>
12+
<Copyright>Copyright (C) 2021-2023 Deveel AS</Copyright>
1313
<PackageLicenseFile>LICENSE</PackageLicenseFile>
1414
<PackageIcon>deveel-logo.png</PackageIcon>
1515
<RepositoryUrl>https://github.com/deveel/deveel.webhooks</RepositoryUrl>
@@ -22,7 +22,7 @@
2222
<Compile Remove="Webhooks\WebhookServiceBuilderExtensions.cs" />
2323
</ItemGroup>
2424

25-
<ItemGroup>
25+
<ItemGroup>
2626
<None Include="..\..\deveel-logo.png">
2727
<Pack>True</Pack>
2828
<PackagePath></PackagePath>
@@ -33,7 +33,11 @@
3333
</None>
3434
</ItemGroup>
3535

36-
<ItemGroup>
36+
<ItemGroup>
37+
<None Include="..\..\apl-2.licenseheader" Link="apl-2.licenseheader" />
38+
</ItemGroup>
39+
40+
<ItemGroup>
3741
<PackageReference Include="System.Linq.Dynamic.Core" Version="1.3.2" />
3842
</ItemGroup>
3943

0 commit comments

Comments
 (0)