8.2 KiB
8.2 KiB
📊 QR Code Analytics - Premium Feature
Sistema de rastreamento de leituras de QR codes para usuários premium.
🎯 Visão Geral
Permite que usuários premium acompanhem quantas vezes seus QR codes foram escaneados, com timestamps e histórico completo.
Como Funciona
- Usuário premium gera QR code com analytics habilitado
- QR code aponta para URL de redirect:
https://qrrapido.site/t/{trackingId} - Ao escanear, o sistema:
- Incrementa contador de leituras (
scanCount) - Atualiza timestamp da última leitura (
lastAccessedAt) - Redireciona para URL original (HTTP 302)
- Incrementa contador de leituras (
🔧 Implementação Técnica
Novos Componentes
1. TrackingController (Controllers/TrackingController.cs)
Endpoints:
GET /t/{trackingId}- Redireciona e contabiliza leituraGET /t/analytics/{trackingId}- Retorna analytics (requer autenticação)
2. Campos no MongoDB
QRCodeHistory (campos já existentes, agora em uso):
public int ScanCount { get; set; } = 0; // Contador de leituras
public DateTime LastAccessedAt { get; set; } // Última leitura
public bool IsDynamic { get; set; } = false; // Se é trackable
public string? TrackingId { get; set; } // ID público (novo)
3. QRGenerationRequest (novo campo)
public bool EnableTracking { get; set; } = false; // Premium feature
4. UserService (novos métodos)
Task<QRCodeHistory?> GetQRByTrackingIdAsync(string trackingId);
Task IncrementQRScanCountAsync(string trackingId);
🚀 Como Usar
Backend (já implementado)
Gerar QR com Analytics
var request = new QRGenerationRequest
{
Type = "url",
Content = "https://google.com",
IsPremium = true,
EnableTracking = true // ✅ Habilita analytics
};
var result = await _qrService.GenerateRapidAsync(request);
// result.TrackingId conterá o ID para analytics
// QR code aponta para: https://qrrapido.site/t/{trackingId}
Consultar Analytics
// Via UserService
var qr = await _userService.GetQRByTrackingIdAsync("abc123def456");
Console.WriteLine($"Leituras: {qr.ScanCount}");
Console.WriteLine($"Última leitura: {qr.LastAccessedAt}");
// Via API (requer autenticação)
GET /t/analytics/abc123def456
Response:
{
"trackingId": "abc123def456",
"scanCount": 42,
"createdAt": "2025-10-19T10:00:00Z",
"lastAccessedAt": "2025-10-20T15:30:00Z",
"content": "https://google.com",
"type": "url"
}
Frontend (ainda não implementado)
Opção 1: Checkbox no Gerador
<!-- Em Views/Home/Index.cshtml -->
<div class="form-check premium-feature">
<input type="checkbox" id="enableTracking" class="form-check-input">
<label for="enableTracking">
<i class="fas fa-chart-line"></i> Habilitar Analytics
<span class="badge bg-warning">Premium</span>
</label>
</div>
// Em wwwroot/js/qr-speed-generator.js
const enableTracking = document.getElementById('enableTracking');
formData.append('EnableTracking', enableTracking?.checked && this.isPremium);
Opção 2: Dashboard de Analytics
<!-- Nova view: Views/Premium/Analytics.cshtml -->
<div class="analytics-dashboard">
<h2>Meus QR Codes com Analytics</h2>
<div class="qr-list">
@foreach (var qr in Model.TrackableQRs)
{
<div class="qr-card">
<h3>@qr.Content</h3>
<p><strong>Leituras:</strong> @qr.ScanCount</p>
<p><strong>Última leitura:</strong> @qr.LastAccessedAt.ToString("dd/MM/yyyy HH:mm")</p>
<a href="/t/analytics/@qr.TrackingId">Ver detalhes</a>
</div>
}
</div>
</div>
📝 Limitações Conhecidas
1. Apenas QR codes de URL
- Tracking funciona apenas para
Type = "url" - WiFi, vCard, SMS, etc. não suportam redirect
Razão: Esses tipos não aceitam URLs customizadas
Solução futura: Implementar pixel de tracking invisível ou API de scan manual
2. Redirect adiciona ~50-200ms
- Usuário experimenta pequeno delay ao escanear
- Impacto: Mínimo para maioria dos casos
Otimização: Redirect é assíncrono, contador atualiza em background
3. Bloqueadores de ads podem afetar
- Alguns bloqueadores podem marcar
/t/como tracking - Probabilidade: Baixa (não usa cookies ou JS)
🔐 Segurança
Proteções Implementadas
- Tracking ID não-sequencial: GUID truncado (12 chars)
- Validação de ownership: Endpoint
/t/analytics/verifica se QR pertence ao usuário - Fire-and-forget counting: Não bloqueia redirect se MongoDB estiver lento
- Logging completo: Todas as leituras são logadas
Considerações de Privacidade
- Não coleta: IP, device, localização (por enquanto)
- Apenas conta: Quantidade de leituras + timestamp
- LGPD compliant: Usuário premium pode deletar histórico a qualquer momento
📊 Exemplos de Uso
Caso 1: Rastreamento de Campanha
// Gerar QR para campanha de marketing
var campaign = new QRGenerationRequest
{
Type = "url",
Content = "https://minhaloja.com/promo-verao",
IsPremium = true,
EnableTracking = true
};
var qr = await _qrService.GenerateRapidAsync(campaign);
// Distribuir QR em materiais impressos
// Depois consultar: await _userService.GetQRByTrackingIdAsync(qr.TrackingId);
Caso 2: Validação de Engajamento
// Verificar se QR code em outdoor teve leituras
var qr = await _userService.GetQRByTrackingIdAsync("abc123def456");
if (qr.ScanCount > 100)
{
Console.WriteLine("Outdoor teve boa visibilidade!");
}
else if (qr.ScanCount == 0)
{
Console.WriteLine("QR pode estar ilegível ou mal posicionado");
}
🛠️ Configuração
appsettings.json
{
"App": {
"BaseUrl": "https://qrrapido.site" // ✅ Usado para gerar URLs de tracking
}
}
appsettings.Development.json
{
"App": {
"BaseUrl": "https://localhost:52428" // ✅ Para testes locais
}
}
🧪 Testando Localmente
1. Gerar QR com Tracking
# POST /api/QR/GenerateRapid
curl -X POST https://localhost:52428/api/QR/GenerateRapid \
-H "Content-Type: application/json" \
-d '{
"type": "url",
"content": "https://google.com",
"isPremium": true,
"enableTracking": true
}'
Response:
{
"qrCodeBase64": "iVBORw0KG...",
"trackingId": "a1b2c3d4e5f6",
"success": true
}
2. Simular Leitura do QR
# Abrir no navegador (ou curl)
curl -L https://localhost:52428/t/a1b2c3d4e5f6
# Deve redirecionar para https://google.com
3. Verificar Contador
# Acessar MongoDB ou via API
curl https://localhost:52428/t/analytics/a1b2c3d4e5f6 \
-H "Authorization: Bearer {token}"
Response:
{
"trackingId": "a1b2c3d4e5f6",
"scanCount": 1,
"lastAccessedAt": "2025-10-20T10:00:00Z"
}
📈 Próximos Passos (Features Futuras)
Analytics Avançado
- Gráfico de leituras por dia/semana/mês
- Geo-localização (IP → País/Cidade)
- Tipo de device (mobile/desktop)
- Browser/OS usado para escanear
UI/UX
- Dashboard de analytics no painel premium
- Exportar dados para CSV/Excel
- Notificações quando QR atingir X leituras
Performance
- Cache Redis para evitar queries MongoDB em cada scan
- Batch updates (atualizar contador a cada N leituras)
📚 Referências
- Tracking URLs: Mesma estratégia usada por bit.ly, tinyurl, etc.
- HTTP 302 Redirect: Padrão para preservar SEO e funcionalidade
- Fire-and-forget: Pattern do ASP.NET Core para operações assíncronas não-bloqueantes
🐛 Troubleshooting
Problema: "QR code not found"
- Verificar se
trackingIdexiste no MongoDB - Verificar se QR foi salvo com
IsDynamic = true
Problema: Contador não incrementa
- Verificar logs do
TrackingController - Verificar conectividade MongoDB
- Verificar se
IncrementQRScanCountAsyncestá sendo chamado
Problema: Redirect não funciona
- Verificar se URL original está salva em
Content - Verificar se
BaseUrlestá configurado corretamente - Verificar logs de erro no controller
Implementado em: 2025-10-20 Versão: 1.0.0 Status: ✅ Backend completo, Frontend pendente