A proposta desse estudo é visualizar uma maneira em que a retaguarda envie arquivos de dados ao Sync Server, que serão processados pelo Sync Client no PDV. Isso não substitui a API, mas complementa o fluxo para situações em que seja mais eficiente carregar os dados dessa maneira.

Desafios gerados para esse estudo foram:

SOLUÇÃO PROPOSTA - SUBIDA DE ARQUIVO JSON CRIPTOGRAFADO BI FORMATO AES-256 CONTENDO TODOS OS DADOS PARA BAIXA

Na solução proposta foi desenhado o seguinte escopo:

Para esse fluxo, foi considerado o envio do arquivo pelo Bucked Cloud. No teste realizado, foi utilizado o bucket do GCP (biblioteca Google.Cloud.Storage).

Para o uso do bucket de arquivos do GCP, deve ser considerado as seguintes observações:

PRINCIPAIS RECURSOS:

✅Armazenamento escalável para grandes volumes de dados
Alto desempenho para leitura e escrita de arquivos
Suporte a múltiplos tipos de armazenamento (Standard, Nearline, Coldline e Archive)
Integração com serviços Google (BigQuery, AI, Kubernetes, etc.)
Segurança com criptografia automática e permissões IAM
Versionamento e backup de arquivos

TIPOS DE STORAGE E CASOS DE USO:

Tipo de ArmazenamentoCusto ($/GB/mês)RecuperaçãoUso Ideal
Standard$$$ (Alto)RápidoDados acessados frequentemente
Nearline$$ (Médio)Leve atrasoBackups, arquivamento de médio prazo
Coldline$ (Baixo)DemoradoDados raramente acessados (1x por ano)
Archive$ (Muito Baixo)Muito lentoArquivamento de longo prazo

 Exemplo de Preços (EUA, Março/2024):

Para o nosso caso, o tipo de armazenamento standard é o mais recomendado, visto que precisamos de um processo que a subida de arquivo seja feita de forma rápida e que o mesmo seja acessado frequentemente (subindo o arquivo uma vez e baixando o arquivo apenas uma vez na máquina local para o recebimento dos dados via arquivo).

Vantagens do Google Cloud Storage

Escalabilidade → Suporta petabytes de dados sem limitação de tamanho.
Segurança Avançada → Dados criptografados e integração com IAM.
Baixa Latência → Alta performance para leitura e escrita de arquivos.
Multi-Regional → Armazene dados em várias regiões para redundância.
Integração com BigQuery, AI e Kubernetes.

Desvantagens do Google Cloud Storage

Custo pode ser alto para grandes volumes de dados em classes Standard.
Cobrança por requisições e downloads → Cada leitura/escrita pode gerar custos extras.
Necessidade de autenticação → Exige configuração de chaves e permissões via IAM.
Recuperação lenta em Coldline/Archive → Pode levar horas para acessar arquivos arquivados.

POC - Testando a subida e download de um arquivo

No teste foi criado duas APIs simulando a subida e download de um arquivo via bucket cloud do GCP. 

No GCP foi criado um bucket onde fosse possível armazenar os arquivos subidos através da API.



Para a criação do bucket foi necessário colocar permissão de envio/baixa de arquivo para o usuário utilizado no micro serviço de Controle que faz o acesso ao diretório através da aplicação.

Após a criação do bucket, foi criado as APIs POST para envio do arquivo e a API GET para a baixa do arquivo.

API POST - Carga Loja - Envio:


API GET - Baixa do Arquivo:


MÉTODO PARA ENVIO DE ARQUIVOS CRIPTOGRAFADOS USANDO O MODELO AES-256

Para a solução proposta, é necessário que o arquivo enviado esteja criptografado. Para isso, iremos utilizar o modelo AES, já utilizado dentro do PDV SYNC, na criptografia de senhas do banco de dados dos serviços do client. 

Para isso, podemos utilizar o modelo abaixo para criptografia do arquivo, uma vez que o arquivo enviado já tem que estar devidamente criptografado.

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

class AESFileEncryption
{
    static void Main()
    {
        string filePath = "C:\\Temp\\arquivo.txt"; // Arquivo original
        string encryptedFilePath = "C:\\Temp\\arquivo_encrypted.aes"; // Arquivo criptografado
        string decryptedFilePath = "C:\\Temp\\arquivo_decrypted.txt"; // Arquivo descriptografado

        // Gerar chave e IV AES-256
        byte[] key = GenerateRandomKey(32); // 256 bits
        byte[] iv = GenerateRandomKey(16);  // 128 bits

        Console.WriteLine($"🔑 Chave AES-256: {Convert.ToBase64String(key)}");
        Console.WriteLine($"🌀 IV: {Convert.ToBase64String(iv)}");

        // Criptografar arquivo
        EncryptFile(filePath, encryptedFilePath, key, iv);
        Console.WriteLine("✅ Arquivo criptografado com sucesso!");

        // Descriptografar arquivo
        DecryptFile(encryptedFilePath, decryptedFilePath, key, iv);
        Console.WriteLine("✅ Arquivo descriptografado com sucesso!");
    }

    // Método para gerar chave e IV aleatórios
    static byte[] GenerateRandomKey(int size)
    {
        using (var rng = new RNGCryptoServiceProvider())
        {
            byte[] key = new byte[size];
            rng.GetBytes(key);
            return key;
        }
    }

    // Método para descriptografar um arquivo
    public static void DecryptFile(string inputFile, string outputFile, byte[] key, byte[] iv)
    {
        using (Aes aes = Aes.Create())
        {
            aes.Key = key;
            aes.IV = iv;
            aes.Mode = CipherMode.CBC;
            aes.Padding = PaddingMode.PKCS7;

            using (FileStream fsInput = new FileStream(inputFile, FileMode.Open))
            using (CryptoStream cryptoStream = new CryptoStream(fsInput, aes.CreateDecryptor(), CryptoStreamMode.Read))
            using (FileStream fsOutput = new FileStream(outputFile, FileMode.Create))
            {
                cryptoStream.CopyTo(fsOutput);
            }
        }
    }
}

BAIXA DE ARQUIVOS NO CLIENT

Para a baixa de arquivo de carga, o modelo ideal para a proposta seria a seguinte:

CONSIDERAÇÕES FINAIS + SEPARAÇÃO DE ISSUES PARA CADA TAREFA

O solução proposta unindo todos esses pontos é eficiente, rápido e eficaz, uma vez que o processo de leitura/gravação de dados por arquivo já está implementado no client, com a baixa de dados via Function, e com o modelo de dados proposto para o envio do arquivo para o server, vai gerar mais fluidez para o processo de carga inicial de uma loja. Dito isso, as issues de história que devemos considerar para que esse modelo acima seja seguido são:

  1. Criação da API POST para envio do Arquivo, inclusão da validação do arquivo criptografado + criação da tabela no Controle para a manutenção do envio desses arquivos, incluído campos para status de processamento e logs de mensagens
  2. Processamento de Arquivo no PDV SYNC SERVER Controle
  3. Criação da API GET para a baixa do arquivo no Client
  4. Criação da API PUT para a confirmação da baixa do arquivo e envio de logs referentes ao seu processamento 
  5. Alteração do serviço client Down para a baixa do arquivo enviado no server, leitura do arquivo criptografado, separação dos registros por tipo de dados e acionamento da baixa de dados via function