private static void OnTaskCompleted(BundlingTask tsk, bool success, string message, IOutputWriter output = null)
        {
            using (var sc = Shell.GetScope())
            {
                if (success)
                {
                    var _acc   = sc.ServiceProvider.GetService <EnvironmentAccessor>();
                    var _paths = sc.ServiceProvider.GetService <IPathsService>();
                    _acc.CurrentEnvironment = _paths.GetEnvironments().Where(d => d.Name == tsk.Environment).FirstOrDefault();


                    var _bund = sc.ServiceProvider.GetService <IBundlingService>();
                    var _pub  = sc.ServiceProvider.GetService <IPublisherService>();
                    if (output != null)
                    {
                        _bund.OutputWriter = output;
                        _pub.OutputWriter  = output;
                    }
                    string version = _bund.GetAppVersion(tsk.TenantCode, true);
                    _pub.UploadTenantBundle(tsk.TenantCode, "v" + version);
                    _pub.SetTenantInfo(tsk.TenantCode, version);
                }
                BundlingTask.ClearCompleted();
                if (tsk.Status != "NULL")
                {
                    var pusher = sc.ServiceProvider.GetService <IMessagePusher <IBundlingTasksNotifications> >();
                    pusher.Publish(d => d.TaskChanged(tsk));
                }
            }
        }
        public IActionResult PublishTenant([FromBody] DbCreationRequest req)
        {
            SubmitResult = new SubmitResult();
            var outwriter = GetService <IOutputWriter>();
            var oth       = data.GetAppCodes().Where(d => d != req.TenantCode);

            var ver = bundl.GetAppVersion(req.TenantCode, true);

            if (req.Force ?? false)
            {
                ver = increment(ver);
            }
            BundlingTask.ClearCompleted();

            var tsk = BundlingTask.GetTask(req.TenantCode, ver);

            if (tsk == null)
            {
                if (bundl.StartProductionPackIfNeeded(req.TenantCode, out tsk, ver))
                {
                    tsk.Environment = req.Environment;

                    tsk.OnComplete       = (t, res) => OnTaskCompleted(tsk, res.IsSuccess, res.Message, outwriter);
                    SubmitResult.Message = "started_new_task";
                    BundlingTask.Add(tsk);
                }
                else
                {
                    OnTaskCompleted(new BundlingTask
                    {
                        Status      = "NULL",
                        TenantCode  = req.TenantCode,
                        Version     = ver,
                        Environment = req.Environment
                    }, true, "already_rendered");
                    SubmitResult.Message = "already_rendered";
                }
            }
            else
            {
                SubmitResult.Code    = 1;
                SubmitResult.Message = "task_is_already_running";
            }
            SubmitResult.Data["Task"] = tsk;
            return(Respond());
        }
        public bool StartProductionPackIfNeeded(string tenantCode, out BundlingTask tt, string version = null)
        {
            var v = version ?? GetAppVersion(tenantCode, true);

            if (IsBundled(tenantCode, v))
            {
                tt = null;
                return(false);
            }
            var tsk = new BundlingTask()
            {
                TenantCode = tenantCode,
                Version    = v,
                StartedOn  = DateTime.Now,
                Status     = "Active"
            };

            tsk.Task = new Task <Result>(() =>
            {
                using (var sc = Shell.GetScope())
                {
                    var ser          = sc.ServiceProvider.GetService <IBundlingService>();
                    ser.OutputWriter = Out;
                    return(ser.ProductionPack(tenantCode, v, true));
                }
            });

            tsk.Task.GetAwaiter().OnCompleted(() =>
            {
                var res         = tsk.Task.Result;
                tsk.Status      = res.IsSuccess ? "Successfull" : "Failed";
                tsk.CompletedOn = DateTime.Now;
                tsk.Message     = res.Message;
                tsk.OnComplete?.Invoke(tsk, res);
            });
            tsk.Task.Start();
            tt = tsk;
            return(true);
        }