using line_gestao_api.Data; using line_gestao_api.Models; using Microsoft.EntityFrameworkCore; namespace line_gestao_api.Services; public class DataConsistencyService : IDataConsistencyService { private readonly AppDbContext _db; public DataConsistencyService(AppDbContext db) { _db = db; } public async Task SyncFromMobileLineAsync(MobileLine line, CancellationToken cancellationToken = default) { await ApplyMobileLineToSatellitesAsync(line, cancellationToken); await _db.SaveChangesAsync(cancellationToken); } public async Task SyncFromTrocaNumeroAsync(TrocaNumeroLine trocaNumero, CancellationToken cancellationToken = default) { var linhaAntiga = OnlyDigits(trocaNumero.LinhaAntiga); if (string.IsNullOrWhiteSpace(linhaAntiga)) { return; } var mobile = await _db.MobileLines .FirstOrDefaultAsync(x => x.Linha != null && OnlyDigits(x.Linha) == linhaAntiga, cancellationToken); if (mobile == null) { return; } var linhaNova = OnlyDigits(trocaNumero.LinhaNova); if (!string.IsNullOrWhiteSpace(linhaNova)) { mobile.Linha = linhaNova; } var iccid = OnlyDigits(trocaNumero.ICCID); if (!string.IsNullOrWhiteSpace(iccid)) { mobile.Chip = iccid; } mobile.UpdatedAt = DateTime.UtcNow; await _db.SaveChangesAsync(cancellationToken); await ApplyMobileLineToSatellitesAsync(mobile, cancellationToken); await _db.SaveChangesAsync(cancellationToken); } private static string OnlyDigits(string? value) { if (string.IsNullOrWhiteSpace(value)) { return string.Empty; } var chars = value.Where(char.IsDigit).ToArray(); return new string(chars); } private async Task ApplyMobileLineToSatellitesAsync(MobileLine line, CancellationToken cancellationToken) { var item = line.Item; var vigencias = await _db.VigenciaLines .Where(x => x.Item == item) .ToListAsync(cancellationToken); foreach (var vigencia in vigencias) { vigencia.Conta = line.Conta; vigencia.Linha = line.Linha; vigencia.Cliente = line.Cliente; vigencia.Usuario = line.Usuario; vigencia.PlanoContrato = line.PlanoContrato; vigencia.UpdatedAt = DateTime.UtcNow; } var userDatas = await _db.UserDatas .Where(x => x.Item == item) .ToListAsync(cancellationToken); foreach (var userData in userDatas) { userData.Linha = line.Linha; userData.Cliente = line.Cliente; userData.UpdatedAt = DateTime.UtcNow; } } }