Skip to content

feat: adiciona dag de envio dos csv's do banco para o one drive - #16

Merged
luanaa2005 merged 1 commit into
mainfrom
feat/envio-csv-onedrive
Aug 11, 2026
Merged

feat: adiciona dag de envio dos csv's do banco para o one drive#16
luanaa2005 merged 1 commit into
mainfrom
feat/envio-csv-onedrive

Conversation

@Mateushqms

Copy link
Copy Markdown
Contributor

Descrição

Este PR implementa uma DAG (export_postgres_to_onedrive_dag) que exporta tabelas do Banco para CSV e envia para o OneDrive de um usuário específico, via Microsoft Graph API. O objetivo é permitir que times sem acesso direto ao banco consumam esses dados numa planilha, sem depender de exportação manual.

A autenticação usa client-credentials (App Registration no Azure AD/Entra ID, com permissão de aplicação Files.ReadWrite.All), e o upload é idempotente: reexecutar a DAG substitui o arquivo existente no mesmo caminho em vez de duplicar.

Principais decisões técnicas:

  • cliente_onedrive.py (novo): cliente que autentica via OAuth2client-credentials e faz upload simples (≤4MB) ou em sessão/chunks (>4MB), conforme exigido pela Graph API. Define explicitamente @microsoft.graph.conflictBehavior: replace na sessão de upload — sem isso, o padrão da API é fail, o que quebraria reexecuções em tabelas grandes. Também faz URL-encoding do caminho, necessário para pastas com espaço no nome.
  • cliente_postgres.py (modificado): novo método export_table_to_csv, que exporta qualquer tabela como CSV. Valida schema/table_name por regex antes de montar a query, então a validação evita injeção de SQL). Usa ; como separador em vez de ,, porque o Excel em locale Português (Brasil) usa vírgula como separador decimal e esperava ; como separador de campo — sem isso, o Excel abria o CSV mas colocava cada linha numa única célula sem dividir em colunas.
  • DAG: lê configuração de duas Airflow Variables (secret_onedrive_credentials e onedrive_export_config), evitando credencial fixa no código. O prefixo secret_ no nome da Variable de credenciais faz o Airflow mascarar (***) o valor na UI.

Tipo de mudança

  • Nova funcionalidade / pipeline
  • Correção de bug ou inconsistência de dados
  • Refatoração de modelo DBT
  • Documentação
  • Infraestrutura / CI
  • Outro: ___

Issues relacionadas

Closes #

Domínio de revisão

  • GCES / OSS
  • IPEA
  • MIR
  • MCid
  • MinC
  • OSS
  • Múltiplos domínios: ___

Como testar / validar

# Para DAGs
airflow dags test export_postgres_to_onedrive_dag 2026-01-01

# Para rodar é necessário setar 2 variaveis na UI do airflow ou usando o comando dentro do container airflow variables set secret_onedrive_credentials '{"client_id": "...", "client_secret": "...", "tenant_id": "..."}' airflow variables set onedrive_export_config '{"onedrive_user_id": "usuario@dominio.com.br", "onedrive_folder": "Pasta/Sub", "tables": [{"schema": "transfere_gov", "table": "programas", "file_name": "file.csv"}]}'

Evidências

Checklist

  • Título do PR segue Conventional Commits
  • Issue relacionada foi referenciada
  • Testes/lint foram executados ou a ausência foi justificada
  • Testes DBT adicionados/atualizados, se aplicável
  • Documentação atualizada, se aplicável
  • Sem dados sensíveis ou credenciais no código
  • Branch atualizada com upstream/main ou origin/main
  • Revisores automáticos por domínio foram solicitados pelo GitHub ou justificados no PR

@Mateushqms Mateushqms self-assigned this Aug 7, 2026

@TiagoSBittencourt TiagoSBittencourt left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Achei o código muito bem implementado, vou esperar a review da Luana para mergear, pois é um código complexo

@luanaa2005 luanaa2005 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

O código está muito bom! Eu tenho uma dúvida, dei uma pesquisada e achei que em cliente_onedrive.py: o UPLOAD_CHUNK_SIZE_BYTES precisa ser múltiplo de 320 KiB. Como 60 MiB não é, uploads >4MB vão retornar erro 400 / InvalidRange. Isso faz sentido?

@TiagoSBittencourt
TiagoSBittencourt self-requested a review August 11, 2026 19:29
@luanaa2005
luanaa2005 merged commit ee7dfc2 into main Aug 11, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants