# app/modules/catalog/definition.py """Catalog module definition.""" from app.modules.base import ( MenuItemDefinition, MenuSectionDefinition, ModuleDefinition, PermissionDefinition, ) from app.modules.enums import FrontendType # ============================================================================= # Router Lazy Imports # ============================================================================= def _get_admin_router(): """Lazy import of admin router to avoid circular imports.""" from app.modules.catalog.routes.api.admin import admin_router return admin_router def _get_store_router(): """Lazy import of store router to avoid circular imports.""" from app.modules.catalog.routes.api.store import store_router return store_router def _get_metrics_provider(): """Lazy import of metrics provider to avoid circular imports.""" from app.modules.catalog.services.catalog_metrics import catalog_metrics_provider return catalog_metrics_provider def _get_feature_provider(): """Lazy import of feature provider to avoid circular imports.""" from app.modules.catalog.services.catalog_features import catalog_feature_provider return catalog_feature_provider def _get_media_usage_provider(): """Lazy import of media usage provider to avoid circular imports.""" from app.modules.catalog.services.product_media_service import product_media_service return product_media_service # Catalog module definition catalog_module = ModuleDefinition( code="catalog", name="Product Catalog", description="Product catalog browsing and search for storefronts", version="1.0.0", is_self_contained=True, requires=[], # inventory imports are for response enrichment only (inventory → catalog is the real dependency) migrations_path="migrations", features=[ "product_catalog", # Core product catalog functionality "product_search", # Search and filtering "product_variants", # Product variants management "product_categories", # Category organization "product_attributes", # Custom attributes "product_import_export", # Bulk import/export ], # Module-driven permissions permissions=[ PermissionDefinition( id="products.view", label_key="catalog.permissions.products_view", description_key="catalog.permissions.products_view_desc", category="products", ), PermissionDefinition( id="products.create", label_key="catalog.permissions.products_create", description_key="catalog.permissions.products_create_desc", category="products", ), PermissionDefinition( id="products.edit", label_key="catalog.permissions.products_edit", description_key="catalog.permissions.products_edit_desc", category="products", ), PermissionDefinition( id="products.delete", label_key="catalog.permissions.products_delete", description_key="catalog.permissions.products_delete_desc", category="products", ), PermissionDefinition( id="products.import", label_key="catalog.permissions.products_import", description_key="catalog.permissions.products_import_desc", category="products", ), PermissionDefinition( id="products.export", label_key="catalog.permissions.products_export", description_key="catalog.permissions.products_export_desc", category="products", ), ], # Module-driven menu definitions menus={ FrontendType.STORE: [ MenuSectionDefinition( id="products", label_key="catalog.menu.products_inventory", icon="package", order=10, items=[ MenuItemDefinition( id="products", label_key="catalog.menu.all_products", icon="shopping-bag", route="/store/{store_code}/products", order=10, is_mandatory=True, requires_permission="products.view", ), ], ), ], FrontendType.STOREFRONT: [ MenuSectionDefinition( id="nav", label_key=None, order=10, items=[ MenuItemDefinition( id="products", label_key="storefront.nav.products", icon="shopping-bag", route="products", order=10, ), ], ), MenuSectionDefinition( id="actions", label_key=None, order=10, items=[ MenuItemDefinition( id="search", label_key="storefront.actions.search", icon="search", route="", order=10, ), ], ), ], }, # Metrics provider for dashboard statistics metrics_provider=_get_metrics_provider, feature_provider=_get_feature_provider, media_usage_provider=_get_media_usage_provider, ) def get_catalog_module_with_routers() -> ModuleDefinition: """ Get catalog module with routers attached. This function attaches the routers lazily to avoid circular imports during module initialization. """ catalog_module.admin_router = _get_admin_router() catalog_module.store_router = _get_store_router() return catalog_module __all__ = ["catalog_module", "get_catalog_module_with_routers"]