use super::builders::build_transaction_from_transaction_view;
use crate::{
postgres::{PostgresClient, PostgresError},
relayer::RelayerId,
shared::common_types::{PagingContext, PagingResult},
transaction::types::{Transaction, TransactionId, TransactionStatus},
};
impl PostgresClient {
pub async fn get_transaction(
&self,
id: &TransactionId,
) -> Result<Option<Transaction>, PostgresError> {
let row = self
.query_one_or_none(
"
SELECT *
FROM relayer.transaction
WHERE id = $1;
",
&[id],
)
.await?;
match row {
None => Ok(None),
Some(row) => Ok(Some(build_transaction_from_transaction_view(&row))),
}
}
pub async fn get_transactions_for_relayer(
&self,
id: &RelayerId,
paging_context: &PagingContext,
) -> Result<PagingResult<Transaction>, PostgresError> {
let rows = self
.query(
"
SELECT *
FROM relayer.transaction
WHERE relayer_id = $1
LIMIT $2
OFFSET $3;
",
&[&id, &(paging_context.limit as i64), &(paging_context.offset as i64)],
)
.await?;
let results: Vec<Transaction> =
rows.iter().map(build_transaction_from_transaction_view).collect();
let result_count = results.len();
Ok(PagingResult::new(results, paging_context.next(result_count), paging_context.previous()))
}
pub async fn get_transactions_by_status_for_relayer(
&self,
id: &RelayerId,
status: &TransactionStatus,
paging_context: &PagingContext,
) -> Result<PagingResult<Transaction>, PostgresError> {
let rows = self
.query(
"
SELECT *
FROM relayer.transaction
WHERE relayer_id = $1
AND status = $2
ORDER BY nonce ASC
LIMIT $3
OFFSET $4;
",
&[id, status, &(paging_context.limit as i64), &(paging_context.offset as i64)],
)
.await?;
let results: Vec<Transaction> =
rows.iter().map(build_transaction_from_transaction_view).collect();
let result_count = results.len();
Ok(PagingResult::new(results, paging_context.next(result_count), paging_context.previous()))
}
}