Skip to content

Commit 8e922d3

Browse files
mrudulvajpayee4935Mrudul VajpayeeMrudul Vajpayee
authored
feat(core): Add support for cards bin update (#7194)
Co-authored-by: Mrudul Vajpayee <[email protected]> Co-authored-by: Mrudul Vajpayee <[email protected]>
1 parent 6553e29 commit 8e922d3

File tree

12 files changed

+629
-17
lines changed

12 files changed

+629
-17
lines changed

crates/api_models/src/cards_info.rs

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
use std::fmt::Debug;
22

3+
use common_utils::events::ApiEventMetric;
34
use utoipa::ToSchema;
45

6+
use crate::enums;
7+
58
#[derive(serde::Deserialize, ToSchema)]
69
pub struct CardsInfoRequestParams {
710
#[schema(example = "pay_OSERgeV9qAy7tlK7aKpc_secret_TuDUoh11Msxh12sXn3Yp")]
@@ -29,3 +32,97 @@ pub struct CardInfoResponse {
2932
#[schema(example = "INDIA")]
3033
pub card_issuing_country: Option<String>,
3134
}
35+
36+
#[derive(serde::Serialize, Debug, ToSchema)]
37+
pub struct CardInfoMigrateResponseRecord {
38+
pub card_iin: Option<String>,
39+
pub card_issuer: Option<String>,
40+
pub card_network: Option<String>,
41+
pub card_type: Option<String>,
42+
pub card_sub_type: Option<String>,
43+
pub card_issuing_country: Option<String>,
44+
}
45+
46+
#[derive(Debug, serde::Deserialize, serde::Serialize, ToSchema)]
47+
pub struct CardInfoCreateRequest {
48+
pub card_iin: String,
49+
pub card_issuer: Option<String>,
50+
pub card_network: Option<enums::CardNetwork>,
51+
pub card_type: Option<String>,
52+
pub card_subtype: Option<String>,
53+
pub card_issuing_country: Option<String>,
54+
pub bank_code_id: Option<String>,
55+
pub bank_code: Option<String>,
56+
pub country_code: Option<String>,
57+
pub last_updated_provider: Option<String>,
58+
}
59+
60+
impl ApiEventMetric for CardInfoCreateRequest {}
61+
62+
#[derive(Debug, Clone, serde::Deserialize, serde::Serialize, ToSchema)]
63+
pub struct CardInfoUpdateRequest {
64+
pub card_iin: String,
65+
pub card_issuer: Option<String>,
66+
pub card_network: Option<enums::CardNetwork>,
67+
pub card_type: Option<String>,
68+
pub card_subtype: Option<String>,
69+
pub card_issuing_country: Option<String>,
70+
pub bank_code_id: Option<String>,
71+
pub bank_code: Option<String>,
72+
pub country_code: Option<String>,
73+
pub last_updated_provider: Option<String>,
74+
pub line_number: Option<i64>,
75+
}
76+
77+
impl ApiEventMetric for CardInfoUpdateRequest {}
78+
79+
#[derive(Debug, Default, serde::Serialize)]
80+
pub enum CardInfoMigrationStatus {
81+
Success,
82+
#[default]
83+
Failed,
84+
}
85+
#[derive(Debug, Default, serde::Serialize)]
86+
pub struct CardInfoMigrationResponse {
87+
pub line_number: Option<i64>,
88+
pub card_iin: String,
89+
pub card_issuer: Option<String>,
90+
pub card_network: Option<String>,
91+
pub card_type: Option<String>,
92+
pub card_sub_type: Option<String>,
93+
pub card_issuing_country: Option<String>,
94+
#[serde(skip_serializing_if = "Option::is_none")]
95+
pub migration_error: Option<String>,
96+
pub migration_status: CardInfoMigrationStatus,
97+
}
98+
impl ApiEventMetric for CardInfoMigrationResponse {}
99+
100+
type CardInfoMigrationResponseType = (
101+
Result<CardInfoMigrateResponseRecord, String>,
102+
CardInfoUpdateRequest,
103+
);
104+
105+
impl From<CardInfoMigrationResponseType> for CardInfoMigrationResponse {
106+
fn from((response, record): CardInfoMigrationResponseType) -> Self {
107+
match response {
108+
Ok(res) => Self {
109+
card_iin: record.card_iin,
110+
line_number: record.line_number,
111+
card_issuer: res.card_issuer,
112+
card_network: res.card_network,
113+
card_type: res.card_type,
114+
card_sub_type: res.card_sub_type,
115+
card_issuing_country: res.card_issuing_country,
116+
migration_status: CardInfoMigrationStatus::Success,
117+
migration_error: None,
118+
},
119+
Err(e) => Self {
120+
card_iin: record.card_iin,
121+
migration_status: CardInfoMigrationStatus::Failed,
122+
migration_error: Some(e),
123+
line_number: record.line_number,
124+
..Self::default()
125+
},
126+
}
127+
}
128+
}

crates/diesel_models/src/cards_info.rs

Lines changed: 26 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,17 @@
1-
use diesel::{Identifiable, Queryable, Selectable};
1+
use diesel::{AsChangeset, Identifiable, Insertable, Queryable, Selectable};
22
use time::PrimitiveDateTime;
33

44
use crate::{enums as storage_enums, schema::cards_info};
55

66
#[derive(
7-
Clone, Debug, Queryable, Identifiable, Selectable, serde::Deserialize, serde::Serialize,
7+
Clone,
8+
Debug,
9+
Queryable,
10+
Identifiable,
11+
Selectable,
12+
serde::Deserialize,
13+
serde::Serialize,
14+
Insertable,
815
)]
916
#[diesel(table_name = cards_info, primary_key(card_iin), check_for_backend(diesel::pg::Pg))]
1017
pub struct CardInfo {
@@ -21,3 +28,20 @@ pub struct CardInfo {
2128
pub last_updated: Option<PrimitiveDateTime>,
2229
pub last_updated_provider: Option<String>,
2330
}
31+
32+
#[derive(
33+
Clone, Debug, PartialEq, Eq, AsChangeset, router_derive::DebugAsDisplay, serde::Deserialize,
34+
)]
35+
#[diesel(table_name = cards_info)]
36+
pub struct UpdateCardInfo {
37+
pub card_issuer: Option<String>,
38+
pub card_network: Option<storage_enums::CardNetwork>,
39+
pub card_type: Option<String>,
40+
pub card_subtype: Option<String>,
41+
pub card_issuing_country: Option<String>,
42+
pub bank_code_id: Option<String>,
43+
pub bank_code: Option<String>,
44+
pub country_code: Option<String>,
45+
pub last_updated: Option<PrimitiveDateTime>,
46+
pub last_updated_provider: Option<String>,
47+
}
Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
1-
use diesel::associations::HasTable;
1+
use diesel::{associations::HasTable, ExpressionMethods};
2+
use error_stack::report;
23

3-
use crate::{cards_info::CardInfo, query::generics, PgPooledConn, StorageResult};
4+
use crate::{
5+
cards_info::{CardInfo, UpdateCardInfo},
6+
errors,
7+
query::generics,
8+
schema::cards_info::dsl,
9+
PgPooledConn, StorageResult,
10+
};
411

512
impl CardInfo {
613
pub async fn find_by_iin(conn: &PgPooledConn, card_iin: &str) -> StorageResult<Option<Self>> {
@@ -10,4 +17,25 @@ impl CardInfo {
1017
)
1118
.await
1219
}
20+
pub async fn insert(self, conn: &PgPooledConn) -> StorageResult<Self> {
21+
generics::generic_insert(conn, self).await
22+
}
23+
pub async fn update(
24+
conn: &PgPooledConn,
25+
card_iin: String,
26+
data: UpdateCardInfo,
27+
) -> StorageResult<Self> {
28+
generics::generic_update_with_results::<<Self as HasTable>::Table, UpdateCardInfo, _, _>(
29+
conn,
30+
dsl::card_iin.eq(card_iin),
31+
data,
32+
)
33+
.await?
34+
.first()
35+
.cloned()
36+
.ok_or_else(|| {
37+
report!(errors::DatabaseError::NotFound)
38+
.attach_printable("Error while updating card_info entry")
39+
})
40+
}
1341
}

0 commit comments

Comments
 (0)