141 lines
3.2 KiB
TypeScript
141 lines
3.2 KiB
TypeScript
/**
|
||
* Prisma 辅助函数库
|
||
* 提供常用的数据库操作封装
|
||
*/
|
||
|
||
import { prisma } from '@/lib/prisma'
|
||
|
||
/**
|
||
* 读取系统配置
|
||
*/
|
||
export async function getPrismaConfig(key: string): Promise<any> {
|
||
try {
|
||
const config = await prisma.system_config.findUnique({
|
||
where: { config_key: key }
|
||
})
|
||
return config?.config_value
|
||
} catch (e) {
|
||
console.warn(`[Config] 读取配置 ${key} 失败:`, e)
|
||
return null
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 更新系统配置
|
||
*/
|
||
export async function setPrismaConfig(key: string, value: any, description?: string): Promise<void> {
|
||
await prisma.system_config.upsert({
|
||
where: { config_key: key },
|
||
update: {
|
||
config_value: value,
|
||
description: description || null,
|
||
updated_at: new Date()
|
||
},
|
||
create: {
|
||
config_key: key,
|
||
config_value: value,
|
||
description: description || null
|
||
}
|
||
})
|
||
}
|
||
|
||
/**
|
||
* 查询用户(通过 ID 或 openId)
|
||
*/
|
||
export async function findUserByIdOrOpenId(userId?: string, openId?: string) {
|
||
if (!userId && !openId) return null
|
||
|
||
return await prisma.users.findFirst({
|
||
where: userId ? { id: userId } : { open_id: openId }
|
||
})
|
||
}
|
||
|
||
/**
|
||
* 批量查询用户
|
||
*/
|
||
export async function findUsersByIds(userIds: string[]) {
|
||
return await prisma.users.findMany({
|
||
where: { id: { in: userIds } }
|
||
})
|
||
}
|
||
|
||
/**
|
||
* 记录用户追踪
|
||
*/
|
||
export async function trackUserAction(
|
||
userId: string,
|
||
action: string,
|
||
chapterId?: string,
|
||
target?: string,
|
||
extraData?: any
|
||
) {
|
||
try {
|
||
await prisma.user_tracks.create({
|
||
data: {
|
||
id: `track_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
|
||
user_id: userId,
|
||
action,
|
||
chapter_id: chapterId || null,
|
||
target: target || null,
|
||
extra_data: extraData || null
|
||
}
|
||
})
|
||
} catch (e) {
|
||
console.error('[Track] 记录失败:', e)
|
||
}
|
||
}
|
||
|
||
/**
|
||
* 检查用户是否购买章节
|
||
*/
|
||
export async function hasUserPurchasedChapter(userId: string, chapterId: string): Promise<boolean> {
|
||
const user = await prisma.users.findUnique({
|
||
where: { id: userId },
|
||
select: { has_full_book: true, purchased_sections: true }
|
||
})
|
||
|
||
if (!user) return false
|
||
if (user.has_full_book) return true
|
||
|
||
const purchasedSections = user.purchased_sections as any
|
||
if (Array.isArray(purchasedSections)) {
|
||
return purchasedSections.includes(chapterId)
|
||
}
|
||
|
||
return false
|
||
}
|
||
|
||
/**
|
||
* 获取用户购买的章节列表
|
||
*/
|
||
export async function getUserPurchasedChapters(userId: string): Promise<string[]> {
|
||
const user = await prisma.users.findUnique({
|
||
where: { id: userId },
|
||
select: { purchased_sections: true }
|
||
})
|
||
|
||
const sections = user?.purchased_sections as any
|
||
return Array.isArray(sections) ? sections : []
|
||
}
|
||
|
||
/**
|
||
* 添加用户购买的章节
|
||
*/
|
||
export async function addUserPurchasedChapter(userId: string, chapterId: string): Promise<void> {
|
||
const user = await prisma.users.findUnique({
|
||
where: { id: userId },
|
||
select: { purchased_sections: true }
|
||
})
|
||
|
||
const sections = user?.purchased_sections as any
|
||
const purchased = Array.isArray(sections) ? sections : []
|
||
|
||
if (!purchased.includes(chapterId)) {
|
||
purchased.push(chapterId)
|
||
await prisma.users.update({
|
||
where: { id: userId },
|
||
data: { purchased_sections: purchased }
|
||
})
|
||
}
|
||
}
|