Skip to content

Commit

Permalink
feat: add nft spec on api
Browse files Browse the repository at this point in the history
  • Loading branch information
bigint committed Jan 28, 2024
1 parent a8be20e commit c9de1c4
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 42 deletions.
2 changes: 1 addition & 1 deletion apps/api/src/utils/oembed/getMetadata.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ const getMetadata = async (url: string): Promise<any> => {
image: proxiedUrl,
isLarge,
lastIndexedAt: new Date().toISOString(),
nft: getNft(document),
nft: getNft(document, url),
site: getSite(document),
title: getTitle(document),
url
Expand Down
65 changes: 33 additions & 32 deletions apps/api/src/utils/oembed/meta/getNft.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,71 +2,72 @@ import type { Nft } from '@hey/types/misc';
import type { Document } from 'linkedom';

// https://reflect.site/g/yoginth/nft-extended-open-graph-spec/780502f3c8a3404bb2d7c39ec091602e
const getNft = (document: Document): Nft | null => {
const collection =
const getNft = (document: Document, url: string): Nft | null => {
const collectionName =
document.querySelector('meta[name="eth:nft:collection"]') ||
document.querySelector('meta[property="eth:nft:collection"]');
const contract_address =
const contractAddress =
document.querySelector('meta[name="eth:nft:contract_address"]') ||
document.querySelector('meta[property="eth:nft:contract_address"]');
const creator_address =
const creatorAddress =
document.querySelector('meta[name="eth:nft:creator_address"]') ||
document.querySelector('meta[property="eth:nft:creator_address"]');
const nft_chain =
const chain =
document.querySelector('meta[name="eth:nft:chain"]') ||
document.querySelector('meta[property="eth:nft:chain"]');
const nft_media_url =
const mediaUrl =
document.querySelector('meta[name="eth:nft:media_url"]') ||
document.querySelector('meta[property="eth:nft:media_url"]') ||
document.querySelector('meta[name="og:image"]') ||
document.querySelector('meta[property="og:image"]');
const nft_mint_count =
const mintCount =
document.querySelector('meta[name="eth:nft:mint_count"]') ||
document.querySelector('meta[property="eth:nft:mint_count"]');
const nft_mint_status =
const mintStatus =
document.querySelector('meta[name="eth:nft:mint_status"]') ||
document.querySelector('meta[property="eth:nft:mint_status"]');
const nft_mint_url =
const mintUrl =
document.querySelector('meta[name="eth:nft:mint_url"]') ||
document.querySelector('meta[property="eth:nft:mint_url"]');
const nft_schema =
const schema =
document.querySelector('meta[name="eth:nft:schema"]') ||
document.querySelector('meta[property="eth:nft:schema"]');

const processedCollection = collection?.getAttribute('content') || null;
const processedCollectionName =
collectionName?.getAttribute('content') || null;
const processedContractAddress =
contract_address?.getAttribute('content') || null;
contractAddress?.getAttribute('content') || null;
const processedCreatorAddress =
creator_address?.getAttribute('content') || null;
const processedNftChain = nft_chain?.getAttribute('content') || null;
const processedNftMediaUrl = nft_media_url?.getAttribute('content') || null;
const processedNftMintCount = nft_mint_count?.getAttribute('content')
? parseInt(nft_mint_count?.getAttribute('content') as string)
creatorAddress?.getAttribute('content') || null;
const processedChain = chain?.getAttribute('content') || null;
const processedMediaUrl = mediaUrl?.getAttribute('content') || null;
const processedMintCount = mintCount?.getAttribute('content')
? Number(mintCount?.getAttribute('content'))
: null;
const processedNftMintStatus =
nft_mint_status?.getAttribute('content') || null;
const processedNftMintUrl = nft_mint_url?.getAttribute('content') || null;
const processedNftSchema = nft_schema?.getAttribute('content') || null;
const processedMintStatus = mintStatus?.getAttribute('content') || null;
const processedMintUrl = mintUrl?.getAttribute('content') || null;
const processedSchema = schema?.getAttribute('content') || null;

if (
!processedCollection &&
!processedCollectionName &&
!processedContractAddress &&
!processedCreatorAddress &&
!processedNftSchema
!processedSchema
) {
return null;
}

return {
collection: processedCollection,
contract_address: processedContractAddress,
creator_address: processedCreatorAddress,
nft_chain: processedNftChain,
nft_media_url: processedNftMediaUrl,
nft_mint_count: processedNftMintCount,
nft_mint_status: processedNftMintStatus,
nft_mint_url: processedNftMintUrl,
nft_schema: processedNftSchema
chain: processedChain,
collectionName: processedCollectionName,
contractAddress: processedContractAddress,
creatorAddress: processedCreatorAddress,
mediaUrl: processedMediaUrl,
mintCount: processedMintCount,
mintStatus: processedMintStatus,
mintUrl: processedMintUrl,
schema: processedSchema,
sourceUrl: url
};
};

Expand Down
19 changes: 10 additions & 9 deletions packages/types/misc.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,16 @@ export interface UserSuggestion {
}

export interface Nft {
collection: null | string;
contract_address: null | string;
creator_address: null | string;
nft_chain: 'ethereum' | 'polygon' | null | string;
nft_media_url: null | string;
nft_mint_count: null | number;
nft_mint_status: 'closed' | 'live' | null | string;
nft_mint_url: null | string;
nft_schema: 'erc1155' | 'erc721' | null | string;
chain: null | string;
collectionName: null | string;
contractAddress: null | string;
creatorAddress: null | string;
mediaUrl: null | string;
mintCount: null | number;
mintStatus: 'closed' | 'live' | null | string;
mintUrl: null | string;
schema: 'erc1155' | 'erc721' | null | string;
sourceUrl: string;
}

export interface OG {
Expand Down

0 comments on commit c9de1c4

Please sign in to comment.