Add feature flags, seed data utilities, and Angular frontend scaffold

Major enhancements:
- Feature flag system for cloud vs air-gapped deployment modes
- Automatic storage backend selection based on deployment mode
- Comprehensive seed data generation utilities
- Support for generating CSV, JSON, binary, and PCAP test files
- Quick seed script for easy data generation
- Angular 19 frontend complete setup documentation
- Material Design UI component examples and configuration

Fixes:
- Resolve SQLAlchemy metadata column name conflict
- Rename metadata to custom_metadata throughout codebase
- Fix API health check issues

Documentation:
- FEATURES.md - Complete feature overview
- FRONTEND_SETUP.md - Angular 19 setup guide with examples
- SUMMARY.md - Implementation summary

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-10-14 15:57:49 -05:00
parent 6821e717cd
commit 2dea63f99f
12 changed files with 1513 additions and 9 deletions

View File

@@ -36,7 +36,7 @@ async def upload_artifact(
test_suite: Optional[str] = Form(None),
test_config: Optional[str] = Form(None),
test_result: Optional[str] = Form(None),
metadata: Optional[str] = Form(None),
custom_metadata: Optional[str] = Form(None),
description: Optional[str] = Form(None),
tags: Optional[str] = Form(None),
version: Optional[str] = Form(None),
@@ -51,7 +51,7 @@ async def upload_artifact(
- **test_suite**: Test suite identifier
- **test_config**: JSON string of test configuration
- **test_result**: Test result (pass, fail, skip, error)
- **metadata**: JSON string of additional metadata
- **custom_metadata**: JSON string of additional metadata
- **description**: Text description of the artifact
- **tags**: JSON array of tags (as string)
- **version**: Version identifier
@@ -60,7 +60,7 @@ async def upload_artifact(
try:
# Parse JSON fields
test_config_dict = json.loads(test_config) if test_config else None
metadata_dict = json.loads(metadata) if metadata else None
metadata_dict = json.loads(custom_metadata) if custom_metadata else None
tags_list = json.loads(tags) if tags else None
# Generate unique storage path
@@ -88,7 +88,7 @@ async def upload_artifact(
test_suite=test_suite,
test_config=test_config_dict,
test_result=test_result,
metadata=metadata_dict,
custom_metadata=metadata_dict,
description=description,
tags=tags_list,
version=version,