Commit Graph

29 Commits

Author SHA1 Message Date
Andrés Eduardo García Márquez 1318b4dd1b test(e2e): add smoke tests for CI/CD post-deploy validation
CI/CD Pipeline / deploy (push) Failing after 28s Details
CI/CD Pipeline / rollback (push) Has been skipped Details
CI/CD Pipeline / smoke-tests (push) Has been skipped Details
CI/CD Pipeline / e2e-tests (push) Has been skipped Details
- Add smoke.spec.ts with 11 production-ready tests
- Configure playwright for BASE_URL environment variable
- Tests verify: login page, register, activation, API endpoints
- Validate business rules: 10 subjects, 5 professors, 3 credits

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 08:21:24 -05:00
Andrés Eduardo García Márquez 3c0181b30d test(e2e): add Playwright tests for auth and enrollment
New E2E test suites:

activation.spec.ts:
- Account activation flow with valid code
- Invalid/expired code handling
- Resend code functionality
- Redirect behavior for inactive accounts

auth.spec.ts:
- Login with valid/invalid credentials
- Registration flow
- Password reset flow
- Session persistence

enrollment-restrictions.spec.ts:
- Maximum 3 subjects per student
- Same professor restriction
- Available subjects filtering

role-access.spec.ts:
- Admin-only routes protection
- Student dashboard access
- Guest redirection to login

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 07:43:13 -05:00
Andrés Eduardo García Márquez 1d93d04497 feat(admin): add admin panel for student management
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.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 07:42:50 -05:00
Andrés Eduardo García Márquez 8365830a96 feat(auth): add account activation UI and improve login flow
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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 07:42:30 -05:00
Andrés Eduardo García Márquez 847b494a71 feat(auth): implement account activation backend
Add complete backend support for student account activation:

Persistence layer:
- StudentConfiguration: add IsActive, ActivationCode, ActivationCodeExpiry mappings
- Migration: AddStudentActivation with new columns
- StudentRepository: implement GetByActivationCodeAsync

Application layer:
- ActivateAccountCommand: validates code and activates student account
- RegenerateActivationCodeCommand: generates new code with expiry
- CreateStudentCommand: generates activation code on registration
- StudentDto: expose activation status fields
- Auth Queries: add activation status lookup

API layer:
- Mutation: add activateAccount and regenerateActivationCode endpoints
- Query: add activation status queries

Tests:
- Unit tests for activation commands
- Integration tests for enrollment flow with activation

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 07:42:05 -05:00
Andrés Eduardo García Márquez 0d9c3d46ca feat(domain): add student account activation fields
CI/CD Pipeline / test (push) Failing after 1m18s Details
CI/CD Pipeline / deploy (push) Has been skipped Details
CI/CD Pipeline / smoke-tests (push) Has been skipped Details
CI/CD Pipeline / rollback (push) Has been skipped Details
Add activation-related properties to Student entity:
- IsActive: boolean flag for account activation status
- ActivationCode: 6-digit code for email verification
- ActivationCodeExpiry: expiration timestamp for the code

Add repository method GetByActivationCodeAsync for code lookup.

These changes support the new student self-registration flow where
accounts require email verification before accessing the system.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-09 07:41:42 -05:00
Andrés Eduardo García Márquez a9e4de63c9 ci: optimize deployment workflow for k3s
Deploy to k3s / deploy (push) Failing after 27s Details
- 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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 13:34:38 -05:00
Andrés Eduardo García Márquez 17706676d5 fix(docker): alpine compatibility and k3s deployment fixes
Build and Deploy to k3s / build-api (push) Failing after 32s Details
Build and Deploy to k3s / build-frontend (push) Failing after 30s Details
Build and Deploy to k3s / deploy (push) Has been skipped Details
- 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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 11:53:28 -05:00
Andrés Eduardo García Márquez ff7f43b053 feat: add CI/CD pipeline, password recovery, and QA improvements
- Add Gitea Actions workflow for automated k3s deployment
- Implement password recovery with recovery codes (no email needed)
- Fix unenroll mutation (missing studentId parameter)
- Fix dashboard handling for expired sessions
- Add optimized Docker builds with caching
- Add k3s all-in-one deployment manifest
- Add QA test report and recommendations

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 10:49:32 -05:00
Andrés Eduardo García Márquez 9df6196808 feat(frontend): implement student self-registration and dashboard
- 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)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 09:37:19 -05:00
Andrés Eduardo García Márquez 4ede4d4cef refactor(backend): add validation patterns, query validators, and test builders
- Add centralized ValidationPatterns with XSS protection and name regex
- Add query validators (GetClassmates, GetStudentById, GetStudentsPaged, GetAvailableSubjects)
- Add ClassmateInfo read model for optimized query projections
- Add test builders (Student, Subject, Professor, Enrollment) for cleaner tests
- Improve repository interfaces with XML documentation
- Refactor EnrollmentRepository for better performance
- Update EnrollmentDomainService with additional validation helpers

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 09:18:27 -05:00
Andrés Eduardo García Márquez 815ebf5673 feat(frontend): implement authentication UI and guards
- 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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 09:14:52 -05:00
Andrés Eduardo García Márquez 7916d1d95f feat(backend): implement JWT authentication and authorization
- Add User entity with roles (Admin, Student)
- Create JWT service for token generation/validation
- Create password service using PBKDF2
- Add login and register GraphQL mutations
- Apply [Authorize] attributes to protected mutations
- DeleteStudent requires Admin role
- UpdateStudent/Enroll/Unenroll require owner or admin
- Add admin user creation on startup

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 09:14:42 -05:00
Andrés Eduardo García Márquez 32d895f78c fix(frontend): resolve edit student navigation and signal timing issues
- 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

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 08:41:14 -05:00
Andrés Eduardo García Márquez a9eea7e793 fix(frontend): enforce no-explicit-any and fix test stability
- 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.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 00:31:16 -05:00
Andrés Eduardo García Márquez 275e377492 refactor(frontend): use centralized constants and add JSDoc
- 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.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 00:31:05 -05:00
Andrés Eduardo García Márquez 1b41224514 chore(frontend): add Prettier configuration
- Configure printWidth: 100, singleQuote: true, trailingComma: es5
- Add Angular template parser override
- Ignore dist, node_modules, .angular, coverage
- Ignore generated GraphQL types

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 00:30:51 -05:00
Andrés Eduardo García Márquez a79488bd2d test(frontend): add comprehensive ErrorHandlerService tests
- 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.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 00:30:35 -05:00
Andrés Eduardo García Márquez 833c49adc9 feat(frontend): add reusable form validators
- Create emailValidator with stricter pattern than Angular's built-in
- Create nameValidator with configurable minLength, maxLength, allowNumbers
- Support for Spanish characters (accents, ñ, ü)
- Export validators from shared module
- Add JSDoc documentation with usage examples

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 00:30:20 -05:00
Andrés Eduardo García Márquez 6201adb093 feat(frontend): add centralized constants for enrollment limits
- 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.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 00:30:09 -05:00
Andrés Eduardo García Márquez 1f6a5c393b fix(frontend): add favicon and update references
- 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.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 00:02:19 -05:00
Andrés Eduardo García Márquez 2bbffe60ef fix(frontend): correct pluralization in classmates count
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.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 00:02:09 -05:00
Andrés Eduardo García Márquez 4f5610974f fix(frontend): translate enrollment restriction messages to Spanish
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.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-08 00:02:00 -05:00
Andrés Eduardo García Márquez 51a8f665b9 chore(backend): add solution file and build configuration
- StudentEnrollment.sln with all project references
- Directory.Build.props for shared build settings

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 23:01:13 -05:00
Andrés Eduardo García Márquez e30424cd1f feat(frontend): add Angular 21 SPA with Material Design
Core:
- Apollo Angular for GraphQL integration
- Student and Enrollment services
- Connectivity monitoring with health checks
- Error handling with user-friendly messages

Features:
- Students: list, create, edit, delete
- Enrollment: subject selection with validation feedback
- Classmates: view students in shared subjects

Shared Components:
- ConfirmDialog, EmptyState, LoadingSpinner
- ConnectivityOverlay for offline detection
- Custom pipes (credits, initials)

UI:
- Angular Material with custom theme
- Responsive layout with navigation
- Real-time validation feedback

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 23:00:12 -05:00
Andrés Eduardo García Márquez 2b323adcb4 feat(host): add composition root and API configuration
- Program.cs with dependency injection setup
- Database connection retry logic with detailed logging
- Serilog structured logging configuration
- CORS configuration from environment variables
- Response compression (Brotli + Gzip)
- Rate limiting for GraphQL endpoint
- Health checks with database verification
- OWASP security headers middleware
- Output caching for read-heavy operations

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 22:59:56 -05:00
Andrés Eduardo García Márquez a7dde52e02 feat(adapters): add driven and driving adapters
Driven Adapters (Persistence):
- AppDbContext with EF Core configurations
- Repository implementations (Student, Subject, Professor, Enrollment)
- UnitOfWork pattern for transactions
- DataLoaders for GraphQL N+1 optimization
- Database seeding with 5 professors and 10 subjects
- EF Core migrations for SQL Server

Driving Adapters (API):
- GraphQL API with HotChocolate
- Query and Mutation types
- Type definitions for all entities
- GraphQLErrorFilter for domain exceptions

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 22:59:38 -05:00
Andrés Eduardo García Márquez 5f33edc501 feat(application): add CQRS application layer
Commands:
- CreateStudent, UpdateStudent, DeleteStudent
- EnrollStudent, UnenrollStudent

Queries:
- GetStudents, GetStudentById, GetStudentsPaged
- GetSubjects, GetAvailableSubjects
- GetProfessors
- GetClassmates

DTOs:
- StudentDto, SubjectDto, ProfessorDto, EnrollmentDtos

Validation:
- FluentValidation with ValidationBehavior pipeline
- EnrollStudentValidator for input validation

Uses MediatR for command/query dispatching

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 22:59:23 -05:00
Andrés Eduardo García Márquez ffc879fe8a feat(domain): add core domain layer
Entities:
- Student: core entity with email validation
- Subject: course with credits (3 each)
- Professor: instructor managing 2 subjects
- Enrollment: student-subject relationship

Value Objects:
- Email: validated email with domain rules

Domain Services:
- EnrollmentDomainService: validates business rules
  - Max 3 subjects per student (9 credits)
  - No duplicate professor constraint

Ports:
- Repository interfaces for dependency inversion

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-07 22:59:10 -05:00