📖 Documentação da API Vanguru (Firebase Functions)
Este documento detalha as funções disponíveis no backend para garantir a conformidade com a LGPD e a segurança financeira do projeto Vanguru. Todas as funções são do tipo HTTPS Callable.
🔐 Camada de Segurança e LGPD
1. secureUpsertSensitiveData
Criptografa dados sensíveis antes de salvá-los no Firestore. O dado original nunca toca o banco de dados em texto claro.
Parâmetros de Entrada:
{
"collection": "string", // "users", "passengers" ou "responsibles"
"docId": "string", // ID do documento correspondente na coleção principal
"data": { // Objeto com os campos sensíveis
"cpf": "12345678900",
"birthDate": "2010-01-01"
}
}
Retorno:
{
"success": true,
"timestamp": "ISO-8601-String"
}
Comportamento:
- Os campos são salvos com o sufixo _enc na respectiva coleção de cofre (ex: responsibles_sensitive).
- Utiliza AES-256 com a MASTER_KEY configurada no ambiente.
2. secureReadSensitiveData
Recupera e descriptografa dados sob demanda. Ideal para casos de "revelar informação" ou processos de backend que não podem ser feitos no cliente.
Parâmetros de Entrada:
{
"collection": "string", // "users", "passengers" ou "responsibles"
"docId": "string",
"fields": ["string"] // Lista de campos a serem descriptografados
}
Retorno:
{
"cpf": "12345678900",
"birthDate": "2010-01-01"
}
Comportamento:
- Cada chamada gera um log de auditoria no Cloud Logging: [AUDIT] User {UID} accessed fields [...].
- Se o documento ou campo não existir, retorna um objeto vazio ou apenas os campos encontrados.
3. secureBatchUpsertSensitiveData
Permite o envio de múltiplos dados sensíveis em uma única operação (Batch). É ideal para situações onde múltiplos documentos precisam ser atualizados simultaneamente (ex: importação ou sincronização de dados), reduzindo o número de requisições HTTPS.
Parâmetros de Entrada:
{
"operations": [
{
"collection": "string", // "users", "passengers", "responsibles", ou "users/*/sensitive"
"docId": "string",
"data": {
"cpf": "11122233300"
}
},
{
"collection": "passengers",
"docId": "child_abc",
"data": {
"rg": "12345678"
}
}
]
}
Retorno:
{
"success": true,
"count": 2
}
Comportamento:
- Utiliza o writeBatch do Firestore para garantir atomicidade no nível do banco de dados (dentro dos limites do Firestore).
- Suporta os mesmos mapeamentos de coleção da função individual.
💳 Integração Financeira
4. createAsaasSubscription
Intermediário seguro para a API do Asaas. Garante que a chave de API do Asaas nunca saia do ambiente do servidor.
Parâmetros de Entrada (Exemplo):
{
"customer": "customer_id",
"billingType": "BOLETO",
"value": 150.00,
"nextDueDate": "2026-02-05"
}
Retorno:
{
"asaasSubscriptionId": "string",
"status": "string",
"timestamp": "string"
}
Comportamento:
- Injeta automaticamente a ASAAS_API_KEY nos cabeçalhos da requisição para o Asaas.
🛠️ Configuração de Ambiente (Secrets)
Para que as funções operem corretamente em produção, execute os seguintes comandos no terminal:
# Configurar chave mestra de criptografia
firebase functions:secrets:set MASTER_KEY
# Configurar chave de API do Asaas
firebase functions:secrets:set ASAAS_API_KEY
📱 Exemplo de Integração Flutter (Dart)
import 'package:cloud_functions/cloud_functions.dart';
Future<Map<String, dynamic>> getCpf(String responsibleId) async {
try {
final result = await FirebaseFunctions.instance
.httpsCallable('secureReadSensitiveData')
.call({
"collection": "responsibles",
"docId": responsibleId,
"fields": ["cpf"],
});
return Map<String, dynamic>.from(result.data);
} catch (e) {
print("Erro ao ler CPF: $e");
rethrow;
}
}
// Exemplo de Upsert em Lote (Batch)
Future<void> saveMultipleSensitive(List<Map<String, dynamic>> ops) async {
try {
await FirebaseFunctions.instance
.httpsCallable('secureBatchUpsertSensitiveData')
.call({
"operations": ops,
});
} catch (e) {
print("Erro no batch: $e");
rethrow;
}
}
💻 Ambiente de Desenvolvimento Local
Para executar e testar o projeto localmente, siga os passos abaixo.
Pré-requisitos
- Node.js: Versão 20 (LTS)
- Firebase CLI:
npm install -g firebase-tools - Java: Necessário para emuladores (Firestore/Auth)
Configuração Inicial
- Instale as dependências:
bash npm install - Configure as variáveis de ambiente:
bash cp .env.template .env # Edite o arquivo .env com suas chaves locais (pode usar valores fictícios para desenvolvimento local se não interagir com APIs reais)
Executando Emuladores
O projeto está configurado para emular Functions, Firestore e Auth.
npm run serve
# ou
firebase emulators:start
O VFS (Emulator UI) estará disponível em http://localhost:4000.
Executando Testes
Testes unitários utilizam mocha e chai.
npm test
🚀 CI/CD (GitHub Actions)
O projeto possui pipelines automatizados para garantir a qualidade e o deploy contínuo.
Workflows
- Run Tests (
run-tests.yml): - Gatilho: Pull Request p/
main,develope Push p/develop. -
Ação: Instala dependências, roda lint (
npm run lint) e executa testes unitários (npm test). -
Deploy Functions (
deploy-functions.yml): - Gatilho: Push direto na branch
main. - Ação: Faz o deploy automático das funções para o Firebase.
- Secret Necessária:
FIREBASE_SERVICE_ACCOUNT_KEYdeve estar configurada nos Secrets do repositório GitHub.
🆚 VS Code Setup
O projeto inclui configurações para facilitar o desenvolvimento no VS Code.
- Tasks: Use
Cmd+Shift+P->Tasks: Run Task->Start Firebase Emulatorspara iniciar o ambiente local. - Debug: Fica pronto para anexar debugger se configurado (porta 9229 padrão do node inspector quando rodando em modo debug).