Backend:
- Admin DTOs for student management views
- Admin queries for listing all students with activation status
Frontend:
- AdminDashboard: overview of all students
- StudentManagement: CRUD operations with activation controls
- Manual activation toggle for administrators
- Filter by activation status
- Bulk operations support
This enables administrators to manage student accounts,
manually activate accounts, and monitor registration status.
Frontend implementation for student account activation:
Components:
- ActivateComponent: 6-digit code input with validation
- Auto-redirect to dashboard on successful activation
- Resend code functionality with cooldown timer
Services:
- AuthService: add activateAccount and regenerateCode methods
- StudentService: expose activation status
- GraphQL mutations for activation endpoints
Routing:
- /activate route with guard for unauthenticated users
- Redirect inactive users to activation page after login
Improvements:
- LoginComponent: check activation status and redirect accordingly
- StudentFormComponent: show activation status in admin view
- StudentDashboard: handle activation state
- AppComponent: global activation status check
- Single job instead of 3 (no artifact overhead)
- Build directly on k3s node (avoids image transfer)
- Parallel Docker builds with BuildKit
- Auto-create namespace if missing
- Automatic rollback on failure
- Health check via domain
- Add linux-musl-x64 runtime identifier for Alpine builds
- Install ICU libs for SQL Server globalization support
- Fix nginx upstream to use k8s service name (student-api)
- Sync package-lock.json with package.json
- Make name and email required in registration form
- Add StudentDashboard component with enrolled subjects and program info
- Implement role-based navigation (admin sees management, student sees portal)
- Add adminGuard for restricting student management routes
- Redirect to /dashboard after login/register instead of /students
- Add navigation links: Mi Portal, Mis Materias, Companeros
Fulfills test requirements:
- Students can register online (punto 1)
- Enroll in up to 3 subjects/9 credits (puntos 2-5)
- Cannot have same professor twice (punto 7)
- View classmates by subject - names only (puntos 8-9)
- Add AuthService with login/logout/register functionality
- Create auth guard for protected routes
- Create guest guard for login/register pages
- Add auth interceptor to attach JWT tokens
- Create login page with form validation
- Create register page with student profile option
- Update app component with user menu and logout
- Configure routes with authentication guards
- Change edit button from <button> to <a> for proper routerLink binding
- Replace ngOnInit with effect() to handle input signal timing correctly
- The route param 'id' was not available during ngOnInit lifecycle
Fixes DEF-001: "Estudiante no encontrado" error when clicking edit
- Change ESLint no-explicit-any from 'warn' to 'error'
- Replace 'any' with 'unknown as string' in initials.pipe.spec
- Fix StudentService tests to handle Apollo watchQuery multiple emissions
- Add filter for loading state before asserting in tests
Stricter type checking improves code quality.
- Add comprehensive JSDoc to StudentService and EnrollmentService
- Replace magic numbers with ENROLLMENT_LIMITS constants
- Use RESTRICTION_TRANSLATIONS for enrollment messages
- Update CreditsPipe to use MAX_CREDITS constant
- Expose maxCredits and maxSubjects in enrollment component
This improves code maintainability and developer experience.
- Test all GraphQL error codes (MAX_ENROLLMENTS, SAME_PROFESSOR, etc.)
- Test network errors with different status codes
- Test validation errors with field details
- Test HTTP error handling (500, 0, 400)
- Test unknown/null/undefined error handling
- Test notification display with suggestions
Increases code coverage for the error handling layer.
- Create enrollment.constants.ts with MAX_SUBJECTS, MAX_CREDITS, CREDITS_PER_SUBJECT
- Create error-messages.constants.ts with ERROR_CODES and RESTRICTION_TRANSLATIONS
- Remove empty folders: core/state, shared/directives, features/dashboard
- Use 'as const' for type-safe constants
This improves maintainability by having a single source of truth for business rules.
- Create favicon.svg with blue "S" logo matching app branding
- Update index.html to reference favicon.svg instead of favicon.ico
- Add favicon.svg to angular.json assets configuration
Fixes DEF-004: Browser was showing 404 error for missing favicon.ico
in the console.
Use ternary operator to display correct singular/plural form:
- "1 compañero" (singular) when count === 1
- "X compañeros" (plural) otherwise
Fixes DEF-003: Page incorrectly showed "1 compañeros" instead of
"1 compañero" when there was exactly one classmate.
Add translateReason() method to convert API messages to Spanish:
- "Already enrolled" -> "Ya inscrito"
- "Already have a subject with this professor" -> "Ya tienes una materia con este profesor"
- "Maximum 3 subjects reached" -> "Máximo 3 materias alcanzado"
Apply translation to both warning text and tooltip.
Fixes DEF-002: Messages were displaying in English instead of Spanish,
breaking UI language consistency.