# 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,
          },
        });
      }
    }