opencand/OpenCand.ETL/Services/CandidatoService.cs
Jose Henrique 2660826a3f
All checks were successful
API and ETL Build / build_etl (push) Successful in 8s
API and ETL Build / build_api (push) Successful in 9s
stuff and refactor
2025-06-03 16:27:39 -03:00

116 lines
5.3 KiB
C#

using OpenCand.Core.Models;
using OpenCand.ETL.Repository;
using OpenCand.Repository;
namespace OpenCand.Services
{
public class CandidatoService
{
private readonly CandidatoRepository candidatoRepository;
private readonly PartidoRepository partidoRepository;
public CandidatoService(CandidatoRepository candidatoRepository, PartidoRepository partidoRepository)
{
this.candidatoRepository = candidatoRepository;
this.partidoRepository = partidoRepository;
}
public async Task AddCandidatoAsync(Candidato candidato)
{
if (candidato == null)
{
throw new ArgumentNullException(nameof(candidato), "Candidato cannot be null");
}
if (candidato.Eleicoes == null || candidato.Eleicoes.Count == 0)
{
throw new ArgumentException("Candidato must have at least one mapping", nameof(candidato));
}
var candidatoMapping = candidato.Eleicoes.First();
// Add partido data
if (candidatoMapping.Partido != null)
{
await partidoRepository.AddPartidoAsync(candidatoMapping.Partido);
}
// Check if the candidate already exists in the database
Candidato? existingCandidato;
if (candidato.Cpf == null || candidato.Cpf.Length != 11)
{
existingCandidato = await candidatoRepository.GetCandidatoByNome(candidato.Nome, candidato.DataNascimento.GetValueOrDefault());
}
else
{
existingCandidato = await candidatoRepository.GetCandidatoByCpf(candidato.Cpf);
}
// If the candidate already exists, we can update the mappings
if (existingCandidato != null)
{
candidato.IdCandidato = existingCandidato.IdCandidato;
candidato.Cpf = GetNonEmptyString(existingCandidato.Cpf, candidato.Cpf);
candidato.Email = GetNonEmptyString(existingCandidato.Email, candidato.Email);
candidato.EstadoCivil = GetNonEmptyString(existingCandidato.EstadoCivil, candidato.EstadoCivil);
candidato.Apelido = GetNonEmptyString(existingCandidato.Apelido, candidato.Apelido);
candidato.Escolaridade = GetNonEmptyString(existingCandidato.Escolaridade, candidato.Escolaridade);
candidato.Ocupacao = GetNonEmptyString(existingCandidato.Ocupacao, candidato.Ocupacao);
candidato.Sexo = GetNonEmptyString(existingCandidato.Sexo, candidato.Sexo);
candidatoMapping.IdCandidato = candidato.IdCandidato;
candidatoMapping.Cpf = GetNonEmptyString(candidato.Cpf, candidatoMapping.Cpf);
// Update the entries for the existing candidate
await candidatoRepository.AddCandidatoAsync(candidato);
await candidatoRepository.AddCandidatoMappingAsync(candidatoMapping);
return;
}
// If the candidate does not exist, we create a new one
CandidatoMapping? existingMapping = await candidatoRepository.GetCandidatoMappingByDetails(candidato.Nome,
candidatoMapping.Ano,
candidatoMapping.Cargo,
candidatoMapping.SiglaUF,
candidatoMapping.NomeUE,
candidatoMapping.NrCandidato,
candidatoMapping.Resultado);
// Check if exists
if (existingMapping != null)
{
candidato.IdCandidato = existingMapping.IdCandidato;
candidato.Cpf = GetNonEmptyString(existingMapping.Cpf, candidato.Cpf);
candidato.Apelido = GetNonEmptyString(existingMapping.Apelido, candidato.Apelido);
await candidatoRepository.AddCandidatoAsync(candidato);
return;
}
// No current mapping, we create a new one and create a new mapping for the current election
candidato.IdCandidato = Guid.NewGuid();
// Set the mapping properties
candidatoMapping.IdCandidato = candidato.IdCandidato;
candidatoMapping.Cpf = candidato.Cpf;
candidatoMapping.Nome = candidato.Nome;
await candidatoRepository.AddCandidatoAsync(candidato);
await candidatoRepository.AddCandidatoMappingAsync(candidatoMapping);
}
public string GetNonEmptyString(string? value1, string? value2)
{
if (!string.IsNullOrWhiteSpace(value1))
{
return value1;
}
else if (!string.IsNullOrWhiteSpace(value2))
{
return value2;
}
return string.Empty;
}
}
}