Medical Imaging Interaction Toolkit  2026.06.00
Medical Imaging Interaction Toolkit
mitkDataStorageController.h
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 
13 #ifndef mitkDataStorageController_h
14 #define mitkDataStorageController_h
15 
16 #include <mitkDataStorageBridge.h>
17 #include <mitkNodeQueryParams.h>
18 #include <mitkRestServerConfig.h>
19 #include <httplib.h>
20 #include <mitkFileSystem.h>
21 
22 #include <MitkRESTAPIExports.h>
23 
24 #include <deque>
25 #include <mutex>
26 #include <unordered_map>
27 
28 namespace mitk
29 {
57  {
58  public:
65 
74  void SetTempDirectory(const std::string& tempDir);
75 
86  void SetFileAccessConfig(FileAccessMode mode, const std::vector<std::string>& allowedDirs, const std::string& tempDirectory);
87 
95  void SetMaxActiveTempDirsPerIp(size_t max);
96 
97  // Node operations
98 
104  void HandleGET_nodes(const httplib::Request& req, httplib::Response& res);
105 
111  void HandlePOST_nodes(const httplib::Request& req, httplib::Response& res);
112 
118  void HandleGET_nodes_uid(const httplib::Request& req, httplib::Response& res);
119 
125  void HandlePATCH_nodes_uid(const httplib::Request& req, httplib::Response& res);
126 
132  void HandleDELETE_nodes_uid(const httplib::Request& req, httplib::Response& res);
133 
134  // Children operations
135 
141  void HandleGET_nodes_uid_children(const httplib::Request& req, httplib::Response& res);
142 
148  void HandlePOST_nodes_uid_children(const httplib::Request& req, httplib::Response& res);
149 
150  // Data operations
151 
158  void HandleGET_nodes_uid_data(const httplib::Request& req, httplib::Response& res);
159 
166  void HandlePUT_nodes_uid_data(const httplib::Request& req, httplib::Response& res);
167 
168  // Property operations
169 
175  void HandleGET_nodes_uid_properties(const httplib::Request& req, httplib::Response& res);
176 
182  void HandleGET_nodes_uid_properties_key(const httplib::Request& req, httplib::Response& res);
183 
189  void HandlePUT_nodes_uid_properties_key(const httplib::Request& req, httplib::Response& res);
190 
196  void HandleDELETE_nodes_uid_properties_key(const httplib::Request& req, httplib::Response& res);
197 
203  void HandlePUT_nodes_uid_properties(const httplib::Request& req, httplib::Response& res);
204 
210  void HandlePATCH_nodes_uid_properties(const httplib::Request& req, httplib::Response& res);
211 
212  private:
213  void SendJsonResponse(httplib::Response& res, int status, const nlohmann::json& body);
214  void SendErrorResponse(httplib::Response& res, int status, const nlohmann::json& error);
215 
223  void SendBinaryResponse(httplib::Response& res, const std::string& data,
224  const std::string& filename);
225 
229  NodeQueryParams ParseNodeQueryParams(const httplib::Request& req) const;
230 
239  PropertyQueryParams ParsePropertyQueryParams(const httplib::Request& req, PropertyScope defaultScope = PropertyScope::All) const;
240 
250  std::string DetermineTransferMode(const httplib::Request& req) const;
251 
259  std::string ExtractFilenameFromContentDisposition(const httplib::Request& req) const;
260 
268  nlohmann::json BuildDataMetadata(const mitk::BaseData* data) const;
269 
273  struct ResolveDataPathResult
274  {
275  bool success;
276  std::string filePath;
277  bool isTemporary;
278  int errorStatus;
279  nlohmann::json errorResponse;
280  };
281 
293  ResolveDataPathResult ResolveDataPath(const httplib::Request& req, const std::string& contentType);
294 
298  struct LoadDataResult
299  {
300  bool success;
301  std::vector<mitk::BaseData::Pointer> data;
302  int errorStatus;
303  nlohmann::json errorResponse;
304  };
305 
314  LoadDataResult LoadDataFromFile(const std::string& filePath, const std::string& requestPath);
315 
317  void HandlePOST_nodes_uid_generic(const httplib::Request& req, httplib::Response& res, const std::optional<std::string>& parentUID);
318 
319 
330  fs::path AcquireRequestTempDir(const std::string& clientIp);
331 
338  void ReleaseRequestTempDir(const std::string& clientIp, const fs::path& dir);
339 
340  DataStorageBridge& m_Bridge;
341  std::string m_TempDirectory;
342  FileAccessMode m_FileAccessMode = FileAccessMode::Unrestricted;
343  std::vector<std::string> m_AllowedFileDirectories;
344 
345  // Per-IP bounded temp-directory quota.
346  // Map key: client IP string. Value: deque of active dirs ordered by creation time (oldest first).
347  // Protected by m_ActiveTempDirsMutex.
348  static constexpr size_t DEFAULT_MAX_ACTIVE_TEMP_DIRS_PER_IP = 5;
349  size_t m_MaxActiveTempDirsPerIp = DEFAULT_MAX_ACTIVE_TEMP_DIRS_PER_IP;
350  mutable std::mutex m_ActiveTempDirsMutex;
351  std::unordered_map<std::string, std::deque<fs::path>> m_ActiveTempDirsByIp;
352  };
353 }
354 
355 #endif
#define MITKRESTAPI_EXPORT
Base class of all data objects.
Definition: mitkBaseData.h:60
Thread-safe bridge between the REST API layer and MITK DataStorage.
Handles all /api/v1/datastorage endpoints.
void HandlePUT_nodes_uid_properties_key(const httplib::Request &req, httplib::Response &res)
Handle PUT /datastorage/nodes/:uid/properties/:property_key request.
void SetFileAccessConfig(FileAccessMode mode, const std::vector< std::string > &allowedDirs, const std::string &tempDirectory)
Configure file access restrictions.
void HandlePATCH_nodes_uid(const httplib::Request &req, httplib::Response &res)
Handle PATCH /datastorage/nodes/:uid request.
void HandleGET_nodes_uid_data(const httplib::Request &req, httplib::Response &res)
Handle GET /datastorage/nodes/:uid/data request.
void SetMaxActiveTempDirsPerIp(size_t max)
Set the maximum number of concurrently active file-reference temp directories per client IP....
void HandleGET_nodes(const httplib::Request &req, httplib::Response &res)
Handle GET /datastorage/nodes request.
void HandleDELETE_nodes_uid_properties_key(const httplib::Request &req, httplib::Response &res)
Handle DELETE /datastorage/nodes/:uid/properties/:property_key request.
DataStorageController(DataStorageBridge &bridge)
Construct a DataStorageController.
void HandlePATCH_nodes_uid_properties(const httplib::Request &req, httplib::Response &res)
Handle PATCH /datastorage/nodes/:uid/properties request.
void SetTempDirectory(const std::string &tempDir)
Set the temporary directory for data serialization.
void HandlePOST_nodes(const httplib::Request &req, httplib::Response &res)
Handle POST /datastorage/nodes request.
void HandlePUT_nodes_uid_properties(const httplib::Request &req, httplib::Response &res)
Handle PUT /datastorage/nodes/:uid/properties request.
void HandlePUT_nodes_uid_data(const httplib::Request &req, httplib::Response &res)
Handle PUT /datastorage/nodes/:uid/data request.
void HandleDELETE_nodes_uid(const httplib::Request &req, httplib::Response &res)
Handle DELETE /datastorage/nodes/:uid request.
void HandleGET_nodes_uid(const httplib::Request &req, httplib::Response &res)
Handle GET /datastorage/nodes/:uid request.
void HandleGET_nodes_uid_properties_key(const httplib::Request &req, httplib::Response &res)
Handle GET /datastorage/nodes/:uid/properties/:property_key request.
void HandlePOST_nodes_uid_children(const httplib::Request &req, httplib::Response &res)
Handle POST /datastorage/nodes/:uid/children request.
void HandleGET_nodes_uid_properties(const httplib::Request &req, httplib::Response &res)
Handle GET /datastorage/nodes/:uid/properties request.
void HandleGET_nodes_uid_children(const httplib::Request &req, httplib::Response &res)
Handle GET /datastorage/nodes/:uid/children request.
Portability header that provides a unified namespace alias for the C++ filesystem library.
nlohmann::json json
Find image slices visible on a given plane.
FileAccessMode
Access mode for file system path restrictions.
@ Unrestricted
No file path restrictions (default).
PropertyScope
Enumeration for property scope in REST API queries.
@ All
Both node and data properties (node takes precedence on conflicts).
Query parameters for the GET /datastorage/nodes endpoint.
Query parameters for the GET /datastorage/nodes/{uid}/properties endpoint.