Skip to main content

runledger_postgres/jobs/
types.rs

1use chrono::{DateTime, Utc};
2use runledger_core::jobs::{
3    JobEventType, JobFailureKind, JobStage, JobStatus, JobType, JobTypeName,
4};
5use serde_json::Value;
6use sqlx::types::Uuid;
7
8#[derive(Debug, Clone)]
9pub struct JobDefinitionUpsert<'a> {
10    pub job_type: JobType<'a>,
11    pub version: i32,
12    pub max_attempts: i32,
13    pub default_timeout_seconds: i32,
14    pub default_priority: i32,
15    pub is_enabled: bool,
16}
17
18#[derive(Debug, Clone)]
19pub struct JobDefinitionRecord {
20    pub job_type: JobTypeName,
21    pub version: i32,
22    pub max_attempts: i32,
23    pub default_timeout_seconds: i32,
24    pub default_priority: i32,
25    pub is_enabled: bool,
26    pub created_at: DateTime<Utc>,
27    pub updated_at: DateTime<Utc>,
28}
29
30#[derive(Debug, Clone)]
31pub struct JobDefinitionListFilter<'a> {
32    /// Admin list query input used for escaped `ILIKE` substring matching, not a canonical
33    /// persisted identifier boundary.
34    pub job_type: Option<&'a str>,
35    pub limit: i64,
36    pub offset: i64,
37}
38
39#[derive(Debug, Clone)]
40pub struct JobDefinitionUpdate {
41    pub max_attempts: Option<i32>,
42    pub default_timeout_seconds: Option<i32>,
43    pub default_priority: Option<i32>,
44    pub is_enabled: Option<bool>,
45}
46
47#[derive(Debug, Clone)]
48pub struct JobRuntimeConfigUpsert<'a> {
49    pub job_type: JobType<'a>,
50    pub schema_version: i32,
51    pub config: &'a Value,
52    pub updated_by_user_id: Option<Uuid>,
53}
54
55#[derive(Debug, Clone)]
56pub struct JobRuntimeConfigRecord {
57    pub job_type: JobTypeName,
58    pub schema_version: i32,
59    pub config: Value,
60    pub updated_by_user_id: Option<Uuid>,
61    pub created_at: DateTime<Utc>,
62    pub updated_at: DateTime<Utc>,
63}
64
65#[derive(Debug, Clone)]
66pub struct JobEnqueue<'a> {
67    pub job_type: JobType<'a>,
68    pub organization_id: Option<Uuid>,
69    pub payload: &'a Value,
70    pub priority: Option<i32>,
71    pub max_attempts: Option<i32>,
72    pub timeout_seconds: Option<i32>,
73    pub next_run_at: Option<DateTime<Utc>>,
74    pub idempotency_key: Option<&'a str>,
75    pub stage: Option<JobStage>,
76}
77
78#[derive(Debug, Clone)]
79pub struct JobScheduleRecord {
80    pub id: Uuid,
81    pub name: String,
82    pub job_type: JobTypeName,
83    pub organization_id: Option<Uuid>,
84    pub payload_template: Value,
85    pub cron_expr: String,
86    pub max_jitter_seconds: i32,
87    pub next_fire_at: DateTime<Utc>,
88}
89
90#[derive(Debug, Clone)]
91pub struct JobQueueRecord {
92    pub id: Uuid,
93    pub job_type: JobTypeName,
94    pub organization_id: Option<Uuid>,
95    pub payload: Value,
96    pub status: JobStatus,
97    pub priority: i32,
98    pub run_number: i32,
99    pub attempt: i32,
100    pub max_attempts: i32,
101    pub timeout_seconds: i32,
102    pub next_run_at: DateTime<Utc>,
103    pub lease_expires_at: Option<DateTime<Utc>>,
104    pub last_heartbeat_at: Option<DateTime<Utc>>,
105    pub worker_id: Option<String>,
106    pub started_at: Option<DateTime<Utc>>,
107    pub finished_at: Option<DateTime<Utc>>,
108    pub stage: JobStage,
109    pub progress_done: Option<i64>,
110    pub progress_total: Option<i64>,
111    pub progress_pct: Option<f64>,
112    pub checkpoint: Option<Value>,
113    pub idempotency_key: Option<String>,
114    pub status_reason: Option<String>,
115    pub last_error_code: Option<String>,
116    pub last_error_message: Option<String>,
117    pub created_at: DateTime<Utc>,
118    pub updated_at: DateTime<Utc>,
119}
120
121#[derive(Debug, Clone)]
122pub struct JobEventRecord {
123    pub id: i64,
124    pub job_id: Uuid,
125    pub run_number: i32,
126    pub attempt: Option<i32>,
127    pub event_type: JobEventType,
128    pub stage: Option<JobStage>,
129    pub progress_done: Option<i64>,
130    pub progress_total: Option<i64>,
131    pub payload: Value,
132    pub occurred_at: DateTime<Utc>,
133}
134
135#[derive(Debug, Clone)]
136pub struct ReapedTerminalLeaseRecord {
137    pub job_id: Uuid,
138    pub job_type: JobTypeName,
139    pub organization_id: Option<Uuid>,
140    pub run_number: i32,
141    pub attempt: i32,
142    pub payload: Value,
143}
144
145#[derive(Debug, Clone)]
146pub struct ReapExpiredLeasesResult {
147    pub processed: i64,
148    pub terminal_dead_lettered: Vec<ReapedTerminalLeaseRecord>,
149}
150
151#[derive(Debug, Clone)]
152pub struct JobMetricsRecord {
153    pub job_type: JobTypeName,
154    pub pending_count: i64,
155    pub leased_count: i64,
156    pub stale_leases: i64,
157    pub succeeded_24h: i64,
158    pub retryable_24h: i64,
159    pub terminal_24h: i64,
160    pub panicked_24h: i64,
161    pub timeout_24h: i64,
162    pub dead_lettered_24h: i64,
163    pub p50_duration_ms_24h: Option<f64>,
164    pub p95_duration_ms_24h: Option<f64>,
165}
166
167#[derive(Debug, Clone)]
168pub struct JobLogRecord {
169    pub id: i64,
170    pub job_id: Uuid,
171    pub run_number: i32,
172    pub attempt: Option<i32>,
173    pub level: String,
174    pub message: String,
175    pub payload: Value,
176    pub occurred_at: DateTime<Utc>,
177}
178
179#[derive(Debug, Clone)]
180pub struct JobLogRecordInput {
181    pub job_id: Uuid,
182    pub run_number: i32,
183    pub attempt: Option<i32>,
184    pub level: String,
185    pub message: String,
186    pub payload: Value,
187}
188
189#[derive(Debug, Clone)]
190pub struct JobProgressUpdate<'a> {
191    pub stage: Option<JobStage>,
192    pub progress_done: Option<i64>,
193    pub progress_total: Option<i64>,
194    pub checkpoint: Option<&'a Value>,
195}
196
197#[derive(Debug, Clone)]
198pub struct JobFailureUpdate<'a> {
199    pub kind: JobFailureKind,
200    pub code: &'a str,
201    pub message: &'a str,
202    pub retry_delay_ms: Option<i32>,
203}
204
205#[derive(Debug, Clone)]
206pub struct JobListFilter<'a> {
207    pub organization_id: Option<Uuid>,
208    pub status: Option<JobStatus>,
209    /// Admin list query input used for `ILIKE` substring matching, not a canonical persisted
210    /// identifier boundary.
211    pub job_type: Option<&'a str>,
212    pub limit: i64,
213    pub offset: i64,
214}
215
216#[derive(Debug, Clone)]
217pub struct JobRuntimeConfigListFilter<'a> {
218    /// Admin query filter string used for listing/runtime-config lookup filters, not a canonical
219    /// persisted identifier boundary.
220    pub job_type: Option<&'a str>,
221    pub limit: i64,
222    pub offset: i64,
223}