# app/modules/messaging/definition.py """ Messaging module definition. Defines the messaging 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.messaging.routes.admin import router return router def _get_store_router(): """Lazy import of store router to avoid circular imports.""" from app.modules.messaging.routes.store import router return router def _get_feature_provider(): """Lazy import of feature provider to avoid circular imports.""" from app.modules.messaging.services.messaging_features import ( messaging_feature_provider, ) return messaging_feature_provider # Messaging module definition messaging_module = ModuleDefinition( code="messaging", name="Messaging & Notifications", description=( "Core email and notification system for user registration, password resets, " "team invitations, and system notifications. Required for basic platform operations." ), version="1.0.0", features=[ "customer_messaging", # Customer communication "internal_messages", # Internal team messages "notification_center", # Notification management "message_attachments", # File attachments "admin_notifications", # System admin notifications ], # Module-driven permissions permissions=[ PermissionDefinition( id="messaging.view_messages", label_key="messaging.permissions.view_messages", description_key="messaging.permissions.view_messages_desc", category="messaging", ), PermissionDefinition( id="messaging.send_messages", label_key="messaging.permissions.send_messages", description_key="messaging.permissions.send_messages_desc", category="messaging", ), PermissionDefinition( id="messaging.manage_templates", label_key="messaging.permissions.manage_templates", description_key="messaging.permissions.manage_templates_desc", category="messaging", ), ], menu_items={ FrontendType.ADMIN: [ "messages", # Admin messages "notifications", # Admin notifications "email-logs", # Email audit logs ], FrontendType.STORE: [ "messages", # Store messages "notifications", # Store notifications ], }, # New module-driven menu definitions menus={ FrontendType.ADMIN: [ MenuSectionDefinition( id="platformAdmin", label_key="messaging.menu.platform_admin", icon="chat-bubble-left-right", order=20, items=[ MenuItemDefinition( id="messages", label_key="messaging.menu.messages", icon="chat-bubble-left-right", route="/admin/messages", order=30, ), ], ), MenuSectionDefinition( id="monitoring", label_key="messaging.menu.platform_monitoring", icon="bell", order=80, items=[ MenuItemDefinition( id="notifications", label_key="messaging.menu.notifications", icon="bell", route="/admin/notifications", order=40, ), MenuItemDefinition( id="email-logs", label_key="messaging.menu.email_logs", icon="mail", route="/admin/email-logs", order=50, ), ], ), MenuSectionDefinition( id="settings", label_key="messaging.menu.platform_settings", icon="mail", order=900, items=[ MenuItemDefinition( id="email-templates", label_key="messaging.menu.email_templates", icon="mail", route="/admin/email-templates", order=20, ), ], ), ], FrontendType.STORE: [ MenuSectionDefinition( id="customers", label_key="messaging.menu.customers", icon="chat-bubble-left-right", order=30, items=[ MenuItemDefinition( id="messages", label_key="messaging.menu.messages", icon="chat-bubble-left-right", route="/store/{store_code}/messages", order=20, requires_permission="messaging.view_messages", ), MenuItemDefinition( id="notifications", label_key="messaging.menu.notifications", icon="bell", route="/store/{store_code}/notifications", order=30, requires_permission="messaging.view_messages", ), ], ), MenuSectionDefinition( id="account", label_key="messaging.menu.account_settings", icon="mail", order=900, items=[ MenuItemDefinition( id="email-templates", label_key="messaging.menu.email_templates", icon="mail", route="/store/{store_code}/email-templates", order=40, requires_permission="messaging.manage_templates", ), ], ), ], FrontendType.STOREFRONT: [ MenuSectionDefinition( id="account", label_key=None, order=10, items=[ MenuItemDefinition( id="messages", label_key="messaging.storefront.account.messages", icon="chat-bubble-left-right", route="account/messages", order=50, ), ], ), ], }, is_core=True, # Core module - email/notifications required for registration, password reset, etc. # ========================================================================= # Self-Contained Module Configuration # ========================================================================= is_self_contained=True, services_path="app.modules.messaging.services", models_path="app.modules.messaging.models", schemas_path="app.modules.messaging.schemas", exceptions_path="app.modules.messaging.exceptions", migrations_path="migrations", # Feature provider for feature flags feature_provider=_get_feature_provider, ) def get_messaging_module_with_routers() -> ModuleDefinition: """ Get messaging module with routers attached. This function attaches the routers lazily to avoid circular imports during module initialization. """ messaging_module.admin_router = _get_admin_router() messaging_module.store_router = _get_store_router() return messaging_module __all__ = ["messaging_module", "get_messaging_module_with_routers"]