| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.albumsService = exports.AlbumsService = void 0;
- const models_1 = require("../../models");
- /**
- * 专辑服务
- */
- class AlbumsService {
- /**
- * 获取或创建默认专辑
- */
- async getOrCreateDefaultAlbum() {
- let defaultAlbum = await models_1.prisma.album.findFirst({
- where: { isDefault: true },
- });
- if (!defaultAlbum) {
- defaultAlbum = await models_1.prisma.album.create({
- data: {
- name: '默认专辑',
- description: '包含所有未归类音频的默认专辑',
- isDefault: true,
- },
- });
- }
- return defaultAlbum;
- }
- /**
- * 创建专辑
- */
- async createAlbum(data) {
- return models_1.prisma.album.create({
- data: {
- name: data.name,
- description: data.description,
- coverUrl: data.coverUrl,
- userId: data.userId,
- },
- });
- }
- /**
- * 获取专辑列表
- */
- async getAlbums(options) {
- const { page = 1, pageSize = 20 } = options || {};
- const [albums, total] = await Promise.all([
- models_1.prisma.album.findMany({
- skip: (page - 1) * pageSize,
- take: pageSize,
- orderBy: { createdAt: 'desc' },
- include: {
- _count: {
- select: { subscriptions: true, albumAudios: true },
- },
- },
- }),
- models_1.prisma.album.count(),
- ]);
- // 获取所有未分类的音频数量
- const uncategorizedCount = await models_1.prisma.audio.count({
- where: { albumId: null, status: 'completed' },
- });
- return {
- list: albums.map((album) => {
- // 默认专辑需要加上未分类音频的数量
- const audioCount = album.isDefault
- ? album._count?.albumAudios + uncategorizedCount
- : album._count?.albumAudios;
- return {
- ...album,
- subscriberCount: album._count?.subscriptions || 0,
- audioCount: audioCount || 0,
- _count: undefined,
- };
- }),
- total,
- page,
- pageSize,
- totalPages: Math.ceil(total / pageSize),
- };
- }
- /**
- * 获取专辑详情
- */
- async getAlbumById(albumId) {
- const album = await models_1.prisma.album.findUnique({
- where: { id: albumId },
- include: {
- _count: {
- select: { subscriptions: true },
- },
- },
- });
- if (!album) {
- throw new Error('专辑不存在');
- }
- return {
- ...album,
- subscriberCount: album._count?.subscriptions || 0,
- _count: undefined,
- };
- }
- /**
- * 更新专辑
- */
- async updateAlbum(albumId, data) {
- return models_1.prisma.album.update({
- where: { id: albumId },
- data: {
- name: data.name,
- description: data.description,
- coverUrl: data.coverUrl,
- },
- });
- }
- /**
- * 删除专辑
- */
- async deleteAlbum(albumId) {
- await models_1.prisma.album.delete({
- where: { id: albumId },
- });
- }
- /**
- * 获取专辑内的音频列表
- */
- async getAlbumAudios(albumId) {
- // 检查是否是默认专辑
- const album = await models_1.prisma.album.findUnique({ where: { id: albumId } });
- const isDefault = album?.isDefault || false;
- // 获取通过 albumId 直接关联的音频
- const directAudios = await models_1.prisma.audio.findMany({
- where: { albumId },
- orderBy: { createdAt: 'desc' },
- });
- // 获取通过 AlbumAudio 中间表关联的音频
- const albumAudios = await models_1.prisma.albumAudio.findMany({
- where: { albumId },
- include: {
- audio: true,
- },
- orderBy: { order: 'asc' },
- });
- // 如果是默认专辑,还需要获取 albumId 为 null 的音频
- let uncategorizedAudios = [];
- if (isDefault) {
- uncategorizedAudios = await models_1.prisma.audio.findMany({
- where: {
- albumId: null,
- status: 'completed',
- },
- orderBy: { createdAt: 'desc' },
- });
- }
- // 合并所有音频并去重
- const audioMap = new Map();
- // 先添加直接关联的音频
- directAudios.forEach((audio) => {
- audioMap.set(audio.id, audio);
- });
- // 添加中间表关联的音频
- albumAudios.forEach((aa) => {
- audioMap.set(aa.audio.id, {
- ...aa.audio,
- order: aa.order,
- addedAt: aa.addedAt,
- });
- });
- // 添加未分类音频
- uncategorizedAudios.forEach((audio) => {
- if (!audioMap.has(audio.id)) {
- audioMap.set(audio.id, audio);
- }
- });
- return Array.from(audioMap.values()).sort((a, b) => {
- // 按添加时间排序,如果没有添加时间则按创建时间
- const timeA = a.addedAt || a.createdAt;
- const timeB = b.addedAt || b.createdAt;
- return new Date(timeB).getTime() - new Date(timeA).getTime();
- });
- }
- /**
- * 添加音频到专辑
- */
- async addAudioToAlbum(albumId, audioId, order = 0) {
- // 检查专辑是否存在
- const album = await models_1.prisma.album.findUnique({ where: { id: albumId } });
- if (!album) {
- throw new Error('专辑不存在');
- }
- // 检查音频是否存在
- const audio = await models_1.prisma.audio.findUnique({ where: { id: audioId } });
- if (!audio) {
- throw new Error('音频不存在');
- }
- return models_1.prisma.albumAudio.create({
- data: {
- albumId,
- audioId,
- order,
- },
- });
- }
- /**
- * 从专辑移除音频
- */
- async removeAudioFromAlbum(albumId, audioId) {
- await models_1.prisma.albumAudio.delete({
- where: {
- albumId_audioId: {
- albumId,
- audioId,
- },
- },
- });
- }
- /**
- * 调整专辑中音频的顺序
- */
- async reorderAudio(albumId, audioId, order) {
- return models_1.prisma.albumAudio.update({
- where: {
- albumId_audioId: {
- albumId,
- audioId,
- },
- },
- data: { order },
- });
- }
- /**
- * 订阅专辑
- */
- async subscribeAlbum(userId, albumId) {
- // 检查专辑是否存在
- const album = await models_1.prisma.album.findUnique({ where: { id: albumId } });
- if (!album) {
- throw new Error('专辑不存在');
- }
- return models_1.prisma.albumSubscription.upsert({
- where: {
- userId_albumId: {
- userId,
- albumId,
- },
- },
- update: {},
- create: {
- userId,
- albumId,
- },
- });
- }
- /**
- * 取消订阅专辑
- */
- async unsubscribeAlbum(userId, albumId) {
- await models_1.prisma.albumSubscription.delete({
- where: {
- userId_albumId: {
- userId,
- albumId,
- },
- },
- });
- }
- /**
- * 获取用户已订阅的专辑列表
- */
- async getSubscribedAlbums(userId) {
- const subscriptions = await models_1.prisma.albumSubscription.findMany({
- where: { userId },
- include: {
- album: {
- include: {
- _count: {
- select: { subscriptions: true },
- },
- },
- },
- },
- orderBy: { createdAt: 'desc' },
- });
- return subscriptions.map((sub) => ({
- ...sub.album,
- subscriberCount: sub.album._count?.subscriptions || 0,
- subscribedAt: sub.createdAt,
- _count: undefined,
- }));
- }
- /**
- * 检查用户是否已订阅专辑
- */
- async isSubscribed(userId, albumId) {
- const subscription = await models_1.prisma.albumSubscription.findUnique({
- where: {
- userId_albumId: {
- userId,
- albumId,
- },
- },
- });
- return !!subscription;
- }
- }
- exports.AlbumsService = AlbumsService;
- // 导出单例
- exports.albumsService = new AlbumsService();
|