webhooks finished
This commit is contained in:
parent
5b237b0a8b
commit
71e3839056
@ -22,12 +22,14 @@ namespace Webhooks.API.Services
|
|||||||
var client = _clientFactory.CreateClient("GrantClient");
|
var client = _clientFactory.CreateClient("GrantClient");
|
||||||
var msg = new HttpRequestMessage(HttpMethod.Options, url);
|
var msg = new HttpRequestMessage(HttpMethod.Options, url);
|
||||||
msg.Headers.Add("X-eshop-whtoken", token);
|
msg.Headers.Add("X-eshop-whtoken", token);
|
||||||
_logger.LogTrace($"Sending the OPTIONS message to {url} with token {token ?? string.Empty}");
|
_logger.LogInformation($"Sending the OPTIONS message to {url} with token {token ?? string.Empty}");
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
var response = await client.SendAsync(msg);
|
var response = await client.SendAsync(msg);
|
||||||
_logger.LogInformation($"Response code is {response.StatusCode} for url {url}");
|
var tokenReceived = response.Headers.TryGetValues("X-eshop-whtoken", out var tokenValues) ? tokenValues.FirstOrDefault() : null;
|
||||||
return response.IsSuccessStatusCode;
|
var tokenExpected = string.IsNullOrWhiteSpace(token) ? null : token;
|
||||||
|
_logger.LogInformation($"Response code is {response.StatusCode} for url {url} and token in header was {tokenReceived} (expected token was {tokenExpected})");
|
||||||
|
return response.IsSuccessStatusCode && tokenReceived == tokenExpected;
|
||||||
}
|
}
|
||||||
catch (Exception ex)
|
catch (Exception ex)
|
||||||
{
|
{
|
||||||
|
@ -7,6 +7,7 @@ using System.Collections.Generic;
|
|||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using WebhookClient.Models;
|
using WebhookClient.Models;
|
||||||
|
using WebhookClient.Services;
|
||||||
|
|
||||||
namespace WebhookClient.Controllers
|
namespace WebhookClient.Controllers
|
||||||
{
|
{
|
||||||
@ -17,15 +18,17 @@ namespace WebhookClient.Controllers
|
|||||||
|
|
||||||
private readonly Settings _settings;
|
private readonly Settings _settings;
|
||||||
private readonly ILogger _logger;
|
private readonly ILogger _logger;
|
||||||
|
private readonly IHooksRepository _hooksRepository;
|
||||||
|
|
||||||
public WebhooksReceivedController(IOptions<Settings> settings, ILogger<WebhooksReceivedController> logger)
|
public WebhooksReceivedController(IOptions<Settings> settings, ILogger<WebhooksReceivedController> logger, IHooksRepository hooksRepository)
|
||||||
{
|
{
|
||||||
_settings = settings.Value;
|
_settings = settings.Value;
|
||||||
_logger = logger;
|
_logger = logger;
|
||||||
|
_hooksRepository = hooksRepository;
|
||||||
}
|
}
|
||||||
|
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
public IActionResult NewWebhook(WebhookData hook)
|
public async Task<IActionResult> NewWebhook(WebhookData hook)
|
||||||
{
|
{
|
||||||
var header = Request.Headers[HeaderNames.WebHookCheckHeader];
|
var header = Request.Headers[HeaderNames.WebHookCheckHeader];
|
||||||
var token = header.FirstOrDefault();
|
var token = header.FirstOrDefault();
|
||||||
@ -34,16 +37,15 @@ namespace WebhookClient.Controllers
|
|||||||
|
|
||||||
if (!_settings.ValidateToken || _settings.Token == token)
|
if (!_settings.ValidateToken || _settings.Token == token)
|
||||||
{
|
{
|
||||||
_logger.LogInformation($"Received hook is processed");
|
_logger.LogInformation($"Received hook is going to be processed");
|
||||||
var received = HttpContext.Session.Get<IEnumerable<WebHookReceived>>(SessionKeys.HooksKey)?.ToList() ?? new List<WebHookReceived>();
|
|
||||||
var newHook = new WebHookReceived()
|
var newHook = new WebHookReceived()
|
||||||
{
|
{
|
||||||
Data = hook.Payload,
|
Data = hook.Payload,
|
||||||
When = hook.When,
|
When = hook.When,
|
||||||
Token = token
|
Token = token
|
||||||
};
|
};
|
||||||
received.Add(newHook);
|
await _hooksRepository.AddNew(newHook);
|
||||||
HttpContext.Session.Set<IEnumerable<WebHookReceived>>(SessionKeys.HooksKey, received);
|
_logger.LogInformation($"Received hook was processed.");
|
||||||
return Ok(newHook);
|
return Ok(newHook);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,24 +0,0 @@
|
|||||||
using Newtonsoft.Json;
|
|
||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace Microsoft.AspNetCore.Http
|
|
||||||
{
|
|
||||||
static class ISessionExtensions
|
|
||||||
{
|
|
||||||
public static void Set<T>(this ISession session, string key, T value)
|
|
||||||
{
|
|
||||||
session.SetString(key, JsonConvert.SerializeObject(value));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static T Get<T>(this ISession session, string key)
|
|
||||||
{
|
|
||||||
var value = session.GetString(key);
|
|
||||||
|
|
||||||
return value == null ? default(T) :
|
|
||||||
JsonConvert.DeserializeObject<T>(value);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -14,20 +14,18 @@
|
|||||||
}
|
}
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@if (User.Identity.IsAuthenticated)
|
<div class="table">
|
||||||
{
|
<h3>Current webhooks received</h3>
|
||||||
<div class="table">
|
<p>(Data since last time web started up)<p>
|
||||||
<h3>Current webhooks received</h3>
|
<table class="table">
|
||||||
<p>(Data since last time web started up)<p>
|
@foreach (var webhook in Model.WebHooksReceived)
|
||||||
<table class="table">
|
{
|
||||||
@foreach (var webhook in Model.WebHooksReceived)
|
<tr>
|
||||||
{
|
<td>@webhook.When</td>
|
||||||
<tr>
|
<td><pre>@webhook.Data</pre></td>
|
||||||
<td>@webhook.When</td>
|
<td>@(webhook.Token ?? "--None--")</td>
|
||||||
<td><pre>@webhook.Data</pre></td>
|
</tr>
|
||||||
<td>@(webhook.Token ?? "--None--")</td>
|
}
|
||||||
</tr>
|
</table>
|
||||||
}
|
</div>
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
}
|
|
||||||
|
@ -6,18 +6,25 @@ using Microsoft.AspNetCore.Mvc;
|
|||||||
using Microsoft.AspNetCore.Mvc.RazorPages;
|
using Microsoft.AspNetCore.Mvc.RazorPages;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
using WebhookClient.Models;
|
using WebhookClient.Models;
|
||||||
|
using WebhookClient.Services;
|
||||||
|
|
||||||
namespace WebhookClient.Pages
|
namespace WebhookClient.Pages
|
||||||
{
|
{
|
||||||
|
|
||||||
public class IndexModel : PageModel
|
public class IndexModel : PageModel
|
||||||
{
|
{
|
||||||
|
private readonly IHooksRepository _hooksRepository;
|
||||||
|
|
||||||
|
public IndexModel(IHooksRepository hooksRepository)
|
||||||
|
{
|
||||||
|
_hooksRepository = hooksRepository;
|
||||||
|
}
|
||||||
|
|
||||||
public IEnumerable<WebHookReceived> WebHooksReceived { get; private set; }
|
public IEnumerable<WebHookReceived> WebHooksReceived { get; private set; }
|
||||||
|
|
||||||
public void OnGet()
|
public async Task OnGet()
|
||||||
{
|
{
|
||||||
WebHooksReceived = HttpContext.Session.Get<IEnumerable<WebHookReceived>>(SessionKeys.HooksKey) ?? Enumerable.Empty<WebHookReceived>();
|
WebHooksReceived = await _hooksRepository.GetAll();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -5,6 +5,7 @@ using System.Net;
|
|||||||
using System.Net.Http;
|
using System.Net.Http;
|
||||||
using System.Net.Http.Formatting;
|
using System.Net.Http.Formatting;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
|
using Microsoft.AspNetCore.Authorization;
|
||||||
using Microsoft.AspNetCore.Hosting;
|
using Microsoft.AspNetCore.Hosting;
|
||||||
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Microsoft.AspNetCore.Mvc.RazorPages;
|
using Microsoft.AspNetCore.Mvc.RazorPages;
|
||||||
@ -13,6 +14,7 @@ using WebhookClient.Models;
|
|||||||
|
|
||||||
namespace WebhookClient.Pages
|
namespace WebhookClient.Pages
|
||||||
{
|
{
|
||||||
|
[Authorize]
|
||||||
|
|
||||||
public class RegisterWebhookModel : PageModel
|
public class RegisterWebhookModel : PageModel
|
||||||
{
|
{
|
||||||
|
14
src/Web/WebhookClient/Services/IHooksRepository.cs
Normal file
14
src/Web/WebhookClient/Services/IHooksRepository.cs
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using WebhookClient.Models;
|
||||||
|
|
||||||
|
namespace WebhookClient.Services
|
||||||
|
{
|
||||||
|
public interface IHooksRepository
|
||||||
|
{
|
||||||
|
Task<IEnumerable<WebHookReceived>> GetAll();
|
||||||
|
Task AddNew(WebHookReceived hook);
|
||||||
|
}
|
||||||
|
}
|
26
src/Web/WebhookClient/Services/InMemoryHooksRepository.cs
Normal file
26
src/Web/WebhookClient/Services/InMemoryHooksRepository.cs
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.Linq;
|
||||||
|
using System.Threading.Tasks;
|
||||||
|
using WebhookClient.Models;
|
||||||
|
|
||||||
|
namespace WebhookClient.Services
|
||||||
|
{
|
||||||
|
public class InMemoryHooksRepository : IHooksRepository
|
||||||
|
{
|
||||||
|
private readonly List<WebHookReceived> _data;
|
||||||
|
|
||||||
|
public InMemoryHooksRepository() => _data = new List<WebHookReceived>();
|
||||||
|
|
||||||
|
public Task AddNew(WebHookReceived hook)
|
||||||
|
{
|
||||||
|
_data.Add(hook);
|
||||||
|
return Task.CompletedTask;
|
||||||
|
}
|
||||||
|
|
||||||
|
public Task<IEnumerable<WebHookReceived>> GetAll()
|
||||||
|
{
|
||||||
|
return Task.FromResult(_data.AsEnumerable());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -1,12 +0,0 @@
|
|||||||
using System;
|
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Linq;
|
|
||||||
using System.Threading.Tasks;
|
|
||||||
|
|
||||||
namespace WebhookClient
|
|
||||||
{
|
|
||||||
static class SessionKeys
|
|
||||||
{
|
|
||||||
public const string HooksKey = "webhooks.received";
|
|
||||||
}
|
|
||||||
}
|
|
@ -35,6 +35,7 @@ namespace WebhookClient
|
|||||||
.AddHttpClientServices(Configuration)
|
.AddHttpClientServices(Configuration)
|
||||||
.AddCustomAuthentication(Configuration)
|
.AddCustomAuthentication(Configuration)
|
||||||
.AddTransient<IWebhooksClient, WebhooksClient>()
|
.AddTransient<IWebhooksClient, WebhooksClient>()
|
||||||
|
.AddSingleton<IHooksRepository, InMemoryHooksRepository>()
|
||||||
.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
|
.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -67,8 +68,13 @@ namespace WebhookClient
|
|||||||
var validateToken = bool.TrueString.Equals(Configuration["ValidateToken"], StringComparison.InvariantCultureIgnoreCase);
|
var validateToken = bool.TrueString.Equals(Configuration["ValidateToken"], StringComparison.InvariantCultureIgnoreCase);
|
||||||
var header = context.Request.Headers[HeaderNames.WebHookCheckHeader];
|
var header = context.Request.Headers[HeaderNames.WebHookCheckHeader];
|
||||||
var value = header.FirstOrDefault();
|
var value = header.FirstOrDefault();
|
||||||
if (!validateToken || value == Configuration["Token"])
|
var tokenToValidate = Configuration["Token"];
|
||||||
|
if (!validateToken || value == tokenToValidate)
|
||||||
{
|
{
|
||||||
|
if (!string.IsNullOrWhiteSpace(tokenToValidate))
|
||||||
|
{
|
||||||
|
context.Response.Headers.Add(HeaderNames.WebHookCheckHeader, tokenToValidate);
|
||||||
|
}
|
||||||
context.Response.StatusCode = (int)HttpStatusCode.OK;
|
context.Response.StatusCode = (int)HttpStatusCode.OK;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
Loading…
x
Reference in New Issue
Block a user