outbox_pattern_processor/
outbox_resources.rs

1use crate::aws::{SnsClient, SqsClient};
2use sqlx::{Pool, Postgres};
3
4#[derive(Clone)]
5pub struct OutboxProcessorResources {
6    pub postgres_pool: Pool<Postgres>,
7    pub sqs_client: Option<SqsClient>,
8    pub sns_client: Option<SnsClient>,
9    pub http_timeout_in_millis: Option<u64>,
10    pub outbox_query_limit: Option<u32>,
11    pub outbox_execution_interval_in_seconds: Option<u64>,
12    pub delete_after_process_successfully: Option<bool>,
13    pub max_in_flight_interval_in_seconds: Option<u64>,
14    pub outbox_failure_limit: Option<u32>,
15    pub scheduled_clear_locked_partition: Option<bool>,
16    pub outbox_cleaner_execution_interval_in_seconds: Option<u64>,
17    pub delay_for_failure_attempt_in_seconds: Option<u64>,
18}
19
20impl OutboxProcessorResources {
21    pub fn new(
22        postgres_pool: Pool<Postgres>,
23        sqs_client: Option<SqsClient>,
24        sns_client: Option<SnsClient>,
25    ) -> Self {
26        Self {
27            postgres_pool,
28            sqs_client,
29            sns_client,
30            http_timeout_in_millis: None,
31            outbox_query_limit: None,
32            outbox_execution_interval_in_seconds: None,
33            delete_after_process_successfully: None,
34            max_in_flight_interval_in_seconds: None,
35            outbox_failure_limit: None,
36            scheduled_clear_locked_partition: None,
37            outbox_cleaner_execution_interval_in_seconds: None,
38            delay_for_failure_attempt_in_seconds: None,
39        }
40    }
41
42    pub fn with_http_timeout_in_millis(
43        self,
44        http_timeout: u64,
45    ) -> Self {
46        Self {
47            postgres_pool: self.postgres_pool,
48            sqs_client: self.sqs_client,
49            sns_client: self.sns_client,
50            http_timeout_in_millis: Some(http_timeout),
51            outbox_query_limit: self.outbox_query_limit,
52            outbox_execution_interval_in_seconds: self.outbox_execution_interval_in_seconds,
53            delete_after_process_successfully: self.delete_after_process_successfully,
54            max_in_flight_interval_in_seconds: self.max_in_flight_interval_in_seconds,
55            outbox_failure_limit: self.outbox_failure_limit,
56            scheduled_clear_locked_partition: self.scheduled_clear_locked_partition,
57            outbox_cleaner_execution_interval_in_seconds: None,
58            delay_for_failure_attempt_in_seconds: self.delay_for_failure_attempt_in_seconds,
59        }
60    }
61
62    pub fn with_outbox_query_limit(
63        self,
64        outbox_query_limit: u32,
65    ) -> Self {
66        Self {
67            postgres_pool: self.postgres_pool,
68            sqs_client: self.sqs_client,
69            sns_client: self.sns_client,
70            http_timeout_in_millis: self.http_timeout_in_millis,
71            outbox_query_limit: Some(outbox_query_limit),
72            outbox_execution_interval_in_seconds: self.outbox_execution_interval_in_seconds,
73            delete_after_process_successfully: self.delete_after_process_successfully,
74            max_in_flight_interval_in_seconds: self.max_in_flight_interval_in_seconds,
75            outbox_failure_limit: self.outbox_failure_limit,
76            scheduled_clear_locked_partition: self.scheduled_clear_locked_partition,
77            outbox_cleaner_execution_interval_in_seconds: None,
78            delay_for_failure_attempt_in_seconds: self.delay_for_failure_attempt_in_seconds,
79        }
80    }
81
82    pub fn with_outbox_execution_interval_in_seconds(
83        self,
84        outbox_execution_interval_in_seconds: u64,
85    ) -> Self {
86        Self {
87            postgres_pool: self.postgres_pool,
88            sqs_client: self.sqs_client,
89            sns_client: self.sns_client,
90            http_timeout_in_millis: self.http_timeout_in_millis,
91            outbox_query_limit: self.outbox_query_limit,
92            outbox_execution_interval_in_seconds: Some(outbox_execution_interval_in_seconds),
93            delete_after_process_successfully: self.delete_after_process_successfully,
94            max_in_flight_interval_in_seconds: self.max_in_flight_interval_in_seconds,
95            outbox_failure_limit: self.outbox_failure_limit,
96            scheduled_clear_locked_partition: self.scheduled_clear_locked_partition,
97            outbox_cleaner_execution_interval_in_seconds: None,
98            delay_for_failure_attempt_in_seconds: self.delay_for_failure_attempt_in_seconds,
99        }
100    }
101
102    pub fn with_delete_after_process_successfully(
103        self,
104        delete_after_process_successfully: bool,
105    ) -> Self {
106        Self {
107            postgres_pool: self.postgres_pool,
108            sqs_client: self.sqs_client,
109            sns_client: self.sns_client,
110            http_timeout_in_millis: self.http_timeout_in_millis,
111            outbox_query_limit: self.outbox_query_limit,
112            outbox_execution_interval_in_seconds: self.outbox_execution_interval_in_seconds,
113            delete_after_process_successfully: Some(delete_after_process_successfully),
114            max_in_flight_interval_in_seconds: self.max_in_flight_interval_in_seconds,
115            outbox_failure_limit: self.outbox_failure_limit,
116            scheduled_clear_locked_partition: self.scheduled_clear_locked_partition,
117            outbox_cleaner_execution_interval_in_seconds: None,
118            delay_for_failure_attempt_in_seconds: self.delay_for_failure_attempt_in_seconds,
119        }
120    }
121
122    pub fn with_max_in_flight_interval_in_seconds(
123        self,
124        max_in_flight_interval_in_seconds: u64,
125    ) -> Self {
126        Self {
127            postgres_pool: self.postgres_pool,
128            sqs_client: self.sqs_client,
129            sns_client: self.sns_client,
130            http_timeout_in_millis: self.http_timeout_in_millis,
131            outbox_query_limit: self.outbox_query_limit,
132            outbox_execution_interval_in_seconds: self.outbox_execution_interval_in_seconds,
133            delete_after_process_successfully: self.delete_after_process_successfully,
134            max_in_flight_interval_in_seconds: Some(max_in_flight_interval_in_seconds),
135            outbox_failure_limit: self.outbox_failure_limit,
136            scheduled_clear_locked_partition: self.scheduled_clear_locked_partition,
137            outbox_cleaner_execution_interval_in_seconds: None,
138            delay_for_failure_attempt_in_seconds: self.delay_for_failure_attempt_in_seconds,
139        }
140    }
141
142    pub fn with_outbox_failure_limit(
143        self,
144        outbox_failure_limit: u32,
145    ) -> Self {
146        Self {
147            postgres_pool: self.postgres_pool,
148            sqs_client: self.sqs_client,
149            sns_client: self.sns_client,
150            http_timeout_in_millis: self.http_timeout_in_millis,
151            outbox_query_limit: self.outbox_query_limit,
152            outbox_execution_interval_in_seconds: self.outbox_execution_interval_in_seconds,
153            delete_after_process_successfully: self.delete_after_process_successfully,
154            max_in_flight_interval_in_seconds: self.max_in_flight_interval_in_seconds,
155            outbox_failure_limit: Some(outbox_failure_limit),
156            scheduled_clear_locked_partition: self.scheduled_clear_locked_partition,
157            outbox_cleaner_execution_interval_in_seconds: None,
158            delay_for_failure_attempt_in_seconds: self.delay_for_failure_attempt_in_seconds,
159        }
160    }
161
162    pub fn with_scheduled_clear_locked_partition(
163        self,
164        scheduled_clear_locked_partition: bool,
165    ) -> Self {
166        Self {
167            postgres_pool: self.postgres_pool,
168            sqs_client: self.sqs_client,
169            sns_client: self.sns_client,
170            http_timeout_in_millis: self.http_timeout_in_millis,
171            outbox_query_limit: self.outbox_query_limit,
172            outbox_execution_interval_in_seconds: self.outbox_execution_interval_in_seconds,
173            delete_after_process_successfully: self.delete_after_process_successfully,
174            max_in_flight_interval_in_seconds: self.max_in_flight_interval_in_seconds,
175            outbox_failure_limit: self.outbox_failure_limit,
176            scheduled_clear_locked_partition: Some(scheduled_clear_locked_partition),
177            outbox_cleaner_execution_interval_in_seconds: None,
178            delay_for_failure_attempt_in_seconds: self.delay_for_failure_attempt_in_seconds,
179        }
180    }
181
182    pub fn with_outbox_cleaner_execution_interval_in_seconds(
183        self,
184        outbox_cleaner_execution_interval_in_seconds: u64,
185    ) -> Self {
186        Self {
187            postgres_pool: self.postgres_pool,
188            sqs_client: self.sqs_client,
189            sns_client: self.sns_client,
190            http_timeout_in_millis: self.http_timeout_in_millis,
191            outbox_query_limit: self.outbox_query_limit,
192            outbox_execution_interval_in_seconds: self.outbox_execution_interval_in_seconds,
193            delete_after_process_successfully: self.delete_after_process_successfully,
194            max_in_flight_interval_in_seconds: self.max_in_flight_interval_in_seconds,
195            outbox_failure_limit: self.outbox_failure_limit,
196            scheduled_clear_locked_partition: self.scheduled_clear_locked_partition,
197            outbox_cleaner_execution_interval_in_seconds: Some(outbox_cleaner_execution_interval_in_seconds),
198            delay_for_failure_attempt_in_seconds: self.delay_for_failure_attempt_in_seconds,
199        }
200    }
201
202    pub fn with_delay_for_failure_attempt_in_seconds(
203        self,
204        delay_for_failure_attempt_in_seconds: u64,
205    ) -> Self {
206        Self {
207            postgres_pool: self.postgres_pool,
208            sqs_client: self.sqs_client,
209            sns_client: self.sns_client,
210            http_timeout_in_millis: self.http_timeout_in_millis,
211            outbox_query_limit: self.outbox_query_limit,
212            outbox_execution_interval_in_seconds: self.outbox_execution_interval_in_seconds,
213            delete_after_process_successfully: self.delete_after_process_successfully,
214            max_in_flight_interval_in_seconds: self.max_in_flight_interval_in_seconds,
215            outbox_failure_limit: self.outbox_failure_limit,
216            scheduled_clear_locked_partition: self.scheduled_clear_locked_partition,
217            outbox_cleaner_execution_interval_in_seconds: self.outbox_cleaner_execution_interval_in_seconds,
218            delay_for_failure_attempt_in_seconds: Some(delay_for_failure_attempt_in_seconds),
219        }
220    }
221}