mirror of
https://github.com/d0zingcat/nextjs-notion-starter-kit.git
synced 2026-05-13 15:09:47 +00:00
63 lines
1.5 KiB
TypeScript
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: any) {
|
|
// 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: any) {
|
|
// 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)
|