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>>,
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 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 pub job_type: Option<&'a str>,
224 pub limit: i64,
225 pub offset: i64,
226}