90 lines
3.0 KiB
Python
90 lines
3.0 KiB
Python
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
|