/** * @copyright 2026 NHCarrigan * @license Naomi's Public License * @author Naomi Carrigan */ import { Game, GameStatus, CreateGameDto, UpdateGameDto } from "@library/shared-types"; import { prisma } from "../lib/prisma"; export class GameService { private prisma = prisma; constructor() {} /** * Get all games. */ async getAllGames(): Promise { const games = await this.prisma.game.findMany({ orderBy: { updatedAt: "desc" }, }); return games.map((game) => ({ ...game, status: game.status as unknown as GameStatus, dateAdded: game.dateAdded, dateCompleted: game.dateCompleted || undefined, tags: game.tags ?? [], links: game.links ?? [], createdAt: game.createdAt, updatedAt: game.updatedAt, })); } /** * Get game by ID. */ async getGameById(id: string): Promise { const game = await this.prisma.game.findUnique({ where: { id }, }); if (!game) return null; return { ...game, status: game.status as unknown as GameStatus, dateAdded: game.dateAdded, dateCompleted: game.dateCompleted || undefined, tags: game.tags ?? [], links: game.links ?? [], createdAt: game.createdAt, updatedAt: game.updatedAt, }; } /** * Create new game. */ async createGame(data: CreateGameDto): Promise { const game = await this.prisma.game.create({ data: { ...data, status: data.status.toUpperCase() as any, }, }); return { ...game, status: game.status as unknown as GameStatus, dateAdded: game.dateAdded, dateCompleted: game.dateCompleted || undefined, tags: game.tags ?? [], links: game.links ?? [], createdAt: game.createdAt, updatedAt: game.updatedAt, }; } /** * Update game by ID. */ async updateGame(id: string, data: UpdateGameDto): Promise { const updateData = { ...data }; if (updateData.status) { updateData.status = updateData.status.toUpperCase() as any; } const game = await this.prisma.game.update({ where: { id }, data: updateData, }); return { ...game, status: game.status as unknown as GameStatus, dateAdded: game.dateAdded, dateCompleted: game.dateCompleted || undefined, tags: game.tags ?? [], links: game.links ?? [], createdAt: game.createdAt, updatedAt: game.updatedAt, }; } /** * Delete game by ID. */ async deleteGame(id: string): Promise { await this.prisma.game.delete({ where: { id }, }); } }