private async Task <IActionResult> TakeBackup(BackupRequestBody backupRequest, Data.BackupOption backupOption)
        {
            var error = this.ValidateRequest(backupRequest);

            if (!error.IsValid)
            {
                return(BadRequest(error));
            }

            if (!this.backupParserManager.HasParsingFinished())
            {
                Response.StatusCode = 423; // resource locked at this time.
                return(new JsonResult(new Dictionary <string, string>()
                {
                    { "status", "inprogress" },
                    { "reason", "Backup parsing is still going on. " }
                }));
            }

            var timeout = TimeSpan.FromSeconds(backupRequest.TimeoutInSecs);
            var cancellationTokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(backupRequest.TimeoutInSecs));
            var cancellationToken       = cancellationTokenSource.Token;

            this.UserBackupLocation = String.IsNullOrWhiteSpace(backupRequest.BackupLocation) ?
                                      Directory.GetCurrentDirectory() : backupRequest.BackupLocation;

            await this.backupParserManager.BackupParser.BackupAsync(backupOption, timeout, cancellationToken, this.OnBackupCompletionAsync);

            return(new JsonResult(new Dictionary <string, string>()
            {
                { "status", "success" },
                { "backPath", this.BackupPath },
            }));
        }
        private ModelStateDictionary ValidateRequest(BackupRequestBody backupRequest)
        {
            var error = new ModelStateDictionary();

            if (backupRequest.CancellationTokenInSecs == 0)
            {
                error.AddModelError("CancellationTokenInSecs", new MissingFieldException("CancellationTokenInSecs is a required argument"));
            }

            if (backupRequest.TimeoutInSecs == 0)
            {
                error.AddModelError("TimeoutInSecs", new MissingFieldException("TimeoutInSecs is a required argument"));
            }

            return(error);
        }
 public async Task <IActionResult> PostIncrementalBackup([FromBody] BackupRequestBody backupRequest)
 {
     return(await TakeBackup(backupRequest, BackupOption.Incremental));
 }