Notes API

Notes API

Una REST API para crear, leer, actualizar y eliminar notas, hecha para aprender a desacoplar correctamente el acceso a datos de la lógica de negocio.

NestJSTypeScriptPostgreSQLPrismaNeonJestSwagger
Ver en vivoVer repositorio

El problema

Había consumido REST APIs muchas veces como desarrollador frontend, pero nunca había diseñado el lado backend de una desde cero. Quería entender, construyéndolo yo mismo, cómo mantener la capa de acceso a datos desacoplada de la lógica de negocio, en vez de solo leer sobre el tema. Una API CRUD simple de notas era un dominio lo suficientemente chico como para enfocarme en la arquitectura y no en reglas de negocio.

Rol e impacto

Decisiones técnicas y desafíos

Si los services llaman a Prisma directamente, cada regla de negocio termina atada a un ORM específico, y testear un service implica también testear un cliente de base de datos real. Comparé llamar a Prisma directamente desde los services contra introducir una capa de repositorio entre ambos.

Elegí introducir interfaces de repositorio de las que dependen los services, con implementaciones de Prisma detrás, porque permitía que la capa de services dependiera de una abstracción en vez de una tecnología de acceso a datos concreta, siguiendo el principio de inversión de dependencia.

Habría sido más rápido poner la validación, las reglas de negocio y las llamadas a la base de datos todo en el controller. Evalué un enfoque de una sola capa contra una estructura de módulos de NestJS con controllers, services y repositorios como capas distintas.

Terminé con controllers que solo manejan aspectos de HTTP, services que contienen la lógica de negocio y repositorios que contienen el acceso a datos, porque separar esas responsabilidades hizo que cada capa fuera testeable de forma independiente y más fácil de razonar a medida que la API crecía más allá de un CRUD básico.

Stack detallado

CapaTecnologíaPor qué
Framework de APINestJS, TypeScriptInyección de dependencias integrada, ideal para practicar DIP
Base de datosPostgreSQL, NeonPostgres administrado para una capa de acceso a datos relacional real
ORMPrismaQueries type-safe, aisladas detrás de la capa de repositorio
TestingJestTests unitarios de services contra interfaces de repositorio mockeadas
DocsSwaggerDocumentación de API auto-generada y explorable

Galería

Swagger UI mostrando los endpoints de Notes APISuite de tests de Jest pasando para el service de notas