from sqlalchemy.orm import joinedload from datetime import datetime from models.entities.militante import Militante from models.entities.email_militante import EmailMilitante from models.entities.endereco import Endereco from services.database_service import DatabaseService class MilitanteService: """Serviço para operações com militantes""" @staticmethod def listar_militantes(): """Lista todos os militantes""" db = DatabaseService.get_db_connection() try: militantes = db.query(Militante)\ .options( joinedload(Militante.celula), joinedload(Militante.emails) )\ .order_by(Militante.nome)\ .all() return militantes finally: db.close() @staticmethod def buscar_militante(militante_id): """Busca um militante pelo ID""" db = DatabaseService.get_db_connection() try: militante = db.query(Militante)\ .options( joinedload(Militante.celula), joinedload(Militante.emails), joinedload(Militante.endereco), joinedload(Militante.redes_sociais) )\ .get(militante_id) return militante finally: db.close() @staticmethod def buscar_por_cpf(cpf): """Busca um militante pelo CPF""" db = DatabaseService.get_db_connection() try: militante = db.query(Militante).filter(Militante.cpf == cpf).first() return militante finally: db.close() @staticmethod def salvar_militante(militante): """Salva um militante no banco de dados""" db = DatabaseService.get_db_connection() try: if militante.id is None: # Novo militante db.add(militante) db.flush() # Para obter o ID gerado militante_id = militante.id else: # Militante existente db.merge(militante) militante_id = militante.id db.commit() return militante_id except Exception as e: db.rollback() print(f"Erro ao salvar militante: {e}") raise finally: db.close() @staticmethod def salvar_endereco(endereco): """Salva um endereço no banco de dados""" db = DatabaseService.get_db_connection() try: db.add(endereco) db.flush() # Para obter o ID gerado endereco_id = endereco.id db.commit() return endereco_id except Exception as e: db.rollback() print(f"Erro ao salvar endereço: {e}") raise finally: db.close() @staticmethod def salvar_email_militante(email_militante): """Salva um email de militante no banco de dados""" db = DatabaseService.get_db_connection() try: db.add(email_militante) db.commit() return email_militante.id except Exception as e: db.rollback() print(f"Erro ao salvar email: {e}") raise finally: db.close() @staticmethod def atualizar_email_militante(militante_id, email): """Atualiza ou cria o email principal de um militante""" db = DatabaseService.get_db_connection() try: # Verificar se já existe email email_existente = db.query(EmailMilitante)\ .filter_by(militante_id=militante_id)\ .first() if email_existente: email_existente.endereco_email = email db.commit() else: novo_email = EmailMilitante( endereco_email=email, militante_id=militante_id ) db.add(novo_email) db.commit() return True except Exception as e: db.rollback() print(f"Erro ao atualizar email: {e}") raise finally: db.close() @staticmethod def excluir_militante(militante_id): """Exclui um militante pelo ID""" db = DatabaseService.get_db_connection() try: militante = db.query(Militante).get(militante_id) if not militante: return False # Excluir emails associados db.query(EmailMilitante)\ .filter_by(militante_id=militante_id)\ .delete() # Excluir o militante db.delete(militante) db.commit() return True except Exception as e: db.rollback() print(f"Erro ao excluir militante: {e}") raise finally: db.close()