12 KiB
Architecture Documentation
Overview
This document describes the architecture of the Bootstrap App, which follows clean architecture principles with clear separation of concerns, dependency injection, and modern security practices.
Architecture Principles
Clean Architecture
The application follows Uncle Bob's Clean Architecture principles:
- Independence of Frameworks: The architecture doesn't depend on specific frameworks
- Testability: Business rules can be tested without UI, database, or external services
- Independence of UI: The UI can change without changing the business rules
- Independence of Database: Business rules are not bound to the database
- Independence of External Services: Business rules know nothing about the outside world
SOLID Principles
- Single Responsibility: Each class/module has one reason to change
- Open/Closed: Open for extension, closed for modification
- Liskov Substitution: Objects should be replaceable with instances of their subtypes
- Interface Segregation: Many client-specific interfaces are better than one general-purpose interface
- Dependency Inversion: Depend on abstractions, not concretions
Layer Architecture
1. Presentation Layer (controller/)
Responsibility: Handle HTTP requests and responses
- Input validation and sanitization
- Request/response mapping
- Error handling and status codes
- Authentication and authorization checks
Components:
- Controllers for each domain
- Middleware for cross-cutting concerns
- Request/response DTOs
Dependencies: Service Layer
2. Business Logic Layer (service/)
Responsibility: Implement business rules and orchestrate operations
- Business rule validation
- Transaction management
- Cross-domain operations
- Business logic orchestration
Components:
- Service classes for each domain
- Business rule validators
- Transaction coordinators
Dependencies: Repository Layer, External Services
3. Data Access Layer (repository/)
Responsibility: Data persistence and retrieval
- Database operations
- Query optimization
- Data mapping
- Cache management
Components:
- Repository interfaces and implementations
- Database models
- Query builders
Dependencies: Database, Cache
4. Domain Layer (model/)
Responsibility: Core business entities and rules
- Domain entities
- Value objects
- Domain services
- Business rule definitions
Components:
- Entity models
- Validation rules
- Domain constants
- Business exceptions
Dependencies: None (should be isolated)
5. Infrastructure Layer (utl/)
Responsibility: External concerns and utilities
- Database configuration
- Logging
- Security utilities
- Configuration management
- External service integrations
Components:
- Database connection and migration
- Logging infrastructure
- Security middleware
- Configuration loaders
- Utility functions
Component Interaction Flow
HTTP Request
↓
[Middleware Stack] ← Security, Logging, CORS
↓
[Controller] ← Request handling, validation
↓
[Service] ← Business logic, orchestration
↓
[Repository] ← Data access, persistence
↓
[Database/Cache] ← Data storage
Dependency Injection
The application uses Uber Dig for dependency injection, providing:
- Loose Coupling: Components depend on interfaces, not implementations
- Testability: Easy to mock dependencies for testing
- Configuration: Centralized dependency configuration
- Lifecycle Management: Automatic instance management
DI Container Structure
// Database and core services
di.Provide(func() *gorm.DB { ... })
di.Provide(NewCache)
// Repositories
di.Provide(NewUserRepository)
di.Provide(NewRoleRepository)
// ...
// Services
di.Provide(NewUserService)
di.Provide(NewAuthService)
// ...
// Controllers
di.Invoke(NewUserController)
di.Invoke(NewAuthController)
// ...
Security Architecture
Authentication Flow
Client Request
↓
[CORS Middleware] ← Cross-origin validation
↓
[Security Headers] ← Security headers injection
↓
[Rate Limiting] ← Request rate validation
↓
[JWT Validation] ← Token verification
↓
[Permission Check] ← Authorization validation
↓
[Controller] ← Authorized request processing
Security Layers
- Network Security: CORS, security headers, HTTPS
- Authentication: JWT token validation
- Authorization: Role-based access control
- Input Security: Sanitization, validation, size limits
- Audit Security: Logging, monitoring, alerting
Database Architecture
Entity Relationships
Users
├── UserRoles (Many-to-Many with Roles)
├── AuditLogs (One-to-Many)
└── SecurityEvents (One-to-Many)
Roles
├── UserRoles (Many-to-Many with Users)
└── RolePermissions (Many-to-Many with Permissions)
Permissions
└── RolePermissions (Many-to-Many with Roles)
SystemConfig (Standalone)
Base Model Pattern
All entities inherit from BaseModel:
type BaseModel struct {
ID string `json:"id" gorm:"primary_key"`
DateCreated time.Time `json:"dateCreated"`
DateUpdated time.Time `json:"dateUpdated"`
}
Benefits:
- Consistent ID generation (UUID)
- Automatic timestamp management
- Uniform audit trail
- Simplified queries
API Architecture
RESTful Design
- Resource-based URLs:
/api/v1/users/{id} - HTTP Methods: GET, POST, PUT, DELETE, PATCH
- Status Codes: Appropriate HTTP status codes
- Content Negotiation: JSON request/response format
API Versioning
- URL Versioning:
/api/v1/ - Backward Compatibility: Maintain older versions
- Migration Path: Clear upgrade documentation
Response Format
type APIResponse struct {
Success bool `json:"success"`
Data interface{} `json:"data,omitempty"`
Message string `json:"message,omitempty"`
Error string `json:"error,omitempty"`
Code int `json:"code,omitempty"`
}
Pagination
type PaginatedResponse struct {
APIResponse
Pagination PaginationResponse `json:"pagination"`
}
Middleware Architecture
Middleware Stack (Order Matters)
- Recovery: Panic recovery and logging
- Security Headers: OWASP security headers
- CORS: Cross-origin resource sharing
- Rate Limiting: Request rate limiting
- Request Logging: HTTP request/response logging
- Authentication: JWT token validation
- Authorization: Permission validation
- Input Validation: Request sanitization
Security Middleware Components
- Rate Limiter: Token bucket algorithm with IP-based limits
- Input Sanitizer: XSS protection, SQL injection prevention
- Content Validator: Content-type and size validation
- User Agent Validator: Bot detection and blocking
Configuration Architecture
Configuration Layers
- Environment Variables: Runtime configuration
- Database Config: Dynamic configuration storage
- Default Values: Fallback configuration
- Validation: Configuration validation rules
Configuration Categories
- Security: JWT secrets, encryption keys, password policies
- Database: Connection settings, migration options
- API: Rate limits, timeouts, CORS settings
- Logging: Log levels, retention policies
- Features: Feature flags, service toggles
Error Handling Architecture
Error Types
- Business Errors: Domain rule violations
- Validation Errors: Input validation failures
- System Errors: Infrastructure failures
- Security Errors: Authentication/authorization failures
Error Propagation
Controller → Service → Repository
↓ ↓ ↓
HTTP Business Data
Error Error Error
Error Response Format
type HTTPError struct {
Code int `json:"code"`
Message string `json:"message"`
Details map[string]interface{} `json:"details,omitempty"`
}
Logging Architecture
Log Levels
- DEBUG: Detailed information for debugging
- INFO: General information about application flow
- WARN: Warning messages for potential issues
- ERROR: Error messages for failures
- PANIC: Critical errors that cause application termination
Log Categories
- Application Logs: General application flow
- HTTP Logs: Request/response logging
- Security Logs: Authentication, authorization events
- Audit Logs: User actions and system changes
- Performance Logs: Response times, resource usage
Log Format
[TIMESTAMP] LEVEL [CALLER] MESSAGE
[2024-01-01 12:00:00] INFO [main.go:42] Starting application
Caching Architecture
Cache Layers
- Application Cache: In-memory cache for frequently accessed data
- Database Cache: GORM query result caching
- HTTP Cache: Response caching for static content
Cache Strategies
- TTL-based: Time-to-live expiration
- LRU: Least recently used eviction
- Size-based: Memory usage limits
- Manual: Explicit cache invalidation
Testing Architecture
Test Layers
- Unit Tests: Individual component testing
- Integration Tests: Component interaction testing
- API Tests: End-to-end API testing
- Security Tests: Security vulnerability testing
Test Structure
test/
├── unit/ # Unit tests
├── integration/ # Integration tests
├── api/ # API tests
├── fixtures/ # Test data
└── helpers/ # Test utilities
Mock Strategy
- Interface Mocking: Mock external dependencies
- Database Mocking: In-memory database for tests
- HTTP Mocking: Mock external API calls
Scalability Considerations
Horizontal Scaling
- Stateless Design: No server-side session storage
- Database Connection Pooling: Efficient connection management
- Load Balancer Friendly: Health checks and graceful shutdown
Performance Optimization
- Database Indexing: Optimized query performance
- Pagination: Limit result set sizes
- Caching: Reduce database load
- Compression: Reduce bandwidth usage
Monitoring Points
- Health Endpoints: Application health status
- Metrics Collection: Performance metrics
- Log Aggregation: Centralized logging
- Alert Configuration: Automated alerting
Deployment Architecture
Build Process
- Dependency Resolution:
go mod download - Code Generation: Swagger documentation
- Compilation: Static binary creation
- Testing: Automated test execution
- Packaging: Container image creation
Deployment Strategies
- Blue-Green: Zero-downtime deployments
- Rolling: Gradual instance replacement
- Canary: Phased traffic migration
- Feature Flags: Runtime feature control
Environment Configuration
- Development: Local development setup
- Staging: Production-like testing environment
- Production: Live application environment
- DR: Disaster recovery environment
Security Considerations
Threat Model
- Authentication Bypass: JWT validation, rate limiting
- Authorization Escalation: RBAC, permission validation
- Data Injection: Input sanitization, parameterized queries
- Data Exposure: Access logging, encryption at rest
- DoS Attacks: Rate limiting, request size limits
Security Controls
- Input Validation: All user inputs validated
- Output Encoding: XSS prevention
- Access Control: Role-based permissions
- Audit Logging: All actions logged
- Encryption: Sensitive data encrypted
Future Considerations
Planned Enhancements
- Microservices: Service decomposition
- Event Sourcing: Event-driven architecture
- CQRS: Command query responsibility segregation
- GraphQL: Alternative API interface
- Real-time: WebSocket support
Technology Evolution
- Database: PostgreSQL migration path
- Cache: Redis integration
- Messaging: Event bus implementation
- Search: Full-text search capabilities
- Analytics: Business intelligence integration