From 21d0c27f4d781de382650abdb9d7ee6aed00964a Mon Sep 17 00:00:00 2001 From: Jose Selesan Date: Thu, 23 Apr 2026 16:46:46 -0300 Subject: [PATCH] feat: enhance createSport functionality with conflict handling and result management Co-authored-by: Copilot --- .../sport/handlers/create-sport.handler.ts | 12 ++---------- .../src/modules/sport/services/sport.service.ts | 15 +++++++++++++-- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/apps/backend/src/modules/sport/handlers/create-sport.handler.ts b/apps/backend/src/modules/sport/handlers/create-sport.handler.ts index b8b1c29..18deca1 100644 --- a/apps/backend/src/modules/sport/handlers/create-sport.handler.ts +++ b/apps/backend/src/modules/sport/handlers/create-sport.handler.ts @@ -1,18 +1,10 @@ import { Prisma } from '@/generated/prisma/client'; +import { handleResult } from '@/lib/http/handle-result'; import { createSport } from '@/modules/sport/services/sport.service'; import type { AppContext } from '@/types/hono'; import type { CreateSportInput } from '@repo/api-contract'; export async function createSportHandler(c: AppContext) { const payload = c.req.valid('json' as never) as CreateSportInput; - - try { - const sport = await createSport(payload); - return c.json(sport, 201); - } catch (error) { - if (error instanceof Prisma.PrismaClientKnownRequestError) { - return c.json({ message: 'No se pudo crear el deporte.' }, 409); - } - throw error; - } + return handleResult(c, await createSport(payload), 201); } diff --git a/apps/backend/src/modules/sport/services/sport.service.ts b/apps/backend/src/modules/sport/services/sport.service.ts index bba9485..866dbc6 100644 --- a/apps/backend/src/modules/sport/services/sport.service.ts +++ b/apps/backend/src/modules/sport/services/sport.service.ts @@ -1,6 +1,7 @@ import { Prisma, Sport } from '@/generated/prisma/client'; +import { Errors } from '@/lib/errors'; import { db } from '@/lib/prisma'; -import { ok, Result } from '@/lib/result'; +import { err, ok, Result } from '@/lib/result'; import { v7 as uuidv7 } from 'uuid'; export type CreateSportInput = { @@ -62,7 +63,15 @@ export async function listSports(): Promise> { export async function createSport(input: CreateSportInput) { const slug = await buildUniqueSlug(input.name); - return db.sport.create({ + const existing = await db.sport.count({ + where: { slug }, + }); + + if (existing > 0) { + return err(Errors.conflict('Ya existe un deporte con ese nombre.')); + } + + var created = db.sport.create({ data: { id: uuidv7(), name: input.name.trim(), @@ -70,6 +79,8 @@ export async function createSport(input: CreateSportInput) { isActive: true, }, }); + + return ok(created); } export async function getSportById(id: string) {