[Authorize] // Require some form of authentication public HttpResponseMessage Post([FromBody] JObject jsondata) { try { if (ConfigHelper.ParseOrDefault(Microsoft.Azure.CloudConfigurationManager.GetSetting("LogEventsToFile")) == true) { var logPath = ConfigHelper.GetLoggingPath(); logger.Info(string.Format("Post: Event being logged to [{0}]", logPath)); LoggingHelper.DumpEventToDisk(jsondata, logPath); } var dataProvider = new Providers.JsonDataProvider(jsondata); var uri = dataProvider.GetServerUrl(); var locationpat = ConfigHelper.GetPersonalAccessToken(uri); logger.Info($"Post: Using a {uri}"); if (string.IsNullOrEmpty(locationpat.Item2) == false) { logger.Info($"Post: Using a PAT token and obtained from {locationpat.Item1}"); this.iAzureDevOpsProvider = new Providers.AzureDevOpsProvider(uri, locationpat.Item2); } else { logger.Info(string.Format("Post: Using default credentials and url {0}", uri)); this.iAzureDevOpsProvider = new Providers.AzureDevOpsProvider(uri); } // work out the event type var eventType = dataProvider.GetEventType(); // work out the subscription ID var subscriptionID = dataProvider.GetSubsriptionID(); string[] argItems = null; switch (eventType) { case "workitem.updated": case "workitem.created": case "workitem.deleted": case "workitem.restored": case "workitem.commented": var workItemId = dataProvider.GetWorkItemDetails().Id; if (workItemId > 0) { argItems = new[] { eventType, workItemId.ToString() }; logger.Info( string.Format("Post: {1} Event being processed for WI:{0}", workItemId, eventType)); } else { logger.Error( string.Format("Post: {0} Event cannot find workitem ID", eventType)); return(new HttpResponseMessage(HttpStatusCode.BadRequest)); } break; case "build.complete": var buildDetails = dataProvider.GetBuildDetails(); argItems = new[] { eventType, buildDetails.Id.ToString() }; logger.Info(string.Format( "Post: Event being processed for Build:{0}", buildDetails.BuildUri)); break; case "ms.vss-release.deployment-approval-completed-event": case "ms.vss-release.deployment-approval-pending-event": case "ms.vss-release.deployment-completed-event": case "ms.vss-release.deployment-started-event": case "ms.vss-release.release-abandoned-event": case "ms.vss-release.release-created-event": var releaseDetails = dataProvider.GetReleaseDetails(); argItems = new[] { eventType, releaseDetails.Id.ToString() }; logger.Info(string.Format( "Post: Event being processed for Release:{0}", releaseDetails.Id)); break; case "tfvc.checkin": var checkInDetails = dataProvider.GetCheckInDetails(); argItems = new[] { eventType, checkInDetails.Changeset.ToString() }; logger.Info( string.Format( "Post: Event being processed for Checkin:{0}", checkInDetails.Changeset)); break; case "message.posted": var messagePostDetails = dataProvider.GetMessagePostDetails(); argItems = new[] { eventType, messagePostDetails.PostRoomId.ToString() }; logger.Info( string.Format( "Post: Event being processed for Meesage Post in Room:{0}", messagePostDetails.PostRoomId)); break; case "git.push": var pushDetails = dataProvider.GetPushDetails(); argItems = new[] { eventType, pushDetails.Repo, pushDetails.PushId.ToString() }; logger.Info( string.Format( "Post: Event being processed for Push:{0}", pushDetails.PushId)); break; case "git.pullrequest.created": case "git.pullrequest.merged": case "git.pullrequest.updated": var pullDetails = dataProvider.GetPullDetails(); argItems = new[] { eventType, pullDetails.Repo, pullDetails.PullId.ToString() }; logger.Info( string.Format( "Post: Event being processed for Pull:{0}", pullDetails.PullId)); break; default: logger.Info(string.Format("Post: Unhandled event cannot processed:{0}", eventType)); return(new HttpResponseMessage(HttpStatusCode.BadRequest)); } var args = new Dictionary <string, object> { { "Arguments", argItems }, }; var engine = new AzureDevOpsEventsProcessor.Dsl.DslProcessor(redirectScriptEngineOutputtoLogging); engine.RunScript( this.dslFolder, this.scriptFolder, FolderHelper.GetScriptName( eventType, subscriptionID, this.scriptFile, this.useSubscriptionID), args, this.iAzureDevOpsProvider, this.iEmailProvider, dataProvider); return(new HttpResponseMessage(HttpStatusCode.OK)); } catch (Exception ex) { // using a global exception catch to make sure we don't block any threads LoggingHelper.DumpException(logger, ex); return(new HttpResponseMessage(HttpStatusCode.BadRequest)); } }