1use apalis_core::request::Request;
2use apalis_core::service_fn::FromRequest;
3use apalis_core::worker::WorkerId;
4use apalis_core::{error::Error, request::State};
5use chrono::{DateTime, Utc};
6use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Clone, Serialize, Deserialize)]
11pub struct SqlContext {
12 status: State,
13 run_at: DateTime<Utc>,
14 max_attempts: i32,
15 last_error: Option<String>,
16 lock_at: Option<i64>,
17 lock_by: Option<WorkerId>,
18 done_at: Option<i64>,
19 priority: i32,
20}
21
22impl Default for SqlContext {
23 fn default() -> Self {
24 Self::new()
25 }
26}
27
28impl SqlContext {
29 pub fn new() -> Self {
31 SqlContext {
32 status: State::Pending,
33 run_at: Utc::now(),
34 lock_at: None,
35 done_at: None,
36 max_attempts: 5,
37 last_error: None,
38 lock_by: None,
39 priority: 0,
40 }
41 }
42
43 pub fn set_max_attempts(&mut self, max_attempts: i32) {
45 self.max_attempts = max_attempts;
46 }
47
48 pub fn max_attempts(&self) -> i32 {
50 self.max_attempts
51 }
52
53 pub fn done_at(&self) -> &Option<i64> {
55 &self.done_at
56 }
57
58 pub fn set_done_at(&mut self, done_at: Option<i64>) {
60 self.done_at = done_at;
61 }
62
63 pub fn run_at(&self) -> &DateTime<Utc> {
65 &self.run_at
66 }
67
68 pub fn set_run_at(&mut self, run_at: DateTime<Utc>) {
70 self.run_at = run_at;
71 }
72
73 pub fn lock_at(&self) -> &Option<i64> {
75 &self.lock_at
76 }
77
78 pub fn set_lock_at(&mut self, lock_at: Option<i64>) {
80 self.lock_at = lock_at;
81 }
82
83 pub fn status(&self) -> &State {
85 &self.status
86 }
87
88 pub fn set_status(&mut self, status: State) {
90 self.status = status;
91 }
92
93 pub fn lock_by(&self) -> &Option<WorkerId> {
95 &self.lock_by
96 }
97
98 pub fn set_lock_by(&mut self, lock_by: Option<WorkerId>) {
100 self.lock_by = lock_by;
101 }
102
103 pub fn last_error(&self) -> &Option<String> {
105 &self.last_error
106 }
107
108 pub fn set_last_error(&mut self, error: Option<String>) {
110 self.last_error = error;
111 }
112
113 pub fn set_priority(&mut self, priority: i32) {
115 self.priority = priority
116 }
117
118 pub fn priority(&self) -> &i32 {
120 &self.priority
121 }
122}
123
124impl<Req> FromRequest<Request<Req, SqlContext>> for SqlContext {
125 fn from_request(req: &Request<Req, SqlContext>) -> Result<Self, Error> {
126 Ok(req.parts.context.clone())
127 }
128}