Skip to main content

Documentation Index

Fetch the complete documentation index at: https://mintlify.com/Renzo717/Aula-Virtual-Universidad-Radiolocucion/llms.txt

Use this file to discover all available pages before exploring further.

Students — estudiantes — are the primary end-users of the NuestraVoz virtual campus. Their account is immediately active after self-registration, and access to content is strictly scoped to the subjects they are enrolled in. From their dashboard, students can track pending assignments, monitor their overall average, and follow active forum discussions across all their subjects. This page covers the full student lifecycle: registration, the enrolment model, activity submission, grade visibility, forum participation, and profile management.

Registration

Students register through POST /api/auth/register with rol: 'estudiante'. Unlike docente accounts, student accounts are immediately set to status: 'activo':
// apps/api/src/routes/auth.ts
const status = rol === 'docente' ? 'pendiente' : 'activo';
The registerSchema accepts only 'estudiante' or 'docente' for the rol field — preceptor and admin accounts must be created by an admin:
// packages/shared/src/schemas.ts
export const registerSchema = z.object({
  nombre:   z.string().min(2, 'Nombre requerido'),
  apellido: z.string().min(2, 'Apellido requerido'),
  email:    z.string().email('Email inválido'),
  password: z.string().min(6, 'Mínimo 6 caracteres'),
  rol:      z.enum(['estudiante', 'docente']),
});
After registration the student is redirected to login. No email confirmation step is required.

Enrolment Model

Students gain access to virtual classrooms through the inscripciones table. A record can target either a full career (carrera_id) or a standalone subject (materia_id). Both are created exclusively by admins or preceptors — students cannot enrol themselves.
// packages/shared/src/types.ts
export interface Inscripcion {
  id: string;
  user_id: string;
  carrera_id: string | null;   // enrolment in an entire career (grado/posgrado)
  materia_id: string | null;   // enrolment in a single standalone subject
  asignado_por: string | null; // admin or preceptor who created the record
  estado: InscripcionEstado;   // 'activa' | 'pendiente' | 'baja'
  created_at: string;
}
A student enrolled in a career gains access to every active subject belonging to that career. A student enrolled in a standalone subject (one without a carrera_id) gains access only to that specific classroom. Both types can coexist in a student’s profile.

Dashboard

The student dashboard is rendered by AlumnoDashboardPage.tsx and is driven by a single endpoint:
GET /api/dashboard/alumno
The response is typed as AlumnoDashboard:
// packages/shared/src/types.ts
export interface AlumnoDashboard {
  tareasPendientes:  number;                  // active activities with no submission yet
  promedioGeneral:   number | null;           // average of all non-null submission grades (1–10)
  atrasadas:         number;                  // active activities past their deadline with no submission
  forosPopulares:    ForoPopular[];           // top threads across enrolled subjects
  proximasEntregas:  ProximaEntregaResumen[]; // upcoming deadlines, sorted ascending
}
The three headline stats are displayed as cards:
StatDescription
tareasPendientesCount of active activities with no submission from this student
promedioGeneralAverage of all submission nota values that are not null; displays if no grades yet
atrasadasCount of active activities whose fecha_entrega has passed and the student has not yet submitted
When atrasadas > 0 the card renders in red to prompt immediate action. forosPopulares lists the most-active threads in enrolled subjects, sorted by a combination of reply count and reaction count. Each entry links to /aula/:materia_id?tab=foro.

Upcoming submissions

proximasEntregas contains activities with a fecha_entrega in the future that the student has not yet submitted. Each entry links directly to the activity view: /aula/:materia_id?tab=actividades&ver=:id.

Submitting Activities

Students can submit work for two activity types: entregable_simple (file upload) and formulario (online form).

File submission

POST /api/aula/:materiaId/actividades/:actividadId/entregas
Content-Type: multipart/form-data

comentario=Aquí mi práctica de locución
files[]=audio.mp3
files[]=transcripcion.pdf
Up to 10 files can be attached in a single submission. The optional comentario field is validated by createEntregaSchema. The response includes the new Entrega record with estado: 'entregada'.
If the activity’s fecha_entrega has passed and permite_entrega_tardia is false, the server will reject the submission. If late submissions are allowed, the tardia flag on the Entrega is set to true automatically.

Online form submission

POST /api/aula/:materiaId/actividades/:actividadId/entregas/formulario
Content-Type: application/json

{
  "respuestas": [
    {
      "pregunta_id": "uuid-pregunta-1",
      "opcion_ids": ["uuid-opcion-correcta"]
    },
    {
      "pregunta_id": "uuid-pregunta-2",
      "opcion_ids": ["uuid-opcion-a", "uuid-opcion-c"]
    }
  ]
}
opcion_ids must be a non-empty array. For single-answer questions, pass exactly one ID. The server auto-grades the form immediately, calculating nota as a fraction of the total points achieved, and sets estado: 'calificada'.

Viewing Submission State

Each activity in the student’s view includes a mi_entrega summary:
// packages/shared/src/types.ts
export interface MiEntregaResumen {
  estado: string;      // 'entregada' | 'calificada'
  nota:   number | null;
  tardia: boolean;
}
estadoMeaning
entregadaWork received, awaiting teacher review
calificadaTeacher has graded the submission; nota is set (1–10)

Viewing Grades and the Bulletin

Students can see activity-level marks inline in the classroom. For a consolidated view of final grades across all enrolled subjects, they can download their boletín (grade bulletin) as a PDF:
GET /api/boletin/:estudianteId
Each row in the bulletin corresponds to one subject (BoletinMateriaFila):
// packages/shared/src/types.ts
export interface BoletinMateriaFila {
  materia_id:          string;
  materia_nombre:      string;
  promocional:         boolean; // true = direct promotion, no exam required
  libre:               boolean;
  regular:             boolean;
  nota:                number | null; // final exam mark
  nota_recuperatorio:  number | null; // resit mark
}
Students can only download their own bulletin. The route is protected so that passing another student’s ID returns 403. Admins and preceptors can download any student’s bulletin.

Forum Participation

Every enrolled subject has a forum. Students can create threads, reply to posts, and react to content.

Creating a thread

POST /api/aula/:materiaId/foro
Content-Type: application/json

{
  "titulo": "Duda sobre la práctica de sibilantes",
  "contenido": "Hola, ¿qué diferencia hay entre /s/ apicoalveolar y /s/ predorsal?",
  "tags": ["fonética", "pronunciación"]
}

Replying

POST /api/aula/:materiaId/foro/:hiloId/respuestas
Content-Type: application/json

{
  "contenido": "La diferencia principal está en el punto de articulación de la lengua...",
  "parent_id": "uuid-of-parent-reply"  // optional, for nested replies
}
parent_id is optional. Omitting it creates a top-level reply to the thread; including it creates a nested reply.

Reactions

POST /api/aula/:materiaId/foro/:hiloId/reaccionar
A toggle endpoint — calling it a second time removes the reaction.

Profile Management

Students can update their own profile information and change their password at any time.

Update profile fields

PATCH /api/auth/perfil
Content-Type: application/json

{
  "nombre":   "Juan",
  "apellido": "Pérez",
  "dni":      "35987654",
  "celular":  "1144445555",
  "email":    "juan.nuevo@gmail.com"
}
All fields in updatePerfilSchema are optional. Only the fields provided are updated.

Change password

POST /api/auth/change-password
Content-Type: application/json

{
  "password":    "contraseñaActual",
  "newPassword": "nuevaContraseña123"
}
changePasswordSchema requires both the current and new password, each at least 6 characters. The server validates the current password before applying the change.

What Students Cannot Do

  • Create, edit, or delete user accounts
  • Create or modify careers, subjects, or activities
  • View or grade other students’ submissions
  • Manage enrolments (inscripciones)
  • View platform-wide statistics or the audit log
  • Access subjects they are not enrolled in
  • Download another student’s bulletin

Build docs developers (and LLMs) love