WIP
This commit is contained in:
		
							parent
							
								
									586c6de020
								
							
						
					
					
						commit
						485bb9e4a9
					
				| @ -403,5 +403,6 @@ services: | ||||
|       - IdentityUrl=http://10.0.75.1:5105 | ||||
|       - CallBackUrl=http://localhost:5114 | ||||
|       - WebhooksUrl=http://webhooks.api | ||||
|       - SelfUrl=http://webhooks.client/ | ||||
|     ports: | ||||
|       - "5114:80" | ||||
| @ -0,0 +1,22 @@ | ||||
| using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Events; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
| 
 | ||||
| namespace Webhooks.API.IntegrationEvents | ||||
| { | ||||
|     public class OrderStatusChangedToShippedIntegrationEvent : IntegrationEvent | ||||
|     { | ||||
|         public int OrderId { get; private set; } | ||||
|         public string OrderStatus { get; private set; } | ||||
|         public string BuyerName { get; private set; } | ||||
| 
 | ||||
|         public OrderStatusChangedToShippedIntegrationEvent(int orderId, string orderStatus, string buyerName) | ||||
|         { | ||||
|             OrderId = orderId; | ||||
|             OrderStatus = orderStatus; | ||||
|             BuyerName = buyerName; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,29 @@ | ||||
| using Microsoft.eShopOnContainers.BuildingBlocks.EventBus.Abstractions; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
| using Webhooks.API.Model; | ||||
| using Webhooks.API.Services; | ||||
| 
 | ||||
| namespace Webhooks.API.IntegrationEvents | ||||
| { | ||||
|     public class OrderStatusChangedToShippedIntegrationEventHandler : IIntegrationEventHandler<OrderStatusChangedToShippedIntegrationEvent> | ||||
|     { | ||||
|         private readonly IWebhooksRetriever _retriever; | ||||
|         private readonly IWebhooksSender _sender; | ||||
|         public OrderStatusChangedToShippedIntegrationEventHandler(IWebhooksRetriever retriever, IWebhooksSender sender ) | ||||
|         { | ||||
|             _retriever = retriever; | ||||
|             _sender = sender; | ||||
|         } | ||||
| 
 | ||||
|         public async Task Handle(OrderStatusChangedToShippedIntegrationEvent @event) | ||||
|         { | ||||
|             var subscriptions = await _retriever.GetSubscriptionsOfType(WebhookType.OrderShipped); | ||||
| 
 | ||||
|             var whook = new WebhookData(WebhookType.OrderShipped, @event); | ||||
|             await _sender.SendAll(subscriptions, whook); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										26
									
								
								src/Services/Webhooks/Webhooks.API/Model/WebhookData.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								src/Services/Webhooks/Webhooks.API/Model/WebhookData.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,26 @@ | ||||
| using Newtonsoft.Json; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
| 
 | ||||
| namespace Webhooks.API.Model | ||||
| { | ||||
|     public class WebhookData | ||||
|     { | ||||
|         public DateTime When { get; } | ||||
| 
 | ||||
|         public string Payload { get; } | ||||
| 
 | ||||
|         public string Type { get;  } | ||||
| 
 | ||||
|         public WebhookData(WebhookType hookType, object data) | ||||
|         { | ||||
|             When = DateTime.UtcNow; | ||||
|             Type = hookType.ToString(); | ||||
|             Payload = JsonConvert.SerializeObject(data); | ||||
|         } | ||||
| 
 | ||||
| 
 | ||||
|     } | ||||
| } | ||||
| @ -7,6 +7,7 @@ namespace Webhooks.API.Model | ||||
| { | ||||
|     public enum WebhookType | ||||
|     { | ||||
|         CatalogItemPriceChange = 1 | ||||
|         CatalogItemPriceChange = 1, | ||||
|         OrderShipped = 2 | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -0,0 +1,14 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
| using Webhooks.API.Model; | ||||
| 
 | ||||
| namespace Webhooks.API.Services | ||||
| { | ||||
|     public interface IWebhooksRetriever | ||||
|     { | ||||
| 
 | ||||
|         Task<IEnumerable<WebhookSubscription>> GetSubscriptionsOfType(WebhookType type); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,11 @@ | ||||
| using System.Collections.Generic; | ||||
| using System.Threading.Tasks; | ||||
| using Webhooks.API.Model; | ||||
| 
 | ||||
| namespace Webhooks.API.Services | ||||
| { | ||||
|     public interface IWebhooksSender | ||||
|     { | ||||
|         Task SendAll(IEnumerable<WebhookSubscription> receivers, WebhookData data); | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,24 @@ | ||||
| using Microsoft.EntityFrameworkCore; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
| using Webhooks.API.Infrastructure; | ||||
| using Webhooks.API.Model; | ||||
| 
 | ||||
| namespace Webhooks.API.Services | ||||
| { | ||||
|     public class WebhooksRetriever : IWebhooksRetriever | ||||
|     { | ||||
|         private readonly WebhooksContext _db; | ||||
|         public WebhooksRetriever(WebhooksContext db) | ||||
|         { | ||||
|             _db = db; | ||||
|         } | ||||
|         public async Task<IEnumerable<WebhookSubscription>> GetSubscriptionsOfType(WebhookType type) | ||||
|         { | ||||
|             var data = await _db.Subscriptions.Where(s => s.Type == type).ToListAsync(); | ||||
|             return data; | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,49 @@ | ||||
| using Microsoft.Extensions.Logging; | ||||
| using Newtonsoft.Json; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Net.Http; | ||||
| using System.Text; | ||||
| using System.Threading.Tasks; | ||||
| using Webhooks.API.Model; | ||||
| 
 | ||||
| namespace Webhooks.API.Services | ||||
| { | ||||
|     public class WebhooksSender : IWebhooksSender | ||||
|     { | ||||
|         private readonly IHttpClientFactory _httpClientFactory; | ||||
|         private readonly ILogger _logger; | ||||
|         public WebhooksSender(IHttpClientFactory httpClientFactory, ILogger<WebhooksSender> logger) | ||||
|         { | ||||
|             _httpClientFactory = httpClientFactory; | ||||
|             _logger = logger; | ||||
|         } | ||||
| 
 | ||||
|         public async Task SendAll(IEnumerable<WebhookSubscription> receivers, WebhookData data) | ||||
|         { | ||||
|             var client = _httpClientFactory.CreateClient(); | ||||
|             var json = JsonConvert.SerializeObject(data); | ||||
|             var tasks = receivers.Select(r => OnSendData(r, json, client)); | ||||
|             await Task.WhenAll(tasks.ToArray()); | ||||
|         } | ||||
| 
 | ||||
|         private Task OnSendData(WebhookSubscription subs, string jsonData, HttpClient client) | ||||
|         { | ||||
|             var request = new HttpRequestMessage() | ||||
|             { | ||||
|                 RequestUri = new Uri(subs.DestUrl, UriKind.Absolute), | ||||
|                 Method = HttpMethod.Post, | ||||
|                 Content = new StringContent(jsonData, Encoding.UTF8, "application/json") | ||||
|             }; | ||||
| 
 | ||||
|             if (!string.IsNullOrWhiteSpace(subs.Token)) | ||||
|             { | ||||
|                 request.Headers.Add("X-eshop-whtoken", subs.Token); | ||||
|             } | ||||
|             _logger.LogDebug($"Sending hook to {subs.DestUrl} of type {subs.Type.ToString()}"); | ||||
|             return client.SendAsync(request); | ||||
|         } | ||||
| 
 | ||||
|     } | ||||
| } | ||||
| @ -61,7 +61,9 @@ namespace Webhooks.API | ||||
|                 .AddCustomAuthentication(Configuration) | ||||
|                 .AddSingleton<IHttpContextAccessor, HttpContextAccessor>() | ||||
|                 .AddTransient<IIdentityService, IdentityService>() | ||||
|                 .AddTransient<IGrantUrlTesterService, GrantUrlTesterService>(); | ||||
|                 .AddTransient<IGrantUrlTesterService, GrantUrlTesterService>() | ||||
|                 .AddTransient<IWebhooksRetriever, WebhooksRetriever>() | ||||
|                 .AddTransient<IWebhooksSender, WebhooksSender>(); | ||||
| 
 | ||||
|             var container = new ContainerBuilder(); | ||||
|             container.Populate(services); | ||||
| @ -125,6 +127,7 @@ namespace Webhooks.API | ||||
|         { | ||||
|             var eventBus = app.ApplicationServices.GetRequiredService<IEventBus>(); | ||||
|             eventBus.Subscribe<ProductPriceChangedIntegrationEvent, ProductPriceChangedIntegrationEventHandler>(); | ||||
|             eventBus.Subscribe<OrderStatusChangedToShippedIntegrationEvent, OrderStatusChangedToShippedIntegrationEventHandler>(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
| @ -287,19 +290,11 @@ namespace Webhooks.API | ||||
|         public static IServiceCollection AddHttpClientServices(this IServiceCollection services, IConfiguration configuration) | ||||
|         { | ||||
|             services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); | ||||
| 
 | ||||
| 
 | ||||
|             //register delegating handlers | ||||
|             //services.AddTransient<HttpClientAuthorizationDelegatingHandler>(); | ||||
| 
 | ||||
|             //InfinteTimeSpan -> See: https://github.com/aspnet/HttpClientFactory/issues/194 | ||||
|             services.AddHttpClient("extendedhandlerlifetime").SetHandlerLifetime(Timeout.InfiniteTimeSpan); | ||||
| 
 | ||||
|             //add http client services | ||||
|             services.AddHttpClient("GrantClient") | ||||
|                    .SetHandlerLifetime(TimeSpan.FromMinutes(5)); | ||||
|                    //.AddHttpMessageHandler<HttpClientAuthorizationDelegatingHandler>(); | ||||
| 
 | ||||
|             return services; | ||||
|         } | ||||
| 
 | ||||
|  | ||||
							
								
								
									
										24
									
								
								src/Web/WebhookClient/Extensions/ISessionExtensions.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								src/Web/WebhookClient/Extensions/ISessionExtensions.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,24 @@ | ||||
| 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); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @ -0,0 +1,51 @@ | ||||
| using Microsoft.AspNetCore.Authentication; | ||||
| using Microsoft.AspNetCore.Http; | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Net.Http; | ||||
| using System.Net.Http.Headers; | ||||
| using System.Threading; | ||||
| using System.Threading.Tasks; | ||||
| 
 | ||||
| namespace WebhookClient | ||||
| { | ||||
|     public class HttpClientAuthorizationDelegatingHandler | ||||
|             : DelegatingHandler | ||||
|     { | ||||
|         private readonly IHttpContextAccessor _httpContextAccesor; | ||||
| 
 | ||||
|         public HttpClientAuthorizationDelegatingHandler(IHttpContextAccessor httpContextAccesor) | ||||
|         { | ||||
|             _httpContextAccesor = httpContextAccesor; | ||||
|         } | ||||
| 
 | ||||
|         protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) | ||||
|         { | ||||
|             var authorizationHeader = _httpContextAccesor.HttpContext | ||||
|                 .Request.Headers["Authorization"]; | ||||
| 
 | ||||
|             if (!string.IsNullOrEmpty(authorizationHeader)) | ||||
|             { | ||||
|                 request.Headers.Add("Authorization", new List<string>() { authorizationHeader }); | ||||
|             } | ||||
| 
 | ||||
|             var token = await GetToken(); | ||||
| 
 | ||||
|             if (token != null) | ||||
|             { | ||||
|                 request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token); | ||||
|             } | ||||
| 
 | ||||
|             return await base.SendAsync(request, cancellationToken); | ||||
|         } | ||||
| 
 | ||||
|         async Task<string> GetToken() | ||||
|         { | ||||
|             const string ACCESS_TOKEN = "access_token"; | ||||
| 
 | ||||
|             return await _httpContextAccesor.HttpContext | ||||
|                 .GetTokenAsync(ACCESS_TOKEN); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										13
									
								
								src/Web/WebhookClient/Models/WebHookReceived.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/Web/WebhookClient/Models/WebHookReceived.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
| 
 | ||||
| namespace WebhookClient.Models | ||||
| { | ||||
|     public class WebHookReceived | ||||
|     { | ||||
|         public DateTime When { get; set; } | ||||
|         public string Data { get; set; } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										14
									
								
								src/Web/WebhookClient/Models/WebhookResponse.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/Web/WebhookClient/Models/WebhookResponse.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
| 
 | ||||
| namespace WebhookClient.Models | ||||
| { | ||||
|     public class WebhookResponse | ||||
|     { | ||||
|         public DateTime Date { get; set; } | ||||
|         public string DestUrl { get; set; } | ||||
|         public string Token { get; set; } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										15
									
								
								src/Web/WebhookClient/Models/WebhookSubscriptionRequest.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								src/Web/WebhookClient/Models/WebhookSubscriptionRequest.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,15 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
| 
 | ||||
| namespace WebhookClient.Models | ||||
| { | ||||
|     public class WebhookSubscriptionRequest | ||||
|     { | ||||
|         public string Url { get; set; } | ||||
|         public string Token { get; set; } | ||||
|         public string Event { get; set; } | ||||
|         public string GrantUrl { get; set; } | ||||
|     } | ||||
| } | ||||
| @ -7,13 +7,23 @@ | ||||
| <div class="text-center"> | ||||
|     <h1 class="display-4">Welcome</h1> | ||||
|     <p>eShopOnContainers - Webhook client</p> | ||||
|     <a class="btn-primary btn" href="@Url.Action("SignIn","Account")>Login</a> | ||||
|     <a class="btn-primary btn" href="@Url.Action("SignIn","Account")">Login</a> | ||||
|     <p>Why I need to login? You only need to login <bold>to setup a new webhook</bold>.</p> | ||||
| </div> | ||||
| 
 | ||||
| @if (User.Identity.IsAuthenticated) | ||||
| { | ||||
| <div class="row"> | ||||
|     Your current Webhooks: | ||||
| </div> | ||||
| 
 | ||||
|     <div class="table"> | ||||
|         <h3>Current webhooks invoked</h3> | ||||
|         <table class="table"> | ||||
|             @foreach (var webhook in Model.WebHooksReceived) | ||||
|             { | ||||
|                 <tr> | ||||
|                     <td>@webhook.When</td> | ||||
|                     <td><pre>@webhook.Data</pre></td> | ||||
|                 </tr> | ||||
|             } | ||||
|         </table> | ||||
|     </div> | ||||
| } | ||||
|  | ||||
| @ -4,14 +4,20 @@ using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using Microsoft.AspNetCore.Mvc.RazorPages; | ||||
| using Microsoft.AspNetCore.Http; | ||||
| using WebhookClient.Models; | ||||
| 
 | ||||
| namespace WebhookClient.Pages | ||||
| { | ||||
| 
 | ||||
|     public class IndexModel : PageModel | ||||
|     { | ||||
| 
 | ||||
|         public IEnumerable<WebHookReceived> WebHooksReceived { get; private set; } | ||||
| 
 | ||||
|         public void OnGet() | ||||
|         { | ||||
| 
 | ||||
|             WebHooksReceived = HttpContext.Session.Get<IEnumerable<WebHookReceived>>("webhooks.received") ?? Enumerable.Empty<WebHookReceived>(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
							
								
								
									
										14
									
								
								src/Web/WebhookClient/Pages/RegisterWebhook.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								src/Web/WebhookClient/Pages/RegisterWebhook.cshtml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,14 @@ | ||||
| @page | ||||
| @model WebhookClient.Pages.RegisterWebhookModel | ||||
| @{ | ||||
|     ViewData["Title"] = "RegisterWebhook"; | ||||
| } | ||||
| 
 | ||||
| <h3>Register webhook</h3> | ||||
| 
 | ||||
| <p>This page registers the "OrderShipped" Webhook by sending a POST to webhooks.</p> | ||||
| 
 | ||||
| <form method="post"> | ||||
|     <p>Token: <input type="text" asp-for="Token" /></p> | ||||
|     <input type="submit" value="send" /> | ||||
| </form> | ||||
							
								
								
									
										55
									
								
								src/Web/WebhookClient/Pages/RegisterWebhook.cshtml.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								src/Web/WebhookClient/Pages/RegisterWebhook.cshtml.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,55 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Net.Http; | ||||
| using System.Net.Http.Formatting; | ||||
| using System.Threading.Tasks; | ||||
| using Microsoft.AspNetCore.Hosting; | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using Microsoft.AspNetCore.Mvc.RazorPages; | ||||
| using Microsoft.Extensions.Options; | ||||
| using WebhookClient.Models; | ||||
| 
 | ||||
| namespace WebhookClient.Pages | ||||
| { | ||||
| 
 | ||||
|     public class RegisterWebhookModel : PageModel | ||||
|     { | ||||
|         private readonly Settings _settings; | ||||
|         private readonly IHttpClientFactory _httpClientFactory; | ||||
| 
 | ||||
|         [BindProperty] public string Token { get; set; } | ||||
| 
 | ||||
| 
 | ||||
|         public RegisterWebhookModel(IOptions<Settings> settings, IHttpClientFactory httpClientFactory) | ||||
|         { | ||||
|             _settings = settings.Value; | ||||
|             _httpClientFactory = httpClientFactory; | ||||
|         } | ||||
| 
 | ||||
|         public void OnGet() | ||||
|         { | ||||
|             Token = _settings.Token; | ||||
|         } | ||||
| 
 | ||||
|         public async Task OnPost() | ||||
|         { | ||||
|             var protocol = Request.IsHttps ? "https" : "http"; | ||||
|             var selfurl = !string.IsNullOrEmpty(_settings.SelfUrl) ? _settings.SelfUrl : $"{protocol}://{Request.Host}/{Request.PathBase}"; | ||||
|             var granturl = $"{selfurl}check"; | ||||
|             var url = $"{selfurl}webhook"; | ||||
|             var client = _httpClientFactory.CreateClient("GrantClient"); | ||||
| 
 | ||||
|             var payload = new WebhookSubscriptionRequest() | ||||
|             { | ||||
|                 Event = "OrderShipped", | ||||
|                 GrantUrl = granturl, | ||||
|                 Url = url, | ||||
|                 Token = Token | ||||
|             }; | ||||
|             var response = await client.PostAsync<WebhookSubscriptionRequest>(_settings.WebhooksUrl + "/api/v1/webhooks", payload, new JsonMediaTypeFormatter()); | ||||
| 
 | ||||
|             RedirectToPage("Index"); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										28
									
								
								src/Web/WebhookClient/Pages/WebhooksList.cshtml
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/Web/WebhookClient/Pages/WebhooksList.cshtml
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | ||||
| @page | ||||
| @model WebhookClient.Pages.WebhooksListModel | ||||
| @{ | ||||
|     ViewData["Title"] = "WebhooksList"; | ||||
| } | ||||
| 
 | ||||
| <h1>List of Webhooks registered by user @User.Identity.Name</h1> | ||||
| 
 | ||||
| <table class="table"> | ||||
|     <thead class="thead-light"> | ||||
|         <tr> | ||||
|             <th scope="col">Date</th> | ||||
|             <th scope="col">Destination Url</th> | ||||
|             <th scope="col">Validation token</th> | ||||
|         </tr> | ||||
|     </thead> | ||||
| 
 | ||||
|     @foreach (var whr in Model.Webhooks) | ||||
|     { | ||||
|         <tr> | ||||
|             <td>@whr.Date</td> | ||||
|             <td>@whr.DestUrl</td> | ||||
|             <td>@whr.Token</td> | ||||
|         </tr> | ||||
|     } | ||||
| 
 | ||||
| </table> | ||||
| 
 | ||||
							
								
								
									
										28
									
								
								src/Web/WebhookClient/Pages/WebhooksList.cshtml.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/Web/WebhookClient/Pages/WebhooksList.cshtml.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
| using Microsoft.AspNetCore.Mvc; | ||||
| using Microsoft.AspNetCore.Mvc.RazorPages; | ||||
| using WebhookClient.Models; | ||||
| using WebhookClient.Services; | ||||
| 
 | ||||
| namespace WebhookClient.Pages | ||||
| { | ||||
|     public class WebhooksListModel : PageModel | ||||
|     { | ||||
|         private readonly IWebhooksClient _webhooksClient; | ||||
| 
 | ||||
|         public IEnumerable<WebhookResponse> Webhooks { get; private set; } | ||||
| 
 | ||||
|         public WebhooksListModel(IWebhooksClient webhooksClient) | ||||
|         { | ||||
|             _webhooksClient = webhooksClient; | ||||
|         } | ||||
| 
 | ||||
|         public async Task OnGet() | ||||
|         { | ||||
|             Webhooks = await _webhooksClient.LoadWebhooks(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										13
									
								
								src/Web/WebhookClient/Services/IWebhooksClient.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								src/Web/WebhookClient/Services/IWebhooksClient.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,13 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
| using WebhookClient.Models; | ||||
| 
 | ||||
| namespace WebhookClient.Services | ||||
| { | ||||
|     public interface IWebhooksClient | ||||
|     { | ||||
|         Task<IEnumerable<WebhookResponse>> LoadWebhooks(); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										29
									
								
								src/Web/WebhookClient/Services/WebhooksClient.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								src/Web/WebhookClient/Services/WebhooksClient.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Threading.Tasks; | ||||
| using WebhookClient.Models; | ||||
| 
 | ||||
| namespace WebhookClient.Services | ||||
| { | ||||
|     public class WebhooksClient : IWebhooksClient | ||||
|     { | ||||
|         public async Task<IEnumerable<WebhookResponse>> LoadWebhooks() | ||||
|         { | ||||
|             return new[]{ | ||||
|                 new WebhookResponse() | ||||
|                 { | ||||
|                     Date = DateTime.Now, | ||||
|                     DestUrl = "http://aaaaa.me", | ||||
|                     Token = "3282832as2" | ||||
|                 }, | ||||
|                 new WebhookResponse() | ||||
|                 { | ||||
|                     Date = DateTime.Now.Subtract(TimeSpan.FromSeconds(392)), | ||||
|                     DestUrl = "http://bbbbb.me", | ||||
|                     Token = "ds2" | ||||
|                 } | ||||
|             }; | ||||
| 
 | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										17
									
								
								src/Web/WebhookClient/Settings.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								src/Web/WebhookClient/Settings.cs
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | ||||
| using System; | ||||
| using System.Collections.Generic; | ||||
| using System.Linq; | ||||
| using System.Threading.Tasks; | ||||
| 
 | ||||
| namespace WebhookClient | ||||
| { | ||||
|     public class Settings | ||||
|     { | ||||
|         public string Token { get; set; } | ||||
|         public string IdentityUrl { get; set; } | ||||
|         public string CallBackUrl { get; set; } | ||||
|         public string WebhooksUrl { get; set; } | ||||
|         public string SelfUrl { get; set; } | ||||
| 
 | ||||
|     } | ||||
| } | ||||
| @ -9,6 +9,8 @@ using Microsoft.Extensions.DependencyInjection; | ||||
| using System; | ||||
| using System.Linq; | ||||
| using System.Net; | ||||
| using System.Threading; | ||||
| using WebhookClient.Services; | ||||
| 
 | ||||
| namespace WebhookClient | ||||
| { | ||||
| @ -25,7 +27,14 @@ namespace WebhookClient | ||||
|         public void ConfigureServices(IServiceCollection services) | ||||
|         { | ||||
|             services | ||||
|                 .AddSession(opt => | ||||
|                 { | ||||
|                     opt.Cookie.Name = ".eShopWebhooks.Session"; | ||||
|                 }) | ||||
|                 .AddConfiguration(Configuration) | ||||
|                 .AddHttpClientServices(Configuration) | ||||
|                 .AddCustomAuthentication(Configuration) | ||||
|                 .AddTransient<IWebhooksClient, WebhooksClient>() | ||||
|                 .AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2); | ||||
|         } | ||||
| 
 | ||||
| @ -42,7 +51,6 @@ namespace WebhookClient | ||||
|                 // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. | ||||
|                 app.UseHsts(); | ||||
|             } | ||||
| 
 | ||||
|             app.UseAuthentication(); | ||||
|             app.UseHttpsRedirection(); | ||||
|             app.Map("/check", capp => | ||||
| @ -69,14 +77,20 @@ namespace WebhookClient | ||||
|                     } | ||||
|                 }); | ||||
|             }); | ||||
| 
 | ||||
|             app.UseStaticFiles(); | ||||
|             app.UseSession(); | ||||
|             app.UseMvcWithDefaultRoute(); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     static class ServiceExtensions | ||||
|     { | ||||
|         public static IServiceCollection AddConfiguration(this IServiceCollection services, IConfiguration configuration) | ||||
|         { | ||||
|             services.AddOptions(); | ||||
|             services.Configure<Settings>(configuration); | ||||
|             return services; | ||||
|         } | ||||
|         public static IServiceCollection AddCustomAuthentication(this IServiceCollection services, IConfiguration configuration) | ||||
|         { | ||||
|             var identityUrl = configuration.GetValue<string>("IdentityUrl"); | ||||
| @ -107,5 +121,19 @@ namespace WebhookClient | ||||
| 
 | ||||
|             return services; | ||||
|         } | ||||
| 
 | ||||
|         public static IServiceCollection AddHttpClientServices(this IServiceCollection services, IConfiguration configuration) | ||||
|         { | ||||
|             services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); | ||||
|             services.AddTransient<HttpClientAuthorizationDelegatingHandler>(); | ||||
|             services.AddHttpClient("extendedhandlerlifetime").SetHandlerLifetime(Timeout.InfiniteTimeSpan); | ||||
| 
 | ||||
|             //add http client services | ||||
|             services.AddHttpClient("GrantClient") | ||||
|                    .SetHandlerLifetime(TimeSpan.FromMinutes(5)) | ||||
|                    .AddHttpMessageHandler<HttpClientAuthorizationDelegatingHandler>(); | ||||
| 
 | ||||
|             return services; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| @ -12,6 +12,7 @@ | ||||
|     <PackageReference Include="Microsoft.AspNetCore.App" /> | ||||
|     <PackageReference Include="Microsoft.AspNetCore.Razor.Design" Version="2.2.0" PrivateAssets="All" /> | ||||
|     <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.0.2105168" /> | ||||
|     <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="2.2.0" /> | ||||
|   </ItemGroup> | ||||
| 
 | ||||
| </Project> | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user