/// <summary>
        /// Starts an <see cref="AudioVideoIVRJob"/>.
        /// </summary>
        /// <param name="input"><see cref="AudioVideoIVRJobInput"/> specifying the configuration for the job.</param>
        /// <returns>ID of the started job</returns>
        public HttpResponseMessage Post(AudioVideoIVRJobInput input)
        {
            ValidateInput(input);

            var jobConfig = new PlatformServiceSampleJobConfiguration
            {
                JobType = JobType.AudioVideoIVR,
                AudioVideoIVRJobInput = input
            };

            string jobId = Guid.NewGuid().ToString("N");

            try
            {
                var job = PlatformServiceClientJobHelper.GetJob(jobId, WebApiApplication.InstanceId, WebApiApplication.AzureApplication, jobConfig) as AudioVideoIVRJob;

                if (job == null)
                {
                    return(CreateHttpResponse(HttpStatusCode.BadRequest, "{\"Error\":\"Invalid job input or job type\"}"));
                }

                job.ExecuteAsync().Observe <Exception>();

                return(Request.CreateResponse(HttpStatusCode.Created, job));
            }
            catch (Exception e)
            {
                Logger.Instance.Error(e, "Exception while starting the job.");
                return(CreateHttpResponse(HttpStatusCode.InternalServerError, "{\"Error\":\"Unable to start the job\"}"));
            }
        }
        public async Task <HttpResponseMessage> Post(GetAdhocMeetingResourceInput input)
        {
            string jobId = Guid.NewGuid().ToString("N");

            try
            {
                PlatformServiceSampleJobConfiguration jobConfig = new PlatformServiceSampleJobConfiguration
                {
                    JobType = JobType.AdhocMeeting,
                    GetAdhocMeetingResourceInput = input
                };

                var job = PlatformServiceClientJobHelper.GetJob(jobId, WebApiApplication.InstanceId, WebApiApplication.AzureApplication, jobConfig) as GetAdhocMeetingResouceJob;

                if (job == null)
                {
                    return(CreateHttpResponse(System.Net.HttpStatusCode.BadRequest, "Invalid job input or job type"));
                }

                AdhocMeetingToken token = await job.ExecuteCoreWithResultAsync <AdhocMeetingToken>().ConfigureAwait(false);

                if (token == null)
                {
                    return(CreateHttpResponse(System.Net.HttpStatusCode.InternalServerError, string.Format("Unable to start a job run")));
                }

                var httpResponse = this.Request.CreateResponse(HttpStatusCode.OK, token);
                return(httpResponse);
            }
            catch (Exception ex)
            {
                Logger.Instance.Error(ex, "Exception happened in schedule job");
                return(CreateHttpResponse(System.Net.HttpStatusCode.InternalServerError, string.Format("Unable to start a job run")));
            }
        }
        public async Task <HttpResponseMessage> PostAsync(GetAnonTokenInput input)
        {
            if (string.IsNullOrEmpty(input.ApplicationSessionId))
            {
                return(CreateHttpResponse(HttpStatusCode.BadRequest, "{\"Error\":\"No or invalid callback context specified!\"}"));
            }

            if (string.IsNullOrEmpty(input.AllowedOrigins))
            {
                return(CreateHttpResponse(HttpStatusCode.BadRequest, "{\"Error\":\"Invalid AllowedOrigins\"}"));
            }

            string jobId = Guid.NewGuid().ToString("N");

            try
            {
                PlatformServiceSampleJobConfiguration jobConfig = new PlatformServiceSampleJobConfiguration
                {
                    JobType           = JobType.GetAnonToken,
                    AnonTokenJobInput = input
                };
                var job = PlatformServiceClientJobHelper.GetJob(jobId, WebApiApplication.InstanceId, WebApiApplication.AzureApplication, jobConfig) as GetAnonTokenJob;

                if (job == null)
                {
                    return(CreateHttpResponse(HttpStatusCode.BadRequest, "{\"Error\":\"Invalid job input or job type\"}"));
                }

                AnonymousToken token = await job.ExecuteWithResultAsync <AnonymousToken>().ConfigureAwait(false);

                if (token == null)
                {
                    return(CreateHttpResponse(HttpStatusCode.InternalServerError, "{\"Error\":\"Job did not return a token\"}"));
                }

                return(Request.CreateResponse(HttpStatusCode.OK, token));
            }
            catch (Exception ex)
            {
                telemetry.TrackException(ex);
                Logger.Instance.Error(ex, "Exception while scheduling job.");
                return(CreateHttpResponse(HttpStatusCode.InternalServerError, "{\"Error\":\"An unexecpted error occured while starting the job.\"}"));
            }
        }
        public HttpResponseMessage Post(HuntGroupJobInput input)
        {
            if (input == null /* || input.InviteTargetUris == null || input.InviteTargetUris.Length < 1 */)
            {
                return(CreateHttpResponse(HttpStatusCode.BadRequest, "{\"Error\":\"Invalid HuntGroupJobInput\"}"));
            }

            if (input.InviteTargetUris != null)
            {
                foreach (string s in input.InviteTargetUris)
                {
                    if (!s.StartsWith("sip", StringComparison.InvariantCultureIgnoreCase))
                    {
                        return(CreateHttpResponse(HttpStatusCode.BadRequest, "{\"Error\":\"Invalid InviteTargetUri\"}"));
                    }
                }
            }

            var jobConfig = new PlatformServiceSampleJobConfiguration
            {
                JobType           = JobType.HuntGroup,
                HuntGroupJobInput = input
            };

            string jobId = Guid.NewGuid().ToString("N");

            try
            {
                PlatformServiceJobBase job = PlatformServiceClientJobHelper.GetJob(jobId, WebApiApplication.InstanceId, WebApiApplication.AzureApplication, jobConfig);

                if (job == null)
                {
                    return(CreateHttpResponse(HttpStatusCode.BadRequest, "{\"Error\":\"Unsupported job input or job type\"}"));
                }

                job.ExecuteAsync().Observe <Exception>();
                return(Request.CreateResponse(HttpStatusCode.Created, job));
            }
            catch (Exception e)
            {
                Logger.Instance.Error(e, "Exception while scheduling job");
                return(CreateHttpResponse(HttpStatusCode.InternalServerError, "{\"Error\":\"Unable to start a job run\"}"));
            }
        }
        public HttpResponseMessage Post(SimpleNotifyJobInput input)
        {
            if (input == null || string.IsNullOrEmpty(input.TargetUri) || string.IsNullOrEmpty(input.NotificationMessage))
            {
                return(CreateHttpResponse(HttpStatusCode.BadRequest, "{\"Error\":\"Invalid OutgoingMessagingNotifyInput\"}"));
            }

            if (!input.TargetUri.StartsWith("sip", StringComparison.InvariantCultureIgnoreCase))
            {
                return(CreateHttpResponse(HttpStatusCode.BadRequest, "{\"Error\":\"Invalid To\"}"));
            }

            string jobId = Guid.NewGuid().ToString("N");

            try
            {
                //New job and run asyncronizedly
                var jobConfig = new PlatformServiceSampleJobConfiguration
                {
                    JobType = JobType.SimpleNotification,
                    SimpleNotifyJobInput = input
                };
                PlatformServiceJobBase job = PlatformServiceClientJobHelper.GetJob(jobId, WebApiApplication.InstanceId, WebApiApplication.AzureApplication, jobConfig);

                if (job == null)
                {
                    return(CreateHttpResponse(HttpStatusCode.BadRequest, "{\"Error\":\"Invalid job input or job type\"}"));
                }

                job.ExecuteAndRecordAsync(Storage).Observe <Exception>();

                return(Request.CreateResponse(HttpStatusCode.Created, job));
            }
            catch (Exception e)
            {
                Logger.Instance.Error(e, "Exception happened in schedule job");
                return(CreateHttpResponse(HttpStatusCode.InternalServerError, "{\"Error\":\"Unable to start a job run\"}"));
            }
        }