- Separa modelos em entidades individuais - Cria camada de serviços para acesso a dados - Implementa controladores para lógica de negócio - Organiza rotas em blueprints por funcionalidade - Adiciona documentação de arquitetura no README - Cria script para preparação da estrutura 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <noreply@anthropic.com>
162 lines
5.0 KiB
Python
162 lines
5.0 KiB
Python
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()
|