| N° | Nombre | Rama |
|---|---|---|
| 1 | Copreni Rodrigo | alumno1-rodrigoCopreni |
| 2 | Cepeda Agustín | alumno2-agustinCepeda |
| 3 | Pascuali Agustín Mateo | alumno3-agustinPascuali |
| 4 | Lares Santiago | alumno4-santiagoLares |
| 5 | Beltrame Juan Manuel Ramirez | alumno5-juanBeltrame |
El proyecto es un sistema para realizar las operaciones CRUD(Create, Read, Update, Delete) de alumos. El proyecto consiste en una API REST desarrollada con Node.js y Express que provee los datos del FrontEnd, reemplazando los datos estáticos.
- BackEnd (Render): https://tp4-api-rest.onrender.com/alumnos
Se utilizó la metodología de una rama por alumno. Cada integrante trabajó en su propia rama y realizó Pull Requests hacia la rama dev para integrar los cambios. Una vez que todo estaba listo en dev, se hizo el merge final a main como entrega.
Flujo de trabajo: rama-alumno → dev → main
tp4-API-REST/ ├── controllers/ │ └── alumno.controller.js │ ├──core/ │ └── server.js │ ├── data/ │ └── alumnos.json │ ├── middleware/ │ └── alumno-validator.middleware.js │ ├── models/ │ ├── alumno.model.ts │ └── persona.model.ts │ ├── routes/ │ └── alumno.routes.js │ ├── .dockerignore ├── .env ├── .gitignore ├── app.js ├── Dockerfile ├── package.json ├── pnpm-lock.yaml ├── README.md ├── settings.json └── tsconfig.json
| Archivo / Tarea | Responsable |
|---|---|
Postman collection, Postman screenshots |
Copreni Rodrigo |
controllers/alumno.controller.js, core/server.js, data/alumnos.json, middleware/alumno-validator.middleware.js, package.json |
Cepeda Agustín |
Render, .dockerignore, Dockerfile, server.js, nodemon, pnpm-lock.yaml |
Lares Santiago |
.dockerignore, Dockerfile, package.json |
Pascuali Agustín |
README.md |
Beltrame Juan Manuel |
Archivo de entrada del servidor. Importa la clase Server desde core/server.js, crea una instancia y llama al método listen() para iniciar la API.
const Server = require('./core/server')
const servidor = new Server()
servidor.listen()Clase principal que configura y levanta el servidor Express.
constructor()
Inicializa la app de Express, define el puerto desde la variable de entorno PORT (o 3000 por defecto), y llama a middleware() y rutas().
middleware()
Configura los middlewares globales:
cors()— permite solicitudes desde cualquier origen.express.json()— permite recibir y parsear cuerpos de solicitud en formato JSON.
rutas()
Define todas las rutas de la API y las conecta con sus archivos de rutas correspondientes.
listen()
Pone el servidor a escuchar en el puerto configurado y muestra un mensaje en consola confirmando que la API está activa.
Este controlador se encarga de manejar todas las operaciones sobre los alumnos utilizando el archivo alumnos.json como base de datos. Permite realizar operaciones CRUD (crear, leer, actualizar y eliminar).
Lee el archivo alumnos.json de forma asíncrona y devuelve el array completo de alumnos en formato JSON. Si todo sale bien responde con status 200, mientras que si ocurre un error, responde con status 500.
Recibe un id por parámetro de URL, lee alumnos.json y busca el alumno cuyo legajo coincide. Si lo encuentra responde con el objeto, si no responde con status 404 si no se encontro o con 500 si hay un error.
Recibe los datos del nuevo alumno por parámetro menos el legajo que se crea automáticamente, lee alumnos.json y carga el nuevo alumno. Si se pudo cargar responde con status 201, en caso de algun error con status 500.
Recibe el legajo por parametro y los datos a actualizar en el body, lee alumnos.json, busca el alumno a modificar por el legajo y modifica los datos. Si no se encontro el aluimno responde con status 404, si se pudo modificar correctamente con 200 y si hubo algun error con 500.
Recibe el legajo por parametro, lee alumnos.json y elimina el alumno. En caso de que se eliminó correctamente responde con status 200 y el alumno eliminado, si no lo encuantra responde con 404 y en caso de error con 500.
Define las rutas del endpoint /alumnos:
-
GET /alumnos→getAlumnoAllDevuelve todos los alumnos. -
GET /alumnos/:legajo→getAlumnoByIdDevuelve un alumno según legajo. -
POST /alumnos→postNewAlumnoCrea un nuevo alumno. -
PUT /alumnos/:legajo→putAlumnoBylegajoModifica un alumno según legajo. -
DELETE /alumnos/:legajo→deleteAlumnoByLegajoElimina un alumno según legajo.
{
"legajo": 10001,
"nombre": "Mora",
"apellido": "García",
"email": "m.garcia@facultad.edu.ar",
"fechaAlta": "2026-03-02",
"modificacion": "2026-03-02",
"isActive": true
}{
"idMateria": "PROG1",
"nombre": "Programación I",
"cuatrimestre": 1
}{
"id": 1,
"legajo": 10001,
"idMateria": "MAT101",
"nota": 9,
"fecha": "03-04-24"
}Archivo reservado para la ampliación opcional del proyecto (carpeta
/extras). Actualmente está vacío; la estructura prevista para cada profesor es:
{
"idProfesor": "PROF001",
"nombre": "Gustavo",
"apellido": "Ramoscelli",
"materias": ["PROG1"]
}Todas las pruebas se realizaron contra el deploy en Render.
- URL base:
https://tp4-api-rest.onrender.com
| Método | Endpoint | Descripción | Body (req) | Códigos HTTP |
|---|---|---|---|---|
GET |
/alumnos |
Lista todos los alumnos | — | 200, 500 |
GET |
/alumnos/:legajo |
Obtiene un alumno por legajo | — | 200, 404, 500 |
POST |
/alumnos |
Crea un alumno (legajo automático) | JSON | 201, 400, 409, 500 |
PUT |
/alumnos/:legajo |
Modifica un alumno por legajo | JSON | 200, 404, 500 |
DELETE |
/alumnos/:legajo |
Elimina un alumno por legajo | — | 200, 404, 500 |
Devuelve el array completo de alumnos.
Request
GET https://tp4-api-rest.onrender.com/alumnos
Response — 200 OK
[
{
"legajo": 10001,
"nombre": "Mora",
"apellido": "García",
"email": "m.garcia@facultad.edu.ar",
"fechaAlta": "2026-03-02",
"modificacion": "2026-03-02",
"isActive": true
}
]Busca un alumno por su número de legajo.
Request
GET https://tp4-api-rest.onrender.com/alumnos/10001
Response — 200 OK
{
"legajo": 10001,
"nombre": "Mora",
"apellido": "García",
"email": "m.garcia@facultad.edu.ar",
"fechaAlta": "2026-03-02",
"modificacion": "2026-03-02",
"isActive": true
}Response — 404 Not Found
{
"msg": "No existe el alumno con el legajo 99999"
}Crea un alumno nuevo. El legajo se genera automáticamente. El body se valida con la clase AlumnoModel.
Request
POST https://tp4-api-rest.onrender.com/alumnos
Content-Type: application/json
{
"nombre": "Test",
"apellido": "User",
"email": "t.user@facultad.edu.ar"
}Response — 201 Created
{
"msg": "Se agregó al sistema el alumno nuevo con el legajo n° 10024",
"alumnoNuevo": {
"legajo": 10024,
"nombre": "Test",
"apellido": "User",
"email": "t.user@facultad.edu.ar",
"fechaAlta": "2026-06-01",
"modificacion": "2026-06-01",
"isActive": true
}
}Response — 400 Bad Request (datos faltantes o inválidos)
{
"errores": ["Nombre inválido", "Email inválido"]
}Response — 409 Conflict (email ya registrado)
{
"msg": "Ya existe un alumno registrado con el email t.user@facultad.edu.ar"
}Modifica los datos de un alumno existente. No se permite modificar el legajo.
Request
PUT https://tp4-api-rest.onrender.com/alumnos/10001
Content-Type: application/json
{
"nombre": "Mora Belén",
"isActive": false
}Response — 200 OK
{
"msg": "Alumno actualizado correctamente",
"alumno": {
"legajo": 10001,
"nombre": "Mora Belén",
"apellido": "García",
"email": "m.garcia@facultad.edu.ar",
"fechaAlta": "2026-03-02",
"modificacion": "2026-06-01",
"isActive": false
}
}Response — 404 Not Found
{
"msg": "No se encontró el alumno con el legajo n° 99999"
}Elimina un alumno por su legajo.
Request
DELETE https://tp4-api-rest.onrender.com/alumnos/10001
Response — 200 OK
{
"msg": "Se eliminó correctamente el alumno con el legajo n° 10001",
"alumno": {
"legajo": 10001,
"nombre": "Mora",
"apellido": "García",
"email": "m.garcia@facultad.edu.ar",
"fechaAlta": "2026-03-02",
"modificacion": "2026-03-02",
"isActive": true
}
}Response — 404 Not Found
{
"msg": "No se encontró el alumno con el legajo n° 99999"
}El proyecto incluye tests automatizados con Jest + ts-jest y Supertest.
pnpm testSe cubre el 100% de las funciones del proyecto (controlador, server, middleware y modelos), superando el 90% exigido por la consigna.




