Skip to content

Commit 772ae17

Browse files
MichaelBuessemeyerMichael Büßemeyer
andauthored
Make manual reserveManualUpload route return datasetId and directoryName (#8476)
* Allow passing a manual dataset Id when triggering a manual upload * Add param to enforce new dataset name on manual upload and return directory name f new dataset * add changelog entry * fix backend * fix backend * fix compilation and remove not needed reserved manual upload param * make new requireUniqueName param optional --------- Co-authored-by: Michael Büßemeyer <[email protected]>
1 parent 18da17f commit 772ae17

File tree

7 files changed

+34
-15
lines changed

7 files changed

+34
-15
lines changed

CHANGELOG.unreleased.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ For upgrade instructions, please check the [migration guide](MIGRATIONS.released
2020
- New config option `datastore.dataVaults.credentials` allows admins to set up global credentials for remote dataset loading. [#8509](https://github.com/scalableminds/webknossos/pull/8509)
2121

2222
### Changed
23+
- Added a parameter to the reserve manual upload route allowing to make the request fail if the name is already taken. Moreover, the new dataset's id and directory name are returned in the response. [#8476](https://github.com/scalableminds/webknossos/pull/8476)
2324
- The skeleton tool can no longer be activated if the skeleton layer is invisible. [#8501](https://github.com/scalableminds/webknossos/pull/8501)
2425
- Improved speed of mesh rendering and mouse interaction in 3D viewport. [#8106](https://github.com/scalableminds/webknossos/pull/8106)
2526

app/controllers/WKRemoteDataStoreController.scala

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,11 @@ class WKRemoteDataStoreController @Inject()(
8383
_ <- folderDAO.assertUpdateAccess(folderId)(AuthorizedAccessContext(user)) ?~> "folder.noWriteAccess"
8484
layersToLinkWithDatasetId <- Fox.serialCombined(uploadInfo.layersToLink.getOrElse(List.empty))(l =>
8585
validateLayerToLink(l, user)) ?~> "dataset.upload.invalidLinkedLayers"
86-
dataset <- datasetService.createPreliminaryDataset(uploadInfo.name, uploadInfo.organization, dataStore) ?~> "dataset.name.alreadyTaken"
86+
dataset <- datasetService.createPreliminaryDataset(
87+
uploadInfo.name,
88+
uploadInfo.organization,
89+
dataStore,
90+
uploadInfo.requireUniqueName.getOrElse(false)) ?~> "dataset.upload.creation.failed"
8791
_ <- datasetDAO.updateFolder(dataset._id, folderId)(GlobalAccessContext)
8892
_ <- datasetService.addInitialTeams(dataset, uploadInfo.initialTeams, user)(AuthorizedAccessContext(user))
8993
_ <- datasetService.addUploader(dataset, user._id)(AuthorizedAccessContext(user))

app/models/dataset/DatasetService.scala

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -65,12 +65,16 @@ class DatasetService @Inject()(organizationDAO: OrganizationDAO,
6565
_ <- bool2Fox(!name.startsWith(".")) ?~> "dataset.layer.name.invalid.startsWithDot"
6666
} yield ()
6767

68-
def createPreliminaryDataset(datasetName: String, organizationId: String, dataStore: DataStore): Fox[Dataset] = {
68+
def createPreliminaryDataset(datasetName: String,
69+
organizationId: String,
70+
dataStore: DataStore,
71+
requireUniqueName: Boolean): Fox[Dataset] = {
6972
val newDatasetId = ObjectId.generate
7073
for {
71-
datasetDirectoryName <- datasetDAO
72-
.doesDatasetDirectoryExistInOrganization(datasetName, organizationId)(GlobalAccessContext)
73-
.map(if (_) s"$datasetName-${newDatasetId.toString}" else datasetName)
74+
isDatasetNameAlreadyTaken <- datasetDAO.doesDatasetDirectoryExistInOrganization(datasetName, organizationId)(
75+
GlobalAccessContext)
76+
_ <- bool2Fox(!(isDatasetNameAlreadyTaken && requireUniqueName)) ?~> "dataset.name.alreadyTaken"
77+
datasetDirectoryName = if (isDatasetNameAlreadyTaken) s"$datasetName-${newDatasetId.toString}" else datasetName
7478
unreportedDatasource = UnusableDataSource(DataSourceId(datasetDirectoryName, organizationId),
7579
notYetUploadedStatus)
7680
newDataset <- createDataset(dataStore, newDatasetId, datasetName, unreportedDatasource)

conf/messages

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,7 @@ dataset.upload.storageExceeded=Cannot upload dataset because the storage quota o
113113
dataset.upload.finishFailed=Failed to finalize dataset upload.
114114
dataset.upload.moveToTarget.failed=Failed to move uploaded dataset to target directory.
115115
dataset.upload.moreBytesThanReserved=The uploaded dataset contains more bytes than originally reserved. Please make sure to reserve the correct amount of bytes.
116+
dataset.upload.creation.failed=Failed to create dataset.
116117
dataset.explore.failed.readFile=Failed to read remote file
117118
dataset.explore.magDtypeMismatch=Element class must be the same for all mags of a layer. Got {0}
118119
dataset.explore.autoAdd.failed=Failed to automatically import the explored dataset.

webknossos-datastore/app/com/scalableminds/webknossos/datastore/controllers/DataSourceController.scala

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -113,7 +113,7 @@ class DataSourceController @Inject()(
113113
accessTokenService.validateAccessFromTokenContext(
114114
UserAccessRequest.administrateDataSources(request.body.organization)) {
115115
for {
116-
_ <- dsRemoteWebknossosClient.reserveDataSourceUpload(
116+
reservedDatasetInfo <- dsRemoteWebknossosClient.reserveDataSourceUpload(
117117
ReserveUploadInformation(
118118
"aManualUpload",
119119
request.body.datasetName,
@@ -123,10 +123,14 @@ class DataSourceController @Inject()(
123123
None,
124124
None,
125125
request.body.initialTeamIds,
126-
request.body.folderId
126+
request.body.folderId,
127+
Some(request.body.requireUniqueName)
127128
)
128129
) ?~> "dataset.upload.validation.failed"
129-
} yield Ok
130+
} yield
131+
Ok(
132+
Json.obj("newDatasetId" -> reservedDatasetInfo.newDatasetId,
133+
"directoryName" -> reservedDatasetInfo.directoryName))
130134
}
131135
}
132136

@@ -419,6 +423,7 @@ class DataSourceController @Inject()(
419423
layersToLink = None,
420424
initialTeams = List.empty,
421425
folderId = folderId,
426+
requireUniqueName = Some(false),
422427
)
423428
) ?~> "dataset.upload.validation.failed"
424429
datasourceId = DataSourceId(reservedAdditionalInfo.directoryName, organizationId)

webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/uploading/ComposeService.scala

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ class ComposeService @Inject()(dataSourceRepository: DataSourceRepository,
6363
None,
6464
None,
6565
List(),
66-
Some(composeRequest.targetFolderId)
66+
Some(composeRequest.targetFolderId),
67+
requireUniqueName = Some(false)
6768
)
6869
reservedAdditionalInfo <- remoteWebknossosClient.reserveDataSourceUpload(reserveUploadInfo) ?~> "Failed to reserve upload."
6970
directory = uploadDirectory(composeRequest.organizationId, reservedAdditionalInfo.directoryName)

webknossos-datastore/app/com/scalableminds/webknossos/datastore/services/uploading/UploadService.scala

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,18 @@ case class ReserveUploadInformation(
3838
totalFileSizeInBytes: Option[Long],
3939
layersToLink: Option[List[LinkedLayerIdentifier]],
4040
initialTeams: List[String], // team ids
41-
folderId: Option[String])
41+
folderId: Option[String],
42+
requireUniqueName: Option[Boolean])
4243
object ReserveUploadInformation {
4344
implicit val reserveUploadInformation: OFormat[ReserveUploadInformation] = Json.format[ReserveUploadInformation]
4445
}
45-
case class ReserveManualUploadInformation(datasetName: String,
46-
datasetDirectoryName: String,
47-
organization: String,
48-
initialTeamIds: List[String],
49-
folderId: Option[String])
46+
case class ReserveManualUploadInformation(
47+
datasetName: String,
48+
organization: String,
49+
initialTeamIds: List[String],
50+
folderId: Option[String],
51+
requireUniqueName: Boolean = false,
52+
)
5053
object ReserveManualUploadInformation {
5154
implicit val reserveUploadInformation: OFormat[ReserveManualUploadInformation] =
5255
Json.format[ReserveManualUploadInformation]

0 commit comments

Comments
 (0)