/// <summary> /// Instantiates a new <see cref="WebHookSingleEventMapperConstraint"/> instance with the given /// <paramref name="loggerFactory"/> and <paramref name="eventMetadata"/>. /// </summary> /// <param name="loggerFactory">The <see cref="ILoggerFactory"/>.</param> /// <param name="eventMetadata">The <see cref="IWebHookEventMetadata"/>.</param> public WebHookSingleEventMapperConstraint(ILoggerFactory loggerFactory, IWebHookEventMetadata eventMetadata) : base(loggerFactory) { if (loggerFactory == null) { throw new ArgumentNullException(nameof(loggerFactory)); } if (eventMetadata == null) { throw new ArgumentNullException(nameof(eventMetadata)); } _eventMetadata = eventMetadata; }
/// <summary> /// Instantiates a new <see cref="WebHookEventNameMapperConstraint"/> instance to verify the given /// <paramref name="eventMetadata"/>. /// </summary> /// <param name="loggerFactory">The <see cref="ILoggerFactory"/>.</param> /// <param name="eventMetadata">The receiver's <see cref="IWebHookEventMetadata"/>.</param> public WebHookEventNameMapperConstraint( ILoggerFactory loggerFactory, IWebHookEventMetadata eventMetadata) { if (loggerFactory == null) { throw new ArgumentNullException(nameof(loggerFactory)); } if (eventMetadata == null) { throw new ArgumentNullException(nameof(eventMetadata)); } _eventMetadata = eventMetadata; _logger = loggerFactory.CreateLogger <WebHookEventNameMapperConstraint>(); }
/// <summary> /// Ensure given <paramref name="eventMetadata"/> is not <see langword="null"/>. An /// <see cref="IWebHookEventMetadata"/> service is mandatory for receivers with an attribute that implements /// <see cref="IWebHookEventSelectorMetadata"/>. /// </summary> /// <param name="eventMetadata"> /// The <paramref name="receiverName"/> receiver's <see cref="IWebHookEventMetadata"/>, if any. /// </param> /// <param name="receiverName">The name of an available <see cref="IWebHookReceiver"/>.</param> protected void EnsureValidEventMetadata(IWebHookEventMetadata eventMetadata, string receiverName) { if (receiverName == null) { // Unusual case likely involves a GeneralWebHookAttribute subclass that implements // IWebHookEventSelectorMetadata. Assume developer adds runtime checks for IWebHookEventMetadata. return; } if (eventMetadata == null) { // IWebHookEventMetadata is mandatory when performing action selection using event names. var message = string.Format( CultureInfo.CurrentCulture, Resources.PropertyProvider_MissingMetadataServices, receiverName, typeof(IWebHookEventSelectorMetadata), typeof(IWebHookEventMetadata)); throw new InvalidOperationException(message); } }
/// <summary> /// Gets an indication whether the expected event names are available in the request. Maps the event names into /// route values. /// </summary> /// <param name="eventMetadata">The <see cref="IWebHookEventMetadata"/> for this receiver.</param> /// <param name="routeContext">The <see cref="RouteContext"/> for this constraint and request.</param> /// <returns> /// <see langword="true"/> if event names are available in the request; <see langword="false"/> otherwise. /// </returns> protected virtual bool Accept(IWebHookEventMetadata eventMetadata, RouteContext routeContext) { if (eventMetadata == null) { throw new ArgumentNullException(nameof(eventMetadata)); } if (routeContext == null) { throw new ArgumentNullException(nameof(routeContext)); } var request = routeContext.HttpContext.Request; var routeData = routeContext.RouteData; if (eventMetadata.HeaderName != null) { var headers = request.Headers; var events = headers.GetCommaSeparatedValues(eventMetadata.HeaderName); if (events.Length > 0) { routeData.SetWebHookEventNames(events); return(true); } } if (eventMetadata.QueryParameterName != null) { var query = request.Query; if (query.TryGetValue(eventMetadata.QueryParameterName, out var events) && events.Count > 0) { routeData.SetWebHookEventNames(events); return(true); } } if (eventMetadata.ConstantValue != null) { routeData.Values[WebHookConstants.EventKeyName] = eventMetadata.ConstantValue; return(true); } routeData.TryGetWebHookReceiverName(out var receiverName); if (eventMetadata.QueryParameterName == null) { _logger.LogError( 500, "A '{ReceiverName}' WebHook request must contain a '{HeaderName}' HTTP header " + "indicating the type of event.", receiverName, eventMetadata.HeaderName); } else if (eventMetadata.HeaderName == null) { _logger.LogError( 501, "A '{ReceiverName}' WebHook request must contain a '{QueryParameterKey}' query " + "parameter indicating the type of event.", receiverName, eventMetadata.QueryParameterName); } else { _logger.LogError( 502, "A '{ReceiverName}' WebHook request must contain a '{HeaderName}' HTTP header or a " + "'{QueryParameterKey}' query parameter indicating the type of event.", receiverName, eventMetadata.HeaderName, eventMetadata.QueryParameterName); } return(false); }
/// <summary> /// Gets an indication whether the expected event names are available in the request. Maps the event names into /// route values. /// </summary> /// <param name="eventMetadata">The <see cref="IWebHookEventMetadata"/> for this receiver.</param> /// <param name="routeContext">The <see cref="RouteContext"/> for this constraint and request.</param> /// <returns> /// <see langword="true"/> if event names are available in the request; <see langword="false"/> otherwise. /// </returns> protected virtual bool Accept(IWebHookEventMetadata eventMetadata, RouteContext routeContext) { if (eventMetadata == null) { throw new ArgumentNullException(nameof(eventMetadata)); } if (routeContext == null) { throw new ArgumentNullException(nameof(routeContext)); } var request = routeContext.HttpContext.Request; var routeData = routeContext.RouteData; if (eventMetadata.HeaderName != null) { var headers = request.Headers; // ??? Is GetCommaSeparatedValues() overkill? var events = headers.GetCommaSeparatedValues(eventMetadata.HeaderName); if (events.Length == 0) { if (eventMetadata.ConstantValue == null && eventMetadata.QueryParameterName != null) { // An error because we have no fallback. routeData.TryGetWebHookReceiverName(out var receiverName); _logger.LogError( 500, "A {ReceiverName} WebHook request must contain a '{HeaderName}' HTTP header indicating " + "the type of event.", receiverName, eventMetadata.HeaderName); } } else { routeData.SetWebHookEventNames(events); return(true); } } if (eventMetadata.QueryParameterName != null) { var query = request.Query; if (!query.TryGetValue(eventMetadata.QueryParameterName, out var events) || events.Count == 0) { if (eventMetadata.ConstantValue == null) { // An error because we have no fallback. routeData.TryGetWebHookReceiverName(out var receiverName); _logger.LogError( 501, "A {ReceiverName} WebHook request must contain a '{QueryParameterKey}' query parameter " + "indicating the type of event.", receiverName, eventMetadata.QueryParameterName); } } else { routeData.SetWebHookEventNames(events); return(true); } } if (eventMetadata.ConstantValue != null) { routeData.Values[WebHookConstants.EventKeyName] = eventMetadata.ConstantValue; return(true); } return(false); }
public TestMetadataProvider(IWebHookEventMetadata eventMetadata) { _eventMetadata = eventMetadata; }