Refactor thread responses into an enum.

Lays ground work for different types of views, i.e. email, news, docs, etc.
This commit is contained in:
2024-08-26 21:48:53 -07:00
parent 446fcfe37f
commit 760cec01a8
10 changed files with 190 additions and 161 deletions

View File

@@ -32,8 +32,13 @@ pub struct ThreadSummary {
pub tags: Vec<String>,
}
#[derive(Debug, Union)]
pub enum Thread {
Email(EmailThread),
}
#[derive(Debug, SimpleObject)]
pub struct Thread {
pub struct EmailThread {
pub thread_id: String,
pub subject: String,
pub messages: Vec<Message>,
@@ -369,11 +374,13 @@ impl QueryRoot {
.field("contentTree")
.exists();
// TODO: look at thread_id and conditionally load newsreader
if newsreader::is_newsreader_thread(&thread_id) {
Ok(newsreader::thread(pool, thread_id).await?)
} else {
Ok(nm::thread(nm, thread_id, debug_content_tree).await?)
}
Ok(Thread::Email(
if newsreader::is_newsreader_thread(&thread_id) {
newsreader::thread(pool, thread_id).await?
} else {
nm::thread(nm, thread_id, debug_content_tree).await?
},
))
}
}

View File

@@ -14,7 +14,7 @@ const THREAD_PREFIX: &'static str = "news:";
use crate::{
compute_offset_limit,
error::ServerError,
graphql::{Body, Email, Html, Message, Tag, Thread, ThreadSummary},
graphql::{Body, Email, EmailThread, Html, Message, Tag, ThreadSummary},
AddOutlink, EscapeHtml, InlineStyle, SanitizeHtml, SlurpContents, StripHtml, Transformer,
};
@@ -143,7 +143,7 @@ pub async fn tags(pool: &PgPool, _needs_unread: bool) -> Result<Vec<Tag>, Server
Ok(tags)
}
pub async fn thread(pool: &PgPool, thread_id: String) -> Result<Thread, ServerError> {
pub async fn thread(pool: &PgPool, thread_id: String) -> Result<EmailThread, ServerError> {
let id = thread_id
.strip_prefix(THREAD_PREFIX)
.expect("news thread doesn't start with '{THREAD_PREFIX}'")
@@ -198,7 +198,6 @@ pub async fn thread(pool: &PgPool, thread_id: String) -> Result<Thread, ServerEr
// * Grafana does <div class="image-wrapp"><img class="lazyload>"<img src="/media/...>"</img></div>
// * Some sites appear to be HTML encoded, unencode them, i.e. imperialviolent
let body_tranformers: Vec<Box<dyn Transformer>> = vec![
// TODO: add a map of urls and selectors
Box::new(SlurpContents {
site_selectors: hashmap![
"hackaday.com".to_string() => vec![
@@ -237,7 +236,7 @@ pub async fn thread(pool: &PgPool, thread_id: String) -> Result<Thread, ServerEr
name: r.name,
addr: addr.map(|a| a.to_string()),
});
Ok(Thread {
Ok(EmailThread {
thread_id,
subject: title.clone(),
messages: vec![Message {

View File

@@ -14,8 +14,8 @@ use crate::{
compute_offset_limit,
error::ServerError,
graphql::{
Attachment, Body, DispositionType, Email, Header, Html, Message, PlainText, Tag, Thread,
ThreadSummary, UnhandledContentType,
Attachment, Body, DispositionType, Email, EmailThread, Header, Html, Message, PlainText,
Tag, ThreadSummary, UnhandledContentType,
},
linkify_html, sanitize_html,
};
@@ -125,7 +125,7 @@ pub async fn thread(
nm: &Notmuch,
thread_id: String,
debug_content_tree: bool,
) -> Result<Thread, ServerError> {
) -> Result<EmailThread, ServerError> {
// TODO(wathiede): normalize all email addresses through an address book with preferred
// display names (that default to the most commonly seen name).
let mut messages = Vec::new();
@@ -246,7 +246,7 @@ pub async fn thread(
.next()
.and_then(|m| m.subject.clone())
.unwrap_or("(NO SUBJECT)".to_string());
Ok(Thread {
Ok(EmailThread {
thread_id,
subject,
messages,