25#include <kcenon/common/patterns/result.h>
33#ifdef PACS_WITH_DATABASE_SYSTEM
42struct job_query_options {
43 std::optional<client::job_status>
status;
44 std::optional<client::job_type>
type;
45 std::optional<std::string>
node_id;
82 :
public base_repository<client::job_record, std::string> {
84 explicit job_repository(std::shared_ptr<pacs_database_adapter> db);
102 [[nodiscard]] auto
find_by_pk(int64_t pk) -> result_type;
110 [[nodiscard]] auto
find_jobs(const job_query_options& options = {})
121 size_t limit = 100) -> list_result_type;
140 [[nodiscard]]
auto find_by_node(std::string_view node_id)
167 std::string_view error_message =
"",
168 std::string_view error_details =
"")
179 const client::job_progress& progress)
190 [[nodiscard]]
auto mark_started(std::string_view job_id) -> VoidResult;
200 [[nodiscard]]
auto mark_completed(std::string_view job_id) -> VoidResult;
212 [[nodiscard]]
auto mark_failed(std::string_view job_id,
213 std::string_view error_message,
214 std::string_view error_details =
"")
223 [[nodiscard]]
auto increment_retry(std::string_view job_id) -> VoidResult;
257 [[nodiscard]]
auto map_row_to_entity(
const database_row& row)
const
258 -> client::job_record
override;
260 [[nodiscard]]
auto entity_to_row(
const client::job_record& entity)
const
261 -> std::map<std::string, database_value>
override;
263 [[nodiscard]]
auto get_pk(
const client::job_record& entity)
const
264 -> std::string
override;
266 [[nodiscard]]
auto has_pk(
const client::job_record& entity)
const
269 [[nodiscard]]
auto select_columns() const
270 -> std::vector<std::
string> override;
273 [[nodiscard]] auto parse_timestamp(const std::
string& str) const
274 -> std::chrono::system_clock::time_point;
276 [[nodiscard]] auto format_timestamp(
277 std::chrono::system_clock::time_point tp) const -> std::
string;
279 [[nodiscard]] auto format_optional_timestamp(
280 const std::optional<std::chrono::system_clock::time_point>& tp) const
284 const std::vector<std::
string>& uids) -> std::
string;
287 -> std::vector<std::
string>;
290 const std::unordered_map<std::
string, std::
string>& metadata)
294 -> std::unordered_map<std::
string, std::
string>;
309using VoidResult = kcenon::common::VoidResult;
315 std::optional<client::job_status>
status;
316 std::optional<client::job_type>
type;
341 [[nodiscard]] auto
save(const client::job_record& job) -> VoidResult;
342 [[nodiscard]] auto
find_by_id(std::string_view job_id) const
343 -> std::optional<client::job_record>;
344 [[nodiscard]] auto
find_by_pk(int64_t pk) const
345 -> std::optional<client::job_record>;
347 -> std::vector<client::job_record>;
349 size_t limit = 100) const
350 -> std::vector<client::job_record>;
352 -> std::vector<client::job_record>;
353 [[nodiscard]] auto
find_by_node(std::string_view node_id) const
354 -> std::vector<client::job_record>;
355 [[nodiscard]] auto
remove(std::string_view job_id) -> VoidResult;
358 [[nodiscard]] auto
exists(std::string_view job_id) const ->
bool;
361 client::job_status status,
362 std::string_view error_message = "",
363 std::string_view error_details = "")
366 const client::job_progress& progress)
368 [[nodiscard]] auto
mark_started(std::string_view job_id) -> VoidResult;
369 [[nodiscard]] auto
mark_completed(std::string_view job_id) -> VoidResult;
370 [[nodiscard]] auto
mark_failed(std::string_view job_id,
371 std::string_view error_message,
372 std::string_view error_details = "")
374 [[nodiscard]] auto
increment_retry(std::string_view job_id) -> VoidResult;
376 [[nodiscard]] auto
count() const ->
size_t;
382 [[nodiscard]] auto
is_valid() const noexcept ->
bool;
385 [[nodiscard]] auto
parse_row(
void* stmt) const -> client::job_record;
388 const std::vector<std::
string>& uids) -> std::
string;
391 -> std::vector<std::
string>;
394 const std::unordered_map<std::
string, std::
string>& metadata)
398 -> std::unordered_map<std::
string, std::
string>;
Generic base repository for CRUD operations.
Repository for job persistence (legacy SQLite interface)
auto cleanup_old_jobs(std::chrono::hours max_age) -> Result< size_t >
job_repository(sqlite3 *db)
static auto deserialize_metadata(std::string_view json) -> std::unordered_map< std::string, std::string >
auto save(const client::job_record &job) -> VoidResult
auto count_failed_today() const -> size_t
auto find_by_node(std::string_view node_id) const -> std::vector< client::job_record >
job_repository(job_repository &&) noexcept
auto mark_completed(std::string_view job_id) -> VoidResult
static auto serialize_metadata(const std::unordered_map< std::string, std::string > &metadata) -> std::string
auto count_completed_today() const -> size_t
auto increment_retry(std::string_view job_id) -> VoidResult
auto remove(std::string_view job_id) -> VoidResult
auto update_status(std::string_view job_id, client::job_status status, std::string_view error_message="", std::string_view error_details="") -> VoidResult
auto mark_started(std::string_view job_id) -> VoidResult
auto find_by_status(client::job_status status, size_t limit=100) const -> std::vector< client::job_record >
auto count() const -> size_t
auto find_pending_jobs(size_t limit=10) const -> std::vector< client::job_record >
static auto deserialize_instance_uids(std::string_view json) -> std::vector< std::string >
auto operator=(const job_repository &) -> job_repository &=delete
auto find_by_id(std::string_view job_id) const -> std::optional< client::job_record >
auto is_valid() const noexcept -> bool
auto mark_failed(std::string_view job_id, std::string_view error_message, std::string_view error_details="") -> VoidResult
static auto serialize_instance_uids(const std::vector< std::string > &uids) -> std::string
auto find_jobs(const job_query_options &options={}) const -> std::vector< client::job_record >
job_repository(const job_repository &)=delete
auto exists(std::string_view job_id) const -> bool
auto count_by_status(client::job_status status) const -> size_t
auto parse_row(void *stmt) const -> client::job_record
auto update_progress(std::string_view job_id, const client::job_progress &progress) -> VoidResult
auto find_by_pk(int64_t pk) const -> std::optional< client::job_record >
Job types and structures for asynchronous DICOM operations.
job_status
Current status of a job.
kcenon::common::Result< T > Result
Result type alias for operations returning a value.
Query options for listing jobs.
size_t offset
Result offset for pagination.
std::optional< client::job_type > type
Filter by type.
size_t limit
Maximum results.
bool order_by_priority
Order by priority (desc) then created_at.
std::optional< std::string > node_id
Filter by source or destination node.
std::optional< std::string > created_by
Filter by creator.
std::optional< client::job_status > status
Filter by status.