RACEMES Template Refactoring - Piano Architetturale Dettagliato
1. EXECUTIVE SUMMARY
Obiettivo
Migrazione della struttura templates dal layout monolitico attuale a un'architettura feature-first allineata con il backend già refactorizzato, ottimizzando maintainability, scalabilità e developer experience.
Scope
- 55 template files identificati
- 10 features principali mappate
- Allineamento con struttura backend
/features/ - Zero downtime migration strategy
- Performance optimization (target: riduzione 30-50% bundle size)
Success Metrics
- Migrazione completata senza interruzioni di servizio
- Riduzione del 40% del tempo di development per nuove features
- Miglioramento del 30% nelle performance di rendering
- 100% backward compatibility durante la transizione
2. ANALISI STATO ATTUALE
2.1 Template Structure Current State
templates/
├── 404.html, 500.html # Error templates (SHARED)
├── base.html # Base template (SHARED)
├── index.html, simple_index.html # Dashboard templates
├── admin/ # Admin feature
│ ├── database/ (3 files)
│ ├── rbac/ (3 files)
│ └── legacy files (2 files)
├── auth/ (6 files) # Authentication feature
├── cognition/ (3 files) # AI/Cognition feature
├── configuration/ (2 files) # Configuration feature
├── documentation/ (7 files) # Documentation feature
├── form_builder/ (4 files) # Form builder feature
├── public/ (2 files) # Public pages
└── ROOT LEVEL TEMPLATES (15+ files) # MIXED FEATURES - NEEDS MIGRATION
2.2 Feature Mapping Analysis
| Current Template | Feature | Priority | Risk Level |
|---|---|---|---|
base.html |
shared | P0 | HIGH |
404.html, 500.html |
shared | P0 | LOW |
auth/* |
auth | P1 | MEDIUM |
admin/* |
admin | P1 | MEDIUM |
cognition/* |
cognition | P2 | LOW |
configuration/* |
configuration | P2 | MEDIUM |
documentation/* |
documentation | P3 | LOW |
form_builder/* |
form_builder | P1 | HIGH |
public/* |
public | P3 | LOW |
index.html |
dashboard | P1 | HIGH |
monitoring.html |
monitoring | P2 | MEDIUM |
assets.html |
assets | P2 | MEDIUM |
rules*.html |
rules | P2 | HIGH |
action_*.html |
actions | P2 | HIGH |
event-*.html |
events | P2 | MEDIUM |
ai_providers.html |
ai | P2 | MEDIUM |
2.3 Dependencies Analysis
graph TD
A[base.html] --> B[All Feature Templates]
B --> C[Error Templates 404/500]
D[Shared Components] --> E[Navigation]
D --> F[Footer]
D --> G[Sidebar]
H[Static Assets] --> I[CSS/JS Dependencies]
3. ARCHITETTURA TARGET
3.1 Feature-First Template Structure
templates/
├── shared/ # Shared components
│ ├── base.html
│ ├── errors/
│ │ ├── 404.html
│ │ └── 500.html
│ ├── components/
│ │ ├── navigation.html
│ │ ├── sidebar.html
│ │ └── footer.html
│ └── layouts/
│ ├── main.html
│ ├── auth.html
│ └── public.html
├── features/
│ ├── dashboard/
│ │ ├── index.html
│ │ ├── simple_index.html
│ │ └── components/
│ ├── auth/
│ │ ├── login.html
│ │ ├── oauth_config.html
│ │ ├── user_profile.html
│ │ ├── notifications.html
│ │ ├── pending_approval.html
│ │ ├── admin_users.html
│ │ └── edit_oauth_provider.html
│ ├── admin/
│ │ ├── role_management.html
│ │ ├── role_permissions.html
│ │ ├── database/
│ │ │ ├── index.html
│ │ │ ├── export.html
│ │ │ └── import.html
│ │ └── rbac/
│ │ ├── roles.html
│ │ ├── role_detail.html
│ │ └── permission_assignment.html
│ ├── configuration/
│ │ ├── index.html
│ │ ├── assistant_types.html
│ │ └── system_console_log.html
│ ├── monitoring/
│ │ ├── index.html
│ │ └── rule_monitoring.html
│ ├── assets/
│ │ └── index.html
│ ├── rules/
│ │ ├── index.html
│ │ ├── redesign.html
│ │ └── components/
│ ├── actions/
│ │ ├── builder.html
│ │ ├── executions.html
│ │ └── components/
│ ├── ai/
│ │ ├── providers.html
│ │ └── cognition/
│ │ ├── agent.html
│ │ ├── assistant.html
│ │ └── chat.html
│ ├── events/
│ │ ├── management.html
│ │ ├── prediction.html
│ │ └── wall.html
│ ├── form_builder/
│ │ ├── index.html
│ │ ├── view_form.html
│ │ └── widget_runtime.html
│ └── documentation/
│ ├── index.html
│ ├── api.html
│ ├── architecture.html
│ ├── deployment.html
│ ├── race_introduction.html
│ ├── troubleshooting.html
│ └── user_guide.html
└── public/
├── landing.html
└── documentation.html
3.2 Template Loader Configuration
# Flask template loader configuration
app.jinja_loader = ChoiceLoader([
FileSystemLoader('templates/shared'), # Highest priority
FileSystemLoader('templates/features'), # Feature templates
FileSystemLoader('templates/public'), # Public templates
FileSystemLoader('templates') # Fallback during migration
])
4. MIGRATION STRATEGY
4.1 Migration Phases Overview
| Phase | Focus | Risk | Duration | Templates |
|---|---|---|---|---|
| Phase 1 | Shared & Low Risk | LOW | 2 days | 15 templates |
| Phase 2 | Medium Risk Features | MEDIUM | 3 days | 20 templates |
| Phase 3 | High Risk Features | HIGH | 4 days | 15 templates |
| Phase 4 | Cleanup & Optimization | LOW | 2 days | 5 templates |
4.2 Phase 1: Foundation & Low Risk (Days 1-2)
Obiettivo: Stabilire base architetturale e migrare template a basso rischio
Templates da migrare:
SHARED COMPONENTS:
- 404.html → shared/errors/404.html
- 500.html → shared/errors/500.html
- base.html → shared/base.html (con modularizzazione)
LOW RISK FEATURES:
- documentation/* → features/documentation/*
- public/* → public/*
- cognition/* → features/ai/cognition/*
Tasks: 1. Create shared template structure 2. Modularize base.html into components 3. Migrate documentation templates 4. Migrate public templates 5. Update route references 6. Test basic navigation and error handling
Route Updates Required:
# Before
render_template('404.html')
render_template('documentation/api.html')
# After
render_template('shared/errors/404.html')
render_template('features/documentation/api.html')
4.3 Phase 2: Medium Risk Features (Days 3-5)
Obiettivo: Migrare features con dipendenze moderate
Templates da migrare:
- auth/* → features/auth/*
- admin/* → features/admin/*
- configuration/* → features/configuration/*
- monitoring.html → features/monitoring/index.html
- assets.html → features/assets/index.html
- ai_providers.html → features/ai/providers.html
Critical Dependencies: - Authentication flow templates - Admin interface components - Configuration management UI
Tasks: 1. Migrate auth templates with session handling 2. Migrate admin templates with RBAC components 3. Update configuration template references 4. Test authentication flows 5. Validate admin functionalities
4.4 Phase 3: High Risk Features (Days 6-9)
Obiettivo: Migrare template critici business-logic intensive
Templates da migrare:
HIGH COMPLEXITY:
- index.html → features/dashboard/index.html
- rules*.html → features/rules/*
- action_*.html → features/actions/*
- event-*.html → features/events/*
- form_builder/* → features/form_builder/*
Risk Mitigation: - Blue-green deployment per template - Feature flags for progressive rollout - Comprehensive A/B testing - Real-time monitoring
Tasks: 1. Migrate dashboard with all widgets 2. Migrate rules engine templates 3. Migrate action builder (already partially modernized) 4. Migrate event management templates 5. Update form builder integration 6. Extensive integration testing
4.5 Phase 4: Cleanup & Optimization (Days 10-11)
Obiettivo: Finalizzazione e ottimizzazione
Tasks: 1. Remove legacy template paths 2. Update all route references 3. Optimize template inheritance 4. Performance testing and optimization 5. Documentation update 6. Team training on new structure
5. ROUTE MAPPING UPDATES
5.1 Flask Route Updates Strategy
# Template path resolver utility
class TemplatePathResolver:
"""Utility to handle template path migration"""
MIGRATION_MAP = {
# Phase 1 mappings
'404.html': 'shared/errors/404.html',
'500.html': 'shared/errors/500.html',
'documentation/api.html': 'features/documentation/api.html',
'public/landing.html': 'public/landing.html',
# Phase 2 mappings
'auth/login.html': 'features/auth/login.html',
'admin/role_management.html': 'features/admin/role_management.html',
'configuration.html': 'features/configuration/index.html',
'monitoring.html': 'features/monitoring/index.html',
'assets.html': 'features/assets/index.html',
'ai_providers.html': 'features/ai/providers.html',
# Phase 3 mappings
'index.html': 'features/dashboard/index.html',
'rules.html': 'features/rules/index.html',
'rules_redesign.html': 'features/rules/redesign.html',
'action_builder.html': 'features/actions/builder.html',
'action_executions.html': 'features/actions/executions.html',
'event-management.html': 'features/events/management.html',
'event-prediction.html': 'features/events/prediction.html',
'event-wall.html': 'features/events/wall.html',
'form_builder/index.html': 'features/form_builder/index.html'
}
@classmethod
def resolve_template_path(cls, template_path: str) -> str:
"""Resolve template path during migration"""
return cls.MIGRATION_MAP.get(template_path, template_path)
# Helper decorator for gradual migration
def migrate_template(old_path: str, new_path: str):
def decorator(func):
def wrapper(*args, **kwargs):
# During migration, try new path first, fallback to old
try:
return render_template(new_path, **kwargs)
except TemplateNotFound:
return render_template(old_path, **kwargs)
return wrapper
return decorator
5.2 Route Updates by Feature
# PHASE 1 UPDATES
# Error handlers
@app.errorhandler(404)
def page_not_found(e):
return render_template('shared/errors/404.html'), 404
@app.errorhandler(500)
def internal_server_error(e):
return render_template('shared/errors/500.html'), 500
# PHASE 2 UPDATES
# Auth routes (auth_routes.py)
@auth_bp.route('/login')
def login():
return render_template('features/auth/login.html', oauth_providers=oauth_providers)
# Admin routes (rbac_routes.py)
@rbac_bp.route('/roles')
def roles():
return render_template('features/admin/rbac/roles.html', roles=roles_data)
# PHASE 3 UPDATES
# Dashboard route (main app)
@app.route('/')
def index():
return render_template('features/dashboard/index.html', dashboard_data=data)
# Rules routes
@rules_bp.route('/rules')
def rules():
return render_template('features/rules/index.html', rules=rules_data)
6. RISK ASSESSMENT & MITIGATION
6.1 High Risk Areas
| Risk Area | Impact | Probability | Mitigation Strategy |
|---|---|---|---|
| Template Inheritance Breakage | HIGH | MEDIUM | - Gradual migration with fallbacks - Comprehensive testing - Template loader priority |
| Route Reference Errors | HIGH | MEDIUM | - Automated route scanning - Template path resolver - Staged deployment |
| Performance Degradation | MEDIUM | LOW | - Template caching optimization - Asset bundling review - Performance monitoring |
| User Experience Disruption | HIGH | LOW | - Blue-green deployment - Feature flags - Real-time monitoring |
| Developer Workflow Impact | MEDIUM | MEDIUM | - Clear documentation - IDE configuration updates - Team training |
6.2 Mitigation Strategies
6.2.1 Template Inheritance Safety
# Enhanced template loader with fallback and logging
class MigrationAwareTemplateLoader(FileSystemLoader):
def __init__(self, searchpath, **kwargs):
super().__init__(searchpath, **kwargs)
self.migration_log = []
def get_source(self, environment, template):
try:
# Try new structure first
return super().get_source(environment, template)
except TemplateNotFound as e:
# Log migration needed
self.migration_log.append(template)
# Try legacy path
legacy_path = self._resolve_legacy_path(template)
if legacy_path:
return super().get_source(environment, legacy_path)
raise e
6.2.2 Progressive Migration with Feature Flags
class TemplateMigrationManager:
def __init__(self, app):
self.app = app
self.feature_flags = {
'USE_NEW_DASHBOARD_TEMPLATES': False,
'USE_NEW_AUTH_TEMPLATES': False,
'USE_NEW_ADMIN_TEMPLATES': False,
}
def render_migrated_template(self, template_name, **context):
feature_flag = self._get_feature_flag(template_name)
if self.feature_flags.get(feature_flag, False):
new_path = self._get_migrated_path(template_name)
return render_template(new_path, **context)
return render_template(template_name, **context)
6.2.3 Automated Testing Framework
# Template migration testing suite
class TemplateMigrationTester:
def __init__(self, app):
self.app = app
self.test_routes = []
self.load_test_routes()
def test_template_migration(self, route_path, expected_template):
"""Test that route renders expected template"""
with self.app.test_client() as client:
response = client.get(route_path)
assert response.status_code == 200
# Verify template was used
assert expected_template in response.get_data(as_text=True)
def run_migration_tests(self):
"""Run all migration tests"""
for route, template in self.test_routes:
self.test_template_migration(route, template)
7. TESTING STRATEGY
7.1 Testing Framework Architecture
Testing Strategy:
├── Unit Tests
│ ├── Template rendering tests
│ ├── Route mapping tests
│ └── Template inheritance tests
├── Integration Tests
│ ├── Feature workflow tests
│ ├── Authentication flow tests
│ └── Admin functionality tests
├── E2E Tests
│ ├── User journey tests
│ ├── Cross-feature navigation tests
│ └── Performance regression tests
└── Migration Tests
├── Phase-specific validation
├── Rollback validation
└── Data integrity tests
7.2 Test Cases by Phase
Phase 1 Tests
class Phase1MigrationTests(unittest.TestCase):
def test_error_templates_migration(self):
"""Test 404/500 error templates work after migration"""
response = self.client.get('/nonexistent-page')
self.assertEqual(response.status_code, 404)
self.assertIn('Page Not Found', response.data.decode())
def test_documentation_templates(self):
"""Test documentation templates render correctly"""
for doc_page in ['api', 'architecture', 'deployment']:
response = self.client.get(f'/docs/{doc_page}')
self.assertEqual(response.status_code, 200)
def test_base_template_inheritance(self):
"""Test base template inheritance chain"""
# Verify all templates extend new base structure
pass
Phase 2 Tests
class Phase2MigrationTests(unittest.TestCase):
def test_auth_flow_migration(self):
"""Test complete authentication flow"""
# Login flow
response = self.client.get('/auth/login')
self.assertEqual(response.status_code, 200)
# OAuth configuration
response = self.client.get('/auth/oauth-config')
self.assertEqual(response.status_code, 200)
def test_admin_interface_migration(self):
"""Test admin interface functionality"""
self.login_as_admin()
response = self.client.get('/admin/roles')
self.assertEqual(response.status_code, 200)
Phase 3 Tests
class Phase3MigrationTests(unittest.TestCase):
def test_dashboard_migration(self):
"""Test dashboard renders with all widgets"""
self.login_as_user()
response = self.client.get('/')
self.assertEqual(response.status_code, 200)
self.assertIn('dashboard-widget', response.data.decode())
def test_rules_engine_migration(self):
"""Test rules engine interface"""
response = self.client.get('/rules')
self.assertEqual(response.status_code, 200)
def test_form_builder_integration(self):
"""Test form builder still works after migration"""
response = self.client.get('/form-builder')
self.assertEqual(response.status_code, 200)
7.3 Performance Testing
class PerformanceMigrationTests(unittest.TestCase):
def test_template_rendering_performance(self):
"""Measure template rendering performance before/after"""
import time
start_time = time.time()
for _ in range(100):
self.client.get('/')
end_time = time.time()
avg_response_time = (end_time - start_time) / 100
self.assertLess(avg_response_time, 0.1) # 100ms threshold
def test_memory_usage(self):
"""Monitor memory usage during template rendering"""
import tracemalloc
tracemalloc.start()
self.client.get('/')
current, peak = tracemalloc.get_traced_memory()
tracemalloc.stop()
# Assert memory usage is within acceptable limits
self.assertLess(peak / 1024 / 1024, 50) # 50MB limit
8. ROLLBACK PLAN
8.1 Rollback Strategy per Phase
class RollbackManager:
def __init__(self, app):
self.app = app
self.backup_templates = {}
self.rollback_points = []
def create_rollback_point(self, phase_name):
"""Create rollback point before phase migration"""
rollback_point = {
'phase': phase_name,
'timestamp': datetime.now(),
'template_loader_config': self.app.jinja_loader,
'route_mappings': self._capture_route_mappings(),
'feature_flags': self._capture_feature_flags()
}
self.rollback_points.append(rollback_point)
def rollback_to_phase(self, phase_name):
"""Rollback to specific phase"""
rollback_point = next(
rp for rp in self.rollback_points
if rp['phase'] == phase_name
)
# Restore template loader configuration
self.app.jinja_loader = rollback_point['template_loader_config']
# Restore route mappings
self._restore_route_mappings(rollback_point['route_mappings'])
# Restore feature flags
self._restore_feature_flags(rollback_point['feature_flags'])
8.2 Emergency Rollback Procedures
#!/bin/bash
# emergency_rollback.sh
echo "Starting emergency rollback procedure..."
# 1. Switch to backup template loader
export TEMPLATE_MIGRATION_ENABLED=false
# 2. Restart application with legacy configuration
sudo systemctl restart racemes-app
# 3. Verify application health
curl -f http://localhost:5000/health || exit 1
# 4. Notify team
echo "Emergency rollback completed successfully"
8.3 Rollback Testing
class RollbackTests(unittest.TestCase):
def test_phase1_rollback(self):
"""Test rollback from Phase 1"""
# Perform Phase 1 migration
self.migration_manager.migrate_phase1()
# Create rollback point
self.rollback_manager.create_rollback_point('phase1')
# Perform rollback
self.rollback_manager.rollback_to_phase('baseline')
# Verify original functionality
self.verify_original_templates_work()
def test_partial_migration_rollback(self):
"""Test rollback from partial migration state"""
# Simulate partial migration failure
self.migration_manager.migrate_templates_subset(['base.html'])
# Rollback
self.rollback_manager.emergency_rollback()
# Verify system stability
self.verify_system_health()
9. IMPLEMENTATION TIMELINE
9.1 Detailed Schedule
WEEK 1: Preparation & Phase 1
├── Day 1: Environment setup & baseline testing
├── Day 2: Phase 1 implementation (shared templates)
├── Day 3: Phase 1 testing & validation
├── Day 4: Phase 2 preparation
└── Day 5: Phase 2 implementation start
WEEK 2: Phase 2 & 3 Implementation
├── Day 6: Phase 2 completion (medium risk)
├── Day 7: Phase 2 testing & validation
├── Day 8: Phase 3 implementation (high risk)
├── Day 9: Phase 3 testing & validation
└── Day 10: Phase 3 completion
WEEK 3: Finalization & Optimization
├── Day 11: Phase 4 implementation (cleanup)
├── Day 12: Performance optimization
├── Day 13: Comprehensive testing
├── Day 14: Documentation & training
└── Day 15: Production deployment
9.2 Resource Allocation
- Lead Developer: Full-time (15 days)
- Frontend Developer: Part-time (8 days)
- QA Engineer: Part-time (6 days)
- DevOps Engineer: Part-time (3 days)
9.3 Success Criteria
- Functional Criteria:
- All 55 templates migrated successfully
- Zero broken template inheritance chains
- All routes functioning correctly
-
Authentication flows intact
-
Performance Criteria:
- Template rendering time improved by 20%
- Memory usage reduced by 15%
-
Bundle size reduced by 30%
-
Quality Criteria:
- 100% test coverage for migrated templates
- Zero critical security vulnerabilities
- Code maintainability score > 8/10
10. POST-MIGRATION OPTIMIZATION
10.1 Template Performance Optimization
# Template caching strategy
from flask_caching import Cache
cache = Cache(app, config={
'CACHE_TYPE': 'redis',
'CACHE_REDIS_URL': 'redis://localhost:6379/0'
})
@cache.memoize(timeout=300)
def render_cached_template(template_name, **context):
"""Cache rendered templates for performance"""
return render_template(template_name, **context)
10.2 Asset Optimization
# Template-specific asset loading
class AssetManager:
def __init__(self):
self.feature_assets = {
'dashboard': ['dashboard.js', 'charts.js'],
'rules': ['rules-engine.js', 'monaco-editor.js'],
'form_builder': ['form-builder.js', 'widget-runtime.js']
}
def get_feature_assets(self, template_path):
"""Return assets needed for specific template"""
feature = self._extract_feature_from_path(template_path)
return self.feature_assets.get(feature, [])
10.3 Developer Experience Improvements
# Template development utilities
class TemplateDevelopmentUtils:
@staticmethod
def generate_template_skeleton(feature_name, template_name):
"""Generate template skeleton for new features"""
template_content = f"""
{{% extends "shared/base.html" %}}
{{% block title %}}{feature_name.title()} - {{{{ super() }}}}{{% endblock %}}
{{% block feature_styles %}}
<link href="{{{{ url_for('static', filename='css/{feature_name}.css') }}}}" rel="stylesheet">
{{% endblock %}}
{{% block content %}}
<div class="{feature_name}-container">
<!-- {template_name} content -->
</div>
{{% endblock %}}
{{% block feature_scripts %}}
<script src="{{{{ url_for('static', filename='js/{feature_name}.js') }}}}"></script>
{{% endblock %}}
"""
return template_content
11. MONITORING & MAINTENANCE
11.1 Template Health Monitoring
class TemplateHealthMonitor:
def __init__(self, app):
self.app = app
self.metrics = {
'render_times': {},
'error_rates': {},
'cache_hit_rates': {}
}
def track_template_render(self, template_name, render_time):
"""Track template rendering performance"""
if template_name not in self.metrics['render_times']:
self.metrics['render_times'][template_name] = []
self.metrics['render_times'][template_name].append(render_time)
# Alert if render time exceeds threshold
avg_time = sum(self.metrics['render_times'][template_name]) / len(self.metrics['render_times'][template_name])
if avg_time > 0.5: # 500ms threshold
self.alert_slow_template(template_name, avg_time)
11.2 Maintenance Procedures
# Automated template maintenance
class TemplateMaintenance:
def __init__(self, app):
self.app = app
def check_template_integrity(self):
"""Check for broken template inheritance"""
broken_templates = []
for template in self.get_all_templates():
try:
self.app.jinja_env.get_template(template)
except Exception as e:
broken_templates.append((template, str(e)))
return broken_templates
def optimize_template_cache(self):
"""Optimize template cache based on usage patterns"""
# Analyze template usage patterns
# Adjust cache TTL based on usage frequency
pass
def generate_usage_report(self):
"""Generate template usage analytics"""
return {
'most_used_templates': self.get_most_used_templates(),
'least_used_templates': self.get_least_used_templates(),
'performance_metrics': self.get_performance_metrics()
}
12. CONCLUSION
12.1 Expected Benefits
- Improved Maintainability: Feature-first organization reduces cognitive load
- Enhanced Scalability: Modular structure supports rapid feature development
- Better Performance: Optimized template loading and caching
- Developer Experience: Clear structure and improved tooling
- Future-Proof Architecture: Aligned with modern Flask best practices
12.2 Key Success Factors
- Comprehensive testing at each phase
- Progressive migration with rollback capabilities
- Team alignment and training
- Continuous monitoring and optimization
- Documentation and knowledge transfer
12.3 Next Steps
- Review and approve this architecture plan
- Set up development environment for migration
- Begin Phase 1 implementation
- Establish monitoring and alerting
- Execute migration according to timeline
Document Version: 1.0 Last Updated: 2024-09-30 Author: Claude Code Architect Reviewed By: [To be filled] Approved By: [To be filled]