# ================================================================ # services/notification/app/core/database.py - COMPLETE IMPLEMENTATION # ================================================================ """ Database configuration and initialization for notification service """ import structlog from sqlalchemy.ext.asyncio import AsyncSession, create_async_engine, async_sessionmaker from sqlalchemy import text from shared.database.base import Base, DatabaseManager from app.core.config import settings logger = structlog.get_logger() # Initialize database manager with notification service configuration database_manager = DatabaseManager(settings.DATABASE_URL) # Convenience alias for dependency injection get_db = database_manager.get_db async def init_db(): """Initialize database tables and seed data""" try: logger.info("Initializing notification service database...") # Import all models to ensure they're registered with SQLAlchemy from app.models.notifications import ( Notification, NotificationTemplate, NotificationPreference, NotificationLog ) # Import template models (these are separate and optional) try: from app.models.templates import EmailTemplate, WhatsAppTemplate logger.info("Template models imported successfully") except ImportError: logger.warning("Template models not found, using basic templates only") logger.info("Models imported successfully") # Create all tables await database_manager.create_tables() logger.info("Database tables created successfully") # Seed default templates await _seed_default_templates() logger.info("Default templates seeded successfully") # Test database connection await _test_database_connection() logger.info("Database connection test passed") logger.info("Notification service database initialization completed") except Exception as e: logger.error(f"Failed to initialize notification database: {e}") raise async def _seed_default_templates(): """Seed default notification templates""" try: async for db in get_db(): # Check if templates already exist from sqlalchemy import select from app.models.notifications import NotificationTemplate result = await db.execute( select(NotificationTemplate).where( NotificationTemplate.is_system == True ).limit(1) ) if result.scalar_one_or_none(): logger.info("Default templates already exist, skipping seeding") return # Create default email templates default_templates = [ { "template_key": "welcome_email", "name": "Bienvenida - Email", "description": "Email de bienvenida para nuevos usuarios", "category": "transactional", "type": "email", "subject_template": "¡Bienvenido a Bakery Forecast, {{user_name}}!", "body_template": """ ¡Hola {{user_name}}! Bienvenido a Bakery Forecast, la plataforma de pronóstico de demanda para panaderías. Tu cuenta ha sido creada exitosamente. Ya puedes: - Subir datos de ventas históricos - Generar pronósticos de demanda - Optimizar tu producción diaria Para comenzar, visita tu dashboard: {{dashboard_url}} Si tienes alguna pregunta, nuestro equipo está aquí para ayudarte. ¡Éxito en tu panadería! Saludos, El equipo de Bakery Forecast """.strip(), "html_template": """
Pronósticos inteligentes para tu panadería
Bienvenido a Bakery Forecast, la plataforma de pronóstico de demanda diseñada especialmente para panaderías como la tuya.
Ya puedes comenzar a:
💡 Consejo: Para obtener mejores pronósticos, te recomendamos subir al menos 3 meses de datos históricos de ventas.
Si tienes alguna pregunta o necesitas ayuda, nuestro equipo está aquí para apoyarte en cada paso.
¡Éxito en tu panadería! 🥐
El equipo de Bakery Forecast
© 2025 Bakery Forecast. Todos los derechos reservados.
Madrid, España 🇪🇸
{{bakery_name}}
Se requiere tu atención para ajustar la producción.
| 📦 Producto: | {{product_name}} |
| 📅 Fecha: | {{forecast_date}} |
| 📊 Demanda prevista: | {{predicted_demand}} unidades |
| 📈 Variación: | {{variation_percentage}}% |
{{alert_message}}
El equipo de Bakery Forecast
{{bakery_name}}
{{week_start}} - {{week_end}}
Ventas Totales
Precisión
{{recommendations}}
El equipo de Bakery Forecast
Optimizando panaderías en Madrid desde 2025