import os import click from flask import Flask, jsonify from app.config import Config from app.extensions import db, bcrypt, jwt, cors def create_app(config_class=Config): app = Flask(__name__) app.config.from_object(config_class) # Inicializar extensões db.init_app(app) bcrypt.init_app(app) jwt.init_app(app) cors.init_app(app, resources={r"/api/*": {"origins": "*"}}) # Registrar Blueprints from app.routes.auth import auth_bp from app.routes.users import users_bp from app.routes.leads import leads_bp from app.routes.webhooks import webhooks_bp app.register_blueprint(auth_bp) app.register_blueprint(users_bp) app.register_blueprint(leads_bp) app.register_blueprint(webhooks_bp) # Tratamento global de erros JWT @jwt.invalid_token_loader def invalid_token_callback(error): return jsonify({'error': 'Token JWT inválido ou corrompido.'}), 401 @jwt.unauthorized_loader def missing_token_callback(error): return jsonify({'error': 'Cabeçalho de autorização (Bearer token) ausente.'}), 401 @jwt.expired_token_loader def expired_token_callback(jwt_header, jwt_payload): return jsonify({'error': 'Token JWT expirado. Faça login novamente.'}), 401 # Rota de Healthcheck @app.route('/health', methods=['GET']) def healthcheck(): return jsonify({ 'status': 'healthy', 'app': 'LeadRadar Core API', 'version': '1.0.0' }), 200 # Comando CLI para popular banco com admin inicial se vazio @app.cli.command('seed-db') def seed_db_command(): """Popula o banco de dados com usuário Admin inicial se não houver registros.""" from app.models.user import User with app.app_context(): db.create_all() if User.query.count() == 0: admin = User( nome='Administrador LeadRadar', email='admin@leadradar.com', role='admin', ativo=True ) admin.set_password('Admin@123456') db.session.add(admin) db.session.commit() click.echo("Usuário Admin padrão criado: admin@leadradar.com / Admin@123456") else: click.echo("Banco de dados já contém usuários cadastrados.") # Auto-criação de tabelas e usuário Admin no startup se o banco estiver vazio with app.app_context(): db.create_all() try: from app.models.user import User if db.session.query(User).count() == 0: admin = User( nome='Administrador LeadRadar', email='admin@leadradar.com', role='admin', ativo=True ) admin.set_password('Admin@123456') db.session.add(admin) db.session.commit() except Exception: db.session.rollback() return app