feat: implement three-tier module classification and framework layer
Module Classification: - Core (4): core, tenancy, cms, customers - always enabled - Optional (7): payments, billing, inventory, orders, marketplace, analytics, messaging - Internal (2): dev-tools, monitoring - admin-only Key Changes: - Rename platform-admin module to tenancy - Promote CMS and Customers to core modules - Create new payments module (gateway abstractions) - Add billing→payments and orders→payments dependencies - Mark dev-tools and monitoring as internal modules New Infrastructure: - app/modules/events.py: Module event bus (ENABLED, DISABLED, STARTUP, SHUTDOWN) - app/modules/migrations.py: Module-specific migration discovery - app/core/observability.py: Health checks, Prometheus metrics, Sentry integration Enhanced ModuleDefinition: - version, is_internal, permissions - config_schema, default_config - migrations_path - Lifecycle hooks: on_enable, on_disable, on_startup, health_check New Registry Functions: - get_optional_module_codes(), get_internal_module_codes() - is_core_module(), is_internal_module() - get_modules_by_tier(), get_module_tier() Migrations: - zc*: Rename platform-admin to tenancy - zd*: Ensure CMS and Customers enabled for all platforms Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -213,6 +213,41 @@ if config.config_file_name is not None:
|
||||
target_metadata = Base.metadata
|
||||
|
||||
|
||||
# ============================================================================
|
||||
# MODULE MIGRATIONS DISCOVERY
|
||||
# ============================================================================
|
||||
# Discover migration paths from self-contained modules.
|
||||
# Each module can have its own migrations/ directory.
|
||||
# ============================================================================
|
||||
|
||||
def get_version_locations() -> list[str]:
|
||||
"""
|
||||
Get all version locations including module migrations.
|
||||
|
||||
Returns:
|
||||
List of paths to migration version directories
|
||||
"""
|
||||
try:
|
||||
from app.modules.migrations import get_all_migration_paths
|
||||
|
||||
paths = get_all_migration_paths()
|
||||
locations = [str(p) for p in paths if p.exists()]
|
||||
|
||||
if len(locations) > 1:
|
||||
print(f"[ALEMBIC] Found {len(locations)} migration locations:")
|
||||
for loc in locations:
|
||||
print(f" - {loc}")
|
||||
|
||||
return locations
|
||||
except ImportError:
|
||||
# Fallback if module migrations not available
|
||||
return ["alembic/versions"]
|
||||
|
||||
|
||||
# Get version locations for multi-directory support
|
||||
version_locations = get_version_locations()
|
||||
|
||||
|
||||
def run_migrations_offline() -> None:
|
||||
"""
|
||||
Run migrations in 'offline' mode.
|
||||
@@ -229,6 +264,7 @@ def run_migrations_offline() -> None:
|
||||
target_metadata=target_metadata,
|
||||
literal_binds=True,
|
||||
dialect_opts={"paramstyle": "named"},
|
||||
version_locations=version_locations,
|
||||
)
|
||||
|
||||
with context.begin_transaction():
|
||||
@@ -249,7 +285,11 @@ def run_migrations_online() -> None:
|
||||
)
|
||||
|
||||
with connectable.connect() as connection:
|
||||
context.configure(connection=connection, target_metadata=target_metadata)
|
||||
context.configure(
|
||||
connection=connection,
|
||||
target_metadata=target_metadata,
|
||||
version_locations=version_locations,
|
||||
)
|
||||
|
||||
with context.begin_transaction():
|
||||
context.run_migrations()
|
||||
|
||||
Reference in New Issue
Block a user