PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
worklist_repository.h
Go to the documentation of this file.
1// BSD 3-Clause License
2// Copyright (c) 2021-2025, 🍀☀🌕🌥 🌊
3// See the LICENSE file in the project root for full license information.
4
20#pragma once
21
23
24#include <kcenon/common/patterns/result.h>
25
26#include <memory>
27#include <optional>
28#include <string>
29#include <string_view>
30#include <vector>
31
32#ifdef PACS_WITH_DATABASE_SYSTEM
33
35
36namespace kcenon::pacs::storage {
37
49class worklist_repository : public base_repository<worklist_item, int64_t> {
50public:
55 explicit worklist_repository(std::shared_ptr<pacs_database_adapter> db);
56 ~worklist_repository() override = default;
57
59 auto operator=(const worklist_repository&) -> worklist_repository& = delete;
60 worklist_repository(worklist_repository&&) noexcept = default;
61 auto operator=(worklist_repository&&) noexcept
62 -> worklist_repository& = default;
63
70 [[nodiscard]] auto add_worklist_item(const worklist_item& item)
71 -> Result<int64_t>;
72
84 [[nodiscard]] auto update_worklist_status(std::string_view step_id,
85 std::string_view accession_no,
86 std::string_view new_status)
87 -> VoidResult;
88
94 [[nodiscard]] auto query_worklist(const worklist_query& query)
95 -> Result<std::vector<worklist_item>>;
96
103 [[nodiscard]] auto find_worklist_item(std::string_view step_id,
104 std::string_view accession_no)
105 -> std::optional<worklist_item>;
106
112 [[nodiscard]] auto find_worklist_by_pk(int64_t pk)
113 -> std::optional<worklist_item>;
114
121 [[nodiscard]] auto delete_worklist_item(std::string_view step_id,
122 std::string_view accession_no)
123 -> VoidResult;
124
134 [[nodiscard]] auto cleanup_old_worklist_items(std::chrono::hours age)
135 -> Result<size_t>;
136
142 [[nodiscard]] auto cleanup_worklist_items_before(
143 std::chrono::system_clock::time_point before) -> Result<size_t>;
144
149 [[nodiscard]] auto worklist_count() -> Result<size_t>;
150
156 [[nodiscard]] auto worklist_count(std::string_view status)
157 -> Result<size_t>;
158
159protected:
160 [[nodiscard]] auto map_row_to_entity(const database_row& row) const
161 -> worklist_item override;
162 [[nodiscard]] auto entity_to_row(const worklist_item& entity) const
163 -> std::map<std::string, database_value> override;
164 [[nodiscard]] auto get_pk(const worklist_item& entity) const
165 -> int64_t override;
166 [[nodiscard]] auto has_pk(const worklist_item& entity) const
167 -> bool override;
168 [[nodiscard]] auto select_columns() const -> std::vector<std::string> override;
169
170private:
171 [[nodiscard]] static auto to_like_pattern(std::string_view pattern)
172 -> std::string;
173 [[nodiscard]] auto parse_timestamp(const std::string& str) const
174 -> std::chrono::system_clock::time_point;
175 [[nodiscard]] auto format_timestamp(
176 std::chrono::system_clock::time_point tp) const -> std::string;
177};
178
179} // namespace kcenon::pacs::storage
180
181#else
182
183struct sqlite3;
184
185namespace kcenon::pacs::storage {
186
187template <typename T>
189
190using VoidResult = kcenon::common::VoidResult;
191
199public:
204 explicit worklist_repository(sqlite3* db);
206
210 auto operator=(worklist_repository&&) noexcept -> worklist_repository&;
211
213 [[nodiscard]] auto add_worklist_item(const worklist_item& item)
214 -> Result<int64_t>;
216 [[nodiscard]] auto update_worklist_status(std::string_view step_id,
217 std::string_view accession_no,
218 std::string_view new_status)
219 -> VoidResult;
221 [[nodiscard]] auto query_worklist(const worklist_query& query) const
222 -> Result<std::vector<worklist_item>>;
224 [[nodiscard]] auto find_worklist_item(std::string_view step_id,
225 std::string_view accession_no) const
226 -> std::optional<worklist_item>;
228 [[nodiscard]] auto find_worklist_by_pk(int64_t pk) const
229 -> std::optional<worklist_item>;
231 [[nodiscard]] auto delete_worklist_item(std::string_view step_id,
232 std::string_view accession_no)
233 -> VoidResult;
235 [[nodiscard]] auto cleanup_old_worklist_items(std::chrono::hours age)
236 -> Result<size_t>;
238 [[nodiscard]] auto cleanup_worklist_items_before(
239 std::chrono::system_clock::time_point before) -> Result<size_t>;
241 [[nodiscard]] auto worklist_count() const -> Result<size_t>;
243 [[nodiscard]] auto worklist_count(std::string_view status) const
244 -> Result<size_t>;
245
246private:
247 [[nodiscard]] auto parse_worklist_row(void* stmt) const -> worklist_item;
248 [[nodiscard]] static auto to_like_pattern(std::string_view pattern)
249 -> std::string;
250 [[nodiscard]] static auto parse_timestamp(const std::string& str)
251 -> std::chrono::system_clock::time_point;
252
253 sqlite3* db_{nullptr};
254};
255
256} // namespace kcenon::pacs::storage
257
258#endif
Generic base repository for CRUD operations.
Legacy direct-SQLite fallback when database_system is disabled.
worklist_repository(sqlite3 *db)
Construct repository bound to a raw sqlite3 handle.
auto cleanup_old_worklist_items(std::chrono::hours age) -> Result< size_t >
Remove worklist items older than the given age.
auto operator=(const worklist_repository &) -> worklist_repository &=delete
auto update_worklist_status(std::string_view step_id, std::string_view accession_no, std::string_view new_status) -> VoidResult
Update SPS status for a worklist item identified by (step_id, accession)
auto cleanup_worklist_items_before(std::chrono::system_clock::time_point before) -> Result< size_t >
Remove worklist items scheduled before an absolute time point.
worklist_repository(const worklist_repository &)=delete
auto worklist_count() const -> Result< size_t >
Total number of worklist items currently stored.
auto find_worklist_by_pk(int64_t pk) const -> std::optional< worklist_item >
Look up a worklist item by database primary key.
auto query_worklist(const worklist_query &query) const -> Result< std::vector< worklist_item > >
Query worklist items matching a structured filter.
static auto parse_timestamp(const std::string &str) -> std::chrono::system_clock::time_point
auto find_worklist_item(std::string_view step_id, std::string_view accession_no) const -> std::optional< worklist_item >
Look up a single worklist item by (step_id, accession)
auto parse_worklist_row(void *stmt) const -> worklist_item
auto delete_worklist_item(std::string_view step_id, std::string_view accession_no) -> VoidResult
Delete a worklist item by (step_id, accession)
auto add_worklist_item(const worklist_item &item) -> Result< int64_t >
Insert a new worklist item; returns the new primary key.
static auto to_like_pattern(std::string_view pattern) -> std::string
kcenon::common::Result< T > Result
Result type alias for operations returning a value.
Worklist item record from the database.
Query parameters for worklist search.
Modality Worklist (MWL) record data structures.