/** * @copyright 2026 NHCarrigan * @license Naomi's Public License * @author Naomi Carrigan */ import { Music, MusicStatus, MusicType, CreateMusicDto, UpdateMusicDto } from "@library/shared-types"; import { prisma } from "../lib/prisma"; export class MusicService { private prisma = prisma; constructor() {} /** * Get all music. */ async getAllMusic(): Promise { const musicItems = await this.prisma.music.findMany({ orderBy: { updatedAt: "desc" }, }); return musicItems.map((music) => ({ ...music, type: music.type as unknown as MusicType, status: music.status as unknown as MusicStatus, dateAdded: music.dateAdded, dateCompleted: music.dateCompleted || undefined, tags: music.tags ?? [], links: music.links ?? [], createdAt: music.createdAt, updatedAt: music.updatedAt, })); } /** * Get music by ID. */ async getMusicById(id: string): Promise { const music = await this.prisma.music.findUnique({ where: { id }, }); if (!music) return null; return { ...music, type: music.type as unknown as MusicType, status: music.status as unknown as MusicStatus, dateAdded: music.dateAdded, dateCompleted: music.dateCompleted || undefined, tags: music.tags ?? [], links: music.links ?? [], createdAt: music.createdAt, updatedAt: music.updatedAt, }; } /** * Create new music. */ async createMusic(data: CreateMusicDto): Promise { const music = await this.prisma.music.create({ data: { ...data, type: data.type.toUpperCase() as any, status: data.status.toUpperCase() as any, }, }); return { ...music, type: music.type as unknown as MusicType, status: music.status as unknown as MusicStatus, dateAdded: music.dateAdded, dateCompleted: music.dateCompleted || undefined, tags: music.tags ?? [], links: music.links ?? [], createdAt: music.createdAt, updatedAt: music.updatedAt, }; } /** * Update music by ID. */ async updateMusic(id: string, data: UpdateMusicDto): Promise { const updateData = { ...data }; if (updateData.type) { updateData.type = updateData.type.toUpperCase() as any; } if (updateData.status) { updateData.status = updateData.status.toUpperCase() as any; } const music = await this.prisma.music.update({ where: { id }, data: updateData, }); return { ...music, type: music.type as unknown as MusicType, status: music.status as unknown as MusicStatus, dateAdded: music.dateAdded, dateCompleted: music.dateCompleted || undefined, tags: music.tags ?? [], links: music.links ?? [], createdAt: music.createdAt, updatedAt: music.updatedAt, }; } /** * Delete music by ID. */ async deleteMusic(id: string): Promise { await this.prisma.music.delete({ where: { id }, }); } }