view Framework/Plugins/OptimizedRoutes.cpp @ 164:6f83b74373d3 optimized-routes

/optimized-routes/studies/../instances-metadatas: include empty dico if no metadata such that all instances are listed
author Alain Mazy <alain@mazy.be>
date Tue, 14 Jul 2020 09:47:46 +0200
parents 2ccde9c7311b
children
line wrap: on
line source

/**
 * Orthanc - A Lightweight, RESTful DICOM Store
 * Copyright (C) 2012-2016 Sebastien Jodogne, Medical Physics
 * Department, University Hospital of Liege, Belgium
 * Copyright (C) 2017-2020 Osimis S.A., Belgium
 *
 * This program is free software: you can redistribute it and/or
 * modify it under the terms of the GNU Affero General Public License
 * as published by the Free Software Foundation, either version 3 of
 * the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but
 * WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program. If not, see <http://www.gnu.org/licenses/>.
 **/


#include "OptimizedRoutes.h"
#include "../../Resources/Orthanc/Plugins/OrthancPluginCppWrapper.h"

#include <string>
#include <map>
#include <list>
#include <json/writer.h>
#include <json/value.h>
#include <boost/algorithm/string.hpp> // for boost::algorithm::split & boost::starts_with

static OrthancDatabases::IndexBackend* backend_;
static OrthancPluginContext* context_;

extern "C"
{

  // handles url like /optimized-routes/studies/{id)/instances-metadata?types=1,10
  OrthancPluginErrorCode RestGetStudiesInstancesMetadata(OrthancPluginRestOutput* output,
                                                         const char* /* url */,
                                                         const OrthancPluginHttpRequest* request)
  {
    std::list<int32_t> metadataTypes;
    for (uint32_t i = 0; i < request->getCount; i++)
    {
      if (strcmp(request->getKeys[i], "types") == 0)
      {
        std::string getValue(request->getValues[i]);
        std::vector<std::string> typesString;
        boost::algorithm::split(typesString, getValue, boost::is_any_of(","));

        for (size_t t = 0; t < typesString.size(); t++)
        {
          int32_t metadataType = boost::lexical_cast<int32_t>(typesString[t]);
          metadataTypes.push_back(metadataType);
        }
      }
    }

    std::map<std::string, std::map<int32_t, std::string>> result;
    std::string orthancId = std::string(request->groups[0]);
    backend_->GetStudyInstancesMetadata(result,
                                        orthancId,
                                        metadataTypes);

    Json::Value response(Json::objectValue);
    for (std::map<std::string, std::map<int32_t, std::string>>::const_iterator itInstance = result.begin(); itInstance != result.end(); itInstance++)
    {
      Json::Value instanceMetadatas(Json::objectValue);
      for (std::map<int32_t, std::string>::const_iterator itMetadata = itInstance->second.begin(); itMetadata != itInstance->second.end(); itMetadata++)
      {
        std::string id = boost::lexical_cast<std::string>(itMetadata->first);
        instanceMetadatas[id] = itMetadata->second;
      }

      response[itInstance->first] = instanceMetadatas;
    }

    Json::StyledWriter writer;
    std::string outputStr = writer.write(response);
    OrthancPluginAnswerBuffer(context_, output, outputStr.c_str(), outputStr.size(), "application/json");

    return OrthancPluginErrorCode_Success;
  }

  // handles url like /optimized-routes/studies/{id)/instances-ids
  OrthancPluginErrorCode RestGetStudiesInstancesIds(OrthancPluginRestOutput* output,
                                                    const char* /*url*/,
                                                    const OrthancPluginHttpRequest* request)
  {
    std::list<std::string> result;
    std::string orthancId = std::string(request->groups[0]);
    backend_->GetStudyInstancesIds(result,
                                   orthancId);

    Json::Value response(Json::arrayValue);
    for (std::list<std::string>::const_iterator itInstance = result.begin(); itInstance != result.end(); itInstance++)
    {
      response.append(*itInstance);
    }

    Json::StyledWriter writer;
    std::string outputStr = writer.write(response);
    OrthancPluginAnswerBuffer(context_, output, outputStr.c_str(), outputStr.size(), "application/json");

    return OrthancPluginErrorCode_Success;
  }
}

namespace OrthancDatabases {

  void OptimizedRoutes::EnableOptimizedRoutes(IndexBackend *backend, OrthancPluginContext *context)
  {
    backend_ = backend;
    context_ = context;
    // Register optimized rest routes (temporary)
    OrthancPluginRegisterRestCallbackNoLock(context_, "/optimized-routes/studies/(.*)/instances-metadata", RestGetStudiesInstancesMetadata);
    OrthancPluginRegisterRestCallbackNoLock(context_, "/optimized-routes/studies/(.*)/instances-ids", RestGetStudiesInstancesIds);
  }
}