add offset support

This commit is contained in:
boring_nick 2023-06-28 08:54:12 +03:00
parent c7be67cc71
commit 4098036d31
3 changed files with 30 additions and 3 deletions

View File

@ -23,9 +23,12 @@ pub async fn read_channel(
channel_id: &str,
log_date: ChannelLogDate,
reverse: bool,
limit: Option<u64>,
offset: Option<u64>,
) -> Result<LogsStream> {
let suffix = if reverse { "DESC" } else { "ASC" };
let query = format!("SELECT raw FROM message WHERE channel_id = ? AND toStartOfDay(timestamp) = ? ORDER BY timestamp {suffix}");
let mut query = format!("SELECT raw FROM message WHERE channel_id = ? AND toStartOfDay(timestamp) = ? ORDER BY timestamp {suffix}");
apply_limit_offset(&mut query, limit, offset);
let cursor = db
.query(&query)
@ -41,9 +44,12 @@ pub async fn read_user(
user_id: &str,
log_date: UserLogDate,
reverse: bool,
limit: Option<u64>,
offset: Option<u64>,
) -> Result<LogsStream> {
let suffix = if reverse { "DESC" } else { "ASC" };
let query = format!("SELECT raw FROM message WHERE channel_id = ? AND user_id = ? AND toStartOfMonth(timestamp) = ? ORDER BY timestamp {suffix}");
let mut query = format!("SELECT raw FROM message WHERE channel_id = ? AND user_id = ? AND toStartOfMonth(timestamp) = ? ORDER BY timestamp {suffix}");
apply_limit_offset(&mut query, limit, offset);
let cursor = db
.query(&query)
@ -188,3 +194,12 @@ pub async fn delete_user_logs(db: &Client, user_id: &str) -> Result<()> {
.await?;
Ok(())
}
fn apply_limit_offset(query: &mut String, limit: Option<u64>, offset: Option<u64>) {
if let Some(limit) = limit {
*query = format!("{query} LIMIT {limit}");
}
if let Some(offset) = offset {
*query = format!("{query} OFFSET {offset}");
}
}

View File

@ -72,7 +72,15 @@ pub async fn get_channel_logs(
let log_date = ChannelLogDate::try_from(channel_log_params.date)?;
debug!("Querying logs for date {log_date:?}");
let stream = read_channel(&app.db, &channel_id, log_date, logs_params.reverse).await?;
let stream = read_channel(
&app.db,
&channel_id,
log_date,
logs_params.reverse,
logs_params.limit,
logs_params.offset,
)
.await?;
let logs = LogsResponse {
response_type: logs_params.response_type(),
@ -143,6 +151,8 @@ async fn get_user_logs(
&user_id,
log_date,
logs_params.reverse,
logs_params.limit,
logs_params.offset,
)
.await?;

View File

@ -89,6 +89,8 @@ pub struct LogsParams {
pub reverse: bool,
#[serde(default, deserialize_with = "deserialize_bool_param")]
pub ndjson: bool,
pub limit: Option<u64>,
pub offset: Option<u64>,
}
impl LogsParams {