@@ -39,6 +39,7 @@ import models.team._
3939import models .user .{User , UserService }
4040import com .scalableminds .util .tools .Box .tryo
4141import com .scalableminds .util .tools .{Empty , EmptyBox , Full }
42+ import com .scalableminds .webknossos .datastore .controllers .PathValidationResult
4243import play .api .libs .json .{JsObject , Json }
4344import security .RandomIDGenerator
4445import utils .WkConf
@@ -101,17 +102,16 @@ class DatasetService @Inject()(organizationDAO: OrganizationDAO,
101102 }
102103
103104 def createVirtualDataset (datasetName : String ,
104- organizationId : String ,
105105 dataStore : DataStore ,
106106 dataSource : DataSource ,
107107 folderId : Option [String ],
108108 user : User ): Fox [Dataset ] =
109109 for {
110110 _ <- assertValidDatasetName(datasetName)
111- isDatasetNameAlreadyTaken <- datasetDAO.doesDatasetDirectoryExistInOrganization(datasetName, organizationId )(
111+ isDatasetNameAlreadyTaken <- datasetDAO.doesDatasetDirectoryExistInOrganization(datasetName, user._organization )(
112112 GlobalAccessContext )
113113 _ <- Fox .fromBool(! isDatasetNameAlreadyTaken) ?~> " dataset.name.alreadyTaken"
114- organization <- organizationDAO.findOne(organizationId )(GlobalAccessContext ) ?~> " organization.notFound"
114+ organization <- organizationDAO.findOne(user._organization )(GlobalAccessContext ) ?~> " organization.notFound"
115115 folderId <- ObjectId .fromString(folderId.getOrElse(organization._rootFolder.toString)) ?~> " dataset.upload.folderId.invalid"
116116 _ <- folderDAO.assertUpdateAccess(folderId)(AuthorizedAccessContext (user)) ?~> " folder.noWriteAccess"
117117 newDatasetId = ObjectId .generate
@@ -155,7 +155,7 @@ class DatasetService @Inject()(organizationDAO: OrganizationDAO,
155155
156156 val dataSourceHash = if (dataSource.isUsable) Some (dataSource.hashCode()) else None
157157 for {
158- organization <- organizationDAO.findOne(dataSource.id.organizationId)
158+ organization <- organizationDAO.findOne(dataSource.id.organizationId) ?~> " organization.notFound "
159159 organizationRootFolder <- folderDAO.findOne(organization._rootFolder)
160160 dataset = Dataset (
161161 datasetId,
@@ -657,6 +657,31 @@ class DatasetService @Inject()(organizationDAO: OrganizationDAO,
657657 })
658658 } yield magInfosAndLinkedMags
659659
660+ def validatePaths (paths : Seq [String ], dataStore : DataStore ): Fox [Unit ] =
661+ for {
662+ _ <- Fox .successful(())
663+ client = new WKRemoteDataStoreClient (dataStore, rpc)
664+ pathValidationResults <- client.validatePaths(paths)
665+ _ <- Fox .serialCombined(pathValidationResults)({
666+ case PathValidationResult (_, true ) => Fox .successful(())
667+ case PathValidationResult (path, false ) => Fox .failure(s " Path validation failed for path: $path" )
668+ })
669+ } yield ()
670+
671+ def deleteVirtualOrDiskDataset (dataset : Dataset )(implicit ctx : DBAccessContext ): Fox [Unit ] =
672+ for {
673+ _ <- if (dataset.isVirtual) {
674+ // At this point, we should also free space in S3 once implemented.
675+ // Right now, we can just mark the dataset as deleted in the database.
676+ datasetDAO.deleteDataset(dataset._id, onlyMarkAsDeleted = true )
677+ } else {
678+ for {
679+ datastoreClient <- clientFor(dataset)
680+ _ <- datastoreClient.deleteOnDisk(dataset._id)
681+ } yield ()
682+ } ?~> " dataset.delete.failed"
683+ } yield ()
684+
660685 def publicWrites (dataset : Dataset ,
661686 requestingUserOpt : Option [User ],
662687 organization : Option [Organization ] = None ,
0 commit comments