pub mod address; pub mod api_keys; pub mod blocklist_lookup; pub mod business_profile; pub mod capture; pub mod cards_info; pub mod configs; pub mod authentication; pub mod authorization; pub mod blocklist; pub mod blocklist_fingerprint; pub mod callback_mapper; pub mod customers; pub mod dispute; pub mod dynamic_routing_stats; pub mod enums; pub mod ephemeral_key; pub mod errors; pub mod events; pub mod file; #[allow(unused)] pub mod fraud_check; pub mod generic_link; pub mod gsm; pub mod hyperswitch_ai_interaction; pub mod invoice; #[cfg(feature = "kv_store")] pub mod kv; pub mod locker_mock_up; pub mod mandate; pub mod merchant_account; pub mod merchant_connector_account; pub mod merchant_key_store; pub mod organization; pub mod payment_attempt; pub mod payment_intent; pub mod payment_link; pub mod payment_method; pub mod payout_attempt; pub mod payouts; pub mod process_tracker; pub mod query; pub mod refund; pub mod relay; pub mod reverse_lookup; pub mod role; pub mod routing_algorithm; pub mod subscription; pub mod types; pub mod unified_translations; #[cfg(feature = "v2")] pub mod payment_methods_session; #[allow(unused_qualifications)] pub mod schema; #[allow(unused_qualifications)] pub mod schema_v2; pub mod user; pub mod user_authentication_method; pub mod user_key_store; pub mod user_role; use diesel_impl::{DieselArray, OptionalDieselArray}; #[cfg(feature = "v2")] use diesel_impl::{RequiredFromNullable, RequiredFromNullableWithDefault}; pub type StorageResult = error_stack::Result; pub type PgPooledConn = async_bb8_diesel::Connection; pub use self::{ address::*, api_keys::*, callback_mapper::*, cards_info::*, configs::*, customers::*, dispute::*, ephemeral_key::*, events::*, file::*, generic_link::*, hyperswitch_ai_interaction::*, locker_mock_up::*, mandate::*, merchant_account::*, merchant_connector_account::*, payment_attempt::*, payment_intent::*, payment_method::*, payout_attempt::*, payouts::*, process_tracker::*, refund::*, reverse_lookup::*, user_authentication_method::*, }; /// The types and implementations provided by this module are required for the schema generated by /// `diesel_cli` 2.0 to work with the types defined in Rust code. This is because /// [`diesel`][diesel] 2.0 [changed the nullability of array elements][diesel-2.0-array-nullability], /// which causes [`diesel`][diesel] to deserialize arrays as `Vec>`. To prevent declaring /// array elements as `Option`, this module provides types and implementations to deserialize /// arrays as `Vec`, considering only non-null values (`Some(T)`) among the deserialized /// `Option` values. /// /// [diesel-2.0-array-nullability]: https://diesel.rs/guides/migration_guide.html#2-0-0-nullability-of-array-elements #[doc(hidden)] pub(crate) mod diesel_impl { #[cfg(feature = "v2")] use common_utils::{id_type, types}; use diesel::{ deserialize::FromSql, pg::Pg, sql_types::{Array, Nullable}, Queryable, }; #[cfg(feature = "v2")] use crate::enums; pub struct DieselArray(Vec>); impl From> for Vec { fn from(array: DieselArray) -> Self { array.0.into_iter().flatten().collect() } } impl Queryable>, Pg> for DieselArray where T: FromSql, Vec>: FromSql>, Pg>, { type Row = Vec>; fn build(row: Self::Row) -> diesel::deserialize::Result { Ok(Self(row)) } } pub struct OptionalDieselArray(Option>>); impl From> for Option> { fn from(option_array: OptionalDieselArray) -> Self { option_array .0 .map(|array| array.into_iter().flatten().collect()) } } impl Queryable>>, Pg> for OptionalDieselArray where Option>>: FromSql>>, Pg>, { type Row = Option>>; fn build(row: Self::Row) -> diesel::deserialize::Result { Ok(Self(row)) } } #[cfg(feature = "v2")] /// If the DB value is null, this wrapper will return an error when deserializing. /// /// This is useful when you want to ensure that a field is always present, even if the database /// value is NULL. If the database column contains a NULL value, an error will be returned. pub struct RequiredFromNullable(T); #[cfg(feature = "v2")] impl RequiredFromNullable { /// Extracts the inner value from the wrapper pub fn into_inner(self) -> T { self.0 } } #[cfg(feature = "v2")] impl Queryable, DB> for RequiredFromNullable where DB: diesel::backend::Backend, T: Queryable, Option: FromSql, DB>, ST: diesel::sql_types::SingleValue, { type Row = Option; fn build(row: Self::Row) -> diesel::deserialize::Result { match row { Some(inner_row) => { let value = T::build(inner_row)?; Ok(Self(value)) } None => Err("Cannot deserialize NULL value for required field. Check if the database column that should not be NULL contains a NULL value.".into()), } } } #[cfg(feature = "v2")] /// If the DB value is null, this wrapper will provide a default value for the type `T`. /// /// This is useful when you want to ensure that a field is always present, even if the database /// value is NULL. The default value is provided by the `Default` trait implementation of `T`. pub struct RequiredFromNullableWithDefault(T); #[cfg(feature = "v2")] impl RequiredFromNullableWithDefault { /// Extracts the inner value from the wrapper pub fn into_inner(self) -> T { self.0 } } #[cfg(feature = "v2")] impl Queryable, DB> for RequiredFromNullableWithDefault where DB: diesel::backend::Backend, T: Queryable, T: Default, Option: FromSql, DB>, ST: diesel::sql_types::SingleValue, { type Row = Option; fn build(row: Self::Row) -> diesel::deserialize::Result { match row { Some(inner_row) => { let value = T::build(inner_row)?; Ok(Self(value)) } None => Ok(Self(T::default())), } } } #[cfg(feature = "v2")] /// Macro to implement From trait for types wrapped in RequiredFromNullable #[macro_export] macro_rules! impl_from_required_from_nullable { ($($type:ty),* $(,)?) => { $( impl From<$crate::RequiredFromNullable<$type>> for $type { fn from(wrapper: $crate::RequiredFromNullable<$type>) -> Self { wrapper.into_inner() } } )* }; } #[cfg(feature = "v2")] /// Macro to implement From trait for types wrapped in RequiredFromNullableWithDefault #[macro_export] macro_rules! impl_from_required_from_nullable_with_default { ($($type:ty),* $(,)?) => { $( impl From<$crate::RequiredFromNullableWithDefault<$type>> for $type { fn from(wrapper: $crate::RequiredFromNullableWithDefault<$type>) -> Self { wrapper.into_inner() } } )* }; } #[cfg(feature = "v2")] crate::impl_from_required_from_nullable_with_default!(enums::DeleteStatus); #[cfg(feature = "v2")] crate::impl_from_required_from_nullable!( enums::AuthenticationType, types::MinorUnit, enums::PaymentMethod, enums::Currency, id_type::ProfileId, time::PrimitiveDateTime, id_type::RefundReferenceId, ); } pub(crate) mod metrics { use router_env::{counter_metric, global_meter, histogram_metric_f64}; global_meter!(GLOBAL_METER, "ROUTER_API"); counter_metric!(DATABASE_CALLS_COUNT, GLOBAL_METER); histogram_metric_f64!(DATABASE_CALL_TIME, GLOBAL_METER); } #[cfg(feature = "tokenization_v2")] pub mod tokenization;