# app/modules/customers/definition.py """ Customers module definition. Defines the customers module including its features, menu items, route configurations, and self-contained module settings. """ from app.modules.base import ( MenuItemDefinition, MenuSectionDefinition, ModuleDefinition, PermissionDefinition, ) from app.modules.enums import FrontendType def _get_admin_router(): """Lazy import of admin router to avoid circular imports.""" from app.modules.customers.routes.admin import admin_router return admin_router def _get_store_router(): """Lazy import of store router to avoid circular imports.""" from app.modules.customers.routes.store import store_router return store_router def _get_metrics_provider(): """Lazy import of metrics provider to avoid circular imports.""" from app.modules.customers.services.customer_metrics import ( customer_metrics_provider, ) return customer_metrics_provider def _get_feature_provider(): """Lazy import of feature provider to avoid circular imports.""" from app.modules.customers.services.customer_features import ( customer_feature_provider, ) return customer_feature_provider # Customers module definition customers_module = ModuleDefinition( code="customers", name="Customer Management", description="Customer database, profiles, addresses, and segmentation.", version="1.0.0", # Module-driven permissions permissions=[ PermissionDefinition( id="customers.view", label_key="customers.permissions.customers_view", description_key="customers.permissions.customers_view_desc", category="customers", ), PermissionDefinition( id="customers.edit", label_key="customers.permissions.customers_edit", description_key="customers.permissions.customers_edit_desc", category="customers", ), PermissionDefinition( id="customers.delete", label_key="customers.permissions.customers_delete", description_key="customers.permissions.customers_delete_desc", category="customers", ), PermissionDefinition( id="customers.export", label_key="customers.permissions.customers_export", description_key="customers.permissions.customers_export_desc", category="customers", ), ], features=[ "customer_view", # View customer profiles "customer_export", # Export customer data "customer_profiles", # Detailed customer profiles "customer_segmentation", # Customer tagging and segments "customer_addresses", # Address management "customer_authentication", # Customer login/registration ], menu_items={ FrontendType.ADMIN: [ "customers", # Platform-wide customer view ], FrontendType.STORE: [ "customers", # Store customer list ], }, # New module-driven menu definitions menus={ FrontendType.ADMIN: [ MenuSectionDefinition( id="storeOps", label_key="customers.menu.store_operations", icon="user-group", order=40, items=[ MenuItemDefinition( id="customers", label_key="customers.menu.customers", icon="user-group", route="/admin/customers", order=20, ), ], ), ], FrontendType.STORE: [ MenuSectionDefinition( id="customers", label_key="customers.menu.customers_section", icon="user-group", order=30, items=[ MenuItemDefinition( id="customers", label_key="customers.menu.all_customers", icon="user-group", route="/store/{store_code}/customers", order=10, ), ], ), ], FrontendType.STOREFRONT: [ MenuSectionDefinition( id="account", label_key=None, order=10, items=[ MenuItemDefinition( id="dashboard", label_key="storefront.account.dashboard", icon="home", route="account/dashboard", order=10, ), MenuItemDefinition( id="profile", label_key="storefront.account.profile", icon="user", route="account/profile", order=20, ), MenuItemDefinition( id="addresses", label_key="storefront.account.addresses", icon="map-pin", route="account/addresses", order=30, ), MenuItemDefinition( id="settings", label_key="storefront.account.settings", icon="cog", route="account/settings", order=90, ), ], ), ], }, is_core=True, # Customers is a core module - customer data is fundamental # ========================================================================= # Self-Contained Module Configuration # ========================================================================= is_self_contained=True, services_path="app.modules.customers.services", models_path="app.modules.customers.models", schemas_path="app.modules.customers.schemas", exceptions_path="app.modules.customers.exceptions", migrations_path="migrations", # Metrics provider for dashboard statistics metrics_provider=_get_metrics_provider, # Feature provider for feature flags feature_provider=_get_feature_provider, ) def get_customers_module_with_routers() -> ModuleDefinition: """ Get customers module with routers attached. This function attaches the routers lazily to avoid circular imports during module initialization. """ customers_module.admin_router = _get_admin_router() customers_module.store_router = _get_store_router() return customers_module __all__ = ["customers_module", "get_customers_module_with_routers"]