PACS System 0.1.0
PACS DICOM system library
Loading...
Searching...
No Matches
audit_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
46class audit_repository : public base_repository<audit_record, int64_t> {
47public:
52 explicit audit_repository(std::shared_ptr<pacs_database_adapter> db);
53 ~audit_repository() override = default;
54
55 audit_repository(const audit_repository&) = delete;
56 auto operator=(const audit_repository&) -> audit_repository& = delete;
57 audit_repository(audit_repository&&) noexcept = default;
58 auto operator=(audit_repository&&) noexcept -> audit_repository& = default;
59
65 [[nodiscard]] auto add_audit_log(const audit_record& record)
66 -> Result<int64_t>;
67
77 [[nodiscard]] auto query_audit_log(const audit_query& query)
78 -> Result<std::vector<audit_record>>;
79
85 [[nodiscard]] auto find_audit_by_pk(int64_t pk)
86 -> std::optional<audit_record>;
87
92 [[nodiscard]] auto audit_count() -> Result<size_t>;
93
103 [[nodiscard]] auto cleanup_old_audit_logs(std::chrono::hours age)
104 -> Result<size_t>;
105
106protected:
107 [[nodiscard]] auto map_row_to_entity(const database_row& row) const
108 -> audit_record override;
109 [[nodiscard]] auto entity_to_row(const audit_record& entity) const
110 -> std::map<std::string, database_value> override;
111 [[nodiscard]] auto get_pk(const audit_record& entity) const
112 -> int64_t override;
113 [[nodiscard]] auto has_pk(const audit_record& entity) const
114 -> bool override;
115 [[nodiscard]] auto select_columns() const -> std::vector<std::string> override;
116
117private:
118 [[nodiscard]] static auto to_like_pattern(std::string_view pattern)
119 -> std::string;
120 [[nodiscard]] auto parse_timestamp(const std::string& str) const
121 -> std::chrono::system_clock::time_point;
122 [[nodiscard]] auto format_timestamp(
123 std::chrono::system_clock::time_point tp) const -> std::string;
124};
125
126} // namespace kcenon::pacs::storage
127
128#else
129
130struct sqlite3;
131
132namespace kcenon::pacs::storage {
133
134template <typename T>
136
137using VoidResult = kcenon::common::VoidResult;
138
146public:
151 explicit audit_repository(sqlite3* db);
153
155 auto operator=(const audit_repository&) -> audit_repository& = delete;
157 auto operator=(audit_repository&&) noexcept -> audit_repository&;
158
160 [[nodiscard]] auto add_audit_log(const audit_record& record)
161 -> Result<int64_t>;
163 [[nodiscard]] auto query_audit_log(const audit_query& query) const
164 -> Result<std::vector<audit_record>>;
166 [[nodiscard]] auto find_audit_by_pk(int64_t pk) const
167 -> std::optional<audit_record>;
169 [[nodiscard]] auto audit_count() const -> Result<size_t>;
171 [[nodiscard]] auto cleanup_old_audit_logs(std::chrono::hours age)
172 -> Result<size_t>;
173
174private:
175 [[nodiscard]] auto parse_audit_row(void* stmt) const -> audit_record;
176 [[nodiscard]] static auto to_like_pattern(std::string_view pattern)
177 -> std::string;
178 [[nodiscard]] static auto parse_timestamp(const std::string& str)
179 -> std::chrono::system_clock::time_point;
180
181 sqlite3* db_{nullptr};
182};
183
184} // namespace kcenon::pacs::storage
185
186#endif
Audit log record data structures.
Generic base repository for CRUD operations.
Legacy direct-SQLite fallback when database_system is disabled.
auto audit_count() const -> Result< size_t >
Total number of audit records currently stored.
auto query_audit_log(const audit_query &query) const -> Result< std::vector< audit_record > >
Query audit records using a structured filter.
static auto to_like_pattern(std::string_view pattern) -> std::string
auto add_audit_log(const audit_record &record) -> Result< int64_t >
Append a new audit record.
auto operator=(const audit_repository &) -> audit_repository &=delete
auto cleanup_old_audit_logs(std::chrono::hours age) -> Result< size_t >
Delete audit records older than the specified age.
static auto parse_timestamp(const std::string &str) -> std::chrono::system_clock::time_point
auto parse_audit_row(void *stmt) const -> audit_record
audit_repository(sqlite3 *db)
Construct repository bound to a raw sqlite3 handle.
audit_repository(const audit_repository &)=delete
auto find_audit_by_pk(int64_t pk) const -> std::optional< audit_record >
Look up a single audit record by primary key.
kcenon::common::Result< T > Result
Result type alias for operations returning a value.
Query parameters for audit log search.
Audit log record from the database.