# 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 admin_router return admin_router def _get_vendor_router(): """Lazy import of vendor router to avoid circular imports.""" from app.modules.messaging.routes.vendor import vendor_router return vendor_router # 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 ], FrontendType.VENDOR: [ "messages", # Vendor messages "notifications", # Vendor 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, ), ], ), 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.VENDOR: [ 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="/vendor/{vendor_code}/messages", order=20, ), MenuItemDefinition( id="notifications", label_key="messaging.menu.notifications", icon="bell", route="/vendor/{vendor_code}/notifications", order=30, ), ], ), 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="/vendor/{vendor_code}/email-templates", order=40, ), ], ), ], }, 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", ) 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.vendor_router = _get_vendor_router() return messaging_module __all__ = ["messaging_module", "get_messaging_module_with_routers"]