From 4dd0fc7e47bdbf239290009455ef5bd46b6b8f7c Mon Sep 17 00:00:00 2001
From: Nagaprasadvr <nagaprasadvr246@gmail.com>
Date: Thu, 21 Nov 2024 17:36:06 +0530
Subject: [PATCH] resolve comments

---
 Cargo.lock                                    |  1 -
 digital_asset_types/Cargo.toml                |  1 -
 digital_asset_types/src/dao/scopes/asset.rs   | 13 +++++-------
 .../src/token_metadata/master_edition.rs      | 17 ++++++++++++---
 .../src/token_metadata/mod.rs                 | 21 ++++++++++++++++++-
 .../src/token_metadata/v1_asset.rs            | 18 +++-------------
 6 files changed, 42 insertions(+), 29 deletions(-)

diff --git a/Cargo.lock b/Cargo.lock
index 6fdf217a4..0638677e8 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1942,7 +1942,6 @@ dependencies = [
  "borsh-derive 0.10.3",
  "bs58 0.4.0",
  "futures",
- "hex",
  "indexmap 1.9.3",
  "jsonpath_lib",
  "log",
diff --git a/digital_asset_types/Cargo.toml b/digital_asset_types/Cargo.toml
index 5eafabe57..53d7bc0d5 100644
--- a/digital_asset_types/Cargo.toml
+++ b/digital_asset_types/Cargo.toml
@@ -30,7 +30,6 @@ thiserror = { workspace = true }
 tokio = { workspace = true, features = ["macros"] }
 url = { workspace = true }
 mpl-token-metadata = { workspace = true }
-hex = { workspace = true }
 
 [features]
 default = ["json_types", "sql_types"]
diff --git a/digital_asset_types/src/dao/scopes/asset.rs b/digital_asset_types/src/dao/scopes/asset.rs
index 203206ac7..5bbbddb01 100644
--- a/digital_asset_types/src/dao/scopes/asset.rs
+++ b/digital_asset_types/src/dao/scopes/asset.rs
@@ -15,6 +15,7 @@ use crate::{
 use indexmap::IndexMap;
 use mpl_token_metadata::accounts::{Edition, MasterEdition};
 use sea_orm::{entity::*, query::*, sea_query::Expr, ConnectionTrait, DbErr, Order};
+use serde::de::DeserializeOwned;
 use serde_json::Value;
 use solana_sdk::pubkey::Pubkey;
 use std::collections::HashMap;
@@ -561,11 +562,7 @@ fn filter_out_stale_creators(creators: &mut Vec<asset_creators::Model>) {
     }
 }
 
-pub fn get_edition_data_from_json(data: Value) -> Result<Edition, DbErr> {
-    serde_json::from_value(data).map_err(|e| DbErr::Custom(e.to_string()))
-}
-
-pub fn get_master_edition_data_from_json(data: Value) -> Result<MasterEdition, DbErr> {
+pub fn get_edition_data_from_json<T: DeserializeOwned>(data: Value) -> Result<T, DbErr> {
     serde_json::from_value(data).map_err(|e| DbErr::Custom(e.to_string()))
 }
 
@@ -587,13 +584,13 @@ pub async fn get_nft_editions(
 
     let limit = limit.unwrap_or(10);
 
-    let master_edition_data = master_edition
+    let master_edition_data: MasterEdition = master_edition
         .data
         .clone()
         .ok_or(DbErr::RecordNotFound(
             "Master Edition data not found".to_string(),
         ))
-        .map(get_master_edition_data_from_json)??;
+        .map(get_edition_data_from_json)??;
 
     let nft_editions = asset_v1_account_attachments::Entity::find()
         .filter(
@@ -612,7 +609,7 @@ pub async fn get_nft_editions(
     let nft_editions = nft_editions
         .iter()
         .map(|e| -> Result<NftEdition, DbErr> {
-            let data = e
+            let data: Edition = e
                 .data
                 .clone()
                 .ok_or(DbErr::RecordNotFound("Edition data not found".to_string()))
diff --git a/program_transformers/src/token_metadata/master_edition.rs b/program_transformers/src/token_metadata/master_edition.rs
index 7dfb2c4df..73eeb1fcc 100644
--- a/program_transformers/src/token_metadata/master_edition.rs
+++ b/program_transformers/src/token_metadata/master_edition.rs
@@ -75,7 +75,7 @@ pub async fn save_master_edition(
         ..Default::default()
     };
 
-    let query = asset_v1_account_attachments::Entity::insert(model)
+    let mut query = asset_v1_account_attachments::Entity::insert(model)
         .on_conflict(
             OnConflict::columns([asset_v1_account_attachments::Column::Id])
                 .update_columns([
@@ -86,6 +86,12 @@ pub async fn save_master_edition(
                 .to_owned(),
         )
         .build(DbBackend::Postgres);
+
+    query.sql = format!(
+        "{} WHERE excluded.slot_updated >= asset_v1_account_attachments.slot_updated",
+        query.sql
+    );
+
     txn.execute(query).await?;
     Ok(())
 }
@@ -109,7 +115,7 @@ pub async fn save_edition(
         ..Default::default()
     };
 
-    let query = asset_v1_account_attachments::Entity::insert(model)
+    let mut query = asset_v1_account_attachments::Entity::insert(model)
         .on_conflict(
             OnConflict::columns([asset_v1_account_attachments::Column::Id])
                 .update_columns([
@@ -120,7 +126,12 @@ pub async fn save_edition(
                 .to_owned(),
         )
         .build(DbBackend::Postgres);
-    txn.execute(query).await?;
 
+    query.sql = format!(
+        "{} WHERE excluded.slot_updated >= asset_v1_account_attachments.slot_updated",
+        query.sql
+    );
+
+    txn.execute(query).await?;
     Ok(())
 }
diff --git a/program_transformers/src/token_metadata/mod.rs b/program_transformers/src/token_metadata/mod.rs
index 00cc89efe..bf0710560 100644
--- a/program_transformers/src/token_metadata/mod.rs
+++ b/program_transformers/src/token_metadata/mod.rs
@@ -7,7 +7,10 @@ use {
         },
         AccountInfo, DownloadMetadataNotifier,
     },
-    blockbuster::programs::token_metadata::{TokenMetadataAccountData, TokenMetadataAccountState},
+    blockbuster::{
+        programs::token_metadata::{TokenMetadataAccountData, TokenMetadataAccountState},
+        token_metadata::types::TokenStandard,
+    },
     master_edition::save_edition,
     sea_orm::{DatabaseConnection, TransactionTrait},
 };
@@ -59,3 +62,19 @@ pub async fn handle_token_metadata_account<'a, 'b>(
         _ => Err(ProgramTransformerError::NotImplemented),
     }
 }
+
+pub trait IsNonFungibeFromTokenStandard {
+    fn is_non_fungible(&self) -> bool;
+}
+
+impl IsNonFungibeFromTokenStandard for TokenStandard {
+    fn is_non_fungible(&self) -> bool {
+        matches!(
+            self,
+            TokenStandard::NonFungible
+                | TokenStandard::NonFungibleEdition
+                | TokenStandard::ProgrammableNonFungible
+                | TokenStandard::ProgrammableNonFungibleEdition
+        )
+    }
+}
diff --git a/program_transformers/src/token_metadata/v1_asset.rs b/program_transformers/src/token_metadata/v1_asset.rs
index 504b701ac..74f00ceb7 100644
--- a/program_transformers/src/token_metadata/v1_asset.rs
+++ b/program_transformers/src/token_metadata/v1_asset.rs
@@ -1,4 +1,5 @@
 use {
+    super::IsNonFungibeFromTokenStandard,
     crate::{
         asset_upserts::{
             upsert_assets_metadata_account_columns, upsert_assets_mint_account_columns,
@@ -144,16 +145,6 @@ async fn index_token_account_data<T: ConnectionTrait + TransactionTrait>(
     Ok(())
 }
 
-const fn check_is_non_fungible_from_token_standard(token_standard: Option<TokenStandard>) -> bool {
-    matches!(
-        token_standard,
-        Some(TokenStandard::NonFungible)
-            | Some(TokenStandard::NonFungibleEdition)
-            | Some(TokenStandard::ProgrammableNonFungible)
-            | Some(TokenStandard::ProgrammableNonFungibleEdition)
-    )
-}
-
 pub async fn save_v1_asset<T: ConnectionTrait + TransactionTrait>(
     conn: &T,
     metadata: &Metadata,
@@ -413,7 +404,7 @@ pub async fn save_v1_asset<T: ConnectionTrait + TransactionTrait>(
     txn.commit().await?;
 
     // If the asset is a non-fungible token, then we need to insert to the asset_v1_account_attachments table
-    if check_is_non_fungible_from_token_standard(metadata.token_standard) {
+    if let Some(true) = metadata.token_standard.map(|t| t.is_non_fungible()) {
         upsert_asset_v1_account_attachments(conn, &mint_pubkey, slot).await?;
     }
 
@@ -446,10 +437,7 @@ async fn upsert_asset_v1_account_attachments<T: ConnectionTrait + TransactionTra
     let query = asset_v1_account_attachments::Entity::insert(attachment)
         .on_conflict(
             OnConflict::columns([asset_v1_account_attachments::Column::Id])
-                .update_columns([
-                    asset_v1_account_attachments::Column::SlotUpdated,
-                    asset_v1_account_attachments::Column::AssetId,
-                ])
+                .update_columns([asset_v1_account_attachments::Column::AssetId])
                 .to_owned(),
         )
         .build(DbBackend::Postgres);