Beispiel #1
0
        public async Task DownloadAsync()
        {
            EventHandler <ProgressUpdatedEventArgs> eventHandler = (sender, e) =>
            {
                this.DownloadMessage  = e.Message;
                this.DownloadProgress = e.Progress;
            };

            try
            {
                this.ClientState = ClientState.PrepareDownload;
                _dataService.Progress.ProgressChanged += eventHandler;

                var selectedDatasets = this.GetSelectedDatasets().Select(dataset => dataset.Model).ToList();

                // security check
                var projectIds = selectedDatasets.Select(dataset => dataset.Parent.Parent.Id).Distinct();

                foreach (var projectId in projectIds)
                {
                    if (!Utilities.IsProjectAccessible(_userIdService.User, projectId, _databaseManager.Database))
                    {
                        throw new UnauthorizedAccessException($"The current user is not authorized to access project '{projectId}'.");
                    }
                }

                //
                var job = new ExportJob()
                {
                    Owner      = _userIdService.User.Identity.Name,
                    Parameters = this.ExportParameters
                };

                var exportJobService = _serviceProvider.GetRequiredService <JobService <ExportJob> >();

                _exportJobControl = exportJobService.AddJob(job, _dataService.Progress, (jobControl, cts) =>
                {
                    var task = _dataService.ExportDataAsync(this.ExportParameters,
                                                            selectedDatasets,
                                                            cts.Token);

                    return(task);
                });

                var downloadLink = await _exportJobControl.Task;

                if (!string.IsNullOrWhiteSpace(downloadLink))
                {
                    var fileName = downloadLink.Split("/").Last();
                    await _jsRuntime.FileSaveAs(fileName, downloadLink);
                }
            }
            finally
            {
                _dataService.Progress.ProgressChanged -= eventHandler;
                this.ClientState      = ClientState.Normal;
                this.DownloadMessage  = string.Empty;
                this.DownloadProgress = 0;
            }
        }