Skip to content

Commit

Permalink
feat: add export dicom dir 7z plugin
Browse files Browse the repository at this point in the history
- Use GET `/dicom-web/dicomdir?{attr=value}` to export dicom dir 7z file
  • Loading branch information
Chinlinlee committed Mar 1, 2024
1 parent ab04e91 commit f3d4ecb
Show file tree
Hide file tree
Showing 3 changed files with 92 additions and 0 deletions.
10 changes: 10 additions & 0 deletions plugins/config.template.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,5 +27,15 @@ module.exports.pluginsConfig = {
baseUrl: "http://127.0.0.1/fhir"
}
}
},
"dicomdir": {
enable: false,
before: true,
routers: [
{
path: "/dicom-web/dicomdir",
method: "get"
}
]
}
};
64 changes: 64 additions & 0 deletions plugins/dicomdir/getDicomDirService.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
const { DicomWebServiceError, DicomWebStatusCodes } = require("@error/dicom-web-service");
const { DicomDir } = require("@models/DICOM/dcm4che/dicomdir");
const { InstanceModel } = require("@models/mongodb/models/instance.model");
const { BaseQueryService } = require("@root/api/dicom-web/service/base-query.service");
const { raccoonConfig } = require("@root/config-class");
const { SevenZip } = require("@root/utils/sevenZip");
const path = require("path");
const shortHash = require("shorthash2");
const { v4: uuidV4 } = require("uuid");

class GetDicomDirService extends BaseQueryService {
constructor(req, res) {
super(req, res);
}

async getDicomDirSevenZip() {
let instanceFiles = await this.#getInstanceFiles();

if (instanceFiles.length === 0) throw new DicomWebServiceError(DicomWebStatusCodes.ProcessingFailure, "No any instance found", 404);

let dicomDirFilename = path.join(raccoonConfig.dicomWebConfig.storeRootPath, "DICOMDIR" + shortHash(uuidV4()));

let relativePaths = [
path.relative(raccoonConfig.dicomWebConfig.storeRootPath, dicomDirFilename)
];
for(let file of instanceFiles) {
let relativePath = path.relative(raccoonConfig.dicomWebConfig.storeRootPath, file.instancePath);
relativePaths.push(relativePath);
}

let dicomDirInstance = new DicomDir(dicomDirFilename, ...instanceFiles.map(v=> v.instancePath));
await dicomDirInstance.exec();

await this.compressTo7zip(`${dicomDirFilename}.7z`, relativePaths);
return `${dicomDirFilename}.7z`;
}

async #getInstanceFiles() {
return await InstanceModel.getInstancePathsByQueryOpts({
query: this.query,
requestParams: this.request.params
});
}

/**
*
* @param {string} zipFile
* @param {string[]} relativePaths
*/
async compressTo7zip(zipFile, relativePaths) {
let sevenZip = new SevenZip("7z", undefined, zipFile);

for(let i = 0 ; i < relativePaths.length ; i++) {
sevenZip.addCmd(relativePaths[i]);
}

let cwd = path.normalize(raccoonConfig.dicomWebConfig.storeRootPath);
await sevenZip.pack({
cwd: cwd
});
}
}

module.exports.GetDicomDirService = GetDicomDirService;
18 changes: 18 additions & 0 deletions plugins/dicomdir/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
const { app } = require("@root/app");
const fs = require("fs");
const path = require("path");
const { GetDicomDirService } = require("./getDicomDirService");

let pluginConfigFile = path.join(__dirname, "../config.template.js");
if (fs.existsSync(path.join(__dirname, "../config.js"))) pluginConfigFile = path.join(__dirname, "../config.js");

const { pluginsConfig } = require(pluginConfigFile);

app.get("/dicom-web/dicomdir", async (req, res) => {
let getDicomDirService = new GetDicomDirService(req, res);

let dicomDirSevenZipFilename = await getDicomDirService.getDicomDirSevenZip();
return fs.createReadStream(dicomDirSevenZipFilename).pipe(res);
});

module.exports = [];

0 comments on commit f3d4ecb

Please sign in to comment.