altas mudanças
This commit is contained in:
parent
684a2c0630
commit
23b1f0f14e
@ -90,5 +90,16 @@ namespace OpenCand.Repository
|
|||||||
return (await connection.QueryAsync<RedeSocial>(query, new { idcandidato })).AsList();
|
return (await connection.QueryAsync<RedeSocial>(query, new { idcandidato })).AsList();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task<List<CandidatoExt>?> GetCandidatoExtById(Guid idcandidato)
|
||||||
|
{
|
||||||
|
using (var connection = new NpgsqlConnection(ConnectionString))
|
||||||
|
{
|
||||||
|
var query = @"
|
||||||
|
SELECT * FROM candidato_ext
|
||||||
|
WHERE idcandidato = @idcandidato";
|
||||||
|
return (await connection.QueryAsync<CandidatoExt>(query, new { idcandidato })).AsList();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -59,11 +59,7 @@ namespace OpenCand.API.Services
|
|||||||
{
|
{
|
||||||
var result = await candidatoRepository.GetCandidatoAsync(idcandidato);
|
var result = await candidatoRepository.GetCandidatoAsync(idcandidato);
|
||||||
var eleicoes = await candidatoRepository.GetCandidatoMappingById(idcandidato);
|
var eleicoes = await candidatoRepository.GetCandidatoMappingById(idcandidato);
|
||||||
|
var candidatoExt = await candidatoRepository.GetCandidatoExtById(idcandidato);
|
||||||
foreach (var eleicao in eleicoes)
|
|
||||||
{
|
|
||||||
eleicao.Partido = await candidatoRepository.GetPartidoBySigla(eleicao.Sgpartido);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (result == null)
|
if (result == null)
|
||||||
{
|
{
|
||||||
@ -74,10 +70,16 @@ namespace OpenCand.API.Services
|
|||||||
throw new KeyNotFoundException($"CandidatoMapping for ID {idcandidato} not found.");
|
throw new KeyNotFoundException($"CandidatoMapping for ID {idcandidato} not found.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var eleicao in eleicoes)
|
||||||
|
{
|
||||||
|
eleicao.Partido = await candidatoRepository.GetPartidoBySigla(eleicao.Sgpartido);
|
||||||
|
}
|
||||||
|
|
||||||
var lastEleicao = eleicoes.OrderByDescending(e => e.Ano).First();
|
var lastEleicao = eleicoes.OrderByDescending(e => e.Ano).First();
|
||||||
|
|
||||||
result.FotoUrl = $"{fotoSettings.ApiBasePath}/foto_cand{lastEleicao.Ano}_{lastEleicao.SiglaUF}_div/F{lastEleicao.SiglaUF}{lastEleicao.SqCandidato}_div.jpg";
|
result.FotoUrl = $"{fotoSettings.ApiBasePath}/foto_cand{lastEleicao.Ano}_{lastEleicao.SiglaUF}_div/F{lastEleicao.SiglaUF}{lastEleicao.SqCandidato}_div.jpg";
|
||||||
result.Eleicoes = eleicoes.OrderByDescending(e => e.Ano).ToList();
|
result.Eleicoes = eleicoes.OrderByDescending(e => e.Ano).ToList();
|
||||||
|
result.CandidatoExt = candidatoExt.OrderByDescending(ce => ce.Ano).ToList();
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
@ -20,14 +20,14 @@ namespace OpenCand.Core.Models
|
|||||||
|
|
||||||
public string Sexo { get; set; }
|
public string Sexo { get; set; }
|
||||||
|
|
||||||
public string EstadoCivil { get; set; }
|
public string Localidade { get; set; }
|
||||||
|
|
||||||
public string Escolaridade { get; set; }
|
public int Ultimoano { get; set; }
|
||||||
|
|
||||||
public string Ocupacao { get; set; }
|
|
||||||
|
|
||||||
public List<CandidatoMapping> Eleicoes { get; set; }
|
public List<CandidatoMapping> Eleicoes { get; set; }
|
||||||
|
|
||||||
|
public List<CandidatoExt> CandidatoExt { get; set; }
|
||||||
|
|
||||||
// API ONLY
|
// API ONLY
|
||||||
public string FotoUrl { get; set; }
|
public string FotoUrl { get; set; }
|
||||||
}
|
}
|
||||||
@ -37,7 +37,6 @@ namespace OpenCand.Core.Models
|
|||||||
public Guid IdCandidato { get; set; }
|
public Guid IdCandidato { get; set; }
|
||||||
public string Cpf { get; set; }
|
public string Cpf { get; set; }
|
||||||
public string Nome { get; set; }
|
public string Nome { get; set; }
|
||||||
public string Apelido { get; set; }
|
|
||||||
public string SqCandidato { get; set; }
|
public string SqCandidato { get; set; }
|
||||||
public int Ano { get; set; }
|
public int Ano { get; set; }
|
||||||
public string Turno { get; set; }
|
public string Turno { get; set; }
|
||||||
@ -52,6 +51,17 @@ namespace OpenCand.Core.Models
|
|||||||
public Partido? Partido { get; set; } // Nullable to allow for candidates without a party
|
public Partido? Partido { get; set; } // Nullable to allow for candidates without a party
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public class CandidatoExt
|
||||||
|
{
|
||||||
|
public Guid IdCandidato { get; set; }
|
||||||
|
public int Ano { get; set; }
|
||||||
|
public string Apelido { get; set; }
|
||||||
|
public string Email { get; set; }
|
||||||
|
public string EstadoCivil { get; set; }
|
||||||
|
public string Escolaridade { get; set; }
|
||||||
|
public string Ocupacao { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
public class RedeSocial
|
public class RedeSocial
|
||||||
{
|
{
|
||||||
public Guid IdCandidato { get; set; }
|
public Guid IdCandidato { get; set; }
|
||||||
|
@ -2,11 +2,14 @@
|
|||||||
{
|
{
|
||||||
public static class StringExtensions
|
public static class StringExtensions
|
||||||
{
|
{
|
||||||
public static bool IsNullOrEmpty(this string value)
|
public static bool IsNullOrEmpty(this string? value)
|
||||||
{
|
{
|
||||||
return string.IsNullOrEmpty(value) ||
|
return string.IsNullOrEmpty(value) ||
|
||||||
value == "#NE" ||
|
value == "#NE" ||
|
||||||
value == "#NULO";
|
value == "#NULO" ||
|
||||||
|
value == "#NULO#" ||
|
||||||
|
value == "NÃO DIVULGÁVEL" ||
|
||||||
|
value == "-4";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -36,10 +36,10 @@ namespace OpenCand.Parser.Models
|
|||||||
public string Apelido { get; set; }
|
public string Apelido { get; set; }
|
||||||
|
|
||||||
[Name("NR_CPF_CANDIDATO")]
|
[Name("NR_CPF_CANDIDATO")]
|
||||||
public string CPFCandidato { get; set; }
|
public string? CPFCandidato { get; set; }
|
||||||
|
|
||||||
[Name("DS_EMAIL", "NM_EMAIL")]
|
[Name("DS_EMAIL", "NM_EMAIL")]
|
||||||
public string Email { get; set; }
|
public string? Email { get; set; }
|
||||||
|
|
||||||
[Name("DT_NASCIMENTO")]
|
[Name("DT_NASCIMENTO")]
|
||||||
public string DataNascimento { get; set; }
|
public string DataNascimento { get; set; }
|
||||||
@ -57,7 +57,7 @@ namespace OpenCand.Parser.Models
|
|||||||
public string GrauInstrucao { get; set; }
|
public string GrauInstrucao { get; set; }
|
||||||
|
|
||||||
[Name("DS_SIT_TOT_TURNO")]
|
[Name("DS_SIT_TOT_TURNO")]
|
||||||
public string SituacaoTurno { get; set; }
|
public string? SituacaoTurno { get; set; }
|
||||||
|
|
||||||
[Name("NR_PARTIDO")]
|
[Name("NR_PARTIDO")]
|
||||||
public int NumeroPartido { get; set; }
|
public int NumeroPartido { get; set; }
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
using Microsoft.Extensions.Logging;
|
using Microsoft.Extensions.Logging;
|
||||||
using OpenCand.Core.Models;
|
using OpenCand.Core.Models;
|
||||||
using OpenCand.ETL.Contracts;
|
using OpenCand.ETL.Contracts;
|
||||||
|
using OpenCand.ETL.Extensions;
|
||||||
using OpenCand.Parser.Models;
|
using OpenCand.Parser.Models;
|
||||||
using OpenCand.Services;
|
using OpenCand.Services;
|
||||||
|
|
||||||
@ -22,62 +23,80 @@ namespace OpenCand.ETL.Parser.ParserServices
|
|||||||
|
|
||||||
public async Task ParseObject(CandidatoCSV record)
|
public async Task ParseObject(CandidatoCSV record)
|
||||||
{
|
{
|
||||||
if (string.IsNullOrWhiteSpace(record.CPFCandidato) || record.CPFCandidato.Length <= 3)
|
if (record.CPFCandidato?.Length <= 3 || record.CPFCandidato.IsNullOrEmpty())
|
||||||
{
|
{
|
||||||
record.CPFCandidato = null; // Handle null/empty/whitespace CPF
|
record.CPFCandidato = null; // Handle null/empty/whitespace CPF
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
record.CPFCandidato = record.CPFCandidato.Trim();
|
||||||
|
}
|
||||||
|
|
||||||
if (record.NomeCandidato == "NÃO DIVULGÁVEL" ||
|
if (record.Apelido.IsNullOrEmpty())
|
||||||
string.IsNullOrEmpty(record.NomeCandidato) ||
|
{
|
||||||
record.NomeCandidato == "#NULO")
|
record.Apelido = null;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (record.NomeCandidato.IsNullOrEmpty())
|
||||||
{
|
{
|
||||||
logger.LogCritical($"ParseCandidatosAsync - Candidate with id {record.SequencialCandidato} with invalid name, skipping...");
|
logger.LogCritical($"ParseCandidatosAsync - Candidate with id {record.SequencialCandidato} with invalid name, skipping...");
|
||||||
return; // Skip candidates with invalid name
|
return; // Skip candidates with invalid name
|
||||||
}
|
}
|
||||||
|
|
||||||
if (string.IsNullOrWhiteSpace(record.Apelido) ||
|
if (record.Apelido.IsNullOrEmpty())
|
||||||
record.Apelido.Contains("#NUL") ||
|
|
||||||
record.Apelido.Contains("NULO#") ||
|
|
||||||
record.Apelido.Contains("#NE"))
|
|
||||||
{
|
{
|
||||||
record.Apelido = null;
|
record.Apelido = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (record.SituacaoTurno.IsNullOrEmpty())
|
||||||
|
{
|
||||||
|
record.SituacaoTurno = null;
|
||||||
|
}
|
||||||
|
|
||||||
var candidato = new Candidato
|
var candidato = new Candidato
|
||||||
{
|
{
|
||||||
Cpf = record.CPFCandidato,
|
Cpf = record.CPFCandidato,
|
||||||
SqCandidato = record.SequencialCandidato,
|
SqCandidato = record.SequencialCandidato,
|
||||||
Nome = record.NomeCandidato,
|
Nome = record.NomeCandidato.Trim(),
|
||||||
Apelido = record.Apelido,
|
Apelido = record.Apelido?.Trim(),
|
||||||
Email = record.Email.Contains("@") ? record.Email : null,
|
Sexo = record.Genero.Trim(),
|
||||||
Sexo = record.Genero,
|
Localidade = record.NomeUE.Trim(),
|
||||||
EstadoCivil = record.EstadoCivil,
|
Ultimoano = record.AnoEleicao,
|
||||||
Escolaridade = record.GrauInstrucao,
|
|
||||||
Ocupacao = record.Ocupacao,
|
|
||||||
Eleicoes = new List<CandidatoMapping>()
|
Eleicoes = new List<CandidatoMapping>()
|
||||||
{
|
{
|
||||||
new CandidatoMapping
|
new CandidatoMapping
|
||||||
{
|
{
|
||||||
Cpf = record.CPFCandidato,
|
Cpf = record.CPFCandidato,
|
||||||
Nome = record.NomeCandidato,
|
Nome = record.NomeCandidato.Trim(),
|
||||||
Apelido = record.Apelido,
|
SqCandidato = record.SequencialCandidato.Trim(),
|
||||||
SqCandidato = record.SequencialCandidato,
|
Ano = record.AnoEleicao,
|
||||||
Ano = record.AnoEleicao,
|
Turno = record.Turno.Trim(),
|
||||||
Turno = record.Turno,
|
TipoEleicao = record.TipoAbrangencia.Trim(),
|
||||||
TipoEleicao = record.TipoAbrangencia,
|
NomeUE = record.NomeUE.Trim(),
|
||||||
NomeUE = record.NomeUE,
|
SiglaUF = record.SiglaUF.Trim(),
|
||||||
SiglaUF = record.SiglaUF,
|
Cargo = record.DescricaoCargo.Trim(),
|
||||||
Cargo = record.DescricaoCargo,
|
NrCandidato = record.NumeroCandidato.Trim(),
|
||||||
NrCandidato = record.NumeroCandidato,
|
Resultado = record.SituacaoTurno?.Trim() ?? "-",
|
||||||
Resultado = record.SituacaoTurno,
|
Partido = new Partido
|
||||||
Partido = new Partido
|
{
|
||||||
{
|
Sigla = record.SiglaPartido.Trim(),
|
||||||
Sigla = record.SiglaPartido,
|
Nome = record.NomePartido.Trim(),
|
||||||
Nome = record.NomePartido,
|
Numero = record.NumeroPartido,
|
||||||
Numero = record.NumeroPartido,
|
}
|
||||||
}
|
}
|
||||||
}
|
},
|
||||||
}
|
CandidatoExt = new List<CandidatoExt>()
|
||||||
|
{
|
||||||
|
new CandidatoExt
|
||||||
|
{
|
||||||
|
Apelido = record.Apelido?.Trim(),
|
||||||
|
EstadoCivil = record.EstadoCivil.Trim(),
|
||||||
|
Escolaridade = record.GrauInstrucao.Trim(),
|
||||||
|
Ocupacao = record.Ocupacao.Trim(),
|
||||||
|
Ano = record.AnoEleicao,
|
||||||
|
Email = record.Email.IsNullOrEmpty() ? null : record.Email.Trim()
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
if (!string.IsNullOrEmpty(record.DataNascimento) &&
|
if (!string.IsNullOrEmpty(record.DataNascimento) &&
|
||||||
|
@ -16,18 +16,17 @@ namespace OpenCand.Repository
|
|||||||
using (var connection = new NpgsqlConnection(ConnectionString))
|
using (var connection = new NpgsqlConnection(ConnectionString))
|
||||||
{
|
{
|
||||||
await connection.ExecuteAsync(@"
|
await connection.ExecuteAsync(@"
|
||||||
INSERT INTO candidato (idcandidato, cpf, nome, apelido, datanascimento, email, sexo, estadocivil, escolaridade, ocupacao)
|
INSERT INTO candidato (idcandidato, cpf, nome, apelido, datanascimento, sexo, ultimoano, localidade)
|
||||||
VALUES (@idcandidato, @cpf, @nome, @apelido, @datanascimento, @email, @sexo, @estadocivil, @escolaridade, @ocupacao)
|
VALUES (@idcandidato, @cpf, @nome, @apelido, @datanascimento, @sexo, @ultimoano, @localidade)
|
||||||
ON CONFLICT (idcandidato) DO UPDATE SET
|
ON CONFLICT (idcandidato) DO UPDATE SET
|
||||||
cpf = EXCLUDED.cpf,
|
cpf = EXCLUDED.cpf,
|
||||||
nome = EXCLUDED.nome,
|
nome = EXCLUDED.nome,
|
||||||
|
apelido = EXCLUDED.apelido,
|
||||||
datanascimento = EXCLUDED.datanascimento,
|
datanascimento = EXCLUDED.datanascimento,
|
||||||
email = EXCLUDED.email,
|
|
||||||
sexo = EXCLUDED.sexo,
|
sexo = EXCLUDED.sexo,
|
||||||
estadocivil = EXCLUDED.estadocivil,
|
localidade = EXCLUDED.localidade,
|
||||||
escolaridade = EXCLUDED.escolaridade,
|
ultimoano = EXCLUDED.ultimoano
|
||||||
ocupacao = EXCLUDED.ocupacao,
|
WHERE candidato.ultimoano IS NULL OR EXCLUDED.ultimoano > candidato.ultimoano;",
|
||||||
apelido = EXCLUDED.apelido;",
|
|
||||||
new
|
new
|
||||||
{
|
{
|
||||||
idcandidato = candidato.IdCandidato,
|
idcandidato = candidato.IdCandidato,
|
||||||
@ -35,11 +34,9 @@ namespace OpenCand.Repository
|
|||||||
nome = candidato.Nome,
|
nome = candidato.Nome,
|
||||||
apelido = candidato.Apelido,
|
apelido = candidato.Apelido,
|
||||||
datanascimento = candidato.DataNascimento,
|
datanascimento = candidato.DataNascimento,
|
||||||
email = candidato.Email,
|
|
||||||
sexo = candidato.Sexo,
|
sexo = candidato.Sexo,
|
||||||
estadocivil = candidato.EstadoCivil,
|
localidade = candidato.Localidade,
|
||||||
escolaridade = candidato.Escolaridade,
|
ultimoano = candidato.Ultimoano
|
||||||
ocupacao = candidato.Ocupacao
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -49,15 +46,14 @@ namespace OpenCand.Repository
|
|||||||
using (var connection = new NpgsqlConnection(ConnectionString))
|
using (var connection = new NpgsqlConnection(ConnectionString))
|
||||||
{
|
{
|
||||||
await connection.ExecuteAsync(@"
|
await connection.ExecuteAsync(@"
|
||||||
INSERT INTO candidato_mapping (idcandidato, cpf, nome, apelido, sqcandidato, ano, turno, tipoeleicao, siglauf, nomeue, cargo, nrcandidato, sgpartido, resultado)
|
INSERT INTO candidato_mapping (idcandidato, cpf, nome, sqcandidato, ano, turno, tipoeleicao, siglauf, nomeue, cargo, nrcandidato, sgpartido, resultado)
|
||||||
VALUES (@idcandidato, @cpf, @nome, @apelido, @sqcandidato, @ano, @turno, @tipoeleicao, @siglauf, @nomeue, @cargo, @nrcandidato, @sgpartido, @resultado)
|
VALUES (@idcandidato, @cpf, @nome, @sqcandidato, @ano, @turno, @tipoeleicao, @siglauf, @nomeue, @cargo, @nrcandidato, @sgpartido, @resultado)
|
||||||
ON CONFLICT DO NOTHING;",
|
ON CONFLICT DO NOTHING;",
|
||||||
new
|
new
|
||||||
{
|
{
|
||||||
idcandidato = candidatoMapping.IdCandidato,
|
idcandidato = candidatoMapping.IdCandidato,
|
||||||
cpf = candidatoMapping.Cpf,
|
cpf = candidatoMapping.Cpf,
|
||||||
nome = candidatoMapping.Nome,
|
nome = candidatoMapping.Nome,
|
||||||
apelido = candidatoMapping.Apelido,
|
|
||||||
sqcandidato = candidatoMapping.SqCandidato,
|
sqcandidato = candidatoMapping.SqCandidato,
|
||||||
ano = candidatoMapping.Ano,
|
ano = candidatoMapping.Ano,
|
||||||
turno = candidatoMapping.Turno,
|
turno = candidatoMapping.Turno,
|
||||||
@ -72,6 +68,32 @@ namespace OpenCand.Repository
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public async Task AddCandidatoExtAsync(CandidatoExt candidatoExt)
|
||||||
|
{
|
||||||
|
using (var connection = new NpgsqlConnection(ConnectionString))
|
||||||
|
{
|
||||||
|
await connection.ExecuteAsync(@"
|
||||||
|
INSERT INTO candidato_ext (idcandidato, ano, apelido, email, estadocivil, escolaridade, ocupacao)
|
||||||
|
VALUES (@idcandidato, @ano, @apelido, @email, @estadocivil, @escolaridade, @ocupacao)
|
||||||
|
ON CONFLICT (idcandidato, ano) DO UPDATE SET
|
||||||
|
apelido = EXCLUDED.apelido,
|
||||||
|
email = EXCLUDED.email,
|
||||||
|
estadocivil = EXCLUDED.estadocivil,
|
||||||
|
escolaridade = EXCLUDED.escolaridade,
|
||||||
|
ocupacao = EXCLUDED.ocupacao;",
|
||||||
|
new
|
||||||
|
{
|
||||||
|
idcandidato = candidatoExt.IdCandidato,
|
||||||
|
ano = candidatoExt.Ano,
|
||||||
|
apelido = candidatoExt.Apelido,
|
||||||
|
email = candidatoExt.Email,
|
||||||
|
estadocivil = candidatoExt.EstadoCivil,
|
||||||
|
escolaridade = candidatoExt.Escolaridade,
|
||||||
|
ocupacao = candidatoExt.Ocupacao
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public async Task<Candidato?> GetCandidatoByCpf(string cpf)
|
public async Task<Candidato?> GetCandidatoByCpf(string cpf)
|
||||||
{
|
{
|
||||||
using (var connection = new NpgsqlConnection(ConnectionString))
|
using (var connection = new NpgsqlConnection(ConnectionString))
|
||||||
|
@ -17,7 +17,7 @@ namespace OpenCand.Services
|
|||||||
|
|
||||||
public async Task AddCandidatoAsync(Candidato candidato)
|
public async Task AddCandidatoAsync(Candidato candidato)
|
||||||
{
|
{
|
||||||
if (candidato == null)
|
if (candidato == null || candidato.CandidatoExt == null || candidato.Eleicoes == null)
|
||||||
{
|
{
|
||||||
throw new ArgumentNullException(nameof(candidato), "Candidato cannot be null");
|
throw new ArgumentNullException(nameof(candidato), "Candidato cannot be null");
|
||||||
}
|
}
|
||||||
@ -28,6 +28,7 @@ namespace OpenCand.Services
|
|||||||
}
|
}
|
||||||
|
|
||||||
var candidatoMapping = candidato.Eleicoes.First();
|
var candidatoMapping = candidato.Eleicoes.First();
|
||||||
|
var candidatoExt = candidato.CandidatoExt.First();
|
||||||
|
|
||||||
// Add partido data
|
// Add partido data
|
||||||
if (candidatoMapping.Partido != null)
|
if (candidatoMapping.Partido != null)
|
||||||
@ -52,18 +53,18 @@ namespace OpenCand.Services
|
|||||||
candidato.IdCandidato = existingCandidato.IdCandidato;
|
candidato.IdCandidato = existingCandidato.IdCandidato;
|
||||||
candidato.Cpf = GetNonEmptyString(existingCandidato.Cpf, candidato.Cpf);
|
candidato.Cpf = GetNonEmptyString(existingCandidato.Cpf, candidato.Cpf);
|
||||||
candidato.Email = GetNonEmptyString(existingCandidato.Email, candidato.Email);
|
candidato.Email = GetNonEmptyString(existingCandidato.Email, candidato.Email);
|
||||||
candidato.EstadoCivil = GetNonEmptyString(existingCandidato.EstadoCivil, candidato.EstadoCivil);
|
|
||||||
candidato.Apelido = GetNonEmptyString(existingCandidato.Apelido, candidato.Apelido);
|
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);
|
candidato.Sexo = GetNonEmptyString(existingCandidato.Sexo, candidato.Sexo);
|
||||||
|
|
||||||
candidatoMapping.IdCandidato = candidato.IdCandidato;
|
candidatoMapping.IdCandidato = candidato.IdCandidato;
|
||||||
candidatoMapping.Cpf = GetNonEmptyString(candidato.Cpf, candidatoMapping.Cpf);
|
candidatoMapping.Cpf = GetNonEmptyString(candidato.Cpf, candidatoMapping.Cpf);
|
||||||
|
|
||||||
|
candidatoExt.IdCandidato = candidato.IdCandidato;
|
||||||
|
|
||||||
// Update the entries for the existing candidate
|
// Update the entries for the existing candidate
|
||||||
await candidatoRepository.AddCandidatoAsync(candidato);
|
await candidatoRepository.AddCandidatoAsync(candidato);
|
||||||
await candidatoRepository.AddCandidatoMappingAsync(candidatoMapping);
|
await candidatoRepository.AddCandidatoMappingAsync(candidatoMapping);
|
||||||
|
await candidatoRepository.AddCandidatoExtAsync(candidatoExt);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -79,10 +80,12 @@ namespace OpenCand.Services
|
|||||||
if (existingMapping != null)
|
if (existingMapping != null)
|
||||||
{
|
{
|
||||||
candidato.IdCandidato = existingMapping.IdCandidato;
|
candidato.IdCandidato = existingMapping.IdCandidato;
|
||||||
candidato.Cpf = GetNonEmptyString(existingMapping.Cpf, candidato.Cpf);
|
candidatoExt.IdCandidato = existingMapping.IdCandidato;
|
||||||
candidato.Apelido = GetNonEmptyString(existingMapping.Apelido, candidato.Apelido);
|
|
||||||
await candidatoRepository.AddCandidatoAsync(candidato);
|
|
||||||
|
|
||||||
|
candidato.Cpf = GetNonEmptyString(existingMapping.Cpf, candidato.Cpf);
|
||||||
|
|
||||||
|
await candidatoRepository.AddCandidatoAsync(candidato);
|
||||||
|
await candidatoRepository.AddCandidatoExtAsync(candidatoExt);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -94,8 +97,11 @@ namespace OpenCand.Services
|
|||||||
candidatoMapping.Cpf = candidato.Cpf;
|
candidatoMapping.Cpf = candidato.Cpf;
|
||||||
candidatoMapping.Nome = candidato.Nome;
|
candidatoMapping.Nome = candidato.Nome;
|
||||||
|
|
||||||
|
candidatoExt.IdCandidato = candidato.IdCandidato;
|
||||||
|
|
||||||
await candidatoRepository.AddCandidatoAsync(candidato);
|
await candidatoRepository.AddCandidatoAsync(candidato);
|
||||||
await candidatoRepository.AddCandidatoMappingAsync(candidatoMapping);
|
await candidatoRepository.AddCandidatoMappingAsync(candidatoMapping);
|
||||||
|
await candidatoRepository.AddCandidatoExtAsync(candidatoExt);
|
||||||
}
|
}
|
||||||
|
|
||||||
public string GetNonEmptyString(string? value1, string? value2)
|
public string GetNonEmptyString(string? value1, string? value2)
|
||||||
|
@ -30,7 +30,7 @@ namespace OpenCand.Services
|
|||||||
}
|
}
|
||||||
|
|
||||||
redeSocial.IdCandidato = candidato.IdCandidato;
|
redeSocial.IdCandidato = candidato.IdCandidato;
|
||||||
redeSocial.Rede = GetRedeSocialType(redeSocial.Link);
|
redeSocial.Rede = GetRedeSocialType(redeSocial.Link.Trim());
|
||||||
|
|
||||||
await redeSocialRepository.AddRedeSocialAsync(redeSocial);
|
await redeSocialRepository.AddRedeSocialAsync(redeSocial);
|
||||||
}
|
}
|
||||||
|
35
db/db.sql
35
db/db.sql
@ -1,5 +1,6 @@
|
|||||||
DROP TABLE IF EXISTS bem_candidato CASCADE;
|
DROP TABLE IF EXISTS bem_candidato CASCADE;
|
||||||
DROP TABLE IF EXISTS candidato_mapping CASCADE;
|
DROP TABLE IF EXISTS candidato_mapping CASCADE;
|
||||||
|
DROP TABLE IF EXISTS candidato_ext CASCADE;
|
||||||
DROP TABLE IF EXISTS rede_social CASCADE;
|
DROP TABLE IF EXISTS rede_social CASCADE;
|
||||||
DROP TABLE IF EXISTS candidato CASCADE;
|
DROP TABLE IF EXISTS candidato CASCADE;
|
||||||
DROP TABLE IF EXISTS partido CASCADE;
|
DROP TABLE IF EXISTS partido CASCADE;
|
||||||
@ -10,14 +11,12 @@ CREATE TABLE candidato (
|
|||||||
idcandidato UUID NOT NULL PRIMARY KEY,
|
idcandidato UUID NOT NULL PRIMARY KEY,
|
||||||
cpf VARCHAR(11),
|
cpf VARCHAR(11),
|
||||||
nome VARCHAR(255) NOT NULL,
|
nome VARCHAR(255) NOT NULL,
|
||||||
apelido VARCHAR(255),
|
|
||||||
datanascimento TIMESTAMPTZ,
|
datanascimento TIMESTAMPTZ,
|
||||||
email TEXT,
|
|
||||||
sexo CHAR(15),
|
sexo CHAR(15),
|
||||||
estadocivil VARCHAR(50),
|
apelido VARCHAR(255),
|
||||||
escolaridade VARCHAR(50),
|
localidade VARCHAR(100),
|
||||||
ocupacao VARCHAR(150),
|
ultimoano INT,
|
||||||
popularidade BIGINT DEFAULT 0,
|
popularidade BIGINT DEFAULT 0
|
||||||
);
|
);
|
||||||
CREATE INDEX idx_candidato_nome ON candidato (nome);
|
CREATE INDEX idx_candidato_nome ON candidato (nome);
|
||||||
CREATE INDEX idx_candidato_apelido ON candidato (apelido);
|
CREATE INDEX idx_candidato_apelido ON candidato (apelido);
|
||||||
@ -30,7 +29,6 @@ CREATE TABLE candidato_mapping (
|
|||||||
idcandidato UUID NOT NULL,
|
idcandidato UUID NOT NULL,
|
||||||
cpf VARCHAR(11),
|
cpf VARCHAR(11),
|
||||||
nome VARCHAR(255) NOT NULL,
|
nome VARCHAR(255) NOT NULL,
|
||||||
apelido VARCHAR(255),
|
|
||||||
sqcandidato VARCHAR(50) NOT NULL,
|
sqcandidato VARCHAR(50) NOT NULL,
|
||||||
turno VARCHAR(2) NOT NULL,
|
turno VARCHAR(2) NOT NULL,
|
||||||
ano INT NOT NULL,
|
ano INT NOT NULL,
|
||||||
@ -44,12 +42,25 @@ CREATE TABLE candidato_mapping (
|
|||||||
CONSTRAINT pk_candidato_mapping PRIMARY KEY (idcandidato, ano, siglauf, nomeue, cargo, nrcandidato, resultado),
|
CONSTRAINT pk_candidato_mapping PRIMARY KEY (idcandidato, ano, siglauf, nomeue, cargo, nrcandidato, resultado),
|
||||||
CONSTRAINT fk_candidato_mapping_candidato FOREIGN KEY (idcandidato) REFERENCES candidato(idcandidato) ON DELETE CASCADE ON UPDATE CASCADE
|
CONSTRAINT fk_candidato_mapping_candidato FOREIGN KEY (idcandidato) REFERENCES candidato(idcandidato) ON DELETE CASCADE ON UPDATE CASCADE
|
||||||
);
|
);
|
||||||
|
CREATE INDEX idx_candidato_mapping_idcandidato ON candidato_mapping (idcandidato);
|
||||||
CREATE INDEX idx_candidato_mapping_cpf ON candidato_mapping (cpf);
|
CREATE INDEX idx_candidato_mapping_cpf ON candidato_mapping (cpf);
|
||||||
CREATE INDEX idx_candidato_mapping_nome ON candidato_mapping (nome);
|
CREATE INDEX idx_candidato_mapping_nome ON candidato_mapping (nome);
|
||||||
CREATE INDEX idx_candidato_mapping_apelido ON candidato_mapping (apelido);
|
|
||||||
CREATE INDEX idx_candidato_mapping_ano ON candidato_mapping (ano);
|
CREATE INDEX idx_candidato_mapping_ano ON candidato_mapping (ano);
|
||||||
CREATE INDEX idx_candidato_mapping_sqcandidato ON candidato_mapping (sqcandidato);
|
CREATE INDEX idx_candidato_mapping_sqcandidato ON candidato_mapping (sqcandidato);
|
||||||
|
|
||||||
|
CREATE TABLE candidato_ext (
|
||||||
|
idcandidato UUID NOT NULL,
|
||||||
|
ano INT NOT NULL,
|
||||||
|
apelido VARCHAR(255),
|
||||||
|
email TEXT,
|
||||||
|
estadocivil VARCHAR(50),
|
||||||
|
escolaridade VARCHAR(50),
|
||||||
|
ocupacao TEXT,
|
||||||
|
CONSTRAINT pk_candidato_ext PRIMARY KEY (idcandidato, ano)
|
||||||
|
);
|
||||||
|
CREATE INDEX idx_candidato_ext_idcandidato ON candidato_ext (idcandidato);
|
||||||
|
CREATE INDEX idx_candidato_ext_ano ON candidato_ext (ano);
|
||||||
|
|
||||||
---- Table for storing assets of candidates
|
---- Table for storing assets of candidates
|
||||||
CREATE TABLE bem_candidato (
|
CREATE TABLE bem_candidato (
|
||||||
idcandidato UUID NOT NULL,
|
idcandidato UUID NOT NULL,
|
||||||
@ -138,3 +149,11 @@ CREATE INDEX idx_receitas_candidato_idcandidato ON receitas_candidato (idcandida
|
|||||||
CREATE INDEX idx_receitas_candidato_ano ON receitas_candidato (ano);
|
CREATE INDEX idx_receitas_candidato_ano ON receitas_candidato (ano);
|
||||||
CREATE INDEX idx_receitas_candidato_sqcandidato ON receitas_candidato (sqcandidato);
|
CREATE INDEX idx_receitas_candidato_sqcandidato ON receitas_candidato (sqcandidato);
|
||||||
CREATE INDEX idx_receitas_candidato_sgpartido ON receitas_candidato (sgpartido);
|
CREATE INDEX idx_receitas_candidato_sgpartido ON receitas_candidato (sgpartido);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
-- Search function
|
||||||
|
CREATE EXTENSION IF NOT EXISTS pg_trgm;
|
||||||
|
CREATE INDEX idx_candidato_nome_trgm ON candidato USING GIN (nome gin_trgm_ops);
|
||||||
|
CREATE INDEX idx_candidato_apelido_trgm ON candidato USING GIN (apelido gin_trgm_ops);
|
||||||
|
CREATE INDEX idx_candidato_cpf_trgm ON candidato USING GIN (cpf gin_trgm_ops);
|
Loading…
x
Reference in New Issue
Block a user