Author: Manos Pitsidianakis [manos@pitsidianak.is]
Hash: 703e9cb75c474640776dbab6ad48f3bd3adb53cb
Timestamp: Mon, 24 Apr 2023 17:50:22 +0000 (1 year ago)

+38 -148 +/-12 browse
core: remove obsolete error_queue module
core: remove obsolete error_queue module

Replace with generic queue functionality
1diff --git a/cli/src/args.rs b/cli/src/args.rs
2index 8e3e484..a1acaa4 100644
3--- a/cli/src/args.rs
4+++ b/cli/src/args.rs
5 @@ -236,9 +236,6 @@ pub enum ErrorQueueCommand {
6 /// index of entry.
7 #[arg(long)]
8 index: Vec<i64>,
9- /// JSON format.
10- #[arg(long)]
11- json: bool,
12 },
13 /// Delete entry and print it in stdout.
14 Delete {
15 diff --git a/cli/src/main.rs b/cli/src/main.rs
16index caee04d..d10f015 100644
17--- a/cli/src/main.rs
18+++ b/cli/src/main.rs
19 @@ -530,24 +530,20 @@ fn run_app(opt: Opt) -> Result<()> {
20 }
21 ErrorQueue { cmd } => match cmd {
22 ErrorQueueCommand::List => {
23- let errors = db.error_queue()?;
24+ let errors = db.queue(Queue::Error)?;
25 if errors.is_empty() {
26 println!("Error queue is empty.");
27 } else {
28 for e in errors {
29 println!(
30 "- {} {} {} {} {}",
31- e["pk"],
32- e["datetime"],
33- e["from_address"],
34- e["to_address"],
35- e["subject"]
36+ e.pk, e.datetime, e.from_address, e.to_addresses, e.subject
37 );
38 }
39 }
40 }
41- ErrorQueueCommand::Print { index, json } => {
42- let mut errors = db.error_queue()?;
43+ ErrorQueueCommand::Print { index } => {
44+ let mut errors = db.queue(Queue::Error)?;
45 if !index.is_empty() {
46 errors.retain(|el| index.contains(&el.pk()));
47 }
48 @@ -555,16 +551,12 @@ fn run_app(opt: Opt) -> Result<()> {
49 println!("Error queue is empty.");
50 } else {
51 for e in errors {
52- if json {
53- println!("{:#}", e);
54- } else {
55- println!("{}", e["message"]);
56- }
57+ println!("{e:?}");
58 }
59 }
60 }
61 ErrorQueueCommand::Delete { index, quiet } => {
62- let mut errors = db.error_queue()?;
63+ let mut errors = db.queue(Queue::Error)?;
64 if !index.is_empty() {
65 errors.retain(|el| index.contains(&el.pk()));
66 }
67 @@ -576,10 +568,10 @@ fn run_app(opt: Opt) -> Result<()> {
68 if !quiet {
69 println!("Deleting error queue elements {:?}", &index);
70 }
71- db.delete_from_error_queue(index)?;
72+ db.delete_from_queue(Queue::Error, index)?;
73 if !quiet {
74 for e in errors {
75- println!("{}", e["message"]);
76+ println!("{e:?}");
77 }
78 }
79 }
80 diff --git a/cli/tests/out_queue_flush.rs b/cli/tests/out_queue_flush.rs
81index 7378c21..b1a82c7 100644
82--- a/cli/tests/out_queue_flush.rs
83+++ b/cli/tests/out_queue_flush.rs
84 @@ -156,7 +156,7 @@ fn test_out_queue_flush() {
85 let out_queue = db.queue(Queue::Out).unwrap();
86 assert_eq!(out_queue.len(), 2);
87 assert_eq!(db.list_subscriptions(foo_chat.pk()).unwrap().len(), 2);
88- assert_eq!(db.error_queue().unwrap().len(), 0);
89+ assert_eq!(db.queue(Queue::Error).unwrap().len(), 0);
90 }
91
92 log::info!("Flush out queue, subscription confirmations should be sent to the new users.");
93 @@ -340,7 +340,7 @@ fn test_list_requests_submission() {
94 let out_queue = db.queue(Queue::Out).unwrap();
95 assert_eq!(out_queue.len(), 1);
96 assert_eq!(db.list_subscriptions(foo_chat.pk()).unwrap().len(), 0);
97- assert_eq!(db.error_queue().unwrap().len(), 0);
98+ assert_eq!(db.queue(Queue::Error).unwrap().len(), 0);
99 }
100
101 log::info!("Flush out queue, help reply should go to Αλίκη.");
102 diff --git a/core/src/db.rs b/core/src/db.rs
103index a597138..38cb8e3 100644
104--- a/core/src/db.rs
105+++ b/core/src/db.rs
106 @@ -65,8 +65,6 @@ mod templates;
107 pub use templates::*;
108 mod queue;
109 pub use queue::*;
110- mod error_queue;
111- pub use error_queue::*;
112 mod posts;
113 pub use posts::*;
114 mod subscriptions;
115 diff --git a/core/src/db/error_queue.rs b/core/src/db/error_queue.rs
116deleted file mode 100644
117index effc6da..0000000
118--- a/core/src/db/error_queue.rs
119+++ /dev/null
120 @@ -1,103 +0,0 @@
121- /*
122- * This file is part of mailpot
123- *
124- * Copyright 2020 - Manos Pitsidianakis
125- *
126- * This program is free software: you can redistribute it and/or modify
127- * it under the terms of the GNU Affero General Public License as
128- * published by the Free Software Foundation, either version 3 of the
129- * License, or (at your option) any later version.
130- *
131- * This program is distributed in the hope that it will be useful,
132- * but WITHOUT ANY WARRANTY; without even the implied warranty of
133- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
134- * GNU Affero General Public License for more details.
135- *
136- * You should have received a copy of the GNU Affero General Public License
137- * along with this program. If not, see <https://www.gnu.org/licenses/>.
138- */
139-
140- use serde_json::{json, Value};
141-
142- use super::*;
143-
144- impl Connection {
145- /// Insert a received email into the error queue.
146- pub fn insert_to_error_queue(
147- &self,
148- list_pk: Option<i64>,
149- env: &Envelope,
150- raw: &[u8],
151- reason: String,
152- ) -> Result<i64> {
153- let mut stmt = self.connection.prepare(
154- "INSERT INTO queue(which, list, comment, to_addresses, from_address, subject, \
155- message_id, message) VALUES('error', ?, ?, ?, ?, ?, ?, ?) RETURNING pk;",
156- )?;
157- let pk = stmt.query_row(
158- rusqlite::params![
159- &list_pk,
160- &reason,
161- &env.field_to_to_string(),
162- &env.field_from_to_string(),
163- &env.subject(),
164- &env.message_id().to_string(),
165- raw,
166- ],
167- |row| {
168- let pk: i64 = row.get("pk")?;
169- Ok(pk)
170- },
171- )?;
172- Ok(pk)
173- }
174-
175- /// Fetch all error queue entries.
176- pub fn error_queue(&self) -> Result<Vec<DbVal<Value>>> {
177- let mut stmt = self
178- .connection
179- .prepare("SELECT * FROM queue WHERE which = 'error';")?;
180- let error_iter = stmt.query_map([], |row| {
181- let pk = row.get::<_, i64>("pk")?;
182- Ok(DbVal(
183- json!({
184- "pk" : pk,
185- "error": row.get::<_, Option<String>>("comment")?,
186- "to_addresses": row.get::<_, String>("to_addresses")?,
187- "from_address": row.get::<_, String>("from_address")?,
188- "subject": row.get::<_, String>("subject")?,
189- "message_id": row.get::<_, String>("message_id")?,
190- "message": row.get::<_, Vec<u8>>("message")?,
191- "timestamp": row.get::<_, u64>("timestamp")?,
192- "datetime": row.get::<_, String>("datetime")?,
193- }),
194- pk,
195- ))
196- })?;
197-
198- let mut ret = vec![];
199- for error in error_iter {
200- let error = error?;
201- ret.push(error);
202- }
203- Ok(ret)
204- }
205-
206- /// Delete error queue entries.
207- pub fn delete_from_error_queue(&mut self, index: Vec<i64>) -> Result<()> {
208- let tx = self.connection.transaction()?;
209-
210- if index.is_empty() {
211- tx.execute("DELETE FROM queue WHERE which = 'error';", [])?;
212- } else {
213- for i in index {
214- tx.execute(
215- "DELETE FROM queue WHERE which = 'error' AND pk = ?;",
216- rusqlite::params![i],
217- )?;
218- }
219- };
220- tx.commit()?;
221- Ok(())
222- }
223- }
224 diff --git a/core/src/db/posts.rs b/core/src/db/posts.rs
225index d46ae0e..64c3e53 100644
226--- a/core/src/db/posts.rs
227+++ b/core/src/db/posts.rs
228 @@ -75,7 +75,13 @@ impl Connection {
229 pub fn post(&mut self, env: &Envelope, raw: &[u8], _dry_run: bool) -> Result<()> {
230 let result = self.inner_post(env, raw, _dry_run);
231 if let Err(err) = result {
232- return match self.insert_to_error_queue(None, env, raw, err.to_string()) {
233+ return match self.insert_to_queue(QueueEntry::new(
234+ Queue::Error,
235+ None,
236+ Some(Cow::Borrowed(env)),
237+ raw,
238+ Some(err.to_string()),
239+ )?) {
240 Ok(idx) => {
241 log::info!(
242 "Inserted mail from {:?} into error_queue at index {}",
243 diff --git a/core/src/db/queue.rs b/core/src/db/queue.rs
244index 334516b..20574b5 100644
245--- a/core/src/db/queue.rs
246+++ b/core/src/db/queue.rs
247 @@ -45,6 +45,8 @@ pub enum Queue {
248 Corrupt,
249 /// Emails that must be sent as soon as possible.
250 Out,
251+ /// Error queue
252+ Error,
253 }
254
255 impl Queue {
256 @@ -56,6 +58,7 @@ impl Queue {
257 Self::Deferred => "deferred",
258 Self::Corrupt => "corrupt",
259 Self::Out => "out",
260+ Self::Error => "error",
261 }
262 }
263 }
264 diff --git a/core/tests/account.rs b/core/tests/account.rs
265index 7cbf57f..5af5b56 100644
266--- a/core/tests/account.rs
267+++ b/core/tests/account.rs
268 @@ -17,7 +17,7 @@
269 * along with this program. If not, see <https://www.gnu.org/licenses/>.
270 */
271
272- use mailpot::{models::*, Configuration, Connection, SendMail};
273+ use mailpot::{models::*, Configuration, Connection, Queue, SendMail};
274 use mailpot_tests::init_stderr_logging;
275 use tempfile::TempDir;
276
277 @@ -67,7 +67,7 @@ fn test_accounts() {
278 .unwrap();
279
280 assert_eq!(post_policy.pk(), 1);
281- assert_eq!(db.error_queue().unwrap().len(), 0);
282+ assert_eq!(db.queue(Queue::Error).unwrap().len(), 0);
283 assert_eq!(db.list_subscriptions(foo_chat.pk()).unwrap().len(), 0);
284
285 let mut db = db.untrusted();
286 @@ -89,7 +89,7 @@ MIME-Version: 1.0
287 db.post(&envelope, subscribe_bytes, /* dry_run */ false)
288 .unwrap();
289 assert_eq!(db.list_subscriptions(foo_chat.pk()).unwrap().len(), 1);
290- assert_eq!(db.error_queue().unwrap().len(), 0);
291+ assert_eq!(db.queue(Queue::Error).unwrap().len(), 0);
292
293 assert_eq!(db.account_by_address("user@example.com").unwrap(), None);
294
295 @@ -115,7 +115,7 @@ MIME-Version: 1.0
296 melib::Envelope::from_bytes(&set_password_bytes, None).expect("Could not parse message");
297 db.post(&envelope, &set_password_bytes, /* dry_run */ false)
298 .unwrap();
299- assert_eq!(db.error_queue().unwrap().len(), 0);
300+ assert_eq!(db.queue(Queue::Error).unwrap().len(), 0);
301 let acc = db.account_by_address("user@example.com").unwrap().unwrap();
302
303 assert_eq!(
304 @@ -136,7 +136,7 @@ MIME-Version: 1.0
305 melib::Envelope::from_bytes(&set_password_bytes, None).expect("Could not parse message");
306 db.post(&envelope, &set_password_bytes, /* dry_run */ false)
307 .unwrap();
308- assert_eq!(db.error_queue().unwrap().len(), 0);
309+ assert_eq!(db.queue(Queue::Error).unwrap().len(), 0);
310 let acc = db.account_by_address("user@example.com").unwrap().unwrap();
311
312 assert!(
313 diff --git a/core/tests/error_queue.rs b/core/tests/error_queue.rs
314index c7525e7..32c6613 100644
315--- a/core/tests/error_queue.rs
316+++ b/core/tests/error_queue.rs
317 @@ -17,7 +17,7 @@
318 * along with this program. If not, see <https://www.gnu.org/licenses/>.
319 */
320
321- use mailpot::{melib, models::*, Configuration, Connection, SendMail};
322+ use mailpot::{melib, models::*, Configuration, Connection, Queue, SendMail};
323 use mailpot_tests::init_stderr_logging;
324 use tempfile::TempDir;
325
326 @@ -73,7 +73,7 @@ fn test_error_queue() {
327 .unwrap();
328
329 assert_eq!(post_policy.pk(), 1);
330- assert_eq!(db.error_queue().unwrap().len(), 0);
331+ assert_eq!(db.queue(Queue::Error).unwrap().len(), 0);
332
333 // drop privileges
334 let mut db = db.untrusted();
335 @@ -88,5 +88,5 @@ fn test_error_queue() {
336 mailpot::ErrorKind::PostRejected(_reason) => {}
337 other => panic!("Got unexpected error: {}", other),
338 }
339- assert_eq!(db.error_queue().unwrap().len(), 1);
340+ assert_eq!(db.queue(Queue::Error).unwrap().len(), 1);
341 }
342 diff --git a/core/tests/subscription.rs b/core/tests/subscription.rs
343index c3a3f6f..1515af9 100644
344--- a/core/tests/subscription.rs
345+++ b/core/tests/subscription.rs
346 @@ -17,7 +17,7 @@
347 * along with this program. If not, see <https://www.gnu.org/licenses/>.
348 */
349
350- use mailpot::{models::*, Configuration, Connection, SendMail};
351+ use mailpot::{models::*, Configuration, Connection, Queue, SendMail};
352 use mailpot_tests::init_stderr_logging;
353 use tempfile::TempDir;
354
355 @@ -65,7 +65,7 @@ fn test_list_subscription() {
356 .unwrap();
357
358 assert_eq!(post_policy.pk(), 1);
359- assert_eq!(db.error_queue().unwrap().len(), 0);
360+ assert_eq!(db.queue(Queue::Error).unwrap().len(), 0);
361 assert_eq!(db.list_subscriptions(foo_chat.pk()).unwrap().len(), 0);
362
363 let mut db = db.untrusted();
364 @@ -96,7 +96,7 @@ eT48L2h0bWw+
365 mailpot::ErrorKind::PostRejected(_reason) => {}
366 other => panic!("Got unexpected error: {}", other),
367 }
368- assert_eq!(db.error_queue().unwrap().len(), 1);
369+ assert_eq!(db.queue(Queue::Error).unwrap().len(), 1);
370
371 let input_bytes_2 = b"From: Name <user@example.com>
372 To: <foo-chat+subscribe@example.com>
373 @@ -115,11 +115,11 @@ MIME-Version: 1.0
374 db.post(&envelope, input_bytes_2, /* dry_run */ false)
375 .unwrap();
376 assert_eq!(db.list_subscriptions(foo_chat.pk()).unwrap().len(), 1);
377- assert_eq!(db.error_queue().unwrap().len(), 1);
378+ assert_eq!(db.queue(Queue::Error).unwrap().len(), 1);
379 let envelope =
380 melib::Envelope::from_bytes(input_bytes_1, None).expect("Could not parse message");
381 db.post(&envelope, input_bytes_1, /* dry_run */ false)
382 .unwrap();
383- assert_eq!(db.error_queue().unwrap().len(), 1);
384+ assert_eq!(db.queue(Queue::Error).unwrap().len(), 1);
385 assert_eq!(db.list_posts(foo_chat.pk(), None).unwrap().len(), 1);
386 }
387 diff --git a/core/tests/template_replies.rs b/core/tests/template_replies.rs
388index 40c6bc0..8660b87 100644
389--- a/core/tests/template_replies.rs
390+++ b/core/tests/template_replies.rs
391 @@ -65,7 +65,7 @@ fn test_template_replies() {
392 .unwrap();
393
394 assert_eq!(post_policy.pk(), 1);
395- assert_eq!(db.error_queue().unwrap().len(), 0);
396+ assert_eq!(db.queue(Queue::Error).unwrap().len(), 0);
397 assert_eq!(db.list_subscriptions(foo_chat.pk()).unwrap().len(), 0);
398
399 /* create custom subscribe confirm template, and check that it is used in
400 @@ -98,7 +98,7 @@ MIME-Version: 1.0
401 let subenvelope = melib::Envelope::from_bytes(bytes, None).expect("Could not parse message");
402 db.post(&subenvelope, bytes, /* dry_run */ false).unwrap();
403 assert_eq!(db.list_subscriptions(foo_chat.pk()).unwrap().len(), 1);
404- assert_eq!(db.error_queue().unwrap().len(), 0);
405+ assert_eq!(db.queue(Queue::Error).unwrap().len(), 0);
406
407 let out_queue = db.queue(Queue::Out).unwrap();
408 assert_eq!(out_queue.len(), 1);
409 @@ -138,7 +138,7 @@ MIME-Version: 1.0
410 let envelope = melib::Envelope::from_bytes(unbytes, None).expect("Could not parse message");
411 db.post(&envelope, unbytes, /* dry_run */ false).unwrap();
412 assert_eq!(db.list_subscriptions(foo_chat.pk()).unwrap().len(), 0);
413- assert_eq!(db.error_queue().unwrap().len(), 0);
414+ assert_eq!(db.queue(Queue::Error).unwrap().len(), 0);
415
416 let out_queue = db.queue(Queue::Out).unwrap();
417 assert_eq!(out_queue.len(), 2);
418 @@ -155,7 +155,7 @@ MIME-Version: 1.0
419
420 db.post(&subenvelope, bytes, /* dry_run */ false).unwrap();
421 assert_eq!(db.list_subscriptions(foo_chat.pk()).unwrap().len(), 1);
422- assert_eq!(db.error_queue().unwrap().len(), 0);
423+ assert_eq!(db.queue(Queue::Error).unwrap().len(), 0);
424
425 let out_queue = db.queue(Queue::Out).unwrap();
426
427 diff --git a/docs/mpot.1 b/docs/mpot.1
428index fdc434e..5bd2b28 100644
429--- a/docs/mpot.1
430+++ b/docs/mpot.1
431 @@ -649,16 +649,13 @@ List.
432
433 .br
434
435- mpot error\-queue print [\-\-index \fIINDEX\fR] [\-\-json \fIJSON\fR]
436+ mpot error\-queue print [\-\-index \fIINDEX\fR]
437 .br
438
439 Print entry in RFC5322 or JSON format.
440 .TP
441 \-\-index \fIINDEX\fR
442 index of entry.
443- .TP
444- \-\-json
445- JSON format.
446 .ie \n(.g .ds Aq \(aq
447 .el .ds Aq '
448 .\fB