cat_gateway/db/index/queries/rbac/
get_rbac_registrations.rs

1//! Get RBAC registrations by Catalyst ID.
2
3use std::sync::Arc;
4
5use scylla::{
6    prepared_statement::PreparedStatement, statement::Consistency,
7    transport::iterator::TypedRowStream, DeserializeRow, SerializeRow, Session,
8};
9use tracing::error;
10
11use crate::db::{
12    index::{
13        queries::{PreparedQueries, PreparedSelectQuery},
14        session::CassandraSession,
15    },
16    types::{DbCatalystId, DbSlot, DbTransactionId, DbTxnIndex, DbUuidV4},
17};
18
19/// Get registrations by Catalyst ID query.
20const QUERY: &str = include_str!("../cql/get_rbac_registrations_catalyst_id.cql");
21
22/// Get registrations by Catalyst ID query params.
23#[derive(SerializeRow)]
24pub(crate) struct QueryParams {
25    /// A Catalyst ID.
26    pub catalyst_id: DbCatalystId,
27}
28
29/// Get registrations by Catalyst ID query.
30#[allow(dead_code)]
31#[derive(DeserializeRow)]
32pub(crate) struct Query {
33    /// Registration transaction id.
34    pub txn_id: DbTransactionId,
35    /// A block slot number.
36    pub slot_no: DbSlot,
37    /// A transaction index.
38    pub txn_index: DbTxnIndex,
39    /// A previous  transaction id.
40    pub prv_txn_id: Option<DbTransactionId>,
41    /// A registration purpose.
42    pub purpose: DbUuidV4,
43}
44
45impl Query {
46    /// Prepares a query.
47    pub(crate) async fn prepare(session: Arc<Session>) -> anyhow::Result<PreparedStatement> {
48        PreparedQueries::prepare(session, QUERY, Consistency::All, true)
49            .await
50            .inspect_err(
51                |e| error!(error=%e, "Failed to prepare get RBAC registrations by Catalyst ID query"),
52            )
53    }
54
55    /// Executes a get registrations by Catalyst ID query.
56    pub(crate) async fn execute(
57        session: &CassandraSession, params: QueryParams,
58    ) -> anyhow::Result<TypedRowStream<Query>> {
59        session
60            .execute_iter(PreparedSelectQuery::RbacRegistrationsByCatalystId, params)
61            .await?
62            .rows_stream::<Query>()
63            .map_err(Into::into)
64    }
65}