Skip to content

Commit 0e845b2

Browse files
[O2B-1183] Add QC flag types fetch all endpoint (#1458)
* add metrhod * add test * api test: * controller * WIP * test * docs * docs; * Update lib/server/services/qualityControlFlag/QcFlagTypeService.js Co-authored-by: Martin Boulais <31805063+martinboulais@users.noreply.github.com> * Update lib/server/services/qualityControlFlag/QcFlagTypeService.js Co-authored-by: Martin Boulais <31805063+martinboulais@users.noreply.github.com> * Update lib/server/services/qualityControlFlag/QcFlagTypeService.js Co-authored-by: Martin Boulais <31805063+martinboulais@users.noreply.github.com> * Update lib/server/services/qualityControlFlag/QcFlagTypeService.js Co-authored-by: Martin Boulais <31805063+martinboulais@users.noreply.github.com> * Update lib/server/services/qualityControlFlag/QcFlagTypeService.js Co-authored-by: Martin Boulais <31805063+martinboulais@users.noreply.github.com> * fix * correct order --------- Co-authored-by: Martin Boulais <31805063+martinboulais@users.noreply.github.com>
1 parent 6e2061d commit 0e845b2

6 files changed

Lines changed: 690 additions & 1 deletion

File tree

lib/database/seeders/20240213120811-quality-control-flags.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,14 @@ module.exports = {
5353
bad: true,
5454
created_by_id: 1,
5555
},
56+
{
57+
id: 20,
58+
name: 'Archived',
59+
method: 'Archived',
60+
bad: false,
61+
created_by_id: 1,
62+
archived_at: '2024-03-15 12:00:00',
63+
},
5664

5765
], { transaction }),
5866
])),

lib/server/controllers/qcFlagTypes.controller.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,9 @@ const { DtoFactory } = require('../../domain/dtos/DtoFactory');
1616
const { dtoValidator } = require('../utilities/dtoValidator.js');
1717
const { updateExpressResponseFromNativeError } = require('../express/updateExpressResponseFromNativeError');
1818
const { qcFlagTypeService } = require('../services/qualityControlFlag/QcFlagTypeService');
19+
const { PaginationDto } = require('../../domain/dtos');
20+
const { ApiConfig } = require('../../config');
21+
const { countedItemsToHttpView } = require('../utilities/countedItemsToHttpView');
1922

2023
// eslint-disable-next-line valid-jsdoc
2124
/**
@@ -37,6 +40,48 @@ const getQcFlagTypeByIdHandler = async (req, res) => {
3740
}
3841
};
3942

43+
// eslint-disable-next-line valid-jsdoc
44+
/**
45+
* List All QCFlagReasons
46+
*/
47+
const listQCFlagTypesHandler = async (req, res) => {
48+
const validatedDTO = await dtoValidator(
49+
DtoFactory.queryOnly({
50+
filter: {
51+
ids: Joi.array().items(Joi.number()),
52+
bad: Joi.boolean(),
53+
archived: Joi.boolean(),
54+
names: Joi.array().items(Joi.string()),
55+
methods: Joi.array().items(Joi.string()),
56+
},
57+
page: PaginationDto,
58+
sort: DtoFactory.order(['id', 'name', 'bad', 'method', 'archived', 'createdAt', 'updatedAt']),
59+
}),
60+
req,
61+
res,
62+
);
63+
if (validatedDTO) {
64+
try {
65+
const {
66+
filter,
67+
page: { limit = ApiConfig.pagination.limit, offset } = {},
68+
sort = { archived: 'DESC', name: 'DESC' },
69+
} = validatedDTO.query;
70+
71+
const { count, rows: items } = await qcFlagTypeService.getAll({
72+
filter,
73+
limit,
74+
offset,
75+
sort,
76+
});
77+
res.json(countedItemsToHttpView({ count, items }, limit));
78+
} catch (error) {
79+
updateExpressResponseFromNativeError(res, error);
80+
}
81+
}
82+
};
83+
4084
exports.QcFlagTypesController = {
4185
getQcFlagTypeByIdHandler,
86+
listQCFlagTypesHandler,
4287
};

lib/server/routers/qcFlagTypes.router.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,5 +22,9 @@ exports.qcFlagTypesRouter = {
2222
path: ':id',
2323
controller: QcFlagTypesController.getQcFlagTypeByIdHandler,
2424
},
25+
{
26+
method: 'get',
27+
controller: QcFlagTypesController.listQCFlagTypesHandler,
28+
},
2529
],
2630
};

lib/server/services/qualityControlFlag/QcFlagTypeService.js

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,74 @@ class QcFlagTypeService {
5454
return qcFlag;
5555
}
5656

57+
/**
58+
* Get all quality control flag types
59+
* @param {object} [options.filter] filtering defintion
60+
* @param {number[]} [options.filter.ids] quality control flag ids to filter with
61+
* @param {boolean} [options.filter.bad] quality control flag boolean to filter bad or not-bad QC flags
62+
* @param {boolean} [options.filter.archived] quality control flag boolean to filter arhived or not-archived QC flags
63+
* @param {string[]} [options.filter.names] quality control flag type name to filter with, single token is treated as pattern
64+
* @param {string[]} [options.filter.methods] quality control flag type method to filter with, single token is treated as pattern
65+
* @param {number} [options.offset] paramter related to pagination - offset
66+
* @param {number} [options.limit] paramter related to pagination - limit
67+
* @param {Object<string, 'ASC'|'DESC'>[]} [options.sort] definition of sorting
68+
* @return {Promise<CountedItems<QCFlagType>>} promise
69+
*/
70+
async getAll({ filter, sort, limit, offset } = {}) {
71+
const queryBuilder = this.prepareQueryBuilder();
72+
73+
if (sort) {
74+
const { archived: archivedOrder, ...otherSortProperties } = sort;
75+
if (archivedOrder) {
76+
queryBuilder.orderBy((sequelize) => sequelize.literal('archived_at IS NULL'), archivedOrder);
77+
}
78+
for (const property in otherSortProperties) {
79+
queryBuilder.orderBy(property, sort[property]);
80+
}
81+
}
82+
83+
if (limit) {
84+
queryBuilder.limit(limit);
85+
}
86+
if (offset) {
87+
queryBuilder.offset(offset);
88+
}
89+
90+
if (filter) {
91+
const { ids, names, methods, bad, archived } = filter;
92+
if (ids) {
93+
queryBuilder.where('id').oneOf(...ids);
94+
}
95+
if (names?.length) {
96+
if (names.length > 1) {
97+
queryBuilder.where('name').oneOf(...names);
98+
} else {
99+
queryBuilder.where('name').substring(names[0]);
100+
}
101+
}
102+
if (methods?.length) {
103+
if (methods.length > 1) {
104+
queryBuilder.where('method').oneOf(...methods);
105+
} else {
106+
queryBuilder.where('method').substring(methods[0]);
107+
}
108+
}
109+
if (bad !== undefined) {
110+
queryBuilder.where('bad').is(bad);
111+
}
112+
if (archived !== undefined) {
113+
queryBuilder.literalWhere(`archived_at is ${archived ? 'NOT NULL' : 'NULL'}`);
114+
}
115+
}
116+
117+
const { count, rows } = await QcFlagTypeRepository.findAndCountAll(queryBuilder);
118+
119+
return {
120+
count: count,
121+
rows: rows.map(qcFlagTypeAdapter.toEntity),
122+
};
123+
}
124+
57125
/**
58126
* Prepare query builder with common includes for fetching data
59127
* @return {QueryBuilder} common fetch-data query builder

0 commit comments

Comments
 (0)