Files
nextjs-notion-starter-kit/lib/get-tweets.ts
Travis Fischer b8581108b1
2024-11-10 16:14:23 +07:00

63 lines
1.5 KiB
TypeScript

import { type ExtendedRecordMap } from 'notion-types'
import { getPageTweetIds } from 'notion-utils'
import pMap from 'p-map'
import pMemoize from 'p-memoize'
import { getTweet as getTweetData } from 'react-tweet/api'
import type { ExtendedTweetRecordMap } from './types'
import { db } from './db'
export async function getTweetsMap(
recordMap: ExtendedRecordMap
): Promise<void> {
const tweetIds = getPageTweetIds(recordMap)
const tweetsMap = Object.fromEntries(
await pMap(
tweetIds,
async (tweetId: string) => {
return [tweetId, await getTweet(tweetId)]
},
{
concurrency: 8
}
)
)
;(recordMap as ExtendedTweetRecordMap).tweets = tweetsMap
}
async function getTweetImpl(tweetId: string): Promise<any> {
if (!tweetId) return null
const cacheKey = `tweet:${tweetId}`
try {
try {
const cachedTweet = await db.get(cacheKey)
if (cachedTweet || cachedTweet === null) {
return cachedTweet
}
} catch (err) {
// ignore redis errors
console.warn(`redis error get "${cacheKey}"`, err.message)
}
const tweetData = (await getTweetData(tweetId)) || null
try {
await db.set(cacheKey, tweetData)
} catch (err) {
// ignore redis errors
console.warn(`redis error set "${cacheKey}"`, err.message)
}
return tweetData
} catch (err: any) {
console.warn('failed to get tweet', tweetId, err.message)
return null
}
}
export const getTweet = pMemoize(getTweetImpl)