11package models .dataset
22
3- import com .scalableminds .util .accesscontext .{DBAccessContext , GlobalAccessContext }
3+ import com .scalableminds .util .accesscontext .{AuthorizedAccessContext , DBAccessContext , GlobalAccessContext }
44import com .scalableminds .util .objectid .ObjectId
55import com .scalableminds .util .time .Instant
66import com .scalableminds .util .tools .{Fox , FoxImplicits }
@@ -23,6 +23,7 @@ import com.scalableminds.webknossos.datastore.models.datasource.{
2323 AbstractDataLayer ,
2424 AbstractSegmentationLayer ,
2525 DataFormat ,
26+ DataSource ,
2627 DataSourceId ,
2728 GenericDataSource ,
2829 DataLayerLike => DataLayer
@@ -36,6 +37,7 @@ import models.team._
3637import models .user .{User , UserService }
3738import net .liftweb .common .Box .tryo
3839import net .liftweb .common .{Empty , EmptyBox , Full }
40+ import play .api .i18n .Messages
3941import play .api .libs .json .{JsObject , Json }
4042import security .RandomIDGenerator
4143import utils .WkConf
@@ -97,6 +99,34 @@ class DatasetService @Inject()(organizationDAO: OrganizationDAO,
9799 } yield newDataset
98100 }
99101
102+ private def virtualRemoteDatasetStatus = " Virtual remote dataset"
103+
104+ def createVirtualDataset (datasetName : String ,
105+ organizationId : String ,
106+ dataStore : DataStore ,
107+ dataSource : DataSource ,
108+ folderId : Option [String ],
109+ user : User ): Fox [Dataset ] =
110+ for {
111+ _ <- assertValidDatasetName(datasetName)
112+ isDatasetNameAlreadyTaken <- datasetDAO.doesDatasetDirectoryExistInOrganization(datasetName, organizationId)(
113+ GlobalAccessContext )
114+ _ <- Fox .fromBool(! isDatasetNameAlreadyTaken) ?~> " dataset.name.alreadyTaken"
115+ organization <- organizationDAO.findOne(organizationId)(GlobalAccessContext ) ?~> " organization.notFound"
116+ folderId <- ObjectId .fromString(folderId.getOrElse(organization._rootFolder.toString)) ?~> " dataset.upload.folderId.invalid"
117+ _ <- folderDAO.assertUpdateAccess(folderId)(AuthorizedAccessContext (user)) ?~> " folder.noWriteAccess"
118+ newDatasetId = ObjectId .generate
119+ abstractDataSource = dataSource.copy(dataLayers = dataSource.dataLayers.map(_.asAbstractLayer))
120+ dataset <- createDataset(dataStore,
121+ newDatasetId,
122+ datasetName,
123+ abstractDataSource,
124+ status = Some (virtualRemoteDatasetStatus))
125+ datasetId = dataset._id
126+ _ <- datasetDAO.updateFolder(datasetId, folderId)(GlobalAccessContext )
127+ _ <- addUploader(dataset, user._id)(GlobalAccessContext )
128+ } yield dataset
129+
100130 def getAllUnfinishedDatasetUploadsOfUser (userId : ObjectId , organizationId : String )(
101131 implicit ctx : DBAccessContext ): Fox [List [DatasetCompactInfo ]] =
102132 datasetDAO.findAllCompactWithSearch(
@@ -114,7 +144,8 @@ class DatasetService @Inject()(organizationDAO: OrganizationDAO,
114144 datasetId : ObjectId ,
115145 datasetName : String ,
116146 dataSource : InboxDataSource ,
117- publication : Option [ObjectId ] = None
147+ publication : Option [ObjectId ] = None ,
148+ status : Option [String ] = None
118149 ): Fox [Dataset ] = {
119150 implicit val ctx : DBAccessContext = GlobalAccessContext
120151 val metadata =
@@ -147,7 +178,7 @@ class DatasetService @Inject()(organizationDAO: OrganizationDAO,
147178 name = datasetName,
148179 voxelSize = dataSource.voxelSizeOpt,
149180 sharingToken = None ,
150- status = dataSource.statusOpt.getOrElse(" " ),
181+ status = status.orElse( dataSource.statusOpt) .getOrElse(" " ),
151182 logoUrl = None ,
152183 metadata = metadata
153184 )
0 commit comments