ens-proxy/api/profile.ts

73 lines
1.7 KiB
TypeScript

import type { VercelRequest, VercelResponse } from '@vercel/node'
import { getEnsName } from './name'
import { getEnsTextRecords } from './text'
interface ProfileLink {
key: string
value: string
}
interface Profile {
name: string
url?: string
avatar?: string
description?: string
links?: ProfileLink[]
}
function getEnsAvatar(ensName: string): string {
return ensName
? `https://metadata.ens.domains/mainnet/avatar/${ensName}`
: 'null'
}
export async function getEnsProfile(accountId: string): Promise<Profile> {
const name = await getEnsName(accountId)
if (!name) return { name: 'null' }
const records = await getEnsTextRecords(name)
if (!records) return { name }
const avatar = records.filter((record) => record.key === 'avatar')[0]?.value
const description = records.filter(
(record) => record.key === 'description'
)[0]?.value
// filter out what we need from the fetched text records
const linkKeys = [
'url',
'com.twitter',
'com.github',
'org.telegram',
'com.discord',
'com.reddit'
]
const links: ProfileLink[] = records.filter((record) =>
linkKeys.includes(record.key)
)
const profile: Profile = {
name,
...(avatar && { avatar: getEnsAvatar(name) }),
...(description && { description }),
...(links.length > 0 && { links })
}
return profile
}
export default async function EnsProfileApi(
request: VercelRequest,
response: VercelResponse
) {
try {
const accountId = String(request.query.address)
const profile = await getEnsProfile(accountId)
response.setHeader('Cache-Control', 'max-age=0, s-maxage=86400')
response.status(200).send({ profile })
} catch (error) {
response.send({ error })
}
}