PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
patient_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
18#pragma once
19
21
22#include <kcenon/common/patterns/result.h>
23
24#include <memory>
25#include <optional>
26#include <string>
27#include <string_view>
28#include <vector>
29
30#ifdef PACS_WITH_DATABASE_SYSTEM
31
33
34namespace kcenon::pacs::storage {
35
46class patient_repository : public base_repository<patient_record, int64_t> {
47public:
48 explicit patient_repository(std::shared_ptr<pacs_database_adapter> db);
49 ~patient_repository() override = default;
50
52 auto operator=(const patient_repository&) -> patient_repository& = delete;
53 patient_repository(patient_repository&&) noexcept = default;
54 auto operator=(patient_repository&&) noexcept -> patient_repository& = default;
55
56 // =========================================================================
57 // Domain-Specific Operations
58 // =========================================================================
59
72 [[nodiscard]] auto upsert_patient(std::string_view patient_id,
73 std::string_view patient_name = "",
74 std::string_view birth_date = "",
75 std::string_view sex = "")
76 -> Result<int64_t>;
77
84 [[nodiscard]] auto upsert_patient(const patient_record& record)
85 -> Result<int64_t>;
86
93 [[nodiscard]] auto find_patient(std::string_view patient_id)
94 -> std::optional<patient_record>;
95
102 [[nodiscard]] auto find_patient_by_pk(int64_t pk)
103 -> std::optional<patient_record>;
104
113 [[nodiscard]] auto search_patients(const patient_query& query)
114 -> Result<std::vector<patient_record>>;
115
122 [[nodiscard]] auto delete_patient(std::string_view patient_id)
123 -> VoidResult;
124
130 [[nodiscard]] auto patient_count() -> Result<size_t>;
131
132protected:
133 // =========================================================================
134 // base_repository overrides
135 // =========================================================================
136
137 [[nodiscard]] auto map_row_to_entity(const database_row& row) const
138 -> patient_record override;
139
140 [[nodiscard]] auto entity_to_row(const patient_record& entity) const
141 -> std::map<std::string, database_value> override;
142
143 [[nodiscard]] auto get_pk(const patient_record& entity) const
144 -> int64_t override;
145
146 [[nodiscard]] auto has_pk(const patient_record& entity) const
147 -> bool override;
148
149 [[nodiscard]] auto select_columns() const
150 -> std::vector<std::string> override;
151
152private:
153 [[nodiscard]] static auto to_like_pattern(std::string_view pattern)
154 -> std::string;
155
156 [[nodiscard]] auto parse_timestamp(const std::string& str) const
157 -> std::chrono::system_clock::time_point;
158
159 [[nodiscard]] auto format_timestamp(
160 std::chrono::system_clock::time_point tp) const -> std::string;
161};
162
163} // namespace kcenon::pacs::storage
164
165#else // !PACS_WITH_DATABASE_SYSTEM
166
167struct sqlite3;
168
169namespace kcenon::pacs::storage {
170
171template <typename T>
173
174using VoidResult = kcenon::common::VoidResult;
175
180public:
181 explicit patient_repository(sqlite3* db);
183
187 auto operator=(patient_repository&&) noexcept -> patient_repository&;
188
189 [[nodiscard]] auto upsert_patient(std::string_view patient_id,
190 std::string_view patient_name = "",
191 std::string_view birth_date = "",
192 std::string_view sex = "")
193 -> Result<int64_t>;
194 [[nodiscard]] auto upsert_patient(const patient_record& record)
195 -> Result<int64_t>;
196 [[nodiscard]] auto find_patient(std::string_view patient_id) const
197 -> std::optional<patient_record>;
198 [[nodiscard]] auto find_patient_by_pk(int64_t pk) const
199 -> std::optional<patient_record>;
200 [[nodiscard]] auto search_patients(const patient_query& query) const
201 -> Result<std::vector<patient_record>>;
202 [[nodiscard]] auto delete_patient(std::string_view patient_id)
203 -> VoidResult;
204 [[nodiscard]] auto patient_count() const -> Result<size_t>;
205
206private:
207 [[nodiscard]] auto parse_patient_row(void* stmt) const -> patient_record;
208 [[nodiscard]] static auto to_like_pattern(std::string_view pattern)
209 -> std::string;
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 patient metadata persistence (legacy SQLite interface)
auto search_patients(const patient_query &query) const -> Result< std::vector< patient_record > >
patient_repository(patient_repository &&) noexcept
auto find_patient_by_pk(int64_t pk) const -> std::optional< patient_record >
patient_repository(const patient_repository &)=delete
auto upsert_patient(std::string_view patient_id, std::string_view patient_name="", std::string_view birth_date="", std::string_view sex="") -> Result< int64_t >
auto operator=(const patient_repository &) -> patient_repository &=delete
static auto to_like_pattern(std::string_view pattern) -> std::string
auto patient_count() const -> Result< size_t >
auto find_patient(std::string_view patient_id) const -> std::optional< patient_record >
auto parse_patient_row(void *stmt) const -> patient_record
auto delete_patient(std::string_view patient_id) -> VoidResult
kcenon::common::Result< T > Result
Result type alias for operations returning a value.
Patient record data structures for database operations.
Patient record from the database.