jmap_client/email_submission/
helpers.rs

1/*
2 * Copyright Stalwart Labs LLC See the COPYING
3 * file at the top-level directory of this distribution.
4 *
5 * Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6 * https://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7 * <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your
8 * option. This file may not be copied, modified, or distributed
9 * except according to those terms.
10 */
11
12use crate::{
13    client::Client,
14    core::{
15        changes::{ChangesRequest, ChangesResponse},
16        get::GetRequest,
17        query::{Comparator, Filter, QueryRequest, QueryResponse},
18        query_changes::{QueryChangesRequest, QueryChangesResponse},
19        request::{Arguments, Request},
20        response::{EmailSubmissionGetResponse, EmailSubmissionSetResponse},
21        set::{SetObject, SetRequest},
22    },
23    Get, Method, Set, URI,
24};
25
26use super::{Address, EmailSubmission, Property, UndoStatus};
27
28impl Client {
29    #[maybe_async::maybe_async]
30    pub async fn email_submission_create(
31        &self,
32        email_id: impl Into<String>,
33        identity_id: impl Into<String>,
34    ) -> crate::Result<EmailSubmission<Get>> {
35        let mut request = self.build();
36        let id = request
37            .set_email_submission()
38            .create()
39            .email_id(email_id)
40            .identity_id(identity_id)
41            .create_id()
42            .unwrap();
43        request
44            .send_single::<EmailSubmissionSetResponse>()
45            .await?
46            .created(&id)
47    }
48
49    #[maybe_async::maybe_async]
50    pub async fn email_submission_create_envelope<S, T, U>(
51        &self,
52        email_id: impl Into<String>,
53        identity_id: impl Into<String>,
54        mail_from: S,
55        rcpt_to: T,
56    ) -> crate::Result<EmailSubmission<Get>>
57    where
58        S: Into<Address>,
59        T: IntoIterator<Item = U>,
60        U: Into<Address>,
61    {
62        let mut request = self.build();
63        let id = request
64            .set_email_submission()
65            .create()
66            .email_id(email_id)
67            .identity_id(identity_id)
68            .envelope(mail_from, rcpt_to)
69            .create_id()
70            .unwrap();
71        request
72            .send_single::<EmailSubmissionSetResponse>()
73            .await?
74            .created(&id)
75    }
76
77    #[maybe_async::maybe_async]
78    pub async fn email_submission_change_status(
79        &self,
80        id: &str,
81        undo_status: UndoStatus,
82    ) -> crate::Result<Option<EmailSubmission>> {
83        let mut request = self.build();
84        request
85            .set_email_submission()
86            .update(id)
87            .undo_status(undo_status);
88        request
89            .send_single::<EmailSubmissionSetResponse>()
90            .await?
91            .updated(id)
92    }
93
94    #[maybe_async::maybe_async]
95    pub async fn email_submission_destroy(&self, id: &str) -> crate::Result<()> {
96        let mut request = self.build();
97        request.set_email_submission().destroy([id]);
98        request
99            .send_single::<EmailSubmissionSetResponse>()
100            .await?
101            .destroyed(id)
102    }
103
104    #[maybe_async::maybe_async]
105    pub async fn email_submission_get(
106        &self,
107        id: &str,
108        properties: Option<Vec<Property>>,
109    ) -> crate::Result<Option<EmailSubmission>> {
110        let mut request = self.build();
111        let get_request = request.get_email_submission().ids([id]);
112        if let Some(properties) = properties {
113            get_request.properties(properties.into_iter());
114        }
115        request
116            .send_single::<EmailSubmissionGetResponse>()
117            .await
118            .map(|mut r| r.take_list().pop())
119    }
120
121    #[maybe_async::maybe_async]
122    pub async fn email_submission_query(
123        &self,
124        filter: Option<impl Into<Filter<super::query::Filter>>>,
125        sort: Option<impl IntoIterator<Item = Comparator<super::query::Comparator>>>,
126    ) -> crate::Result<QueryResponse> {
127        let mut request = self.build();
128        let query_request = request.query_email_submission();
129        if let Some(filter) = filter {
130            query_request.filter(filter);
131        }
132        if let Some(sort) = sort {
133            query_request.sort(sort.into_iter());
134        }
135        request.send_single::<QueryResponse>().await
136    }
137
138    #[maybe_async::maybe_async]
139    pub async fn email_submission_changes(
140        &self,
141        since_state: impl Into<String>,
142        max_changes: usize,
143    ) -> crate::Result<ChangesResponse<EmailSubmission<Get>>> {
144        let mut request = self.build();
145        request
146            .changes_email_submission(since_state)
147            .max_changes(max_changes);
148        request.send_single().await
149    }
150}
151
152impl Request<'_> {
153    pub fn get_email_submission(&mut self) -> &mut GetRequest<EmailSubmission<Set>> {
154        self.add_capability(URI::Submission);
155        self.add_method_call(
156            Method::GetEmailSubmission,
157            Arguments::email_submission_get(self.params(Method::GetEmailSubmission)),
158        )
159        .email_submission_get_mut()
160    }
161
162    #[maybe_async::maybe_async]
163    pub async fn send_get_email_submission(self) -> crate::Result<EmailSubmissionGetResponse> {
164        self.send_single().await
165    }
166
167    pub fn changes_email_submission(
168        &mut self,
169        since_state: impl Into<String>,
170    ) -> &mut ChangesRequest {
171        self.add_capability(URI::Submission);
172        self.add_method_call(
173            Method::ChangesEmailSubmission,
174            Arguments::changes(
175                self.params(Method::ChangesEmailSubmission),
176                since_state.into(),
177            ),
178        )
179        .changes_mut()
180    }
181
182    #[maybe_async::maybe_async]
183    pub async fn send_changes_email_submission(
184        self,
185    ) -> crate::Result<ChangesResponse<EmailSubmission<Get>>> {
186        self.send_single().await
187    }
188
189    pub fn query_email_submission(&mut self) -> &mut QueryRequest<EmailSubmission<Set>> {
190        self.add_capability(URI::Submission);
191        self.add_method_call(
192            Method::QueryEmailSubmission,
193            Arguments::email_submission_query(self.params(Method::QueryEmailSubmission)),
194        )
195        .email_submission_query_mut()
196    }
197
198    #[maybe_async::maybe_async]
199    pub async fn send_query_email_submission(self) -> crate::Result<QueryResponse> {
200        self.send_single().await
201    }
202
203    pub fn query_email_submission_changes(
204        &mut self,
205        since_query_state: impl Into<String>,
206    ) -> &mut QueryChangesRequest<EmailSubmission<Set>> {
207        self.add_capability(URI::Submission);
208        self.add_method_call(
209            Method::QueryChangesEmailSubmission,
210            Arguments::email_submission_query_changes(
211                self.params(Method::QueryChangesEmailSubmission),
212                since_query_state.into(),
213            ),
214        )
215        .email_submission_query_changes_mut()
216    }
217
218    #[maybe_async::maybe_async]
219    pub async fn send_query_email_submission_changes(self) -> crate::Result<QueryChangesResponse> {
220        self.send_single().await
221    }
222
223    pub fn set_email_submission(&mut self) -> &mut SetRequest<EmailSubmission<Set>> {
224        self.add_capability(URI::Submission);
225        self.add_method_call(
226            Method::SetEmailSubmission,
227            Arguments::email_submission_set(self.params(Method::SetEmailSubmission)),
228        )
229        .email_submission_set_mut()
230    }
231
232    #[maybe_async::maybe_async]
233    pub async fn send_set_email_submission(self) -> crate::Result<EmailSubmissionSetResponse> {
234        self.send_single().await
235    }
236}