Add json export
This commit is contained in:
parent
ed181a6518
commit
186ca5ea5a
4 changed files with 139 additions and 4 deletions
|
|
@ -8,7 +8,7 @@ use rusqlite::{named_params, params, Connection, OptionalExtension, ToSql, Trans
|
|||
use time::OffsetDateTime;
|
||||
use tokio::sync::oneshot;
|
||||
|
||||
use crate::euph::api::{Message, Snowflake, Time, UserId};
|
||||
use crate::euph::api::{Message, SessionView, Snowflake, Time, UserId};
|
||||
use crate::euph::SmallMessage;
|
||||
use crate::store::{MsgStore, Path, Tree};
|
||||
|
||||
|
|
@ -139,6 +139,19 @@ impl EuphVault {
|
|||
let _ = self.vault.tx.send(request.into());
|
||||
rx.await.unwrap()
|
||||
}
|
||||
|
||||
pub async fn chunk_at_offset(&self, amount: usize, offset: usize) -> Vec<Message> {
|
||||
// TODO vault::Error
|
||||
let (tx, rx) = oneshot::channel();
|
||||
let request = EuphRequest::GetChunkAtOffset {
|
||||
room: self.room.clone(),
|
||||
amount,
|
||||
offset,
|
||||
result: tx,
|
||||
};
|
||||
let _ = self.vault.tx.send(request.into());
|
||||
rx.await.unwrap()
|
||||
}
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
|
|
@ -457,6 +470,12 @@ pub(super) enum EuphRequest {
|
|||
id: Snowflake,
|
||||
seen: bool,
|
||||
},
|
||||
GetChunkAtOffset {
|
||||
room: String,
|
||||
amount: usize,
|
||||
offset: usize,
|
||||
result: oneshot::Sender<Vec<Message>>,
|
||||
},
|
||||
}
|
||||
|
||||
impl EuphRequest {
|
||||
|
|
@ -525,6 +544,12 @@ impl EuphRequest {
|
|||
EuphRequest::SetOlderSeen { room, id, seen } => {
|
||||
Self::set_older_seen(conn, room, id, seen)
|
||||
}
|
||||
EuphRequest::GetChunkAtOffset {
|
||||
room,
|
||||
amount,
|
||||
offset,
|
||||
result,
|
||||
} => Self::get_chunk_at_offset(conn, room, amount, offset, result),
|
||||
};
|
||||
if let Err(e) = result {
|
||||
// If an error occurs here, the rest of the UI will likely panic and
|
||||
|
|
@ -1235,4 +1260,54 @@ impl EuphRequest {
|
|||
)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
fn get_chunk_at_offset(
|
||||
conn: &Connection,
|
||||
room: String,
|
||||
amount: usize,
|
||||
offset: usize,
|
||||
result: oneshot::Sender<Vec<Message>>,
|
||||
) -> rusqlite::Result<()> {
|
||||
let mut query = conn.prepare(
|
||||
"
|
||||
SELECT
|
||||
id, parent, previous_edit_id, time, content, encryption_key_id, edited, deleted, truncated,
|
||||
user_id, name, server_id, server_era, session_id, is_staff, is_manager, client_address, real_client_address
|
||||
FROM euph_msgs
|
||||
WHERE room = ?
|
||||
ORDER BY id ASC
|
||||
LIMIT ?
|
||||
OFFSET ?
|
||||
",
|
||||
)?;
|
||||
|
||||
let messages = query
|
||||
.query_map(params![room, amount, offset], |row| {
|
||||
Ok(Message {
|
||||
id: row.get(0)?,
|
||||
parent: row.get(1)?,
|
||||
previous_edit_id: row.get(2)?,
|
||||
time: row.get(3)?,
|
||||
content: row.get(4)?,
|
||||
encryption_key_id: row.get(5)?,
|
||||
edited: row.get(6)?,
|
||||
deleted: row.get(7)?,
|
||||
truncated: row.get(8)?,
|
||||
sender: SessionView {
|
||||
id: UserId(row.get(9)?),
|
||||
name: row.get(10)?,
|
||||
server_id: row.get(11)?,
|
||||
server_era: row.get(12)?,
|
||||
session_id: row.get(13)?,
|
||||
is_staff: row.get(14)?,
|
||||
is_manager: row.get(15)?,
|
||||
client_address: row.get(16)?,
|
||||
real_client_address: row.get(17)?,
|
||||
},
|
||||
})
|
||||
})?
|
||||
.collect::<rusqlite::Result<_>>()?;
|
||||
let _ = result.send(messages);
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue