From 4da907d532de8a870773ec41a827e8743721e341 Mon Sep 17 00:00:00 2001 From: chin Date: Thu, 3 Aug 2023 23:30:50 +0800 Subject: [PATCH] feat: query all series API --- .../controller/QIDO-RS/queryAllSeries.js | 47 +++++++++++++++++++ .../QIDO-RS/service/QIDO-RS.service.js | 3 +- api-sql/dicom-web/qido-rs.route.js | 12 ++--- models/sql/models/series.model.js | 28 +++++++++++ 4 files changed, 83 insertions(+), 7 deletions(-) create mode 100644 api-sql/dicom-web/controller/QIDO-RS/queryAllSeries.js diff --git a/api-sql/dicom-web/controller/QIDO-RS/queryAllSeries.js b/api-sql/dicom-web/controller/QIDO-RS/queryAllSeries.js new file mode 100644 index 00000000..9ebca4e2 --- /dev/null +++ b/api-sql/dicom-web/controller/QIDO-RS/queryAllSeries.js @@ -0,0 +1,47 @@ +const { + SqlQidoRsService: QidoRsService +} = require("./service/QIDO-RS.service"); +const { ApiLogger } = require("@root/utils/logs/api-logger"); +const { Controller } = require("@root/api/controller.class"); + +class QueryAllSeriesController extends Controller { + constructor(req, res) { + super(req, res); + } + + async mainProcess() { + let apiLogger = new ApiLogger(this.request, "QIDO-RS"); + + apiLogger.addTokenValue(); + apiLogger.logger.info("Query all series"); + + try { + + let qidoRsService = new QidoRsService(this.request, this.response, "series"); + + await qidoRsService.getAndResponseDicomJson(); + + } catch (e) { + let errorStr = JSON.stringify(e, Object.getOwnPropertyNames(e)); + apiLogger.logger.error(errorStr); + + this.response.writeHead(500, { + "Content-Type": "application/dicom+json" + }); + this.response.end(JSON.stringify({ + code: 500, + message: errorStr + })); + } + } +} +/** + * + * @param {import('express').Request} req + * @param {import('express').Response} res + */ +module.exports = async function (req, res) { + let controller = new QueryAllSeriesController(req, res); + + await controller.doPipeline(); +}; diff --git a/api-sql/dicom-web/controller/QIDO-RS/service/QIDO-RS.service.js b/api-sql/dicom-web/controller/QIDO-RS/service/QIDO-RS.service.js index 94e3271b..78b9dff5 100644 --- a/api-sql/dicom-web/controller/QIDO-RS/service/QIDO-RS.service.js +++ b/api-sql/dicom-web/controller/QIDO-RS/service/QIDO-RS.service.js @@ -9,6 +9,7 @@ const { DicomWebStatusCodes } = require("@error/dicom-web-service"); const { StudyModel } = require("@models/sql/models/study.model"); +const { SeriesModel } = require("@models/sql/models/series.model"); class SqlQidoRsService extends QidoRsService { @@ -89,7 +90,7 @@ class QidoDicomJsonFactory { return await StudyModel.getDicomJson(queryOptions); }, "series": async () => { - // return await getSeriesDicomJson(queryOptions); + return await SeriesModel.getDicomJson(queryOptions); }, "instance": async () => { // return await getInstanceDicomJson(queryOptions); diff --git a/api-sql/dicom-web/qido-rs.route.js b/api-sql/dicom-web/qido-rs.route.js index ea74e98c..21649cea 100644 --- a/api-sql/dicom-web/qido-rs.route.js +++ b/api-sql/dicom-web/qido-rs.route.js @@ -231,12 +231,12 @@ router.get("/studies", validateParams(queryValidation, "query", { * - $ref: "#/components/schemas/SeriesRequiredMatchingAttributes" * */ -// router.get( -// "/series", validateParams(queryValidation, "query", { -// allowUnknown: true -// }), -// require("./controller/QIDO-RS/queryAllSeries") -// ); +router.get( + "/series", validateParams(queryValidation, "query", { + allowUnknown: true + }), + require("./controller/QIDO-RS/queryAllSeries") +); /** * @openapi diff --git a/models/sql/models/series.model.js b/models/sql/models/series.model.js index 8bfedea6..92d377ff 100644 --- a/models/sql/models/series.model.js +++ b/models/sql/models/series.model.js @@ -1,6 +1,9 @@ const { Sequelize, DataTypes, Model } = require("sequelize"); const sequelizeInstance = require("@models/sql/instance"); const { vrTypeMapping } = require("../vrTypeMapping"); +const { SeriesQueryBuilder } = require("@root/api-sql/dicom-web/controller/QIDO-RS/seriesQueryBuilder"); +const _ = require("lodash"); +const { dictionary } = require("@models/DICOM/dicom-tags-dic"); class SeriesModel extends Model { }; @@ -69,4 +72,29 @@ SeriesModel.init({ freezeTableName: true }); +SeriesModel.getDicomJson = async function(queryOptions) { + let queryBuilder = new SeriesQueryBuilder(queryOptions); + let q = queryBuilder.build(); + let seriesArray = await SeriesModel.findAll({ + ...q, + attributes: ["json"], + limit: queryOptions.limit, + offset: queryOptions.skip + }); + + return await Promise.all(seriesArray.map(async series => { + let { json } = series.toJSON(); + // Set Retrieve URL + let studyInstanceUID = _.get(json, "0020000D.Value.0"); + let seriesInstanceUID = _.get(json, "0020000E.Value.0"); + _.set(json, dictionary.keyword.RetrieveURL, { + vr: dictionary.tagVR[dictionary.keyword.RetrieveURL].vr, + Value: [ + `${queryOptions.retrieveBaseUrl}/${studyInstanceUID}/series/${seriesInstanceUID}` + ] + }); + return json; + })); +}; + module.exports.SeriesModel = SeriesModel;