// [Route("Subscribe")] public async Task <AcknowledgeAction> SubscribeAsync(SubscribeAction action) { var connectionId = CurrentRequest.RequestContext.ConnectionId; LogInfo($"Subscribe request from: {connectionId}"); // validate request if (string.IsNullOrEmpty(action.Rule)) { return(action.AcknowledgeError("missing or invalid rule name")); } // retrieve connection record var connection = await _dataTable.GetConnectionRecordAsync(connectionId); if (connection == null) { LogInfo("Connection was removed"); return(action.AcknowledgeError("connection gone")); } if (connection.State == ConnectionState.Failed) { LogInfo("Connection is in failed state"); throw Abort(action.AcknowledgeError("connection reset required")); } if (connection.SubscriptionArn == null) { LogInfo("Client has not announced itself"); return(action.AcknowledgeError("client is unannounced")); } if (connection.State != ConnectionState.Open) { LogInfo("Connection is not open (state: {0})", connection.State); throw Abort(action.AcknowledgeError("action not allowed")); } // validate pattern var validPattern = false; try { validPattern = EventPatternMatcher.IsValid(JObject.Parse(action.Pattern)); } catch { // nothing to do } if (!validPattern) { return(action.AcknowledgeError("invalid pattern")); } // create or update event rule await _dataTable.CreateOrUpdateRuleRecordAsync(new RuleRecord { Rule = action.Rule, Pattern = action.Pattern, ConnectionId = connection.ConnectionId }); return(action.AcknowledgeOk()); }
public void Pattern_with_null_serialized_is_valid() { // arrange var pattern = JObject.Parse("{\"source\":[\"Sample.BlazorEventsSample:1.0-DEV@stevebv7-lambdasharp-cor-deploymentbucketresource-9h53iqcat7uj::MyBlazorApp\"],\"detail-type\":[\"Sample.BlazorEventsSample.MyBlazorApp.Shared.TodoItem\"],\"resources\":[\"lambdasharp:tier:SteveBv7\"],\"detail\":null}"); // act var isValid = EventPatternMatcher.IsValid(pattern); // assert isValid.Should().BeTrue(); }
public void Empty_pattern_is_not_valid() { // arrange var pattern = JObject.Parse(@"{}"); // act var isValid = EventPatternMatcher.IsValid(pattern); // assert isValid.Should().BeFalse(); }
public void Pattern_with_nested_list_is_not_valid() { // arrange var pattern = JObject.Parse(@"{ ""Foo"": [ [ 42 ] ] }"); // act var isValid = EventPatternMatcher.IsValid(pattern); // assert isValid.Should().BeFalse(); }
public void Pattern_with_null_is_valid() { // arrange var pattern = JObject.Parse(@"{ ""Foo"": [ null ] }"); // act var isValid = EventPatternMatcher.IsValid(pattern); // assert isValid.Should().BeTrue(); }
public void Pattern_with_invalid_filter_is_not_valid() { // arrange var pattern = JObject.Parse(@"{ ""Foo"": [ { ""Bar"": 42 } ] }"); // act var isValid = EventPatternMatcher.IsValid(pattern); // assert isValid.Should().BeFalse(); }
public void Pattern_with_exists_null_is_not_valid() { // arrange var pattern = JObject.Parse(@"{ ""Foo"": [ { ""exists"": null } ] }"); // act var isValid = EventPatternMatcher.IsValid(pattern); // assert isValid.Should().BeFalse(); }
public void Pattern_with_cidr_bad_prefix_is_not_valid() { // arrange var pattern = JObject.Parse(@"{ ""Foo"": [ { ""cidr"": ""1.1.1.1/42"" } ] }"); // act var isValid = EventPatternMatcher.IsValid(pattern); // assert isValid.Should().BeFalse(); }
public void Pattern_with_numeric_two_operations_is_valid() { // arrange var pattern = JObject.Parse(@"{ ""Foo"": [ { ""numeric"": [ "">"", 42, ""<"", 404 ] } ] }"); // act var isValid = EventPatternMatcher.IsValid(pattern); // assert isValid.Should().BeTrue(); }
public void Pattern_with_anything_but_content_filter_is_valid() { // arrange var pattern = JObject.Parse(@"{ ""Foo"": [ { ""anything-but"": { ""prefix"": ""Bar"" } } ] }"); // act var isValid = EventPatternMatcher.IsValid(pattern); // assert isValid.Should().BeTrue(); }
public void Pattern_with_anything_but_numeric_is_valid() { // arrange var pattern = JObject.Parse(@"{ ""Foo"": [ { ""anything-but"": 42 } ] }"); // act var isValid = EventPatternMatcher.IsValid(pattern); // assert isValid.Should().BeTrue(); }
public void Pattern_with_prefix_list_is_not_valid() { // arrange var pattern = JObject.Parse(@"{ ""Foo"": [ { ""prefix"": [ ""Bar"" ] } ] }"); // act var isValid = EventPatternMatcher.IsValid(pattern); // assert isValid.Should().BeFalse(); }
// [Route("Subscribe")] public async Task <AcknowledgeAction> SubscribeAsync(SubscribeAction action) { var connectionId = CurrentRequest.RequestContext.ConnectionId; LogInfo($"Subscribe request from: {connectionId}"); // validate request if (string.IsNullOrEmpty(action.Rule)) { return(new AcknowledgeAction { RequestId = action.RequestId, Status = "Error", Message = "Missing or invalid rule name" }); } // retrieve websocket connection record var connection = await _dataTable.GetConnectionAsync(connectionId); if (connection == null) { LogInfo("Connection was removed"); return(new AcknowledgeAction { RequestId = action.RequestId, Rule = action.Rule, Status = "Error", Message = "Connection gone" }); } // validate pattern var validPattern = false; try { validPattern = EventPatternMatcher.IsValid(JObject.Parse(action.Pattern)); } catch { // nothing to do } if (!validPattern) { return(new AcknowledgeAction { RequestId = action.RequestId, Rule = action.Rule, Status = "Error", Message = "Invalid pattern" }); } // create or update event rule await _dataTable.CreateOrUpdateRuleAsync(new RuleRecord { Rule = action.Rule, Pattern = action.Pattern, ConnectionId = connection.ConnectionId }); return(new AcknowledgeAction { RequestId = action.RequestId, Rule = action.Rule, Status = "Ok" }); }