@@ -28,25 +28,31 @@ class VariantApiController @Inject()(
2828 * Bulk add reference builds (coordinates) to existing variants.
2929 * Matches variants by name or rsId, then adds coordinates for the specified reference genome.
3030 */
31+ private val MaxBulkSize = 1000
32+
3133 def bulkAddBuilds (): Action [BulkAddVariantBuildsRequest ] =
3234 secureApi.jsonAction[BulkAddVariantBuildsRequest ].async { request =>
33- val requests = request.body.variants
34- logger.info(s " Bulk add builds request for ${requests.size} variants " )
35+ if (request.body.variants.size > MaxBulkSize ) {
36+ Future .successful(BadRequest (Json .obj(" error" -> s " Bulk operations limited to $MaxBulkSize items per request " )))
37+ } else {
38+ val requests = request.body.variants
39+ logger.info(s " Bulk add builds request for ${requests.size} variants " )
3540
36- val resultFutures = requests.map(processAddBuildRequest)
41+ val resultFutures = requests.map(processAddBuildRequest)
3742
38- Future .sequence(resultFutures).map { results =>
39- val succeeded = results.count(_.status == " success" )
40- val failed = results.count(_.status != " success" )
43+ Future .sequence(resultFutures).map { results =>
44+ val succeeded = results.count(_.status == " success" )
45+ val failed = results.count(_.status != " success" )
4146
42- logger.info(s " Bulk add builds completed: $succeeded succeeded, $failed failed " )
47+ logger.info(s " Bulk add builds completed: $succeeded succeeded, $failed failed " )
4348
44- Ok (Json .toJson(BulkVariantOperationResponse (
45- total = results.size,
46- succeeded = succeeded,
47- failed = failed,
48- results = results
49- )))
49+ Ok (Json .toJson(BulkVariantOperationResponse (
50+ total = results.size,
51+ succeeded = succeeded,
52+ failed = failed,
53+ results = results
54+ )))
55+ }
5056 }
5157 }
5258
@@ -56,23 +62,27 @@ class VariantApiController @Inject()(
5662 */
5763 def bulkUpdateRsIds (): Action [BulkUpdateRsIdsRequest ] =
5864 secureApi.jsonAction[BulkUpdateRsIdsRequest ].async { request =>
59- val requests = request.body.variants
60- logger.info(s " Bulk update rsIds request for ${requests.size} variants " )
65+ if (request.body.variants.size > MaxBulkSize ) {
66+ Future .successful(BadRequest (Json .obj(" error" -> s " Bulk operations limited to $MaxBulkSize items per request " )))
67+ } else {
68+ val requests = request.body.variants
69+ logger.info(s " Bulk update rsIds request for ${requests.size} variants " )
6170
62- val resultFutures = requests.map(processUpdateRsIdRequest)
71+ val resultFutures = requests.map(processUpdateRsIdRequest)
6372
64- Future .sequence(resultFutures).map { results =>
65- val succeeded = results.count(_.status == " success" )
66- val failed = results.count(_.status != " success" )
73+ Future .sequence(resultFutures).map { results =>
74+ val succeeded = results.count(_.status == " success" )
75+ val failed = results.count(_.status != " success" )
6776
68- logger.info(s " Bulk update rsIds completed: $succeeded succeeded, $failed failed " )
77+ logger.info(s " Bulk update rsIds completed: $succeeded succeeded, $failed failed " )
6978
70- Ok (Json .toJson(BulkVariantOperationResponse (
71- total = results.size,
72- succeeded = succeeded,
73- failed = failed,
74- results = results
75- )))
79+ Ok (Json .toJson(BulkVariantOperationResponse (
80+ total = results.size,
81+ succeeded = succeeded,
82+ failed = failed,
83+ results = results
84+ )))
85+ }
7686 }
7787 }
7888
@@ -138,7 +148,7 @@ class VariantApiController @Inject()(
138148 name = req.name,
139149 rsId = req.rsId,
140150 status = " error" ,
141- message = Some (s " Database error: ${e.getMessage} " )
151+ message = Some (" A database error occurred while processing this request " )
142152 )
143153 }
144154 }
@@ -184,7 +194,7 @@ class VariantApiController @Inject()(
184194 name = Some (req.name),
185195 rsId = Some (req.rsId),
186196 status = " error" ,
187- message = Some (s " Database error: ${e.getMessage} " )
197+ message = Some (" A database error occurred while processing this request " )
188198 )
189199 }
190200 }
@@ -218,7 +228,7 @@ class VariantApiController @Inject()(
218228 newSource = req.newSource,
219229 aliasesUpdated = 0 ,
220230 status = " error" ,
221- message = Some (s " Database error: ${e.getMessage} " )
231+ message = Some (" A database error occurred while processing this request " )
222232 )
223233 }
224234 }
@@ -305,28 +315,32 @@ class VariantApiController @Inject()(
305315 */
306316 def bulkAssignDuNames (): Action [BulkAssignDuNamesRequest ] =
307317 secureApi.jsonAction[BulkAssignDuNamesRequest ].async { request =>
308- val variantIds = request.body.variantIds
309- logger.info(s " Bulk assign DU names request for ${variantIds.size} variants " )
310-
311- // Process sequentially to maintain name ordering
312- variantIds.foldLeft(Future .successful(Seq .empty[DuNameAssignmentResult ])) { (accFuture, variantId) =>
313- accFuture.flatMap { acc =>
314- processAssignDuName(variantId).map(result => acc :+ result)
315- }
316- }.map { results =>
317- val succeeded = results.count(_.status == " success" )
318- val failed = results.count(_.status == " error" )
319- val skipped = results.count(_.status == " skipped" )
320-
321- logger.info(s " Bulk assign DU names completed: $succeeded succeeded, $failed failed, $skipped skipped " )
318+ if (request.body.variantIds.size > MaxBulkSize ) {
319+ Future .successful(BadRequest (Json .obj(" error" -> s " Bulk operations limited to $MaxBulkSize items per request " )))
320+ } else {
321+ val variantIds = request.body.variantIds
322+ logger.info(s " Bulk assign DU names request for ${variantIds.size} variants " )
322323
323- Ok (Json .toJson(BulkDuNameAssignmentResponse (
324- total = results.size,
325- succeeded = succeeded,
326- failed = failed,
327- skipped = skipped,
324+ // Process sequentially to maintain name ordering
325+ variantIds.foldLeft(Future .successful(Seq .empty[DuNameAssignmentResult ])) { (accFuture, variantId) =>
326+ accFuture.flatMap { acc =>
327+ processAssignDuName(variantId).map(result => acc :+ result)
328+ }
329+ }.map { results =>
330+ val succeeded = results.count(_.status == " success" )
331+ val failed = results.count(_.status == " error" )
332+ val skipped = results.count(_.status == " skipped" )
333+
334+ logger.info(s " Bulk assign DU names completed: $succeeded succeeded, $failed failed, $skipped skipped " )
335+
336+ Ok (Json .toJson(BulkDuNameAssignmentResponse (
337+ total = results.size,
338+ succeeded = succeeded,
339+ failed = failed,
340+ skipped = skipped,
328341 results = results
329342 )))
343+ }
330344 }
331345 }
332346
0 commit comments