101 lines
2.6 KiB
TypeScript
101 lines
2.6 KiB
TypeScript
import { NextRequest, NextResponse } from 'next/server'
|
||
import { getPayload } from 'payload'
|
||
import config from '@payload-config'
|
||
import { getCache, setCache } from '@/lib/redis'
|
||
|
||
/**
|
||
* GET /api/public/product-recommendations
|
||
* 获取商品推荐列表数据(带缓存)
|
||
* 需要 x-store-api-key 验证
|
||
*/
|
||
export async function GET(req: NextRequest) {
|
||
try {
|
||
// 验证 API Key
|
||
const apiKey = req.headers.get('x-store-api-key')
|
||
const validApiKey = process.env.PAYLOAD_API_KEY
|
||
|
||
if (!apiKey || !validApiKey || apiKey !== validApiKey) {
|
||
return NextResponse.json({ success: false, error: 'Unauthorized' }, { status: 401 })
|
||
}
|
||
|
||
// 生成缓存 key
|
||
const cacheKey = 'product-recommendations:data'
|
||
|
||
// 尝试从缓存获取
|
||
const cached = await getCache(cacheKey)
|
||
if (cached) {
|
||
return NextResponse.json({
|
||
success: true,
|
||
data: cached,
|
||
cached: true,
|
||
})
|
||
}
|
||
|
||
// 从数据库获取
|
||
const payload = await getPayload({ config })
|
||
const result = await payload.findGlobal({
|
||
slug: 'product-recommendations' as any,
|
||
depth: 3, // 填充商品和图片关联数据
|
||
})
|
||
|
||
// 如果功能未启用,返回空数据
|
||
if (!(result as any).enabled) {
|
||
const emptyData = {
|
||
enabled: false,
|
||
lists: [],
|
||
}
|
||
|
||
// 缓存空数据(较短时间)
|
||
await setCache(cacheKey, emptyData, 600) // 10 分钟
|
||
|
||
return NextResponse.json({
|
||
success: true,
|
||
data: emptyData,
|
||
cached: false,
|
||
})
|
||
}
|
||
|
||
// 获取所有列表
|
||
const lists = (result as any).lists || []
|
||
|
||
// 处理每个列表
|
||
const processedLists = lists.map((list: any) => {
|
||
const products = Array.isArray(list.products)
|
||
? list.products.filter((product: any) => product && product.status === 'published')
|
||
: []
|
||
|
||
return {
|
||
id: list.id,
|
||
title: list.title,
|
||
subtitle: list.subtitle,
|
||
products,
|
||
totalProducts: products.length,
|
||
}
|
||
})
|
||
|
||
const responseData = {
|
||
enabled: (result as any).enabled,
|
||
lists: processedLists,
|
||
totalLists: processedLists.length,
|
||
}
|
||
|
||
// 缓存结果(1 小时)
|
||
await setCache(cacheKey, responseData, 3600)
|
||
|
||
return NextResponse.json({
|
||
success: true,
|
||
data: responseData,
|
||
cached: false,
|
||
})
|
||
} catch (error) {
|
||
console.error('Product recommendations API error:', error)
|
||
return NextResponse.json(
|
||
{
|
||
success: false,
|
||
error: error instanceof Error ? error.message : 'Failed to fetch product recommendations',
|
||
},
|
||
{ status: 500 },
|
||
)
|
||
}
|
||
}
|