Browse Source

Merge pull request #571 from colinin/5.2.0

feat(webhooks): 查询完整的请求记录
pull/580/head
yx lin 4 years ago
committed by GitHub
parent
commit
b5aa59612a
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 3
      apps/vue/src/api/webhooks/model/sendAttemptsModel.ts
  2. 9
      apps/vue/src/views/webhooks/send-attempts/components/SendAttemptModal.vue
  3. 7
      aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application.Contracts/LINGYUN/Abp/WebhooksManagement/WebhookSendRecordDto.cs
  4. 15
      aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application/LINGYUN/Abp/WebhooksManagement/Extensions/WebhookEventRecordExtensions.cs
  5. 52
      aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application/LINGYUN/Abp/WebhooksManagement/Extensions/WebhookSendRecordExtensions.cs
  6. 6
      aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application/LINGYUN/Abp/WebhooksManagement/WebhookSendRecordAppService.cs
  7. 4
      aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Domain.Shared/LINGYUN/Abp/WebhooksManagement/Localization/Resources/en.json
  8. 4
      aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Domain.Shared/LINGYUN/Abp/WebhooksManagement/Localization/Resources/zh-Hans.json

3
apps/vue/src/api/webhooks/model/sendAttemptsModel.ts

@ -17,6 +17,9 @@ export interface WebhookSendAttempt {
responseStatusCode?: HttpStatusCode;
creationTime: Date;
lastModificationTime?: Date;
sendExactSameData: boolean;
requestHeaders: Record<string, string>;
responseHeaders: Record<string, string>;
webhookEvent: WebhookEvent;
}

9
apps/vue/src/views/webhooks/send-attempts/components/SendAttemptModal.vue

@ -19,12 +19,21 @@
<FormItem :label="L('DisplayName:TenantId')">
<Input readonly :value="getTenant" />
</FormItem>
<FormItem :label="L('DisplayName:SendExactSameData')">
<Checkbox disabled v-model:checked="modelRef.sendExactSameData">{{ L('DisplayName:SendExactSameData') }}</Checkbox>
</FormItem>
<FormItem :label="L('DisplayName:CreationTime')">
<Input readonly :value="getDateTime(modelRef.creationTime)" />
</FormItem>
<FormItem :label="L('DisplayName:RequestHeaders')">
<CodeEditor readonly style="height: 300px;" :mode="MODE.JSON" v-model:value="modelRef.requestHeaders" />
</FormItem>
<FormItem :label="L('DisplayName:ResponseStatusCode')">
<Tag v-if="modelRef.responseStatusCode" :color="getHttpStatusColor(modelRef.responseStatusCode)">{{ httpStatusCodeMap[modelRef.responseStatusCode] }}</Tag>
</FormItem>
<FormItem :label="L('DisplayName:ResponseHeaders')">
<CodeEditor readonly style="height: 300px;" :mode="MODE.JSON" v-model:value="modelRef.responseHeaders" />
</FormItem>
<FormItem :label="L('DisplayName:Response')">
<TextArea readonly v-model:value="modelRef.response" :auto-size="{ minRows: 10 }" />
</FormItem>

7
aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application.Contracts/LINGYUN/Abp/WebhooksManagement/WebhookSendRecordDto.cs

@ -1,4 +1,5 @@
using System;
using System.Collections.Generic;
using System.Net;
using Volo.Abp.Application.Dtos;
@ -20,5 +21,11 @@ public class WebhookSendRecordDto : EntityDto<Guid>
public DateTime? LastModificationTime { get; set; }
public bool SendExactSameData { get; set; }
public IDictionary<string, string> RequestHeaders { get; set; } = new Dictionary<string, string>();
public IDictionary<string, string> ResponseHeaders { get; set; } = new Dictionary<string, string>();
public WebhookEventRecordDto WebhookEvent { get; set; } = new WebhookEventRecordDto();
}

15
aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application/LINGYUN/Abp/WebhooksManagement/Extensions/WebhookEventRecordExtensions.cs

@ -0,0 +1,15 @@
namespace LINGYUN.Abp.WebhooksManagement.Extensions;
public static class WebhookEventRecordExtensions
{
public static WebhookEventRecordDto ToWebhookEventRecordDto(this WebhookEventRecord eventRecord)
{
return new WebhookEventRecordDto
{
Id = eventRecord.Id,
CreationTime = eventRecord.CreationTime,
Data = eventRecord.Data,
TenantId = eventRecord.TenantId,
WebhookName = eventRecord.WebhookName
};
}
}

52
aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application/LINGYUN/Abp/WebhooksManagement/Extensions/WebhookSendRecordExtensions.cs

@ -0,0 +1,52 @@
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
namespace LINGYUN.Abp.WebhooksManagement.Extensions;
public static class WebhookSendRecordExtensions
{
public static WebhookSendRecordDto ToWebhookSendRecordDto(this WebhookSendRecord sendRecord)
{
var dto = new WebhookSendRecordDto
{
Id = sendRecord.Id,
TenantId = sendRecord.TenantId,
CreationTime = sendRecord.CreationTime,
ResponseStatusCode = sendRecord.ResponseStatusCode,
SendExactSameData = sendRecord.SendExactSameData,
WebhookEventId = sendRecord.WebhookEventId,
WebhookSubscriptionId = sendRecord.WebhookSubscriptionId,
LastModificationTime = sendRecord.LastModificationTime,
RequestHeaders = sendRecord.GetRequestHeaders(),
ResponseHeaders = sendRecord.GetResponseHeaders(),
Response = sendRecord.Response,
};
if (sendRecord.WebhookEvent != null)
{
dto.WebhookEvent = sendRecord.WebhookEvent.ToWebhookEventRecordDto();
}
return dto;
}
public static IDictionary<string, string> GetRequestHeaders(this WebhookSendRecord sendRecord)
{
if (sendRecord.RequestHeaders.IsNullOrWhiteSpace())
{
return new Dictionary<string, string>();
}
return JsonConvert.DeserializeObject<Dictionary<string, string>>(sendRecord.RequestHeaders);
}
public static IDictionary<string, string> GetResponseHeaders(this WebhookSendRecord sendRecord)
{
if (sendRecord.ResponseHeaders.IsNullOrWhiteSpace())
{
return new Dictionary<string, string>();
}
return JsonConvert.DeserializeObject<Dictionary<string, string>>(sendRecord.ResponseHeaders);
}
}

6
aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Application/LINGYUN/Abp/WebhooksManagement/WebhookSendRecordAppService.cs

@ -1,9 +1,11 @@
using LINGYUN.Abp.Webhooks;
using LINGYUN.Abp.WebhooksManagement.Authorization;
using LINGYUN.Abp.WebhooksManagement.Extensions;
using Microsoft.AspNetCore.Authorization;
using Newtonsoft.Json;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.BackgroundJobs;
@ -30,7 +32,7 @@ public class WebhookSendRecordAppService : WebhooksManagementAppServiceBase, IWe
{
var sendRecord = await RecordRepository.GetAsync(id);
return ObjectMapper.Map<WebhookSendRecord, WebhookSendRecordDto>(sendRecord);
return sendRecord.ToWebhookSendRecordDto();
}
[Authorize(WebhooksManagementPermissions.WebhooksSendAttempts.Delete)]
@ -58,7 +60,7 @@ public class WebhookSendRecordAppService : WebhooksManagementAppServiceBase, IWe
input.Sorting, input.MaxResultCount, input.SkipCount);
return new PagedResultDto<WebhookSendRecordDto>(totalCount,
ObjectMapper.Map<List<WebhookSendRecord>, List<WebhookSendRecordDto>>(sendRecords));
sendRecords.Select(sendRecord => sendRecord.ToWebhookSendRecordDto()).ToList());
}
[Authorize(WebhooksManagementPermissions.WebhooksSendAttempts.Resend)]

4
aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Domain.Shared/LINGYUN/Abp/WebhooksManagement/Localization/Resources/en.json

@ -46,6 +46,8 @@
"DisplayName:Secret": "Secret",
"DisplayName:IsActive": "Is Active",
"DisplayName:Webhooks": "Webhooks",
"DisplayName:Headers": "Headers"
"DisplayName:Headers": "Headers",
"DisplayName:RequestHeaders": "Request Headers",
"DisplayName:ResponseHeaders": "Response Headers"
}
}

4
aspnet-core/modules/webhooks/LINGYUN.Abp.WebhooksManagement.Domain.Shared/LINGYUN/Abp/WebhooksManagement/Localization/Resources/zh-Hans.json

@ -46,6 +46,8 @@
"DisplayName:Secret": "密钥",
"DisplayName:IsActive": "是否启用",
"DisplayName:Webhooks": "事件列表",
"DisplayName:Headers": "发送标头"
"DisplayName:Headers": "发送标头",
"DisplayName:RequestHeaders": "请求标头",
"DisplayName:ResponseHeaders": "响应标头"
}
}
Loading…
Cancel
Save