Skip to content

Commit 5c460f6

Browse files
committed
add filtering to api
1 parent af41bf4 commit 5c460f6

4 files changed

Lines changed: 54 additions & 37 deletions

File tree

lib/server/controllers/qcFlag.controller.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,6 +322,7 @@ const getQcFlagsSummaryHandler = async (req, res) => {
322322
simulationPassId: Joi.number(),
323323
mcReproducibleAsNotBad: Joi.boolean().optional(),
324324
lhcPeriodId: Joi.number(),
325+
filter: qcFlagFilterDTO,
325326
}).xor('dataPassId', 'simulationPassId', 'lhcPeriodId')),
326327
req,
327328
res,
@@ -333,9 +334,14 @@ const getQcFlagsSummaryHandler = async (req, res) => {
333334
simulationPassId,
334335
lhcPeriodId,
335336
mcReproducibleAsNotBad = false,
337+
filter,
336338
} = validatedDTO.query;
337339

338-
const data = await qcFlagSummaryService.getSummary({ dataPassId, simulationPassId, lhcPeriodId }, { mcReproducibleAsNotBad });
340+
const data = await qcFlagSummaryService.getSummary(
341+
{ dataPassId, simulationPassId, lhcPeriodId },
342+
{ mcReproducibleAsNotBad },
343+
filter,
344+
);
339345
res.json({ data });
340346
} catch (error) {
341347
updateExpressResponseFromNativeError(res, error);

lib/server/services/qualityControlFlag/QcFlagService.js

Lines changed: 4 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ const { getOneSimulationPassOrFail } = require('../simulationPasses/getOneSimula
3636
const { AccessDeniedError } = require('../../errors/AccessDeniedError.js');
3737
const { LogManager } = require('@aliceo2/web-ui');
3838
const { DetectorType } = require('../../../domain/enums/DetectorTypes.js');
39+
const { getCreatedByFilterClause } = require('./getQcFlagFiltering.js');
3940

4041
/**
4142
* @typedef UserWithRoles
@@ -64,17 +65,6 @@ const validateUserDetectorAccess = (userRoles, detectorName) => {
6465
}
6566
};
6667

67-
/**
68-
* @typedef CreatedByFilter
69-
* @property {string} names
70-
* @property {'or'|'none'} operator
71-
*/
72-
73-
/**
74-
* @typedef QcFlagFilter
75-
* @property {CreatedByFilter} createdBy
76-
*/
77-
7868
/**
7969
* Quality control flags service
8070
*/
@@ -394,27 +384,6 @@ class QcFlagService {
394384
});
395385
}
396386

397-
/**
398-
* Get sequelize clause for CreateByFilter
399-
*
400-
* @param {QcFlagFilter} filter filter
401-
* @returns {object} sequelize clause
402-
* @throws {Error} if bad operator provided
403-
*/
404-
getCreatedByFilterClause(filter = {}) {
405-
const { createdBy: { names: createdByNames, operator: createdByOperator } = {} } = filter;
406-
407-
if (createdByNames && createdByOperator) {
408-
if (createdByOperator === 'or') {
409-
return { name: { [Op.or]: createdByNames } };
410-
} else if (createdByOperator === 'none') {
411-
return { [Op.not]: { name: { [Op.or]: createdByNames } } };
412-
} else {
413-
throw Error(`Operator ${createdByOperator} is not suppoerted`);
414-
}
415-
}
416-
}
417-
418387
/**
419388
* Return a paginated list of QC flags related to a given data pass, run and dpl detector
420389
*
@@ -439,7 +408,7 @@ class QcFlagService {
439408
{ association: 'flagType' },
440409
{
441410
association: 'createdBy',
442-
where: this.getCreatedByFilterClause(filter),
411+
where: getCreatedByFilterClause(filter),
443412
},
444413
{ association: 'verifications', include: [{ association: 'createdBy' }] },
445414
{ association: 'effectivePeriods' },
@@ -496,7 +465,7 @@ class QcFlagService {
496465
{ association: 'flagType' },
497466
{
498467
association: 'createdBy',
499-
where: this.getCreatedByFilterClause(filter),
468+
where: getCreatedByFilterClause(filter),
500469
},
501470
{ association: 'verifications', include: [{ association: 'createdBy' }] },
502471
{ association: 'effectivePeriods' },
@@ -556,7 +525,7 @@ class QcFlagService {
556525
{ association: 'flagType' },
557526
{
558527
association: 'createdBy',
559-
where: this.getCreatedByFilterClause(filter),
528+
where: getCreatedByFilterClause(filter),
560529
},
561530
{ association: 'verifications', include: [{ association: 'createdBy' }] },
562531
{ association: 'dataPasses', required: false },

lib/server/services/qualityControlFlag/QcFlagSummaryService.js

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ const { dataSource } = require('../../../database/DataSource.js');
3434
const { QcFlagRepository } = require('../../../database/repositories/index.js');
3535
const { Op } = require('sequelize');
3636
const { QcSummarProperties } = require('../../../domain/enums/QcSummaryProperties.js');
37+
const { getCreatedByFilterClause } = require('./getQcFlagFiltering.js');
3738

3839
/**
3940
* QC flag summary service
@@ -82,9 +83,10 @@ class QcFlagSummaryService {
8283
* @param {object} [options] additional options
8384
* @param {boolean} [options.mcReproducibleAsNotBad = false] if set to true, `Limited Acceptance MC Reproducible` flag type is treated as
8485
* good one
86+
* @param {QcFlagFilter} [filter] filter
8587
* @return {Promise<QcSummary>} summary
8688
*/
87-
async getSummary({ dataPassId, simulationPassId, lhcPeriodId, dplDetectorIds }, { mcReproducibleAsNotBad = false } = {}) {
89+
async getSummary({ dataPassId, simulationPassId, lhcPeriodId, dplDetectorIds }, { mcReproducibleAsNotBad = false } = {}, filter = {}) {
8890
if (Boolean(dataPassId) + Boolean(simulationPassId) + Boolean(lhcPeriodId) !== 1) {
8991
throw new BadParameterError('One and exactly one of `dataPassId`, `simulationPassId` and `lhcPeriodId` is required');
9092
}
@@ -112,6 +114,11 @@ class QcFlagSummaryService {
112114
queryBuilder.where('detectorId').oneOf(...dplDetectorIds);
113115
}
114116

117+
queryBuilder.include({
118+
association: 'createdBy',
119+
where: getCreatedByFilterClause(filter),
120+
});
121+
115122
queryBuilder
116123
.include({ association: 'effectivePeriods', attributes: [], required: true })
117124
.include({ association: 'flagType', attributes: [] })
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
const { Op } = require('sequelize');
2+
3+
/**
4+
* @typedef CreatedByFilter
5+
* @property {string} names
6+
* @property {'or'|'none'} operator
7+
*/
8+
9+
/**
10+
* @typedef QcFlagFilter
11+
* @property {CreatedByFilter} createdBy
12+
*/
13+
14+
/**
15+
* Get sequelize clause for CreateByFilter
16+
*
17+
* @param {QcFlagFilter} filter filter
18+
* @returns {object} sequelize clause
19+
* @throws {Error} if bad operator provided
20+
*/
21+
const getCreatedByFilterClause = (filter = {}) => {
22+
const { createdBy: { names: createdByNames, operator: createdByOperator } = {} } = filter;
23+
24+
if (createdByNames && createdByOperator) {
25+
if (createdByOperator === 'or') {
26+
return { name: { [Op.or]: createdByNames } };
27+
} else if (createdByOperator === 'none') {
28+
return { [Op.not]: { name: { [Op.or]: createdByNames } } };
29+
} else {
30+
throw Error(`Operator ${createdByOperator} is not suppoerted`);
31+
}
32+
}
33+
};
34+
35+
module.exports.getCreatedByFilterClause = getCreatedByFilterClause;

0 commit comments

Comments
 (0)