/** * @copyright 2026 NHCarrigan * @license Naomi's Public License * @author Naomi Carrigan */ import { Book, BookStatus, CreateBookDto, UpdateBookDto } from "@library/shared-types"; import { prisma } from "../lib/prisma"; export class BookService { private prisma = prisma; constructor() {} /** * Get all books. */ async getAllBooks(): Promise { const books = await this.prisma.book.findMany({ orderBy: { updatedAt: "desc" }, }); return books.map((book) => ({ ...book, status: book.status as unknown as BookStatus, dateAdded: book.dateAdded, dateFinished: book.dateFinished || undefined, tags: book.tags ?? [], links: book.links ?? [], createdAt: book.createdAt, updatedAt: book.updatedAt, })); } /** * Get book by ID. */ async getBookById(id: string): Promise { const book = await this.prisma.book.findUnique({ where: { id }, }); if (!book) return null; return { ...book, status: book.status as unknown as BookStatus, dateAdded: book.dateAdded, dateFinished: book.dateFinished || undefined, tags: book.tags ?? [], links: book.links ?? [], createdAt: book.createdAt, updatedAt: book.updatedAt, }; } /** * Create new book. */ async createBook(data: CreateBookDto): Promise { const book = await this.prisma.book.create({ data: { ...data, status: data.status.toUpperCase() as any, }, }); return { ...book, status: book.status as unknown as BookStatus, dateAdded: book.dateAdded, dateFinished: book.dateFinished || undefined, tags: book.tags ?? [], links: book.links ?? [], createdAt: book.createdAt, updatedAt: book.updatedAt, }; } /** * Update book by ID. */ async updateBook(id: string, data: UpdateBookDto): Promise { const updateData = { ...data }; if (updateData.status) { updateData.status = updateData.status.toUpperCase() as any; } const book = await this.prisma.book.update({ where: { id }, data: updateData, }); return { ...book, status: book.status as unknown as BookStatus, dateAdded: book.dateAdded, dateFinished: book.dateFinished || undefined, tags: book.tags ?? [], links: book.links ?? [], createdAt: book.createdAt, updatedAt: book.updatedAt, }; } /** * Delete book by ID. */ async deleteBook(id: string): Promise { await this.prisma.book.delete({ where: { id }, }); } }