And graphql search with pagination.

This commit is contained in:
2023-11-20 20:56:16 -08:00
parent f52a76dba3
commit a7b172099b
4 changed files with 147 additions and 45 deletions

View File

@@ -1,17 +1,8 @@
#[macro_use]
extern crate rocket;
use std::{error::Error, io::Cursor, str::FromStr};
use std::{
error::Error,
hash::{DefaultHasher, Hash, Hasher},
io::Cursor,
str::FromStr,
};
use async_graphql::{
http::GraphiQLSource, Context, EmptyMutation, EmptySubscription, FieldResult, Object, Schema,
SimpleObject,
};
use async_graphql::{http::GraphiQLSource, EmptyMutation, EmptySubscription, Schema};
use async_graphql_rocket::{GraphQLQuery, GraphQLRequest, GraphQLResponse};
use glog::Flags;
use notmuch::{Notmuch, NotmuchError, ThreadSet};
@@ -23,7 +14,11 @@ use rocket::{
Response, State,
};
use rocket_cors::{AllowedHeaders, AllowedOrigins};
use server::{error::ServerError, nm::threadset_to_messages};
use server::{
error::ServerError,
graphql::{GraphqlSchema, QueryRoot},
nm::threadset_to_messages,
};
use shared::Message;
#[get("/refresh")]
@@ -148,38 +143,6 @@ async fn graphql_request(
request.execute(schema.inner()).await
}
pub struct QueryRoot;
#[derive(SimpleObject)]
struct Tag {
name: String,
fg_color: String,
bg_color: String,
}
#[Object]
impl QueryRoot {
async fn tags<'ctx>(&self, ctx: &Context<'ctx>) -> FieldResult<Vec<Tag>> {
let nm = ctx.data_unchecked::<Notmuch>();
Ok(nm
.tags()?
.into_iter()
.map(|tag| {
let mut hasher = DefaultHasher::new();
tag.hash(&mut hasher);
let hex = format!("#{:06x}", hasher.finish() % (1 << 24));
Tag {
name: tag,
fg_color: "white".to_string(),
bg_color: hex,
}
})
.collect())
}
}
pub type GraphqlSchema = Schema<QueryRoot, EmptyMutation, EmptySubscription>;
#[rocket::main]
async fn main() -> Result<(), Box<dyn Error>> {
glog::new()