Skip to content

Commit 9ba114f

Browse files
authored
Merge pull request #97 from tofubert/feature/fetch_all_history
allow for the full history of all chats to be fetched
2 parents 93a48dc + 1e9914d commit 9ba114f

File tree

4 files changed

+195
-41
lines changed

4 files changed

+195
-41
lines changed

src/backend/nc_request/nc_requester.rs

Lines changed: 167 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use tokio_util::sync::CancellationToken;
88
use crate::config::Config;
99
use async_trait::async_trait;
1010

11-
use std::{error::Error, fmt};
11+
use std::{error::Error, fmt, io::ErrorKind};
1212
use std::{fmt::Debug, sync::Arc};
1313

1414
#[cfg(test)]
@@ -106,49 +106,35 @@ impl NCRequest {
106106
log::trace!("got a new API Request {req}");
107107
match req {
108108
ApiRequests::FetchChatInitial(token, maxMessage, response) => {
109-
response
110-
.send(Ok(worker
111-
.fetch_chat_initial(&token, maxMessage)
112-
.await
113-
.unwrap()))
114-
.expect("could not Send.");
109+
NCRequest::handle_fetch_chat_initial(worker, token, maxMessage, response).await;
115110
}
116111
ApiRequests::FetchChatUpdate(token, maxMessage, last_message, response) => {
117-
response
118-
.send(Ok(worker
119-
.fetch_chat_update(&token, maxMessage, last_message)
120-
.await
121-
.unwrap()))
122-
.expect("could not Send.");
112+
NCRequest::handle_fetch_chat_update(
113+
worker,
114+
token,
115+
maxMessage,
116+
last_message,
117+
response,
118+
)
119+
.await;
123120
}
124121
ApiRequests::FetchRoomsInitial(response) => {
125-
response
126-
.send(Ok(worker.fetch_rooms_initial().await.unwrap()))
127-
.expect("could not Send.");
122+
NCRequest::handle_fetch_rooms_initial(worker, response).await;
128123
}
129124
ApiRequests::FetchRoomsUpdate(last_timestamp, response) => {
130-
response
131-
.send(Ok(worker.fetch_rooms_update(last_timestamp).await.unwrap()))
132-
.expect("could not Send.");
125+
NCRequest::handle_fetch_rooms_update(worker, last_timestamp, response).await;
133126
}
134127
ApiRequests::SendMessage(token, message, response) => {
135-
response
136-
.send(Ok(worker.send_message(message, &token).await.unwrap()))
137-
.expect("could not Send.");
128+
NCRequest::handle_send_message(worker, token, message, response).await;
138129
}
139130
ApiRequests::FetchAutocompleteUsers(name, response) => {
140-
response
141-
.send(Ok(worker.fetch_autocomplete_users(&name).await.unwrap()))
142-
.expect("could not Send.");
131+
NCRequest::handle_autocomplete_users(worker, name, response).await;
143132
}
144133
ApiRequests::FetchParticipants(token, response) => {
145-
response
146-
.send(Ok(worker.fetch_participants(&token).await.unwrap()))
147-
.expect("could not Send.");
134+
NCRequest::handle_fetch_participants(worker, token, response).await;
148135
}
149136
ApiRequests::MarkChatRead(token, last_message, response) => {
150-
worker.mark_chat_read(&token, last_message).await.unwrap();
151-
response.send(Ok(())).expect("could not Send.");
137+
NCRequest::handle_mark_read(worker, token, last_message, response).await;
152138
}
153139
ApiRequests::None => {
154140
log::warn!("Unknown Request");
@@ -225,6 +211,157 @@ impl NCRequest {
225211
cancel_token,
226212
}
227213
}
214+
async fn handle_fetch_chat_initial(
215+
worker: &NCRequestWorker,
216+
token: String,
217+
maxMessage: i32,
218+
response: ApiResponseChannel<Vec<NCReqDataMessage>>,
219+
) {
220+
let req_response = worker.fetch_chat_initial(&token, maxMessage).await;
221+
if let Ok(data_content) = req_response {
222+
response.send(Ok(data_content)).expect("could not Send.");
223+
} else {
224+
log::error!("Failed to fetch initial chat {req_response:?}");
225+
response
226+
.send(Err(Arc::new(std::io::Error::new(
227+
ErrorKind::NetworkDown,
228+
format!("Got a Request Rejected! {req_response:?}"),
229+
))))
230+
.expect("could not Send.");
231+
}
232+
}
233+
async fn handle_fetch_chat_update(
234+
worker: &NCRequestWorker,
235+
token: String,
236+
maxMessage: i32,
237+
last_message: i32,
238+
response: ApiResponseChannel<Vec<NCReqDataMessage>>,
239+
) {
240+
let data = worker
241+
.fetch_chat_update(&token, maxMessage, last_message)
242+
.await;
243+
244+
if let Ok(data_content) = data {
245+
response.send(Ok(data_content)).expect("could not Send.");
246+
} else {
247+
log::error!("Failed to fetch chat update {data:?}");
248+
response
249+
.send(Err(Arc::new(std::io::Error::new(
250+
ErrorKind::NetworkDown,
251+
format!("Got a Request Rejected! {data:?}"),
252+
))))
253+
.expect("could not Send.");
254+
}
255+
}
256+
async fn handle_fetch_rooms_initial(
257+
worker: &NCRequestWorker,
258+
response: ApiResponseChannel<(Vec<NCReqDataRoom>, i64)>,
259+
) {
260+
let req_response = worker.fetch_rooms_initial().await;
261+
if let Ok(data_content) = req_response {
262+
response.send(Ok(data_content)).expect("could not Send.");
263+
} else {
264+
log::error!("Failed to fetch initial rooms {req_response:?}");
265+
response
266+
.send(Err(Arc::new(std::io::Error::new(
267+
ErrorKind::NetworkDown,
268+
format!("Got a Request Rejected! {req_response:?}"),
269+
))))
270+
.expect("could not Send.");
271+
}
272+
}
273+
async fn handle_fetch_rooms_update(
274+
worker: &NCRequestWorker,
275+
last_timestamp: i64,
276+
response: ApiResponseChannel<(Vec<NCReqDataRoom>, i64)>,
277+
) {
278+
let req_response = worker.fetch_rooms_update(last_timestamp).await;
279+
if let Ok(data_content) = req_response {
280+
response.send(Ok(data_content)).expect("could not Send.");
281+
} else {
282+
log::error!("Failed to fetch update rooms {req_response:?}");
283+
response
284+
.send(Err(Arc::new(std::io::Error::new(
285+
ErrorKind::NetworkDown,
286+
format!("Got a Request Rejected! {req_response:?}"),
287+
))))
288+
.expect("could not Send.");
289+
}
290+
}
291+
async fn handle_send_message(
292+
worker: &NCRequestWorker,
293+
token: String,
294+
message: String,
295+
response: ApiResponseChannel<NCReqDataMessage>,
296+
) {
297+
let req_response = worker.send_message(message, &token).await;
298+
if let Ok(data_content) = req_response {
299+
response.send(Ok(data_content)).expect("could not Send.");
300+
} else {
301+
log::error!("Failed to send message {req_response:?}");
302+
response
303+
.send(Err(Arc::new(std::io::Error::new(
304+
ErrorKind::NetworkDown,
305+
format!("Got a Request Rejected! {req_response:?}"),
306+
))))
307+
.expect("could not Send.");
308+
}
309+
}
310+
async fn handle_autocomplete_users(
311+
worker: &NCRequestWorker,
312+
name: String,
313+
response: ApiResponseChannel<Vec<NCReqDataUser>>,
314+
) {
315+
let req_response = worker.fetch_autocomplete_users(&name).await;
316+
if let Ok(data_content) = req_response {
317+
response.send(Ok(data_content)).expect("could not Send.");
318+
} else {
319+
log::error!("Failed to fetch autocomplete users {req_response:?}");
320+
response
321+
.send(Err(Arc::new(std::io::Error::new(
322+
ErrorKind::NetworkDown,
323+
format!("Got a Request Rejected! {req_response:?}"),
324+
))))
325+
.expect("could not Send.");
326+
}
327+
}
328+
async fn handle_fetch_participants(
329+
worker: &NCRequestWorker,
330+
token: String,
331+
response: ApiResponseChannel<Vec<NCReqDataParticipants>>,
332+
) {
333+
let req_response = worker.fetch_participants(&token).await;
334+
if let Ok(data_content) = req_response {
335+
response.send(Ok(data_content)).expect("could not Send.");
336+
} else {
337+
log::error!("Failed to fetch participants {req_response:?}");
338+
response
339+
.send(Err(Arc::new(std::io::Error::new(
340+
ErrorKind::NetworkDown,
341+
format!("Got a Request Rejected! {req_response:?}"),
342+
))))
343+
.expect("could not Send.");
344+
}
345+
}
346+
async fn handle_mark_read(
347+
worker: &NCRequestWorker,
348+
token: String,
349+
last_message: i32,
350+
response: ApiResponseChannel<()>,
351+
) {
352+
let req_response = worker.mark_chat_read(&token, last_message).await;
353+
if let Ok(data_content) = req_response {
354+
response.send(Ok(data_content)).expect("could not Send.");
355+
} else {
356+
log::error!("Failed to mark room as read {req_response:?}");
357+
response
358+
.send(Err(Arc::new(std::io::Error::new(
359+
ErrorKind::NetworkDown,
360+
format!("Got a Request Rejected! {req_response:?}"),
361+
))))
362+
.expect("could not Send.");
363+
}
364+
}
228365
}
229366

230367
#[async_trait]

src/backend/nc_room.rs

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -212,18 +212,18 @@ impl NCRoom {
212212
.await
213213
.unwrap()
214214
};
215-
let response = response_onceshot
216-
.await
217-
.expect("Failed for fetch chat update")
218-
.expect("Failed request");
219-
if response.is_empty() {
220-
log::debug!("No Messages found aborting {fetch_key}");
221-
break;
222-
}
223-
fetch_key = response.last().expect("No Messages fetched").id;
215+
if let Ok(Ok(response)) = response_onceshot.await {
216+
if response.is_empty() {
217+
log::debug!("No Messages found aborting {fetch_key}");
218+
break;
219+
}
220+
fetch_key = response.last().expect("No Messages fetched").id;
224221

225-
for message in response {
226-
messages.insert(message.id, message.into());
222+
for message in response {
223+
messages.insert(message.id, message.into());
224+
}
225+
} else {
226+
break;
227227
}
228228
}
229229
messages

src/backend/nc_talk.rs

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ pub trait NCBackend: Debug + Send {
7878
async fn mark_all_rooms_as_read(&self) -> Result<(), Box<dyn std::error::Error>>;
7979
/// Fetch a rooms full history.
8080
async fn fetch_room_history(&mut self, token: &Token) -> Result<(), Box<dyn Error>>;
81+
/// Fetch all rooms full history.
82+
async fn fetch_all_rooms_history(&mut self) -> Result<(), Box<dyn Error>>;
8183
/// trigger for all threads to be killed.
8284
async fn shutdown(&self) -> Result<(), Box<dyn std::error::Error>>;
8385
}
@@ -510,6 +512,14 @@ impl<Requester: NCRequestInterface + 'static + std::marker::Sync> NCBackend for
510512
.fill_history(Arc::clone(&self.requester))
511513
.await
512514
}
515+
516+
async fn fetch_all_rooms_history(&mut self) -> Result<(), Box<dyn Error>> {
517+
for room in self.rooms.values_mut() {
518+
room.fill_history(Arc::clone(&self.requester)).await?;
519+
}
520+
Ok(())
521+
}
522+
513523
async fn shutdown(&self) -> Result<(), Box<dyn std::error::Error>> {
514524
self.requester.lock().await.shutdown().await
515525
}
@@ -542,6 +552,7 @@ mock! {
542552
async fn mark_current_room_as_read(&self, token: &Token) -> Result<(), Box<dyn std::error::Error>>;
543553
async fn mark_all_rooms_as_read(&self) -> Result<(), Box<dyn std::error::Error>>;
544554
async fn fetch_room_history(&mut self, token: &Token) -> Result<(), Box<dyn Error>>;
555+
async fn fetch_all_rooms_history(&mut self) -> Result<(), Box<dyn Error>>;
545556
async fn shutdown(&self) -> Result<(), Box<dyn std::error::Error>>;
546557
}
547558
}

src/ui/app.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -285,6 +285,11 @@ impl<Backend: NCBackend> App<'_, Backend> {
285285
Ok(())
286286
}
287287

288+
pub async fn fetch_all_rooms_history(&mut self) -> Result<(), Box<dyn std::error::Error>> {
289+
self.backend.fetch_all_rooms_history().await?;
290+
Ok(())
291+
}
292+
288293
pub fn new_input_key(&mut self, key: Input) {
289294
self.input.input(key);
290295
}
@@ -514,6 +519,7 @@ impl<Backend: NCBackend> App<'_, Backend> {
514519
KeyCode::Char('?') => self.popup = Some(Popup::Help),
515520
KeyCode::Char('u') => self.toggle_user_sidebar(),
516521
KeyCode::Char('f') => self.fetch_current_room_history().await?,
522+
KeyCode::Char('F') => self.fetch_all_rooms_history().await?,
517523
_ => (),
518524
}
519525
Ok(())

0 commit comments

Comments
 (0)