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 msg = new HttpRequestMessage(HttpMethod.Options, url);
|
||||
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
|
||||
{
|
||||
var response = await client.SendAsync(msg);
|
||||
_logger.LogInformation($"Response code is {response.StatusCode} for url {url}");
|
||||
return response.IsSuccessStatusCode;
|
||||
var tokenReceived = response.Headers.TryGetValues("X-eshop-whtoken", out var tokenValues) ? tokenValues.FirstOrDefault() : null;
|
||||
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)
|
||||
{
|
||||
|
@ -7,6 +7,7 @@ using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Threading.Tasks;
|
||||
using WebhookClient.Models;
|
||||
using WebhookClient.Services;
|
||||
|
||||
namespace WebhookClient.Controllers
|
||||
{
|
||||
@ -17,15 +18,17 @@ namespace WebhookClient.Controllers
|
||||
|
||||
private readonly Settings _settings;
|
||||
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;
|
||||
_logger = logger;
|
||||
_hooksRepository = hooksRepository;
|
||||
}
|
||||
|
||||
[HttpPost]
|
||||
public IActionResult NewWebhook(WebhookData hook)
|
||||
public async Task<IActionResult> NewWebhook(WebhookData hook)
|
||||
{
|
||||
var header = Request.Headers[HeaderNames.WebHookCheckHeader];
|
||||
var token = header.FirstOrDefault();
|
||||
@ -34,16 +37,15 @@ namespace WebhookClient.Controllers
|
||||
|
||||
if (!_settings.ValidateToken || _settings.Token == token)
|
||||
{
|
||||
_logger.LogInformation($"Received hook is processed");
|
||||
var received = HttpContext.Session.Get<IEnumerable<WebHookReceived>>(SessionKeys.HooksKey)?.ToList() ?? new List<WebHookReceived>();
|
||||
_logger.LogInformation($"Received hook is going to be processed");
|
||||
var newHook = new WebHookReceived()
|
||||
{
|
||||
Data = hook.Payload,
|
||||
When = hook.When,
|
||||
Token = token
|
||||
};
|
||||
received.Add(newHook);
|
||||
HttpContext.Session.Set<IEnumerable<WebHookReceived>>(SessionKeys.HooksKey, received);
|
||||
await _hooksRepository.AddNew(newHook);
|
||||
_logger.LogInformation($"Received hook was processed.");
|
||||
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>
|
||||
|
||||
@if (User.Identity.IsAuthenticated)
|
||||
{
|
||||
<div class="table">
|
||||
<h3>Current webhooks received</h3>
|
||||
<p>(Data since last time web started up)<p>
|
||||
<table class="table">
|
||||
@foreach (var webhook in Model.WebHooksReceived)
|
||||
{
|
||||
<tr>
|
||||
<td>@webhook.When</td>
|
||||
<td><pre>@webhook.Data</pre></td>
|
||||
<td>@(webhook.Token ?? "--None--")</td>
|
||||
</tr>
|
||||
}
|
||||
</table>
|
||||
</div>
|
||||
}
|
||||
<div class="table">
|
||||
<h3>Current webhooks received</h3>
|
||||
<p>(Data since last time web started up)<p>
|
||||
<table class="table">
|
||||
@foreach (var webhook in Model.WebHooksReceived)
|
||||
{
|
||||
<tr>
|
||||
<td>@webhook.When</td>
|
||||
<td><pre>@webhook.Data</pre></td>
|
||||
<td>@(webhook.Token ?? "--None--")</td>
|
||||
</tr>
|
||||
}
|
||||
</table>
|
||||
</div>
|
||||
|
||||
|
@ -6,18 +6,25 @@ using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.Mvc.RazorPages;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
using WebhookClient.Models;
|
||||
using WebhookClient.Services;
|
||||
|
||||
namespace WebhookClient.Pages
|
||||
{
|
||||
|
||||
public class IndexModel : PageModel
|
||||
{
|
||||
private readonly IHooksRepository _hooksRepository;
|
||||
|
||||
public IndexModel(IHooksRepository hooksRepository)
|
||||
{
|
||||
_hooksRepository = hooksRepository;
|
||||
}
|
||||
|
||||
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.Formatting;
|
||||
using System.Threading.Tasks;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Hosting;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.AspNetCore.Mvc.RazorPages;
|
||||
@ -13,6 +14,7 @@ using WebhookClient.Models;
|
||||
|
||||
namespace WebhookClient.Pages
|
||||
{
|
||||
[Authorize]
|
||||
|
||||
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)
|
||||
.AddCustomAuthentication(Configuration)
|
||||
.AddTransient<IWebhooksClient, WebhooksClient>()
|
||||
.AddSingleton<IHooksRepository, InMemoryHooksRepository>()
|
||||
.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
|
||||
}
|
||||
|
||||
@ -67,8 +68,13 @@ namespace WebhookClient
|
||||
var validateToken = bool.TrueString.Equals(Configuration["ValidateToken"], StringComparison.InvariantCultureIgnoreCase);
|
||||
var header = context.Request.Headers[HeaderNames.WebHookCheckHeader];
|
||||
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;
|
||||
}
|
||||
else
|
||||
|
Loading…
x
Reference in New Issue
Block a user