public async Task <IActionResult> RunNow([FromBody] RunNowViewModel request)
        {
            try
            {
                ParametersViewModel.VerifyParameterNameAvailability(request.JobParameters);

                Guid AutomationId = request.AutomationId;
                Guid AgentId      = request.AgentId;
                Guid AgentGroupId = request.AgentGroupId;

                Schedule schedule = new Schedule();
                schedule.AgentId        = AgentId;
                schedule.AgentGroupId   = AgentGroupId;
                schedule.CRONExpression = "";
                schedule.LastExecution  = DateTime.UtcNow;
                schedule.NextExecution  = DateTime.UtcNow;
                schedule.IsDisabled     = false;
                schedule.ProjectId      = null;
                schedule.StartingType   = "RunNow";
                schedule.Status         = "New";
                schedule.ExpiryDate     = DateTime.UtcNow.AddDays(1);
                schedule.StartDate      = DateTime.UtcNow;
                schedule.AutomationId   = AutomationId;
                schedule.CreatedOn      = DateTime.UtcNow;
                schedule.CreatedBy      = applicationUser?.UserName;

                var jsonScheduleObj = JsonSerializer.Serialize <Schedule>(schedule);
                _hubManager.ExecuteJob(jsonScheduleObj, request.JobParameters);

                return(Ok());
            }
            catch (Exception ex)
            {
                return(ex.GetActionResult());
            }
        }
        public async Task <IActionResult> Put(string id, [FromBody] CreateScheduleViewModel request)
        {
            try
            {
                ParametersViewModel.VerifyParameterNameAvailability(request.Parameters);
                //validate the cron expression
                if (!string.IsNullOrWhiteSpace(request.CRONExpression))
                {
                    try
                    {
                        CronExpression expression = CronExpression.Parse(request.CRONExpression, CronFormat.Standard);
                    }
                    catch (Exception ex)
                    {
                        ModelState.AddModelError("Save", string.Concat("Invalid cron expression, ", ex.Message));
                        return(BadRequest(ModelState));
                    }
                }

                Guid entityId = new Guid(id);

                var existingSchedule = repository.GetOne(entityId);
                if (existingSchedule == null)
                {
                    return(NotFound());
                }

                existingSchedule.Name           = request.Name;
                existingSchedule.AgentId        = request.AgentId;
                existingSchedule.AgentGroupId   = request.AgentGroupId;
                existingSchedule.CRONExpression = request.CRONExpression;
                existingSchedule.LastExecution  = request.LastExecution;
                existingSchedule.NextExecution  = request.NextExecution;
                existingSchedule.IsDisabled     = request.IsDisabled;
                existingSchedule.ProjectId      = request.ProjectId;
                existingSchedule.StartingType   = request.StartingType;
                existingSchedule.Status         = request.Status;
                existingSchedule.ExpiryDate     = request.ExpiryDate;
                existingSchedule.StartDate      = request.StartDate;
                existingSchedule.AutomationId   = request.AutomationId;

                var response = await base.PutEntity(id, existingSchedule);

                _manager.DeleteExistingParameters(entityId);

                var set = new HashSet <string>();
                foreach (var parameter in request.Parameters ?? Enumerable.Empty <ParametersViewModel>())
                {
                    if (!set.Add(parameter.Name))
                    {
                        ModelState.AddModelError("ScheduleParameter", "ScheduleParameter Name Already Exists");
                        return(BadRequest(ModelState));
                    }

                    ScheduleParameter scheduleParameter = new ScheduleParameter
                    {
                        Name       = parameter.Name,
                        DataType   = parameter.DataType,
                        Value      = parameter.Value,
                        ScheduleId = entityId,
                        CreatedBy  = applicationUser?.UserName,
                        CreatedOn  = DateTime.UtcNow,
                        Id         = Guid.NewGuid()
                    };
                    _scheduleParameterRepository.Add(scheduleParameter);
                }

                _recurringJobManager.RemoveIfExists(existingSchedule.Id?.ToString());

                if (request.IsDisabled == false && !request.StartingType.ToLower().Equals("manual"))
                {
                    var jsonScheduleObj = JsonSerializer.Serialize <Schedule>(existingSchedule);

                    _backgroundJobClient.Schedule(() => _hubManager.ScheduleNewJob(jsonScheduleObj),
                                                  new DateTimeOffset(existingSchedule.StartDate.Value));
                }

                return(response);
            }
            catch (Exception ex)
            {
                return(ex.GetActionResult());
            }
        }
        public async Task <IActionResult> Post([FromBody] CreateScheduleViewModel request)
        {
            ParametersViewModel.VerifyParameterNameAvailability(request.Parameters);
            if (request == null)
            {
                ModelState.AddModelError("Save", "No data passed");
                return(BadRequest(ModelState));
            }

            //validate the cron expression
            if (!string.IsNullOrWhiteSpace(request.CRONExpression))
            {
                try
                {
                    CronExpression expression = CronExpression.Parse(request.CRONExpression, CronFormat.Standard);
                }
                catch (Exception ex)
                {
                    ModelState.AddModelError("Save", string.Concat("Invalid cron expression, ", ex.Message));
                    return(BadRequest(ModelState));
                }
            }

            Guid entityId = Guid.NewGuid();

            if (request.Id == null || !request.Id.HasValue || request.Id.Equals(Guid.Empty))
            {
                request.Id = entityId;
            }

            try
            {
                Schedule requestObj = request.Map(request); //assign request to schedule entity

                foreach (var parameter in request.Parameters ?? Enumerable.Empty <ParametersViewModel>())
                {
                    ScheduleParameter scheduleParameter = new ScheduleParameter
                    {
                        Name       = parameter.Name,
                        DataType   = parameter.DataType,
                        Value      = parameter.Value,
                        ScheduleId = entityId,
                        CreatedBy  = applicationUser?.UserName,
                        CreatedOn  = DateTime.UtcNow,
                        Id         = Guid.NewGuid()
                    };
                    _scheduleParameterRepository.Add(scheduleParameter);
                }

                var response = await base.PostEntity(requestObj);

                _recurringJobManager.RemoveIfExists(requestObj.Id?.ToString());

                if (request.IsDisabled == false && !request.StartingType.ToLower().Equals("manual"))
                {
                    var jsonScheduleObj = JsonSerializer.Serialize <Schedule>(requestObj);

                    _backgroundJobClient.Schedule(() => _hubManager.ScheduleNewJob(jsonScheduleObj),
                                                  new DateTimeOffset(requestObj.StartDate.Value));
                }

                return(response);
            }
            catch (Exception ex)
            {
                return(ex.GetActionResult());
            }
        }