Esempio n. 1
0
        [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));
            }
        }