📋 Changelog
All notable changes to Springular are documented here.
The format is based on Keep a Changelog.
[Unreleased]
Documentation
- Spec Doc Product Specification: Complete product documentation for version control for AI-generated systems
- Product vision, business strategy, and market analysis
- Epic breakdown and solution architecture
- UX vision and Cursor integration strategy
- Working HTML prototype (
prototype-instant-preview.html) - Git history analysis proving the paradigm shift (205 commits, 71% specs)
Configuration (Feature 3 ✅)
- Dev/Prod Separation: Clear separation with consistent naming (
application.yml= dev,application-prod.yml= prod) - Production Spring Profile: Explicit
application-prod.ymlwith devtools disabled,ddl-auto: validate, minimal logging - Frontend Runtime Config:
ConfigServicewithAPP_INITIALIZERfor runtime configuration loading - Docker Production Setup:
docker-compose.ymlwith port 80, prod profile, runtime Stripe key injection. - Profile-Based Logging:
logback-spring.xmlwith verbose dev logging, minimal prod logging - Docker Entrypoint: Runtime config generation from environment variables (no rebuild needed for config changes)
Reliability (Feature 2 ✅)
- Dependency Injection:
@AllArgsConstructor→@RequiredArgsConstructorwithfinalfields (5 classes) - Transaction Management: Added
@Transactionalto state-changing methods inRefreshTokenService - Exception Handling: New
PaymentProcessingException,JwtExceptionhandler - Null Safety: Added parameter validation in
UserServiceImpl - Code Cleanup: Removed unused
updateExistingOAuthUser()method and dead constant - Frontend: Fixed error message display (
Description→message) in auth components
Security (Feature 1 ✅)
- CORS: Configurable origin patterns with credentials support
- CSRF: Cookie-based protection with Angular interceptor integration
- JWT: Comprehensive token validation with proper error handling
- Rate Limiting: Bucket4j-based limiting on auth endpoints (10 req/min default)
- Password: Minimum 12 character length validation
Added
application-prod.yml- Production Spring profile configurationConfigService- Runtime configuration loader for frontendAppConfiginterface - Type-safe configuration definitiondocker-entrypoint.sh- Generates runtime config from environment variablesdocker-compose.yml- Docker Compose configuration for all environmentsRateLimitService- Token bucket rate limiting using Bucket4jRateLimitHeaders- Constants for rate limit HTTP headersRateLimitProperties- Configurable rate limit settingsGlobalExceptionHandler- Centralized exception handling with@RestControllerAdviceResourceNotFoundException- Standard 404 exceptionTooManyRequestsException- Rate limit 429 exceptionErrorResponse- Consistent error response DTOValidPassword- Custom password validation annotationPasswordValidator- Password length validation (12+ chars)application-dev.yml- Development profile configuration- Spring Boot Actuator for health/metrics endpoints
- Bucket4j dependency for rate limiting
- Jackson JSR310 for Java 8+ date/time serialization
- Checkstyle configuration for code quality
Changed
main.ts- AddedAPP_INITIALIZERforConfigService(standalone bootstrap)Dockerfile(client) - Added entrypoint script for runtime config generationlogback-spring.xml- Profile-based logging (!prod= verbose,prod= minimal)docker-compose.yml- Added dev header comment for clarityWebSecurityConfig- CORS with origin patterns, CSRF with cookie tokensJwtTokenProvider- AddedvalidateToken()method with comprehensive error handlingJwtTokenAuthenticationFilter- Uses provider's validation methodAuthenticationController- Rate limiting on login/register, validation annotationsAuthenticationServiceImpl- Fixed@Transactionalannotations, safe Optional handlingSignupRequest- Added@ValidPasswordannotationLoginRequest- Added@EmailannotationAppWebUtils- AddedgetClientIP()utility methodauth.interceptor.ts- CSRF token header for state-changing requestsenvironment.prod.ts- FixedapiUrlfor nginx proxy (empty string)
Fixed
- CORS wildcard configuration replaced with origin patterns
- CSRF protection enabled (was disabled globally)
- JWT tokens now properly validated before authentication
Optional.get()replaced withorElseThrow()for safety@Transactional(readOnly = true)fixed for methods that write to database
Infrastructure
- HikariCP connection pool configuration
- Spring Actuator endpoints (health, info, metrics)
- Secure logging configuration (SQL parameters hidden)
[1.0.0] - Initial Release
Features
- User authentication (email/password)
- Social login (Google OAuth2)
- JWT access and refresh tokens
- Stripe payments integration
- SendGrid email integration
- Angular 19 frontend
- Spring Boot 3.2 backend
- PostgreSQL database
- Docker deployment support