Skip to content

Commit 0ec4cfd

Browse files
committed
feat: add p-limit to preprocess transactions code
1 parent 4d8dc92 commit 0ec4cfd

1 file changed

Lines changed: 41 additions & 37 deletions

File tree

apps/api/src/instrument-records/instrument-records.service.ts

Lines changed: 41 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import type {
1515
import { Prisma } from '@prisma/client';
1616
import type { Session } from '@prisma/client';
1717
import { isNumber, pickBy } from 'lodash-es';
18+
import pLimit from 'p-limit';
1819

1920
import type { EntityOperationOptions } from '@/core/types';
2021
import { 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

Comments
 (0)