PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
node_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
19#pragma once
20
22
23#include <kcenon/common/patterns/result.h>
24
25#include <memory>
26#include <optional>
27#include <string>
28#include <string_view>
29#include <vector>
30
31#ifdef PACS_WITH_DATABASE_SYSTEM
32
34
35namespace kcenon::pacs::storage {
36
63class node_repository
64 : public base_repository<client::remote_node, std::string> {
65public:
66 explicit node_repository(std::shared_ptr<pacs_database_adapter> db);
67 ~node_repository() override = default;
68
69 node_repository(const node_repository&) = delete;
70 auto operator=(const node_repository&) -> node_repository& = delete;
71 node_repository(node_repository&&) noexcept = default;
72 auto operator=(node_repository&&) noexcept -> node_repository& = default;
73
74 // =========================================================================
75 // Domain-Specific Operations
76 // =========================================================================
77
84 [[nodiscard]] auto find_by_pk(int64_t pk) -> result_type;
85
91 [[nodiscard]] auto find_all_nodes() -> list_result_type;
92
99 [[nodiscard]] auto find_by_status(client::node_status status)
100 -> list_result_type;
101
102 // =========================================================================
103 // Status Updates
104 // =========================================================================
105
114 [[nodiscard]] auto update_status(
115 std::string_view node_id,
116 client::node_status status,
117 std::string_view error_message = "") -> VoidResult;
118
125 [[nodiscard]] auto update_last_verified(std::string_view node_id)
126 -> VoidResult;
127
128protected:
129 // =========================================================================
130 // base_repository overrides
131 // =========================================================================
132
133 [[nodiscard]] auto map_row_to_entity(const database_row& row) const
134 -> client::remote_node override;
135
136 [[nodiscard]] auto entity_to_row(const client::remote_node& entity) const
137 -> std::map<std::string, database_value> override;
138
139 [[nodiscard]] auto get_pk(const client::remote_node& entity) const
140 -> std::string override;
141
142 [[nodiscard]] auto has_pk(const client::remote_node& entity) const
143 -> bool override;
144
145 [[nodiscard]] auto select_columns() const
146 -> std::vector<std::string> override;
147
148private:
149 [[nodiscard]] auto parse_timestamp(const std::string& str) const
150 -> std::chrono::system_clock::time_point;
151
152 [[nodiscard]] auto format_timestamp(
153 std::chrono::system_clock::time_point tp) const -> std::string;
154};
155
156} // namespace kcenon::pacs::storage
157
158#else // !PACS_WITH_DATABASE_SYSTEM
159
160// Legacy interface for builds without database_system
161struct sqlite3;
162
163namespace kcenon::pacs::storage {
164
165template <typename T>
167
168using VoidResult = kcenon::common::VoidResult;
169
178public:
179 explicit node_repository(sqlite3* db);
181
183 auto operator=(const node_repository&) -> node_repository& = delete;
185 auto operator=(node_repository&&) noexcept -> node_repository&;
186
187 [[nodiscard]] auto upsert(const client::remote_node& node) -> Result<int64_t>;
188 [[nodiscard]] auto find_by_id(std::string_view node_id) const
189 -> std::optional<client::remote_node>;
190 [[nodiscard]] auto find_by_pk(int64_t pk) const
191 -> std::optional<client::remote_node>;
192 [[nodiscard]] auto find_all() const -> std::vector<client::remote_node>;
193 [[nodiscard]] auto find_by_status(client::node_status status) const
194 -> std::vector<client::remote_node>;
195 [[nodiscard]] auto remove(std::string_view node_id) -> VoidResult;
196 [[nodiscard]] auto exists(std::string_view node_id) const -> bool;
197 [[nodiscard]] auto count() const -> size_t;
198
199 [[nodiscard]] auto update_status(
200 std::string_view node_id,
201 client::node_status status,
202 std::string_view error_message = "") -> VoidResult;
203 [[nodiscard]] auto update_last_verified(std::string_view node_id)
204 -> VoidResult;
205
206 [[nodiscard]] auto is_valid() const noexcept -> bool;
207
208private:
209 [[nodiscard]] auto parse_row(void* stmt) const -> client::remote_node;
210
211 sqlite3* db_{nullptr};
212};
213
214} // namespace kcenon::pacs::storage
215
216#endif // PACS_WITH_DATABASE_SYSTEM
Generic base repository for CRUD operations.
Repository for remote node persistence (legacy SQLite interface)
node_repository(const node_repository &)=delete
auto find_by_status(client::node_status status) const -> std::vector< client::remote_node >
auto is_valid() const noexcept -> bool
auto operator=(const node_repository &) -> node_repository &=delete
auto upsert(const client::remote_node &node) -> Result< int64_t >
auto update_last_verified(std::string_view node_id) -> VoidResult
auto remove(std::string_view node_id) -> VoidResult
auto parse_row(void *stmt) const -> client::remote_node
auto find_all() const -> std::vector< client::remote_node >
auto find_by_pk(int64_t pk) const -> std::optional< client::remote_node >
auto exists(std::string_view node_id) const -> bool
node_repository(node_repository &&) noexcept
auto update_status(std::string_view node_id, client::node_status status, std::string_view error_message="") -> VoidResult
auto find_by_id(std::string_view node_id) const -> std::optional< client::remote_node >
kcenon::common::Result< T > Result
Result type alias for operations returning a value.
Remote PACS node data structures for client operations.