JMAP protocol layer refactoring (part 5)
This commit is contained in:
@@ -6,8 +6,9 @@
|
||||
|
||||
use crate::{JmapMethods, changes::state::StateManager};
|
||||
use common::Server;
|
||||
use jmap_proto::method::query::{
|
||||
Comparator, Filter, QueryRequest, QueryResponse, RequestArguments, SortProperty,
|
||||
use jmap_proto::{
|
||||
method::query::{Comparator, Filter, QueryRequest, QueryResponse},
|
||||
object::sieve::{Sieve, SieveComparator, SieveFilter},
|
||||
};
|
||||
use std::future::Future;
|
||||
use store::query::{self};
|
||||
@@ -19,35 +20,36 @@ use types::{
|
||||
pub trait SieveScriptQuery: Sync + Send {
|
||||
fn sieve_script_query(
|
||||
&self,
|
||||
request: QueryRequest<RequestArguments>,
|
||||
request: QueryRequest<Sieve>,
|
||||
) -> impl Future<Output = trc::Result<QueryResponse>> + Send;
|
||||
}
|
||||
|
||||
impl SieveScriptQuery for Server {
|
||||
async fn sieve_script_query(
|
||||
&self,
|
||||
mut request: QueryRequest<RequestArguments>,
|
||||
mut request: QueryRequest<Sieve>,
|
||||
) -> trc::Result<QueryResponse> {
|
||||
let account_id = request.account_id.document_id();
|
||||
let mut filters = Vec::with_capacity(request.filter.len());
|
||||
|
||||
for cond in std::mem::take(&mut request.filter) {
|
||||
match cond {
|
||||
Filter::Name(name) => {
|
||||
filters.push(query::Filter::contains(SieveField::Name, &name))
|
||||
}
|
||||
Filter::IsActive(is_active) => filters.push(query::Filter::eq(
|
||||
SieveField::IsActive,
|
||||
vec![is_active as u8],
|
||||
)),
|
||||
Filter::Property(cond) => match cond {
|
||||
SieveFilter::Name(name) => {
|
||||
filters.push(query::Filter::contains(SieveField::Name, &name))
|
||||
}
|
||||
SieveFilter::IsActive(is_active) => filters.push(query::Filter::eq(
|
||||
SieveField::IsActive,
|
||||
vec![is_active as u8],
|
||||
)),
|
||||
SieveFilter::_T(other) => {
|
||||
return Err(trc::JmapEvent::UnsupportedFilter.into_err().details(other));
|
||||
}
|
||||
},
|
||||
|
||||
Filter::And | Filter::Or | Filter::Not | Filter::Close => {
|
||||
filters.push(cond.into());
|
||||
}
|
||||
other => {
|
||||
return Err(trc::JmapEvent::UnsupportedFilter
|
||||
.into_err()
|
||||
.details(other.to_string()));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -70,19 +72,17 @@ impl SieveScriptQuery for Server {
|
||||
for comparator in request
|
||||
.sort
|
||||
.and_then(|s| if !s.is_empty() { s.into() } else { None })
|
||||
.unwrap_or_else(|| vec![Comparator::descending(SortProperty::Name)])
|
||||
.unwrap_or_else(|| vec![Comparator::descending(SieveComparator::Name)])
|
||||
{
|
||||
comparators.push(match comparator.property {
|
||||
SortProperty::Name => {
|
||||
SieveComparator::Name => {
|
||||
query::Comparator::field(SieveField::Name, comparator.is_ascending)
|
||||
}
|
||||
SortProperty::IsActive => {
|
||||
SieveComparator::IsActive => {
|
||||
query::Comparator::field(SieveField::IsActive, comparator.is_ascending)
|
||||
}
|
||||
other => {
|
||||
return Err(trc::JmapEvent::UnsupportedSort
|
||||
.into_err()
|
||||
.details(other.to_string()));
|
||||
SieveComparator::_T(other) => {
|
||||
return Err(trc::JmapEvent::UnsupportedSort.into_err().details(other));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user