Skip to content

Commit

Permalink
refactor: #7
Browse files Browse the repository at this point in the history
- Add `RenderedImageMultipartWriter` to handle how to
  - get images' path object
  - write rendered images to the response
- Add `StudyFramesWriter`, `SeriesFramesWriter`,
`InstanceFramesWriter` and `InstanceFramesListWriter`
determine how to write rendered images to the response
  • Loading branch information
Chinlinlee committed May 13, 2023
1 parent 9f1948a commit 2f4be2e
Show file tree
Hide file tree
Showing 6 changed files with 218 additions and 119 deletions.
77 changes: 14 additions & 63 deletions api/dicom-web/controller/WADO-RS/rendered/instanceFrames.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
const _ = require("lodash");
const renderedService = require("../service/rendered.service");
const dicomModel = require("../../../../../models/mongodb/models/dicom");
const { MultipartWriter } = require("../../../../../utils/multipartWriter");
const { InstanceImagePathFactory } = require("../service/WADO-RS.service");
const errorResponse = require("../../../../../utils/errorResponse/errorResponseMessage");
const { ApiLogger } = require("../../../../../utils/logs/api-logger");
const { Controller } = require("../../../../controller.class");
Expand Down Expand Up @@ -34,58 +33,22 @@ class RetrieveRenderedInstanceFramesController extends Controller {
}

try {
let imagePathObj = await dicomModel.getPathOfInstance(this.request.params);
let renderedImageMultipartWriter = new renderedService.RenderedImageMultipartWriter(
this.request,
this.response,
InstanceImagePathFactory,
renderedService.InstanceFramesListWriter
);

if(!imagePathObj) {
return this.responseNotFound();
}
let buffer = await renderedImageMultipartWriter.write();

let instanceFramesObj = await renderedService.getInstanceFrameObj(this.request.params);
if (_.isUndefined(instanceFramesObj)) {
return this.response.status(400).json(
errorResponse.getBadRequestErrorMessage(`instance: ${this.request.params.instanceUID} doesn't have pixel data`)
);
}

let dicomNumberOfFrames = _.get(instanceFramesObj, "00280008.Value.0", 1);
dicomNumberOfFrames = parseInt(dicomNumberOfFrames);

for(let i = 0; i < frameNumber.length ; i++) {
let frame = frameNumber[i];
if (frame > dicomNumberOfFrames) {
let badRequestMessage = errorResponse.getBadRequestErrorMessage(`Bad frame number , This instance NumberOfFrames is : ${dicomNumberOfFrames} , But request ${frameNumber}`);
this.response.writeHead(badRequestMessage.HttpStatus, {
"Content-Type": "application/dicom+json"
});

let badRequestMessageStr = JSON.stringify(badRequestMessage);

this.apiLogger.logger.warn(badRequestMessageStr);

return this.response.end(JSON.stringify(badRequestMessageStr));
}
}

let transferSyntax = _.get(instanceFramesObj, "00020010.Value.0");
if (frameNumber.length == 1) {
let postProcessResult = await renderedService.postProcessFrameImage(this.request, frameNumber[0], instanceFramesObj, transferSyntax);
if (postProcessResult.status) {
this.response.writeHead(200, {
"Content-Type": "image/jpeg"
});
this.apiLogger.logger.info(`Get instance's frame successfully, instance UID: ${instanceUID}, frame number: ${frameNumber[0]}`);
return this.response.end(postProcessResult.magick.toBuffer(), "binary");
}
throw new Error(`Can not process this image, instanceUID: ${instanceFramesObj.instanceUID}, frameNumber: ${this.request.frameNumber[0]}`);
} else {
let multipartWriter = new MultipartWriter([], this.request, this.response);
await renderedService.writeSpecificFramesRenderedImages(this.request, frameNumber, instanceFramesObj, multipartWriter);
multipartWriter.writeFinalBoundary();

this.apiLogger.logger.info(`Get instance's frame successfully, instance UID: ${instanceUID}, frame numbers: ${frameNumber}`);

return this.response.end();
this.apiLogger.logger.info(`Get instance's frame successfully, instance UID: ${instanceUID}, frame number: ${JSON.stringify(frameNumber)}`);

if (buffer instanceof Buffer) {
return this.response.end(buffer, "binary");
}

return this.response.end();
} catch(e) {
console.error(e);
this.response.writeHead(500, {
Expand All @@ -94,18 +57,6 @@ class RetrieveRenderedInstanceFramesController extends Controller {
this.response.end(JSON.stringify(e, Object.getOwnPropertyNames(e), 4), "utf8");
}
}

responseNotFound() {
let notFoundStr = `Not Found Instance, ${this.paramsToString()}`;

this.apiLogger.logger.warn(notFoundStr);

let notFoundMessage = errorResponse.getNotFoundErrorMessage(
notFoundStr
);

return this.response.status(404).json(notFoundMessage);
}
}
/**
*
Expand Down
26 changes: 9 additions & 17 deletions api/dicom-web/controller/WADO-RS/rendered/instances.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
const _ = require("lodash");
const mongoose = require("mongoose");
const renderedService = require("../service/rendered.service");
const { MultipartWriter } = require("../../../../../utils/multipartWriter");
const { InstanceImagePathFactory } = require("../service/WADO-RS.service");
const errorResponse = require("../../../../../utils/errorResponse/errorResponseMessage");
const { ApiLogger } = require("../../../../../utils/logs/api-logger");
const { Controller } = require("../../../../controller.class");
const dicomModel = require("../../../../../models/mongodb/models/dicom");

class RetrieveRenderedInstancesController extends Controller {
constructor(req, res) {
Expand All @@ -29,21 +28,14 @@ class RetrieveRenderedInstancesController extends Controller {
}

try {
let imagePathObj = await dicomModel.getPathOfInstance(this.request.params);

if (imagePathObj) {
let multipartWriter = new MultipartWriter([], this.request, this.response);
let instanceFramesObj = await renderedService.getInstanceFrameObj(imagePathObj);
if (_.isUndefined(instanceFramesObj)) {
return this.response.status(400).json(
errorResponse.getBadRequestErrorMessage(`instance: ${this.request.params.instanceUID} doesn't have pixel data`)
);
}
let dicomNumberOfFrames = _.get(instanceFramesObj, "00280008.Value.0", 1);
dicomNumberOfFrames = parseInt(dicomNumberOfFrames);
await renderedService.writeRenderedImages(this.request, dicomNumberOfFrames, instanceFramesObj, multipartWriter);
multipartWriter.writeFinalBoundary();
}
let renderedImageMultipartWriter = new renderedService.RenderedImageMultipartWriter(
this.request,
this.response,
InstanceImagePathFactory,
renderedService.InstanceFramesWriter
);

await renderedImageMultipartWriter.write();

apiLogger.logger.info(`Write Multipart Successfully, study's series' instances' rendered images, study UID: ${this.request.params.studyUID}, series UID: ${this.request.params.seriesUID}, instance UID: ${this.request.params.instanceUID}`);
return this.response.end();
Expand Down
28 changes: 9 additions & 19 deletions api/dicom-web/controller/WADO-RS/rendered/series.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const mongoose = require("mongoose");
const _ = require("lodash");
const renderedService = require("../service/rendered.service");
const { MultipartWriter } = require("../../../../../utils/multipartWriter");
const { SeriesImagePathFactory } = require("../service/WADO-RS.service");
const errorResponse = require("../../../../../utils/errorResponse/errorResponseMessage");
const { logger } = require("../../../../../utils/logs/log");
const { Controller } = require("../../../../controller.class");
Expand All @@ -23,24 +23,14 @@ class RetrieveRenderedSeriesController extends Controller {
}

try {
let instancesInSeries = await mongoose.model("dicomSeries").getPathGroupOfInstances(this.request.params);

if (instancesInSeries.length > 0) {
let multipartWriter = new MultipartWriter([], this.request, this.response);

for(let imagePathObj of instancesInSeries) {
let instanceFramesObj = await renderedService.getInstanceFrameObj(imagePathObj);
if (_.isUndefined(instanceFramesObj)) continue;
let dicomNumberOfFrames = _.get(instanceFramesObj, "00280008.Value.0", 1);
dicomNumberOfFrames = parseInt(dicomNumberOfFrames);
await renderedService.writeRenderedImages(this.request, dicomNumberOfFrames, instanceFramesObj, multipartWriter);
}
multipartWriter.writeFinalBoundary();
} else {
this.response.writeHead(404, {
"content-type": "application/dicom+json"
});
}
let renderedImageMultipartWriter = new renderedService.RenderedImageMultipartWriter(
this.request,
this.response,
SeriesImagePathFactory,
renderedService.SeriesFramesWriter
);

await renderedImageMultipartWriter.write();

logger.info(`[WADO-RS] [path: ${this.request.originalUrl}] [Write Multipart Successfully, study's series' rendered instances, study UID: ${this.request.params.studyUID}, series UID: ${this.request.params.seriesUID}]`);

Expand Down
29 changes: 11 additions & 18 deletions api/dicom-web/controller/WADO-RS/rendered/study.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
const mongoose = require("mongoose");
const _ = require("lodash");
const renderedService = require("../service/rendered.service");
const { MultipartWriter } = require("../../../../../utils/multipartWriter");
const {
StudyImagePathFactory
} = require("../service/WADO-RS.service");
const errorResponse = require("../../../../../utils/errorResponse/errorResponseMessage");
const { ApiLogger } = require("../../../../../utils/logs/api-logger");
const { Controller } = require("../../../../controller.class");
Expand All @@ -27,24 +29,15 @@ class RetrieveRenderedStudyController extends Controller {
}

try {
let pathGroupOfInstancesInStudy = await mongoose.model("dicomStudy").getPathGroupOfInstances(this.request.params);

if (pathGroupOfInstancesInStudy.length > 0) {
let multipartWriter = new MultipartWriter([], this.request, this.response);

for(let imagePathObj of pathGroupOfInstancesInStudy) {
let instanceFramesObj = await renderedService.getInstanceFrameObj(imagePathObj);
if(_.isUndefined(instanceFramesObj)) continue;
let dicomNumberOfFrames = _.get(instanceFramesObj, "00280008.Value.0", 1);
dicomNumberOfFrames = parseInt(dicomNumberOfFrames);
await renderedService.writeRenderedImages(this.request, dicomNumberOfFrames, instanceFramesObj, multipartWriter);
}
multipartWriter.writeFinalBoundary();
} else {
this.response.writeHead(404, {
"content-type": "application/dicom+json"
});
}
let renderedImageMultipartWriter = new renderedService.RenderedImageMultipartWriter(
this.request,
this.response,
StudyImagePathFactory,
renderedService.StudyFramesWriter
);

await renderedImageMultipartWriter.write();

apiLogger.logger.info(`Write Multipart Successfully, study's rendered instances, study UID: ${this.request.params.studyUID}`);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -246,6 +246,7 @@ module.exports.getAcceptType = getAcceptType;
module.exports.supportInstanceMultipartType = supportInstanceMultipartType;
module.exports.sendNotSupportedMediaType = sendNotSupportedMediaType;
module.exports.addHostnameOfBulkDataUrl = addHostnameOfBulkDataUrl;
module.exports.ImagePathFactory = ImagePathFactory;
module.exports.StudyImagePathFactory = StudyImagePathFactory;
module.exports.SeriesImagePathFactory = SeriesImagePathFactory;
module.exports.InstanceImagePathFactory = InstanceImagePathFactory;
Expand Down
Loading

0 comments on commit 2f4be2e

Please sign in to comment.