import argparse import sys from pathlib import Path from dotenv import load_dotenv ROOT_DIR = Path(__file__).resolve().parents[1] if str(ROOT_DIR) not in sys.path: sys.path.insert(0, str(ROOT_DIR)) # Carregar .env antes de importar módulos load_dotenv(ROOT_DIR / ".env") from functions.base import Base, engine, get_db_session from functions.rbac import Role, init_rbac from scripts.create_admin import create_admin, rotate_admin_otp from scripts.create_test_users import create_test_users from scripts.seed_database import seed_database ADMIN_USERNAME = "admin" ADMIN_PASSWORD = "admin123" ADMIN_ROLE = Role.SECRETARIO_GERAL def reset_db(args): """Inicializando banco de dados e criando tabelas""" db = get_db_session() try: # Criar todas as tabelas Base.metadata.drop_all(engine) Base.metadata.create_all(engine) except Exception as e: print(f"Erro na drop ou create all da Base: {e}") db.rollback() raise finally: db.close() print("Inicializando sistema RBAC...") init_rbac() print("Cria usuário admin...") create_admin(username=ADMIN_USERNAME, password=ADMIN_PASSWORD, role=ADMIN_ROLE) print("Banco inicializado com sucesso.") return 0 def seed_db_with_fakes(args): """Função para popular o banco com dados fake para desenvolvimento""" seed_database() def seed_db_test_users(args): """Função para popular o banco com dados fake para desenvolvimento""" create_test_users() def reset_admin(args): create_admin(username=ADMIN_USERNAME, password=ADMIN_PASSWORD, role=ADMIN_ROLE) def rotate_admin_otp_cmd(args): rotate_admin_otp(username=ADMIN_USERNAME, save_qr=True) def build_parser(): parser = argparse.ArgumentParser(description="Gerenciador de comandos do sistema Controles") subparsers = parser.add_subparsers(dest="command", required=True) db_reset_parser = subparsers.add_parser("db_reset", help="Reseta o banco e recria tabelas, RBAC e admin") db_reset_parser.set_defaults(func=reset_db) db_seed_fake_parser = subparsers.add_parser("db_seed_fake", help="Adiciona dados falsos para desenvolvimento") db_seed_fake_parser.set_defaults(func=seed_db_with_fakes) db_seed_test_users_parser = subparsers.add_parser("db_seed_test_users", help="Adiciona usuários de teste para desenvolvimento") db_seed_test_users_parser.set_defaults(func=seed_db_test_users) admin_reset_parser = subparsers.add_parser("admin_reset", help="Reseta o usuário admin (padrão: admin123)") admin_reset_parser.set_defaults(func=reset_admin) admin_rotate_otp_parser = subparsers.add_parser("admin_rotate_otp", help="Rotaciona o OTP do usuário admin - se não definido em .env") admin_rotate_otp_parser.set_defaults(func=rotate_admin_otp_cmd) return parser def main(): parser = build_parser() args = parser.parse_args() return args.func(args) if __name__ == "__main__": raise SystemExit(main())