public async Task <DatasetDto> AddPreApprovedDatasetToStudyAsync(int studyId, int datasetId) { // Run validations: (Check if both id's are valid) var studyFromDb = await _studyModelService.GetForDatasetsAsync(studyId, UserOperation.Study_AddRemove_Dataset); var datasetFromDb = await _studySpecificDatasetModelService.GetByIdWithoutPermissionCheckAsync(datasetId); if (datasetFromDb == null) { throw NotFoundException.CreateForEntity("Dataset", datasetId); } if (datasetFromDb.StudySpecific) { throw new ArgumentException($"Dataset {datasetId} is Study specific, and cannot be linked using this method."); } // Create new entry in linking table var studyDataset = new StudyDataset { Study = studyFromDb, Dataset = datasetFromDb }; await _db.StudyDatasets.AddAsync(studyDataset); await _db.SaveChangesAsync(); return(_mapper.Map <DatasetDto>(studyDataset.Dataset)); }
public async Task <DatasetDto> CreateStudySpecificDatasetAsync(int studyId, DatasetCreateUpdateInputBaseDto newDatasetInput, string clientIp, CancellationToken cancellationToken = default) { var studyFromDb = await _studyModelService.GetForDatasetCreationAsync(studyId, UserOperation.Study_AddRemove_Dataset); await _studyWbsValidationService.ValidateForDatasetCreationOrThrow(studyFromDb); DatasetUtils.PerformUsualTestForPostedDatasets(newDatasetInput); ThrowIfDatasetNameTaken(studyFromDb, newDatasetInput.Name); var dataset = _mapper.Map <Dataset>(newDatasetInput); dataset.StudySpecific = true; var currentUser = await _userService.GetCurrentUserAsync(); dataset.CreatedBy = currentUser.UserName; _db.Datasets.Add(dataset); await _db.SaveChangesAsync(); // Create new linking table entry var studyDataset = new StudyDataset { StudyId = studyFromDb.Id, DatasetId = dataset.Id }; await _db.StudyDatasets.AddAsync(studyDataset); await _db.SaveChangesAsync(); dataset = await _studySpecificDatasetModelService.GetForResourceAndFirewall(dataset.Id, UserOperation.Study_AddRemove_Dataset); try { await _datasetCloudResourceService.CreateResourcesForStudySpecificDatasetAsync(studyFromDb, dataset, clientIp, cancellationToken); } catch (Exception ex) { _logger.LogError(ex, $"Unable to create resources for Study specific Dataset, deleting dataset"); _db.StudyDatasets.Remove(studyDataset); _db.Datasets.Remove(dataset); await _db.SaveChangesAsync(); throw; } var datasetDto = _mapper.Map <DatasetDto>(dataset); await DecorateDtoStudySpecific(_userService, studyFromDb, datasetDto.Permissions); return(datasetDto); }