email2db: stub CLI

This commit is contained in:
2024-12-19 18:35:46 -08:00
parent 760f90762d
commit 5ddb4452ff
4 changed files with 79 additions and 169 deletions

View File

@@ -1,6 +1,5 @@
use chrono::NaiveDateTime;
use clap::Parser;
use mailparse::{addrparse_header, dateparse, parse_mail, MailHeaderMap, ParsedMail};
use server::mail::read_mail_to_db;
use sqlx::postgres::PgPool;
@@ -16,99 +15,9 @@ struct Args {
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let _guard = xtracing::init(env!("CARGO_BIN_NAME"))?;
let args = Args::parse();
let pool = PgPool::connect(&args.db_url).await?;
let mut buffer = Vec::new();
read_mail_to_db(&pool, &args.path)?;
read_mail_to_db(&pool, &args.path).await?;
Ok(())
}
async fn add_post(
pool: &PgPool,
site: &str,
title: &str,
summary: &str,
link: &str,
date: i64,
uid: &str,
feed_url: &str,
) -> Result<(), MailError> {
todo!("add_post")
/*
// site | text
// title | text
// summary | text
// link | text
// date | timestamp without time zone
// is_read | boolean
// uid | text
// clean_site | text
// clean_title | text
// clean_summary | text
// clean_summary_text | text
// feed_url | text
let date = NaiveDateTime::from_timestamp_millis(date * 1000);
sqlx::query!(
r#"
INSERT INTO post (
site,
title,
summary,
link,
date,
is_read,
uid,
clean_title,
clean_summary,
clean_summary_text,
feed_url
)
VALUES ( $1, $2, $3, $4, $5, false, $6, $2, $3, '', $7 )
"#,
site,
title,
summary,
link,
date,
uid,
feed_url
)
.execute(pool)
.await?;
Ok(())
*/
}
async fn find_feed(pool: &PgPool, name: &str, slug: &str, url: &str) -> Result<i32, MailError> {
match sqlx::query!(
r#"
SELECT id
FROM feed
WHERE slug = $1
"#,
slug
)
.fetch_one(pool)
.await
{
Err(sqlx::Error::RowNotFound) => {
let rec = sqlx::query!(
r#"
INSERT INTO feed ( name, slug, url, homepage, selector )
VALUES ( $1, $2, $3, '', '' )
RETURNING id
"#,
name,
slug,
url
)
.fetch_one(pool)
.await?;
return Ok(rec.id);
}
Ok(rec) => return Ok(rec.id),
Err(e) => return Err(e.into()),
};
}

View File

@@ -5,6 +5,7 @@ use mailparse::{
};
use sqlx::postgres::PgPool;
use thiserror::Error;
use tracing::info;
#[derive(Error, Debug)]
pub enum MailError {
@@ -64,7 +65,7 @@ pub async fn read_mail_to_db(pool: &PgPool, path: &str) -> Result<(), MailError>
if let Some(m) = first_html(&m) {
let body = m.get_body()?;
add_post(&pool, &slug, &subject, &body, &message_id, date, &uid, &url).await?;
info!("add email {slug} {subject} {message_id} {date} {uid} {url}");
} else {
return Err(MailError::MissingHtmlPart.into());
}
@@ -79,3 +80,35 @@ fn first_html<'m>(m: &'m ParsedMail<'m>) -> Option<&'m ParsedMail<'m>> {
}
None
}
async fn find_feed(pool: &PgPool, name: &str, slug: &str, url: &str) -> Result<i32, MailError> {
match sqlx::query!(
r#"
SELECT id
FROM feed
WHERE slug = $1
"#,
slug
)
.fetch_one(pool)
.await
{
Err(sqlx::Error::RowNotFound) => {
let rec = sqlx::query!(
r#"
INSERT INTO feed ( name, slug, url, homepage, selector )
VALUES ( $1, $2, $3, '', '' )
RETURNING id
"#,
name,
slug,
url
)
.fetch_one(pool)
.await?;
return Ok(rec.id);
}
Ok(rec) => return Ok(rec.id),
Err(e) => return Err(e.into()),
};
}