import json from flask import Flask, jsonify from flask_cors import CORS from flask_jwt_extended import JWTManager from flask_sqlalchemy import SQLAlchemy from flask_migrate import Migrate import os from dotenv import load_dotenv # Create extensions but don't initialize them yet db = SQLAlchemy() migrate = Migrate() jwt = JWTManager() cors = CORS() load_dotenv(override=True) def create_app(config_name=None): """Application factory pattern""" app = Flask(__name__) # Load configuration if config_name is None: config_name = os.environ.get("FLASK_ENV", "development") from app.config import config_by_name app.config.from_object(config_by_name[config_name]) print('----------------------------------------------------------') print(F'------------------ENVIRONMENT: {config_name}-------------------------------------') # print(F'------------------CONFIG: {app.config}-------------------------------------') # print(json.dumps(dict(app.config), indent=2, default=str)) print('----------------------------------------------------------') # Initialize extensions with app db.init_app(app) migrate.init_app(app, db) jwt.init_app(app) cors.init_app(app, resources={r"/api/*": {"origins": app.config.get("CORS_ORIGINS", "*")}}) # Initialize Celery from app.celery import init_celery init_celery(app) # Import models (required for migrations) from app.models import user, product, order # Register blueprints from app.routes import api_bp, health_bp app.register_blueprint(api_bp, url_prefix="/api") app.register_blueprint(health_bp) # Global error handlers @app.errorhandler(404) def not_found(error): return jsonify({"error": "Not found"}), 404 @app.errorhandler(500) def internal_error(error): return jsonify({"error": "Internal server error"}), 500 return app