app.py 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. from fastapi import FastAPI
  2. from fastapi.middleware.cors import CORSMiddleware
  3. from starlette.middleware.sessions import SessionMiddleware
  4. from config.settings import DEVELOPMENT, SECRET_KEY
  5. from routes import sales
  6. from services.email_service import initialize_email_sender
  7. from services.logging_service import structured_logger, LogLevel
  8. from middleware.no_cache import NoCacheMiddleware
  9. from logging import getLogger
  10. logger = getLogger(__name__)
  11. def create_app() -> FastAPI:
  12. """Create and configure FastAPI application"""
  13. logger.info("Creating FastAPI application")
  14. try:
  15. if DEVELOPMENT:
  16. logger.info("Creating FastAPI app in development mode")
  17. app = FastAPI(
  18. title="Web Pedidos Klein - FastAPI Backend",
  19. description="Backend for the Web Pedidos Klein application using FastAPI"
  20. )
  21. else:
  22. logger.info("Creating FastAPI app in production mode")
  23. app = FastAPI(
  24. title="Web Pedidos Klein - FastAPI Backend",
  25. description="Backend for the Web Pedidos Klein application using FastAPI",
  26. version="1.0.0",
  27. docs_url=None,
  28. redoc_url=None
  29. )
  30. structured_logger.log_system_event(
  31. "FastAPI application created",
  32. LogLevel.INFO,
  33. {
  34. "development_mode": DEVELOPMENT,
  35. "docs_enabled": DEVELOPMENT,
  36. "title": "Web Pedidos Klein - FastAPI Backend"
  37. }
  38. )
  39. # Initialize email sender
  40. logger.info("Initializing email sender")
  41. initialize_email_sender()
  42. structured_logger.log_email_event(
  43. "Email sender initialized",
  44. LogLevel.INFO
  45. )
  46. # Add CORS middleware
  47. logger.info("Adding CORS middleware")
  48. app.add_middleware(
  49. CORSMiddleware,
  50. allow_origins=["https://admin.kleinexpress.store"],
  51. allow_credentials=True,
  52. allow_methods=["*"],
  53. allow_headers=["*"],
  54. )
  55. structured_logger.log_system_event(
  56. "CORS middleware configured",
  57. LogLevel.INFO,
  58. {
  59. "allowed_origins": ["https://admin.kleinexpress.store"],
  60. "allow_credentials": True
  61. }
  62. )
  63. # Add SessionMiddleware
  64. logger.info("Adding session middleware")
  65. app.add_middleware(
  66. SessionMiddleware,
  67. secret_key=SECRET_KEY,
  68. max_age=60 * 60 # max_age in seconds for Starlette
  69. )
  70. structured_logger.log_system_event(
  71. "Session middleware configured",
  72. LogLevel.INFO,
  73. {"max_age_seconds": 3600}
  74. )
  75. # Add NoCacheMiddleware
  76. logger.info("Adding no-cache middleware")
  77. app.add_middleware(NoCacheMiddleware)
  78. structured_logger.log_system_event(
  79. "No-cache middleware configured",
  80. LogLevel.INFO,
  81. {"description": "Middleware for preventing cache on public files"}
  82. )
  83. logger.info("FastAPI application created successfully")
  84. return app
  85. except Exception as e:
  86. error_msg = f"Error creating FastAPI application: {e}"
  87. logger.error(error_msg)
  88. structured_logger.log_system_event(
  89. "FastAPI application creation failed",
  90. LogLevel.ERROR,
  91. {
  92. "error": str(e),
  93. "error_type": type(e).__name__
  94. }
  95. )
  96. raise
  97. def setup_routes(app: FastAPI):
  98. """Setup all application routes"""
  99. logger.info("Setting up application routes")
  100. try:
  101. from routes import chat, users, products, orders, static
  102. from fastapi import Depends
  103. from auth.security import get_current_user
  104. # Chat routes
  105. logger.info("Setting up chat routes")
  106. app.include_router(
  107. chat.chat_router,
  108. prefix="/api/chat",
  109. tags=["Chat"],
  110. dependencies=[Depends(get_current_user)]
  111. )
  112. # User routes
  113. logger.info("Setting up user routes")
  114. app.include_router(users.user_router, prefix="/api/users", tags=["Users"])
  115. # Product routes
  116. logger.info("Setting up product routes")
  117. app.include_router(
  118. products.product_router,
  119. prefix="/api/products",
  120. tags=["Products"],
  121. dependencies=[Depends(get_current_user)]
  122. )
  123. # Order routes
  124. logger.info("Setting up order routes")
  125. app.include_router(
  126. orders.order_router,
  127. prefix="/api/orders",
  128. tags=["Orders"],
  129. dependencies=[Depends(get_current_user)]
  130. )
  131. # Sales routes
  132. logger.info("Setting up sales routes")
  133. app.include_router(
  134. sales.sales_router,
  135. prefix="/api/sales",
  136. tags=["Sales"],
  137. dependencies=[Depends(get_current_user)]
  138. )
  139. # Verification routes
  140. logger.info("Setting up verification routes")
  141. app.include_router(users.verify_router, prefix="/verify", tags=["Verification"])
  142. # Static routes
  143. logger.info("Setting up static routes")
  144. from fastapi.responses import HTMLResponse
  145. app.add_api_route("/", static.serve_app_html, methods=["GET"],
  146. response_class=HTMLResponse, include_in_schema=False)
  147. app.add_api_route("/register", static.serve_register_html, methods=["GET"],
  148. response_class=HTMLResponse, include_in_schema=False)
  149. app.add_api_route("/images/{image_path:path}", static.serve_image, methods=["GET"],
  150. response_class=HTMLResponse, include_in_schema=False)
  151. # Mount static files
  152. logger.info("Mounting static file directories")
  153. static.mount_main_static_files(app)
  154. static.mount_register_static_files(app)
  155. structured_logger.log_system_event(
  156. "All application routes configured successfully",
  157. LogLevel.INFO,
  158. {
  159. "route_groups": [
  160. "chat", "users", "products", "orders",
  161. "sales", "verification", "static"
  162. ]
  163. }
  164. )
  165. logger.info("Application routes setup completed successfully")
  166. except Exception as e:
  167. error_msg = f"Error setting up application routes: {e}"
  168. logger.error(error_msg)
  169. structured_logger.log_system_event(
  170. "Route setup failed",
  171. LogLevel.ERROR,
  172. {
  173. "error": str(e),
  174. "error_type": type(e).__name__
  175. }
  176. )
  177. raise