diff --git a/api/dicom-web/controller/MWL-RS/change-filtered-mwlItem-status.js b/api/dicom-web/controller/MWL-RS/change-filtered-mwlItem-status.js new file mode 100644 index 00000000..3c9ef4af --- /dev/null +++ b/api/dicom-web/controller/MWL-RS/change-filtered-mwlItem-status.js @@ -0,0 +1,40 @@ +const { ApiErrorArrayHandler } = require("@error/api-errors.handler"); +const { Controller } = require("@root/api/controller.class"); +const { ApiLogger } = require("@root/utils/logs/api-logger"); +const { ChangeFilteredMwlItemStatusService } = require("./service/change-filtered-mwlItem-status"); + +class ChangeFilteredMwlItemStatusController extends Controller { + constructor(req, res) { + super(req, res); + this.apiLogger = new ApiLogger(this.request, "MWL-RS"); + } + + async mainProcess() { + try { + let changeFilteredMwlItemService = new ChangeFilteredMwlItemStatusService(this.request, this.response); + let changedMwlItemsCount = await changeFilteredMwlItemService.changeMwlItemsStatus(); + + return this.response + .set("Content-Type", "application/dicom+json") + .status(200) + .json({ + updatedCount: changedMwlItemsCount + }); + + } catch (e) { + let apiErrorArrayHandler = new ApiErrorArrayHandler(this.response, this.apiLogger, e); + return apiErrorArrayHandler.doErrorResponse(); + } + } +} + +/** + * + * @param {import('express').Request} req + * @param {import('express').Response} res + */ +module.exports = async function (req, res) { + let controller = new ChangeFilteredMwlItemStatusController(req, res); + + await controller.doPipeline(); +}; \ No newline at end of file diff --git a/api/dicom-web/controller/MWL-RS/change-mwlItem-status.js b/api/dicom-web/controller/MWL-RS/change-mwlItem-status.js index d532d9d0..c80492f4 100644 --- a/api/dicom-web/controller/MWL-RS/change-mwlItem-status.js +++ b/api/dicom-web/controller/MWL-RS/change-mwlItem-status.js @@ -1,10 +1,9 @@ const { ApiErrorArrayHandler } = require("@error/api-errors.handler"); const { Controller } = require("@root/api/controller.class"); const { ApiLogger } = require("@root/utils/logs/api-logger"); -const { GetMwlItemCountService } = require("./service/count-mwlItem.service"); const { ChangeMwlItemStatusService } = require("./service/change-mwlItem-status"); -class ChangeMwlItemStatusCountController extends Controller { +class ChangeMwlItemStatusController extends Controller { constructor(req, res) { super(req, res); this.apiLogger = new ApiLogger(this.request, "MWL-RS"); @@ -14,7 +13,7 @@ class ChangeMwlItemStatusCountController extends Controller { try { let changeMwlItemService = new ChangeMwlItemStatusService(this.request, this.response); let changedMwlItems = await changeMwlItemService.changeMwlItemsStatus(); - + return this.response .set("Content-Type", "application/dicom+json") .status(200) @@ -33,7 +32,7 @@ class ChangeMwlItemStatusCountController extends Controller { * @param {import('express').Response} res */ module.exports = async function (req, res) { - let controller = new ChangeMwlItemStatusCountController(req, res); + let controller = new ChangeMwlItemStatusController(req, res); await controller.doPipeline(); }; \ No newline at end of file diff --git a/api/dicom-web/controller/MWL-RS/service/change-filtered-mwlItem-status.js b/api/dicom-web/controller/MWL-RS/service/change-filtered-mwlItem-status.js new file mode 100644 index 00000000..4711b742 --- /dev/null +++ b/api/dicom-web/controller/MWL-RS/service/change-filtered-mwlItem-status.js @@ -0,0 +1,34 @@ +const _ = require("lodash"); +const { MwlItemModel } = require("@models/mongodb/models/mwlitems.model"); +const { DicomWebServiceError, DicomWebStatusCodes } = require("@error/dicom-web-service"); +const { dictionary } = require("@models/DICOM/dicom-tags-dic"); +const { convertRequestQueryToMongoQuery } = require("../../QIDO-RS/service/query-dicom-json-factory"); +const { BaseQueryService } = require("@root/api/dicom-web/service/base-query.service"); + +class ChangeFilteredMwlItemStatusService extends BaseQueryService { + constructor(req, res) { + super(req, res); + } + + async changeMwlItemsStatus() { + let { status } = this.request.params; + let mwlItems = await this.getMwlItems(); + if (mwlItems.length === 0) { + throw new DicomWebServiceError(DicomWebStatusCodes.NoSuchObjectInstance, "Can not found any MWL item from query", 404); + } + + for (let mwlItem of mwlItems) { + _.set(mwlItem, `${dictionary.keyword.ScheduledProcedureStepSequence}.Value.0.${dictionary.keyword.ScheduledProcedureStepStatus}.Value.0`, status); + await mwlItem.save(); + } + + return mwlItems.length; + } + + async getMwlItems() { + let query = (await convertRequestQueryToMongoQuery(this.query)).$match; + return await MwlItemModel.find(query); + } +} + +module.exports.ChangeFilteredMwlItemStatusService = ChangeFilteredMwlItemStatusService; \ No newline at end of file diff --git a/api/dicom-web/mwl-rs.route.js b/api/dicom-web/mwl-rs.route.js index b8ae6ee6..06e0e0dd 100644 --- a/api/dicom-web/mwl-rs.route.js +++ b/api/dicom-web/mwl-rs.route.js @@ -131,4 +131,30 @@ router.post("/mwlitems/:studyUID/:spsID/status/:status", require("./controller/MWL-RS/change-mwlItem-status") ); +/** + * @openapi + * /dicom-web/mwlitems/status/{spsStatus}: + * post: + * tags: + * - MWL-RS + * description: > + * This transaction create or update a Modality WorkList item. + * requestBody: + * content: + * application/dicom+json: + * parameters: + * - $ref: "#/components/parameters/spsStatus" + * - $ref: "#/components/parameters/filter" + * responses: + * "200": + * description: change status of mwl items successfully + */ +router.post("/mwlitems/status/:status", + validateByJoi( + Joi.object({ + status: Joi.string().valid("SCHEDULED", "ARRIVED", "READY", "STARTED", "DEPARTED", "CANCELED", "DISCONTINUED", "COMPLETED").required() + }), "params", {allowUnknown: false}), + require("./controller/MWL-RS/change-filtered-mwlItem-status") +); + module.exports = router; \ No newline at end of file