All files / modules/preferences preferences.service.ts

0% Statements 0/48
0% Branches 0/1
0% Functions 0/1
0% Lines 0/48

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74                                                                                                                                                   
import { PrismaClient } from '@prisma/client';
 
const prisma = new PrismaClient();
 
/**
 * 获取用户偏好设置
 */
export async function getPreferences(userId: string) {
  const userIdNum = parseInt(userId);
 
  // 使用 upsert 语义,避免外键约束问题
  const preferences = await prisma.userPreference.upsert({
    where: { userId: userIdNum },
    update: {},
    create: {
      userId: userIdNum,
      playSpeed: 1.0,
      quality: 'standard',
      theme: 'light',
      defaultVoiceId: 'cherry',
      defaultVolume: 50,
      autoPlayNext: true,
      wifiOnlyDownload: false,
    },
  });
 
  return preferences;
}
 
/**
 * 更新用户偏好设置
 */
export async function updatePreferences(
  userId: string,
  data: {
    playSpeed?: number;
    quality?: string;
    theme?: string;
    defaultVoiceId?: string;
    defaultVolume?: number;
    autoPlayNext?: boolean;
    wifiOnlyDownload?: boolean;
  }
) {
  const userIdNum = parseInt(userId);
 
  // 使用 upsert 语义
  const existing = await prisma.userPreference.findUnique({
    where: { userId: userIdNum },
  });
 
  if (existing) {
    // 更新
    return await prisma.userPreference.update({
      where: { userId: userIdNum },
      data,
    });
  } else {
    // 创建
    return await prisma.userPreference.create({
      data: {
        userId: userIdNum,
        playSpeed: data.playSpeed ?? 1.0,
        quality: data.quality ?? 'standard',
        theme: data.theme ?? 'light',
        defaultVoiceId: data.defaultVoiceId ?? 'cherry',
        defaultVolume: data.defaultVolume ?? 50,
        autoPlayNext: data.autoPlayNext ?? true,
        wifiOnlyDownload: data.wifiOnlyDownload ?? false,
      },
    });
  }
}