@@ -15,6 +15,7 @@ import type {
1515import { Prisma } from '@prisma/client' ;
1616import type { Session } from '@prisma/client' ;
1717import { isNumber , pickBy } from 'lodash-es' ;
18+ import pLimit from 'p-limit' ;
1819
1920import type { EntityOperationOptions } from '@/core/types' ;
2021import { GroupsService } from '@/groups/groups.service' ;
@@ -275,46 +276,49 @@ export class InstrumentRecordsService {
275276
276277 const createdSessionsArray : Session [ ] = [ ] ;
277278
279+ const transactionLimit = pLimit ( 10 ) ;
278280 try {
279281 const preProcessedRecords = await Promise . all (
280- records . map ( async ( record ) => {
281- const { data : rawData , date, subjectId } = record ;
282-
283- // Validate data
284- const parseResult = instrument . validationSchema . safeParse ( this . parseJson ( rawData ) ) ;
285- if ( ! parseResult . success ) {
286- console . error ( parseResult . error . issues ) ;
287- throw new UnprocessableEntityException (
288- `Data received for record does not pass validation schema of instrument '${ instrument . id } '`
289- ) ;
290- }
282+ records . map ( ( record ) =>
283+ transactionLimit ( async ( ) => {
284+ const { data : rawData , date, subjectId } = record ;
285+
286+ // Validate data
287+ const parseResult = instrument . validationSchema . safeParse ( this . parseJson ( rawData ) ) ;
288+ if ( ! parseResult . success ) {
289+ console . error ( parseResult . error . issues ) ;
290+ throw new UnprocessableEntityException (
291+ `Data received for record does not pass validation schema of instrument '${ instrument . id } '`
292+ ) ;
293+ }
291294
292- // Ensure subject exists
293- await this . createSubjectIfNotFound ( subjectId ) ;
294-
295- const session = await this . sessionsService . create ( {
296- date : date ,
297- groupId : groupId ?? null ,
298- subjectData : { id : subjectId } ,
299- type : 'RETROSPECTIVE'
300- } ) ;
301-
302- createdSessionsArray . push ( session ) ;
303-
304- const computedMeasures = instrument . measures
305- ? this . instrumentMeasuresService . computeMeasures ( instrument . measures , parseResult . data )
306- : null ;
307-
308- return {
309- computedMeasures,
310- data : this . serializeData ( parseResult . data ) ,
311- date,
312- groupId,
313- instrumentId,
314- sessionId : session . id ,
315- subjectId
316- } ;
317- } )
295+ // Ensure subject exists
296+ await this . createSubjectIfNotFound ( subjectId ) ;
297+
298+ const session = await this . sessionsService . create ( {
299+ date : date ,
300+ groupId : groupId ?? null ,
301+ subjectData : { id : subjectId } ,
302+ type : 'RETROSPECTIVE'
303+ } ) ;
304+
305+ createdSessionsArray . push ( session ) ;
306+
307+ const computedMeasures = instrument . measures
308+ ? this . instrumentMeasuresService . computeMeasures ( instrument . measures , parseResult . data )
309+ : null ;
310+
311+ return {
312+ computedMeasures,
313+ data : this . serializeData ( parseResult . data ) ,
314+ date,
315+ groupId,
316+ instrumentId,
317+ sessionId : session . id ,
318+ subjectId
319+ } ;
320+ } )
321+ )
318322 ) ;
319323
320324 await this . instrumentRecordModel . createMany ( {
0 commit comments