Skip to content

Commit 3c2d693

Browse files
committed
fix; static
1 parent ebbb975 commit 3c2d693

File tree

1 file changed

+61
-21
lines changed

1 file changed

+61
-21
lines changed

crates/server/src/handlers/static.rs

Lines changed: 61 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -381,19 +381,30 @@ impl StaticHandler {
381381
&self,
382382
contract_address: &str,
383383
) -> Result<(serde_json::Value, String)> {
384-
// Find the first token with this contract address
384+
// Find tokens with this contract address that have non-empty metadata
385385
let pattern = format!("{}:%", contract_address);
386-
let query_str = format!("SELECT metadata, id FROM {TOKENS_TABLE} WHERE id LIKE ? LIMIT 1");
387-
let query_result = sqlx::query_as::<_, (String, String)>(&query_str)
386+
let query_str = format!(
387+
"SELECT metadata, id FROM {TOKENS_TABLE} WHERE id LIKE ? AND metadata != '' ORDER BY id LIMIT 100"
388+
);
389+
let query_results = sqlx::query_as::<_, (String, String)>(&query_str)
388390
.bind(&pattern)
389-
.fetch_one(&self.pool)
391+
.fetch_all(&self.pool)
390392
.await
391393
.context("Failed to find any tokens for contract address")?;
392394

393-
let metadata: serde_json::Value =
394-
serde_json::from_str(&query_result.0).context("Failed to parse token metadata")?;
395+
// Try to find a token with valid metadata that contains an image field
396+
for (metadata_str, token_id) in query_results {
397+
if let Ok(metadata) = serde_json::from_str::<serde_json::Value>(&metadata_str) {
398+
if metadata.get("image").is_some() {
399+
return Ok((metadata, token_id));
400+
}
401+
}
402+
}
395403

396-
Ok((metadata, query_result.1))
404+
Err(anyhow::anyhow!(
405+
"No tokens found with valid image metadata for contract address: {}",
406+
contract_address
407+
))
397408
}
398409

399410
async fn check_if_image_outdated(
@@ -537,21 +548,50 @@ impl StaticHandler {
537548
// Try to get metadata and image_uri, with fallback for contracts
538549
let metadata = match query_result {
539550
Ok(result) => {
540-
let metadata: serde_json::Value =
541-
serde_json::from_str(&result.0).context("Failed to parse metadata")?;
542-
543-
// Check if image field exists
544-
if metadata.get("image").is_some() {
545-
metadata
546-
} else if is_contract {
547-
// Fallback: try to find first token with this contract address
548-
debug!(target: LOG_TARGET, contract_address = %token_id, "No image found in contract metadata, searching for first token");
549-
let (fallback_metadata, fallback_token_id) =
550-
self.get_first_token_metadata(token_id).await?;
551-
debug!(target: LOG_TARGET, contract_address = %token_id, fallback_token = %fallback_token_id, "Using fallback token image");
552-
fallback_metadata
551+
// Check if metadata is empty or whitespace-only
552+
let metadata_str = result.0.trim();
553+
if metadata_str.is_empty() {
554+
if is_contract {
555+
// Fallback: try to find first token with this contract address
556+
debug!(target: LOG_TARGET, contract_address = %token_id, "Empty metadata for contract, searching for first token");
557+
let (fallback_metadata, fallback_token_id) =
558+
self.get_first_token_metadata(token_id).await?;
559+
debug!(target: LOG_TARGET, contract_address = %token_id, fallback_token = %fallback_token_id, "Using fallback token image");
560+
fallback_metadata
561+
} else {
562+
return Err(anyhow::anyhow!("Empty metadata for token"));
563+
}
553564
} else {
554-
return Err(anyhow::anyhow!("Image URL not found in metadata"));
565+
// Try to parse the metadata
566+
match serde_json::from_str::<serde_json::Value>(metadata_str) {
567+
Ok(metadata) => {
568+
// Check if image field exists
569+
if metadata.get("image").is_some() {
570+
metadata
571+
} else if is_contract {
572+
// Fallback: try to find first token with this contract address
573+
debug!(target: LOG_TARGET, contract_address = %token_id, "No image found in contract metadata, searching for first token");
574+
let (fallback_metadata, fallback_token_id) =
575+
self.get_first_token_metadata(token_id).await?;
576+
debug!(target: LOG_TARGET, contract_address = %token_id, fallback_token = %fallback_token_id, "Using fallback token image");
577+
fallback_metadata
578+
} else {
579+
return Err(anyhow::anyhow!("Image URL not found in metadata"));
580+
}
581+
}
582+
Err(e) => {
583+
if is_contract {
584+
// Fallback: try to find first token with this contract address
585+
debug!(target: LOG_TARGET, contract_address = %token_id, error = ?e, "Failed to parse contract metadata, searching for first token");
586+
let (fallback_metadata, fallback_token_id) =
587+
self.get_first_token_metadata(token_id).await?;
588+
debug!(target: LOG_TARGET, contract_address = %token_id, fallback_token = %fallback_token_id, "Using fallback token image");
589+
fallback_metadata
590+
} else {
591+
return Err(anyhow::anyhow!("Failed to parse metadata: {}", e));
592+
}
593+
}
594+
}
555595
}
556596
}
557597
Err(_) if is_contract => {

0 commit comments

Comments
 (0)