Skip to content

Commit e6f0f04

Browse files
authored
Add tracingstore route to export agglomerate graph as protobuf (#8872)
To be used by the python client, requested by @valentin-pinkau ### URL of deployed dev instance (used for testing): - https://agglomerategraphroute.webknossos.xyz ### Steps to test: - Do some proofreading actions - Request the new route, should return protobuf both for edited agglomerates and non-edited agglomerates (should perform automatic fallback lookup in the agglomerate file) ------ - [x] Added changelog entry (create a `$PR_NUMBER.md` file in `unreleased_changes` or use `./tools/create-changelog-entry.py`) - [x] Considered [common edge cases](../blob/master/.github/common_edge_cases.md)
1 parent 9d6fe6e commit e6f0f04

File tree

3 files changed

+23
-0
lines changed

3 files changed

+23
-0
lines changed

unreleased_changes/8872.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
### Added
2+
- Add tracingstore route to export agglomerate graph as protobuf, to be used by the python client.

webknossos-tracingstore/app/com/scalableminds/webknossos/tracingstore/controllers/EditableMappingController.scala

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,26 @@ class EditableMappingController @Inject()(
129129
}
130130
}
131131

132+
def agglomerateGraph(tracingId: String, agglomerateId: Long, version: Option[Long]): Action[AnyContent] =
133+
Action.async { implicit request =>
134+
log() {
135+
accessTokenService.validateAccessFromTokenContext(UserAccessRequest.readTracing(tracingId)) {
136+
for {
137+
annotationId <- remoteWebknossosClient.getAnnotationIdForTracing(tracingId)
138+
tracing <- annotationService.findVolume(annotationId, tracingId, version)
139+
_ <- editableMappingService.assertTracingHasEditableMapping(tracing)
140+
remoteFallbackLayer <- volumeTracingService.remoteFallbackLayerForVolumeTracing(tracing, annotationId)
141+
editableMappingInfo <- annotationService.findEditableMappingInfo(annotationId, tracingId)
142+
agglomerateGraph <- editableMappingService.getAgglomerateGraphForIdWithFallback(editableMappingInfo,
143+
tracingId,
144+
tracing.version,
145+
agglomerateId,
146+
remoteFallbackLayer)
147+
} yield Ok(agglomerateGraph.toByteArray).as(protobufMimeType)
148+
}
149+
}
150+
}
151+
132152
def agglomerateSkeleton(tracingId: String, agglomerateId: Long): Action[AnyContent] =
133153
Action.async { implicit request =>
134154
accessTokenService.validateAccessFromTokenContext(UserAccessRequest.readTracing(tracingId)) {

webknossos-tracingstore/conf/tracingstore.latest.routes

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ POST /mapping/:tracingId/agglomeratesForSegments
3838
POST /mapping/:tracingId/agglomerateGraphMinCut @com.scalableminds.webknossos.tracingstore.controllers.EditableMappingController.agglomerateGraphMinCut(tracingId: String)
3939
POST /mapping/:tracingId/agglomerateGraphNeighbors @com.scalableminds.webknossos.tracingstore.controllers.EditableMappingController.agglomerateGraphNeighbors(tracingId: String)
4040
GET /mapping/:tracingId/agglomerateSkeleton/:agglomerateId @com.scalableminds.webknossos.tracingstore.controllers.EditableMappingController.agglomerateSkeleton(tracingId: String, agglomerateId: Long)
41+
GET /mapping/:tracingId/agglomerateGraph/:agglomerateId @com.scalableminds.webknossos.tracingstore.controllers.EditableMappingController.agglomerateGraph(tracingId: String, agglomerateId: Long, version: Option[Long])
4142
GET /mapping/:tracingId/editedEdgesZip @com.scalableminds.webknossos.tracingstore.controllers.EditableMappingController.editedEdgesZip(tracingId: String, version: Option[Long])
4243

4344
# Zarr endpoints for volume annotations

0 commit comments

Comments
 (0)