Browse Source

feat(webhooks): add a client proxy publishing module to address layered module calls

pull/532/head
cKey 4 years ago
parent
commit
3e7c232e76
  1. 16
      aspnet-core/modules/webhooks/LINGYUN.Abp.WebHooks.ClientProxies/LINGYUN.Abp.WebHooks.ClientProxies.csproj
  2. 10
      aspnet-core/modules/webhooks/LINGYUN.Abp.WebHooks.ClientProxies/LINGYUN/Abp/WebHooks/ClientProxies/AbpWebHooksClientProxiesModule.cs
  3. 91
      aspnet-core/modules/webhooks/LINGYUN.Abp.WebHooks.ClientProxies/LINGYUN/Abp/WebHooks/ClientProxies/ClientProxiesWebhookPublisher.cs
  4. 35
      aspnet-core/modules/webhooks/LINGYUN.Abp.WebHooks/LINGYUN/Abp/Webhooks/DefaultWebhookPublisher.cs
  5. 5
      aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application.Contracts/LINGYUN/Abp/WebhooksManagement/Authorization/WebhooksManagementPermissionDefinitionProvider.cs
  6. 5
      aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application.Contracts/LINGYUN/Abp/WebhooksManagement/Authorization/WebhooksManagementPermissions.cs
  7. 9
      aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application.Contracts/LINGYUN/Abp/WebhooksManagement/IWebhooksPublishAppService.cs
  8. 2
      aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application.Contracts/LINGYUN/Abp/WebhooksManagement/WebhooksManagementRemoteServiceConsts.cs
  9. 30
      aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application.Contracts/LINGYUN/Abp/WebhooksManagement/WebhooksPublishInput.cs
  10. 45
      aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application/LINGYUN/Abp/WebhooksManagement/WebhooksPublishAppService.cs
  11. 2
      aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Domain/LINGYUN.Abp.WebhooksManagement.Domain.csproj
  12. 27
      aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.HttpApi/LINGYUN/Abp/WebhooksManagement/WebhooksPublishController.cs

16
aspnet-core/modules/webhooks/LINGYUN.Abp.WebHooks.ClientProxies/LINGYUN.Abp.WebHooks.ClientProxies.csproj

@ -0,0 +1,16 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\configureawait.props" />
<Import Project="..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>netstandard2.0</TargetFramework>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\LINGYUN.Abp.WebhooksManagement.HttpApi.Client\LINGYUN.Abp.WebhooksManagement.HttpApi.Client.csproj" />
<ProjectReference Include="..\LINGYUN.Abp.Webhooks\LINGYUN.Abp.Webhooks.csproj" />
</ItemGroup>
</Project>

10
aspnet-core/modules/webhooks/LINGYUN.Abp.WebHooks.ClientProxies/LINGYUN/Abp/WebHooks/ClientProxies/AbpWebHooksClientProxiesModule.cs

@ -0,0 +1,10 @@
using LINGYUN.Abp.WebhooksManagement;
using Volo.Abp.Modularity;
namespace LINGYUN.Abp.Webhooks.ClientProxies;
[DependsOn(typeof(AbpWebhooksModule))]
[DependsOn(typeof(WebhooksManagementHttpApiClientModule))]
public class AbpWebHooksClientProxiesModule : AbpModule
{
}

91
aspnet-core/modules/webhooks/LINGYUN.Abp.WebHooks.ClientProxies/LINGYUN/Abp/WebHooks/ClientProxies/ClientProxiesWebhookPublisher.cs

@ -0,0 +1,91 @@
using LINGYUN.Abp.WebhooksManagement;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.DependencyInjection;
namespace LINGYUN.Abp.Webhooks.ClientProxies;
[Dependency(ReplaceServices = true)]
public class ClientProxiesWebhookPublisher : IWebhookPublisher, ITransientDependency
{
protected IWebhooksPublishAppService PublishAppService { get; }
public ClientProxiesWebhookPublisher(
IWebhooksPublishAppService publishAppService)
{
PublishAppService = publishAppService;
}
public async virtual Task PublishAsync(string webhookName, object data, bool sendExactSameData = false, WebhookHeader headers = null)
{
var input = new WebhooksPublishInput
{
WebhookName = webhookName,
Data = JsonConvert.SerializeObject(data),
SendExactSameData = sendExactSameData,
};
if (headers != null)
{
input.Header = new WebhooksHeaderInput
{
UseOnlyGivenHeaders = headers.UseOnlyGivenHeaders,
Headers = headers.Headers
};
}
await PublishAsync(input);
}
public async virtual Task PublishAsync(string webhookName, object data, Guid? tenantId, bool sendExactSameData = false, WebhookHeader headers = null)
{
var input = new WebhooksPublishInput
{
WebhookName = webhookName,
Data = JsonConvert.SerializeObject(data),
SendExactSameData = sendExactSameData,
TenantIds = new List<Guid?>
{
tenantId
},
};
if (headers != null)
{
input.Header = new WebhooksHeaderInput
{
UseOnlyGivenHeaders = headers.UseOnlyGivenHeaders,
Headers = headers.Headers
};
}
await PublishAsync(input);
}
public async virtual Task PublishAsync(Guid?[] tenantIds, string webhookName, object data, bool sendExactSameData = false, WebhookHeader headers = null)
{
var input = new WebhooksPublishInput
{
WebhookName = webhookName,
Data = JsonConvert.SerializeObject(data),
SendExactSameData = sendExactSameData,
TenantIds = tenantIds.ToList(),
};
if (headers != null)
{
input.Header = new WebhooksHeaderInput
{
UseOnlyGivenHeaders = headers.UseOnlyGivenHeaders,
Headers = headers.Headers
};
}
await PublishAsync(input);
}
protected virtual async Task PublishAsync(WebhooksPublishInput input)
{
await PublishAppService.PublishAsync(input);
}
}

35
aspnet-core/modules/webhooks/LINGYUN.Abp.WebHooks/LINGYUN/Abp/Webhooks/DefaultWebhookPublisher.cs

@ -33,28 +33,45 @@ namespace LINGYUN.Abp.Webhooks
}
#region Async Publish Methods
public virtual async Task PublishAsync(string webhookName, object data, bool sendExactSameData = false, WebhookHeader headers = null)
public virtual async Task PublishAsync(
string webhookName,
object data,
bool sendExactSameData = false,
WebhookHeader headers = null)
{
var subscriptions = await _webhookSubscriptionManager.GetAllSubscriptionsIfFeaturesGrantedAsync(_currentTenant.Id, webhookName);
await PublishAsync(webhookName, data, subscriptions, sendExactSameData, headers);
}
public virtual async Task PublishAsync(string webhookName, object data, Guid? tenantId,
bool sendExactSameData = false, WebhookHeader headers = null)
public virtual async Task PublishAsync(
string webhookName,
object data,
Guid? tenantId,
bool sendExactSameData = false,
WebhookHeader headers = null)
{
var subscriptions = await _webhookSubscriptionManager.GetAllSubscriptionsIfFeaturesGrantedAsync(tenantId, webhookName);
await PublishAsync(webhookName, data, subscriptions, sendExactSameData, headers);
}
public virtual async Task PublishAsync(Guid?[] tenantIds, string webhookName, object data,
bool sendExactSameData = false, WebhookHeader headers = null)
public virtual async Task PublishAsync(
Guid?[] tenantIds,
string webhookName,
object data,
bool sendExactSameData = false,
WebhookHeader headers = null)
{
var subscriptions = await _webhookSubscriptionManager.GetAllSubscriptionsOfTenantsIfFeaturesGrantedAsync(tenantIds, webhookName);
await PublishAsync(webhookName, data, subscriptions, sendExactSameData, headers);
}
private async Task PublishAsync(string webhookName, object data, List<WebhookSubscriptionInfo> webhookSubscriptions,
bool sendExactSameData = false, WebhookHeader headers = null)
protected virtual async Task PublishAsync(
string webhookName,
object data,
List<WebhookSubscriptionInfo> webhookSubscriptions,
bool sendExactSameData = false,
WebhookHeader headers = null)
{
if (webhookSubscriptions.IsNullOrEmpty())
{
@ -104,7 +121,9 @@ namespace LINGYUN.Abp.Webhooks
#endregion
protected virtual async Task<WebhookEvent> SaveAndGetWebhookAsync(Guid? tenantId, string webhookName,
protected virtual async Task<WebhookEvent> SaveAndGetWebhookAsync(
Guid? tenantId,
string webhookName,
object data)
{
var webhookInfo = new WebhookEvent

5
aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application.Contracts/LINGYUN/Abp/WebhooksManagement/Authorization/WebhooksManagementPermissionDefinitionProvider.cs

@ -10,6 +10,11 @@ public class WebhooksManagementPermissionDefinitionProvider : PermissionDefiniti
{
var group = context.AddGroup(WebhooksManagementPermissions.GroupName, L("Permission:WebhooksManagement"));
group.AddPermission(
WebhooksManagementPermissions.Publish,
L("Permission:Publish"))
.WithProviders(ClientPermissionValueProvider.ProviderName);
group.AddPermission(
WebhooksManagementPermissions.ManageSettings,
L("Permission:ManageSettings"));

5
aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application.Contracts/LINGYUN/Abp/WebhooksManagement/Authorization/WebhooksManagementPermissions.cs

@ -4,5 +4,10 @@ public static class WebhooksManagementPermissions
{
public const string GroupName = "WebhooksManagement";
/// <summary>
/// 授权允许发布Webhooks事件, 建议客户端授权
/// </summary>
public const string Publish = GroupName + ".Publish";
public const string ManageSettings = GroupName + ".ManageSettings";
}

9
aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application.Contracts/LINGYUN/Abp/WebhooksManagement/IWebhooksPublishAppService.cs

@ -0,0 +1,9 @@
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
namespace LINGYUN.Abp.WebhooksManagement;
public interface IWebhooksPublishAppService : IApplicationService
{
Task PublishAsync(WebhooksPublishInput input);
}

2
aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application.Contracts/LINGYUN/Abp/WebhooksManagement/WebhooksManagementRemoteServiceConsts.cs

@ -3,5 +3,5 @@
public static class WebhooksManagementRemoteServiceConsts
{
public const string RemoteServiceName = "WebhooksManagement";
public const string ModuleName = "WebhooksManagement";
public const string ModuleName = "webhooks-management";
}

30
aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application.Contracts/LINGYUN/Abp/WebhooksManagement/WebhooksPublishInput.cs

@ -0,0 +1,30 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Validation;
namespace LINGYUN.Abp.WebhooksManagement;
public class WebhooksPublishInput
{
[Required]
[DynamicStringLength(typeof(WebhookEventRecordConsts), nameof(WebhookEventRecordConsts.MaxWebhookNameLength))]
public string WebhookName { get; set; }
[Required]
[DynamicStringLength(typeof(WebhookEventRecordConsts), nameof(WebhookEventRecordConsts.MaxDataLength))]
public string Data { get; set; }
public bool SendExactSameData { get; set; }
public WebhooksHeaderInput Header { get; set; } = new WebhooksHeaderInput();
public List<Guid?> TenantIds { get; set; } = new List<Guid?>();
}
public class WebhooksHeaderInput
{
public bool UseOnlyGivenHeaders { get; set; }
public IDictionary<string, string> Headers { get; set; } = new Dictionary<string, string>();
}

45
aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application/LINGYUN/Abp/WebhooksManagement/WebhooksPublishAppService.cs

@ -0,0 +1,45 @@
using LINGYUN.Abp.Webhooks;
using LINGYUN.Abp.WebhooksManagement.Authorization;
using Microsoft.AspNetCore.Authorization;
using Newtonsoft.Json;
using System.Linq;
using System.Threading.Tasks;
namespace LINGYUN.Abp.WebhooksManagement;
[Authorize(WebhooksManagementPermissions.Publish)]
public class WebhooksPublishAppService : WebhooksManagementAppServiceBase, IWebhooksPublishAppService
{
protected IWebhookPublisher InnerPublisher { get; }
public WebhooksPublishAppService(IWebhookPublisher innerPublisher)
{
InnerPublisher = innerPublisher;
}
public async virtual Task PublishAsync(WebhooksPublishInput input)
{
var webhookHeader = new WebhookHeader
{
UseOnlyGivenHeaders = input.Header.UseOnlyGivenHeaders,
Headers = input.Header.Headers,
};
var inputData = JsonConvert.DeserializeObject(input.Data);
if (input.TenantIds.Any())
{
await InnerPublisher.PublishAsync(
input.TenantIds.ToArray(),
input.WebhookName,
inputData,
input.SendExactSameData,
webhookHeader);
return;
}
await InnerPublisher.PublishAsync(
input.WebhookName,
inputData,
input.SendExactSameData,
webhookHeader);
}
}

2
aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Domain/LINGYUN.Abp.WebhooksManagement.Domain.csproj

@ -16,7 +16,7 @@
<ItemGroup>
<ProjectReference Include="..\LINGYUN.Abp.WebhooksManagement.Domain.Shared\LINGYUN.Abp.WebhooksManagement.Domain.Shared.csproj" />
<ProjectReference Include="..\LINGYUN.Abp.WebHooks\LINGYUN.Abp.WebHooks.csproj" />
<ProjectReference Include="..\LINGYUN.Abp.Webhooks\LINGYUN.Abp.Webhooks.csproj" />
</ItemGroup>
</Project>

27
aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.HttpApi/LINGYUN/Abp/WebhooksManagement/WebhooksPublishController.cs

@ -0,0 +1,27 @@
using LINGYUN.Abp.WebhooksManagement.Authorization;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
using Volo.Abp;
namespace LINGYUN.Abp.WebhooksManagement;
[RemoteService(Name = WebhooksManagementRemoteServiceConsts.RemoteServiceName)]
[Area(WebhooksManagementRemoteServiceConsts.ModuleName)]
[Authorize(WebhooksManagementPermissions.Publish)]
[Route("api/webhooks/publish")]
public class WebhooksPublishController : WebhooksManagementControllerBase, IWebhooksPublishAppService
{
protected IWebhooksPublishAppService PublishAppService { get; }
public WebhooksPublishController(IWebhooksPublishAppService publishAppService)
{
PublishAppService = publishAppService;
}
[HttpPost]
public virtual Task PublishAsync(WebhooksPublishInput input)
{
return PublishAppService.PublishAsync(input);
}
}
Loading…
Cancel
Save