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 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 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 pub job_type: Option<&'a str>,
221 pub limit: i64,
222 pub offset: i64,
223}