@@ -85,7 +85,7 @@ async def fetch_emails(
85
85
),
86
86
) -> List [Dict [str , Any ]]:
87
87
"""
88
- Retrieve the first 5 threads of the authenticated account from the Nylas API.
88
+ Retrieve the first 20 threads of the authenticated account from the Nylas API.
89
89
"""
90
90
from src .main import (
91
91
code_app ,
@@ -295,3 +295,42 @@ async def read_contacts(
295
295
296
296
# todo
297
297
return []
298
+
299
+
300
+ @router .get (
301
+ "/nylas/search-emails" ,
302
+ response_model = List [Dict [str , Any ]],
303
+ status_code = 200 ,
304
+ name = "nylas:search-emails" ,
305
+ )
306
+ async def search_emails (
307
+ search : str ,
308
+ current_user : users_schemas .UserObjectSchema = Depends (
309
+ dependencies .get_current_user
310
+ ),
311
+ ) -> List [Dict [str , Any ]]:
312
+ """
313
+ Retrieve the seached emails threads of the authenticated account from the Nylas API.
314
+ """
315
+ from src .main import (
316
+ code_app ,
317
+ )
318
+
319
+ # A workaround to retrieve threads associated with discovered messages because the
320
+ # `messages.search(search, limit=20)` method returns individual messages, not threads.
321
+ # Therefore, we iterate through the threads and select the ones containing message IDs.
322
+ threads = code_app .state .nylas .threads .where (
323
+ limit = 20 , view = "expanded"
324
+ ).all ()
325
+ messages = code_app .state .nylas .messages .search (search , limit = 20 )
326
+ message_ids = set (message ["id" ] for message in messages )
327
+ # Filter threads that contain at least one message from the list of messages
328
+ threads_with_messages = [
329
+ thread
330
+ for thread in threads
331
+ if any (message ["id" ] in message_ids for message in thread ["_messages" ])
332
+ ]
333
+ res_json = [
334
+ item .as_json (enforce_read_only = False ) for item in threads_with_messages
335
+ ]
336
+ return res_json
0 commit comments