PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
routing_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
21#pragma once
22
24
25#include <kcenon/common/patterns/result.h>
26
27#include <memory>
28#include <optional>
29#include <string>
30#include <string_view>
31#include <vector>
32
33#ifdef PACS_WITH_DATABASE_SYSTEM
34
36
37namespace kcenon::pacs::storage {
38
42struct routing_rule_query_options {
43 std::optional<bool> enabled_only;
44 bool order_by_priority{true};
45 size_t limit{100};
46 size_t offset{0};
47};
48
75class routing_repository
76 : public base_repository<client::routing_rule, std::string> {
77public:
78 explicit routing_repository(std::shared_ptr<pacs_database_adapter> db);
79 ~routing_repository() override = default;
80
82 auto operator=(const routing_repository&) -> routing_repository& = delete;
83 routing_repository(routing_repository&&) noexcept = default;
84 auto operator=(routing_repository&&) noexcept
85 -> routing_repository& = default;
86
87 // =========================================================================
88 // Domain-Specific Operations
89 // =========================================================================
90
97 [[nodiscard]] auto find_by_pk(int64_t pk) -> result_type;
98
105 [[nodiscard]] auto find_rules(
106 const routing_rule_query_options& options = {}) -> list_result_type;
107
113 [[nodiscard]] auto find_enabled_rules() -> list_result_type;
114
115 // =========================================================================
116 // Rule Ordering
117 // =========================================================================
118
126 [[nodiscard]] auto update_priority(std::string_view rule_id, int priority)
127 -> VoidResult;
128
135 [[nodiscard]] auto enable_rule(std::string_view rule_id) -> VoidResult;
136
143 [[nodiscard]] auto disable_rule(std::string_view rule_id) -> VoidResult;
144
145 // =========================================================================
146 // Statistics
147 // =========================================================================
148
157 [[nodiscard]] auto increment_triggered(std::string_view rule_id)
158 -> VoidResult;
159
166 [[nodiscard]] auto increment_success(std::string_view rule_id) -> VoidResult;
167
174 [[nodiscard]] auto increment_failure(std::string_view rule_id) -> VoidResult;
175
182 [[nodiscard]] auto reset_statistics(std::string_view rule_id) -> VoidResult;
183
189 [[nodiscard]] auto count_enabled() -> Result<size_t>;
190
191protected:
192 // =========================================================================
193 // base_repository overrides
194 // =========================================================================
195
196 [[nodiscard]] auto map_row_to_entity(const database_row& row) const
197 -> client::routing_rule override;
198
199 [[nodiscard]] auto entity_to_row(const client::routing_rule& entity) const
200 -> std::map<std::string, database_value> override;
201
202 [[nodiscard]] auto get_pk(const client::routing_rule& entity) const
203 -> std::string override;
204
205 [[nodiscard]] auto has_pk(const client::routing_rule& entity) const
206 -> bool override;
207
208 [[nodiscard]] auto select_columns() const
209 -> std::vector<std::string> override;
210
211private:
212 [[nodiscard]] auto parse_timestamp(const std::string& str) const
213 -> std::chrono::system_clock::time_point;
214
215 [[nodiscard]] auto format_timestamp(
216 std::chrono::system_clock::time_point tp) const -> std::string;
217
218 [[nodiscard]] auto format_optional_timestamp(
219 const std::optional<std::chrono::system_clock::time_point>& tp) const
220 -> std::string;
221
222 [[nodiscard]] static auto serialize_conditions(
223 const std::vector<client::routing_condition>& conditions) -> std::string;
224
225 [[nodiscard]] static auto deserialize_conditions(std::string_view json)
226 -> std::vector<client::routing_condition>;
227
228 [[nodiscard]] static auto serialize_actions(
229 const std::vector<client::routing_action>& actions) -> std::string;
230
231 [[nodiscard]] static auto deserialize_actions(std::string_view json)
232 -> std::vector<client::routing_action>;
233};
234
235} // namespace kcenon::pacs::storage
236
237#else // !PACS_WITH_DATABASE_SYSTEM
238
239// Legacy interface for builds without database_system
240struct sqlite3;
241
242namespace kcenon::pacs::storage {
243
244template <typename T>
246
247using VoidResult = kcenon::common::VoidResult;
248
253 std::optional<bool> enabled_only;
254 bool order_by_priority{true};
255 size_t limit{100};
256 size_t offset{0};
257};
258
267public:
268 explicit routing_repository(sqlite3* db);
270
274 auto operator=(routing_repository&&) noexcept -> routing_repository&;
275
276 [[nodiscard]] auto save(const client::routing_rule& rule) -> VoidResult;
277 [[nodiscard]] auto find_by_id(std::string_view rule_id) const
278 -> std::optional<client::routing_rule>;
279 [[nodiscard]] auto find_by_pk(int64_t pk) const
280 -> std::optional<client::routing_rule>;
281 [[nodiscard]] auto find_rules(
282 const routing_rule_query_options& options = {}) const
283 -> std::vector<client::routing_rule>;
284 [[nodiscard]] auto find_enabled_rules() const
285 -> std::vector<client::routing_rule>;
286 [[nodiscard]] auto remove(std::string_view rule_id) -> VoidResult;
287 [[nodiscard]] auto exists(std::string_view rule_id) const -> bool;
288
289 [[nodiscard]] auto update_priority(std::string_view rule_id, int priority)
290 -> VoidResult;
291 [[nodiscard]] auto enable_rule(std::string_view rule_id) -> VoidResult;
292 [[nodiscard]] auto disable_rule(std::string_view rule_id) -> VoidResult;
293
294 [[nodiscard]] auto increment_triggered(std::string_view rule_id)
295 -> VoidResult;
296 [[nodiscard]] auto increment_success(std::string_view rule_id) -> VoidResult;
297 [[nodiscard]] auto increment_failure(std::string_view rule_id) -> VoidResult;
298 [[nodiscard]] auto reset_statistics(std::string_view rule_id) -> VoidResult;
299
300 [[nodiscard]] auto count() const -> size_t;
301 [[nodiscard]] auto count_enabled() const -> size_t;
302 [[nodiscard]] auto is_valid() const noexcept -> bool;
303
304private:
305 [[nodiscard]] auto parse_row(void* stmt) const -> client::routing_rule;
306
307 [[nodiscard]] static auto serialize_conditions(
308 const std::vector<client::routing_condition>& conditions) -> std::string;
309
310 [[nodiscard]] static auto deserialize_conditions(std::string_view json)
311 -> std::vector<client::routing_condition>;
312
313 [[nodiscard]] static auto serialize_actions(
314 const std::vector<client::routing_action>& actions) -> std::string;
315
316 [[nodiscard]] static auto deserialize_actions(std::string_view json)
317 -> std::vector<client::routing_action>;
318
319 sqlite3* db_{nullptr};
320};
321
322} // namespace kcenon::pacs::storage
323
324#endif // PACS_WITH_DATABASE_SYSTEM
Generic base repository for CRUD operations.
Repository for routing rule persistence (legacy SQLite interface)
auto save(const client::routing_rule &rule) -> VoidResult
routing_repository(const routing_repository &)=delete
auto disable_rule(std::string_view rule_id) -> VoidResult
auto exists(std::string_view rule_id) const -> bool
static auto serialize_conditions(const std::vector< client::routing_condition > &conditions) -> std::string
routing_repository(routing_repository &&) noexcept
auto remove(std::string_view rule_id) -> VoidResult
auto find_by_id(std::string_view rule_id) const -> std::optional< client::routing_rule >
auto find_rules(const routing_rule_query_options &options={}) const -> std::vector< client::routing_rule >
auto operator=(const routing_repository &) -> routing_repository &=delete
auto parse_row(void *stmt) const -> client::routing_rule
auto reset_statistics(std::string_view rule_id) -> VoidResult
auto find_by_pk(int64_t pk) const -> std::optional< client::routing_rule >
static auto deserialize_actions(std::string_view json) -> std::vector< client::routing_action >
static auto deserialize_conditions(std::string_view json) -> std::vector< client::routing_condition >
static auto serialize_actions(const std::vector< client::routing_action > &actions) -> std::string
auto increment_triggered(std::string_view rule_id) -> VoidResult
auto enable_rule(std::string_view rule_id) -> VoidResult
auto increment_failure(std::string_view rule_id) -> VoidResult
auto increment_success(std::string_view rule_id) -> VoidResult
auto update_priority(std::string_view rule_id, int priority) -> VoidResult
auto find_enabled_rules() const -> std::vector< client::routing_rule >
kcenon::common::Result< T > Result
Result type alias for operations returning a value.
Routing types and structures for auto-forwarding DICOM images.
Query options for listing routing rules.
std::optional< bool > enabled_only
Filter by enabled status.