API REST para gestionar canciones, albums, artistas y generos musicales. Construida con Node.js, Express y MongoDB.
Antes de empezar necesitas tener instalado:
- Node.js (v12 o superior) - Descargar aqui
- MongoDB (local o en la nube con MongoDB Atlas)
- npm (viene incluido con Node.js)
Para verificar que los tienes instalados, abre una terminal y ejecuta:
node --version
npm --versionSi ambos comandos muestran un numero de version, estas listo.
git clone https://github.com/fjrock/nodejs-escalab-backend.git
cd nodejs-escalab-backendnpm installEsto descarga todas las librerias necesarias. Puede tardar unos minutos.
Crea un archivo llamado .env en la raiz del proyecto (al mismo nivel que package.json):
touch .envAbre el archivo .env y agrega lo siguiente:
DATABASE=mongodb://localhost:27017/musicapi
JWT_SECRET=una_clave_secreta_muy_larga_y_dificil_de_adivinar
PORT=8000| Variable | Que es | Ejemplo |
|---|---|---|
DATABASE |
URL de conexion a MongoDB | mongodb://localhost:27017/musicapi (local) o tu URI de Atlas |
JWT_SECRET |
Clave secreta para generar tokens de autenticacion. Ponle algo largo y aleatorio | mi_super_secreto_123! |
PORT |
Puerto donde correra el servidor | 8000 |
IMPORTANTE: Nunca subas el archivo
.enva GitHub. Ya esta incluido en.gitignore.
Modo desarrollo (se reinicia automaticamente al guardar cambios):
npm run devModo produccion:
npm startSi todo salio bien, veras en la terminal:
DB Conn
Server is running on port 8000
Si ves DB Conn, tu base de datos esta conectada correctamente.
Una vez que el servidor este corriendo, abre tu navegador y ve a:
http://localhost:8000/api-docs
Ahi puedes ver y probar todos los endpoints de la API de forma interactiva.
Todos los endpoints estan bajo el prefijo /api.
| Metodo | Ruta | Descripcion | Requiere login |
|---|---|---|---|
| POST | /api/signup |
Registrar un nuevo usuario | No |
| POST | /api/signin |
Iniciar sesion | No |
| GET | /api/signout |
Cerrar sesion | No |
| Metodo | Ruta | Descripcion | Requiere login |
|---|---|---|---|
| GET | /api/user/:userId |
Ver perfil de usuario | Si |
| PUT | /api/user/:userId |
Actualizar perfil | Si |
| Metodo | Ruta | Descripcion | Requiere login |
|---|---|---|---|
| GET | /api/songs/:userId |
Listar todas las canciones | Si (admin) |
| GET | /api/song/:songId/:userId |
Ver una cancion | Si (admin) |
| POST | /api/song/create/:userId |
Crear cancion | Si (admin) |
| PUT | /api/song/:songId/:userId |
Actualizar cancion | Si (admin) |
| DELETE | /api/song/:songId/:userId |
Eliminar cancion | Si (admin) |
| Metodo | Ruta | Descripcion | Requiere login |
|---|---|---|---|
| GET | /api/albums |
Listar todos los albums | No |
| GET | /api/album/:albumId/:userId |
Ver un album | Si |
| POST | /api/album/create/:userId |
Crear album | Si (admin) |
| PUT | /api/album/:albumId/:userId |
Actualizar album | Si (admin) |
| DELETE | /api/album/:albumId/:userId |
Eliminar album | Si (admin) |
| Metodo | Ruta | Descripcion | Requiere login |
|---|---|---|---|
| GET | /api/artists |
Listar todos los artistas | No |
| GET | /api/artist/:artistId/:userId |
Ver un artista | Si |
| POST | /api/artist/create/:userId |
Crear artista | Si (admin) |
| PUT | /api/artist/:artistId/:userId |
Actualizar artista | Si (admin) |
| DELETE | /api/artist/:artistId/:userId |
Eliminar artista | Si (admin) |
| Metodo | Ruta | Descripcion | Requiere login |
|---|---|---|---|
| GET | /api/genres |
Listar todos los generos | No |
| GET | /api/genre/:genreId/:userId |
Ver un genero | Si |
| POST | /api/genre/create/:userId |
Crear genero | Si (admin) |
| PUT | /api/genre/:genreId/:userId |
Actualizar genero | Si (admin) |
| DELETE | /api/genre/:genreId/:userId |
Eliminar genero | Si (admin) |
curl -X POST http://localhost:8000/api/signup \
-H "Content-Type: application/json" \
-d '{
"name": "Juan",
"email": "juan@email.com",
"password": "mipassword123"
}'La contrasena debe tener al menos 6 caracteres e incluir un numero.
curl -X POST http://localhost:8000/api/signin \
-H "Content-Type: application/json" \
-d '{
"email": "juan@email.com",
"password": "mipassword123"
}'Esto te devuelve un token. Guardalo, lo necesitas para las siguientes peticiones.
curl http://localhost:8000/api/genres \
-H "Authorization: Bearer TU_TOKEN_AQUI"Reemplaza TU_TOKEN_AQUI con el token que obtuviste al iniciar sesion.
npm testEl proyecto tiene 86 tests con objetivo de 100% de cobertura de codigo.
nodejs-escalab-backend/
├── app.js # Punto de entrada. Configura Express y conecta a MongoDB
├── package.json # Dependencias y scripts
├── jest.config.js # Configuracion de tests
├── render.yaml # Configuracion para deploy en Render
│
├── models/ # Esquemas de la base de datos (Mongoose)
│ ├── user.js # Usuario (nombre, email, contrasena, rol)
│ ├── song.js # Cancion
│ ├── album.js # Album (contiene canciones)
│ ├── artist.js # Artista (tiene albums y generos)
│ └── genre.js # Genero musical
│
├── controllers/ # Logica de negocio
│ ├── auth.js # Registro, login, logout, middleware JWT
│ ├── user.js # Operaciones de usuario
│ ├── song.js # CRUD de canciones
│ ├── album.js # CRUD de albums
│ ├── artist.js # CRUD de artistas
│ └── genre.js # CRUD de generos
│
├── routes/ # Definicion de rutas/endpoints
│ ├── auth.js
│ ├── user.js
│ ├── song.js
│ ├── album.js
│ ├── artist.js
│ └── genre.js
│
├── helpers/ # Funciones utilitarias
│ └── dbErrorHandler.js # Formateo de errores de MongoDB
│
├── validator/ # Reglas de validacion
│ └── index.js # Validacion de registro de usuario
│
└── tests/ # Tests unitarios (Jest)
├── controllers/
├── models/
├── helpers/
└── validator/
| Tecnologia | Para que se usa |
|---|---|
| Express | Framework web para crear la API |
| MongoDB + Mongoose | Base de datos y modelado de datos |
| JWT (jsonwebtoken) | Autenticacion con tokens |
| bcrypt | Encriptacion de contrasenas |
| Swagger | Documentacion interactiva de la API |
| Jest | Tests unitarios |
| Morgan | Logs de peticiones HTTP |
| CORS | Permitir peticiones desde otros dominios |
| dotenv | Cargar variables de entorno desde .env |
| Nodemon | Reinicio automatico en desarrollo |
La API tiene control de acceso basado en roles:
- Usuario normal (
role: 1): Puede ver su perfil y actualizarlo. - Administrador (
role: 0): Puede crear, editar y eliminar canciones, albums, artistas y generos.
Por defecto, los usuarios nuevos se crean con rol de usuario normal.
- Verifica que MongoDB esta corriendo
- Revisa que la URL en
DATABASEde tu.enves correcta - Si usas Atlas, verifica que tu IP esta en la whitelist
- Asegurate de tener el archivo
.enven la raiz del proyecto - Verifica que el archivo tiene la variable
JWT_SECRET
- Verifica tu version de Node.js (
node --version): necesitas v12+ - Borra
node_modulesypackage-lock.jsone intenta de nuevo:rm -rf node_modules package-lock.json npm install
- Revisa que el puerto no este ocupado por otro proceso
- Prueba con otro puerto cambiando
PORTen.env
El proyecto incluye configuracion para Render en el archivo render.yaml. Para deployar:
- Crea una cuenta en Render
- Conecta tu repositorio de GitHub
- Configura las variables de entorno (
DATABASE,JWT_SECRET) - Render se encarga del resto
ISC