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    /// For keyed enqueues, this value is part of the stored idempotency request
74    /// snapshot. Retries must pass the same scheduled time as the original
75    /// enqueue instead of recomputing a fresh timestamp.
76    pub next_run_at: Option<DateTime<Utc>>,
77    pub idempotency_key: Option<&'a str>,
78    pub stage: Option<JobStage>,
79}
80
81#[derive(Debug, Clone)]
82pub struct JobScheduleRecord {
83    pub id: Uuid,
84    pub name: String,
85    pub job_type: JobTypeName,
86    pub organization_id: Option<Uuid>,
87    pub payload_template: Value,
88    pub cron_expr: String,
89    pub max_jitter_seconds: i32,
90    pub next_fire_at: DateTime<Utc>,
91}
92
93#[derive(Debug, Clone)]
94pub struct JobQueueRecord {
95    pub id: Uuid,
96    pub job_type: JobTypeName,
97    pub organization_id: Option<Uuid>,
98    pub payload: Value,
99    pub status: JobStatus,
100    pub priority: i32,
101    pub run_number: i32,
102    pub attempt: i32,
103    pub max_attempts: i32,
104    pub timeout_seconds: i32,
105    pub next_run_at: DateTime<Utc>,
106    pub lease_expires_at: Option<DateTime<Utc>>,
107    pub last_heartbeat_at: Option<DateTime<Utc>>,
108    pub worker_id: Option<String>,
109    pub started_at: Option<DateTime<Utc>>,
110    pub finished_at: Option<DateTime<Utc>>,
111    pub stage: JobStage,
112    pub progress_done: Option<i64>,
113    pub progress_total: Option<i64>,
114    pub progress_pct: Option<f64>,
115    pub checkpoint: Option<Value>,
116    pub idempotency_key: Option<String>,
117    pub status_reason: Option<String>,
118    pub last_error_code: Option<String>,
119    pub last_error_message: Option<String>,
120    pub created_at: DateTime<Utc>,
121    pub updated_at: DateTime<Utc>,
122}
123
124#[derive(Debug, Clone)]
125pub struct JobEventRecord {
126    pub id: i64,
127    pub job_id: Uuid,
128    pub run_number: i32,
129    pub attempt: Option<i32>,
130    pub event_type: JobEventType,
131    pub stage: Option<JobStage>,
132    pub progress_done: Option<i64>,
133    pub progress_total: Option<i64>,
134    pub payload: Value,
135    pub occurred_at: DateTime<Utc>,
136}
137
138#[derive(Debug, Clone)]
139pub struct ReapedTerminalLeaseRecord {
140    pub job_id: Uuid,
141    pub job_type: JobTypeName,
142    pub organization_id: Option<Uuid>,
143    pub run_number: i32,
144    pub attempt: i32,
145    pub payload: Value,
146}
147
148#[derive(Debug, Clone)]
149pub struct ReapExpiredLeasesResult {
150    pub processed: i64,
151    pub terminal_dead_lettered: Vec<ReapedTerminalLeaseRecord>,
152}
153
154#[derive(Debug, Clone)]
155pub struct JobMetricsRecord {
156    pub job_type: JobTypeName,
157    pub pending_count: i64,
158    pub leased_count: i64,
159    pub stale_leases: i64,
160    pub succeeded_24h: i64,
161    pub retryable_24h: i64,
162    pub terminal_24h: i64,
163    pub panicked_24h: i64,
164    pub timeout_24h: i64,
165    pub dead_lettered_24h: i64,
166    pub p50_duration_ms_24h: Option<f64>,
167    pub p95_duration_ms_24h: Option<f64>,
168}
169
170#[derive(Debug, Clone)]
171pub struct JobLogRecord {
172    pub id: i64,
173    pub job_id: Uuid,
174    pub run_number: i32,
175    pub attempt: Option<i32>,
176    pub level: String,
177    pub message: String,
178    pub payload: Value,
179    pub occurred_at: DateTime<Utc>,
180}
181
182#[derive(Debug, Clone)]
183pub struct JobLogRecordInput {
184    pub job_id: Uuid,
185    pub run_number: i32,
186    pub attempt: Option<i32>,
187    pub level: String,
188    pub message: String,
189    pub payload: Value,
190}
191
192#[derive(Debug, Clone)]
193pub struct JobProgressUpdate<'a> {
194    pub stage: Option<JobStage>,
195    pub progress_done: Option<i64>,
196    pub progress_total: Option<i64>,
197    pub checkpoint: Option<&'a Value>,
198}
199
200#[derive(Debug, Clone)]
201pub struct JobFailureUpdate<'a> {
202    pub kind: JobFailureKind,
203    pub code: &'a str,
204    pub message: &'a str,
205    pub retry_delay_ms: Option<i32>,
206}
207
208#[derive(Debug, Clone)]
209pub struct JobListFilter<'a> {
210    pub organization_id: Option<Uuid>,
211    pub status: Option<JobStatus>,
212    /// Admin list query input used for `ILIKE` substring matching, not a canonical persisted
213    /// identifier boundary.
214    pub job_type: Option<&'a str>,
215    pub limit: i64,
216    pub offset: i64,
217}
218
219#[derive(Debug, Clone)]
220pub struct JobRuntimeConfigListFilter<'a> {
221    /// Admin query filter string used for listing/runtime-config lookup filters, not a canonical
222    /// persisted identifier boundary.
223    pub job_type: Option<&'a str>,
224    pub limit: i64,
225    pub offset: i64,
226}