File size: 3,248 Bytes
5058d24
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# utils/apis/gsheets.py
import gspread
import os
from dotenv import load_dotenv
from typing import Optional, List, Any

# --- Configuração e Conexão com a API ---
load_dotenv()

# Carrega as configurações das variáveis de ambiente
SERVICE_ACCOUNT_KEY_PATH: Optional[str] = os.getenv('SERVICE_ACCOUNT_KEY_PATH')
SPREADSHEET_NAME: Optional[str] = os.getenv('GOOGLE_SHEETS_NAME')

# Variáveis globais para "cachear" a conexão e evitar reinicializações
_gc_client: Optional[gspread.Client] = None
_worksheet: Optional[gspread.Worksheet] = None
_initialization_error: Optional[str] = None

def _initialize_connection() -> Optional[str]:
    """
    Inicializa e armazena a conexão com o Google Sheets.

    Tenta conectar-se usando as credenciais do ambiente. Se a conexão for bem-sucedida,
    armazena o cliente e a planilha em variáveis globais. Em caso de falha, armazena
    a mensagem de erro para evitar novas tentativas.

    Returns:
        Optional[str]: Uma string com a mensagem de erro em caso de falha, ou None se bem-sucedido.
    """
    global _gc_client, _worksheet, _initialization_error

    # Se já houve uma tentativa de conexão (bem-sucedida ou não), retorna o resultado
    if _gc_client and _worksheet:
        return None
    if _initialization_error:
        return _initialization_error

    # Validação das variáveis de ambiente
    if not SERVICE_ACCOUNT_KEY_PATH:
        _initialization_error = "A variável de ambiente 'SERVICE_ACCOUNT_KEY_PATH' não foi definida."
        return _initialization_error
    if not SPREADSHEET_NAME:
        _initialization_error = "A variável de ambiente 'GOOGLE_SHEETS_NAME' não foi definida."
        return _initialization_error

    try:
        print("INFO: Tentando conectar-se ao Google Sheets...")
        _gc_client = gspread.service_account(filename=SERVICE_ACCOUNT_KEY_PATH)
        sh = _gc_client.open(SPREADSHEET_NAME)
        _worksheet = sh.sheet1
        print("INFO: Conexão com Google Sheets estabelecida com sucesso.")
        return None
    except gspread.exceptions.SpreadsheetNotFound:
        _initialization_error = f"Erro: A planilha '{SPREADSHEET_NAME}' não foi encontrada."
        return _initialization_error
    except Exception as e:
        _initialization_error = f"Erro ao inicializar a conexão com Google Sheets: {e}"
        return _initialization_error

def append_row(data: List[Any]) -> Optional[str]:
    """
    Adiciona uma nova linha à planilha configurada.

    Args:
        data (List[Any]): Uma lista de valores a serem inseridos como uma nova linha.

    Returns:
        Optional[str]: Uma mensagem de erro em caso de falha, ou None se a operação for bem-sucedida.
    """
    # Garante que a conexão esteja ativa antes de tentar escrever
    init_error = _initialize_connection()
    if init_error:
        return f"Serviço indisponível devido a erro de configuração: {init_error}"

    try:
        # A verificação acima garante que _worksheet não é None
        _worksheet.append_row(data) # type: ignore [union-attr]
        return None
    except Exception as e:
        error_message = f"Falha ao escrever na planilha: {e}"
        print(f"ERROR: {error_message}")
        return error_message