fix: token
All checks were successful
BCards Deployment Pipeline / Run Tests (push) Successful in 4s
BCards Deployment Pipeline / PR Validation (push) Has been skipped
BCards Deployment Pipeline / Build and Push Image (push) Successful in 15m52s
BCards Deployment Pipeline / Deploy to Production (ARM - OCI) (push) Successful in 2m20s
BCards Deployment Pipeline / Deploy to Staging (x86 - Local) (push) Has been skipped
BCards Deployment Pipeline / Cleanup Old Resources (push) Has been skipped
BCards Deployment Pipeline / Deployment Summary (push) Successful in 0s

This commit is contained in:
Ricardo Carneiro 2025-09-14 00:34:53 -03:00
parent 04f406f6bc
commit f98dac9178
2 changed files with 13 additions and 75 deletions

View File

@ -313,12 +313,7 @@ public class AdminController : Controller
await _userPageService.CreatePageAsync(userPage);
_logger.LogInformation("Page created successfully!");
// Generate preview token for development
var previewToken = await _moderationService.GeneratePreviewTokenAsync(userPage.Id);
var previewUrl = $"{Request.Scheme}://{Request.Host}/page/{userPage.Category}/{userPage.Slug}?preview={previewToken}";
userPage.PreviewToken = previewToken;
userPage.PreviewTokenExpiry = DateTime.UtcNow.AddHours(4);
await _userPageService.UpdatePageAsync(userPage);
// Token será gerado apenas quando usuário clicar "Testar Página"
TempData["Success"] = "Página criada com sucesso! Use o botão 'Enviar para Moderação' quando estiver pronta.";
}
@ -371,9 +366,7 @@ public class AdminController : Controller
await _userPageService.UpdatePageAsync(existingPage);
// Generate new preview token
var previewToken = await _moderationService.GeneratePreviewTokenAsync(existingPage.Id);
var previewUrl = $"{Request.Scheme}://{Request.Host}/page/{existingPage.Category}/{existingPage.Slug}?preview={previewToken}";
// Token será gerado apenas quando usuário clicar "Testar Página"
// Send email to user
await _emailService.SendModerationStatusAsync(
@ -382,7 +375,7 @@ public class AdminController : Controller
existingPage.DisplayName,
"pending",
null,
previewUrl);
null); // previewUrl não é mais necessário - token será gerado no clique
TempData["Success"] = "Página atualizada! Teste e envie para moderação.";
}
@ -1023,7 +1016,7 @@ public class AdminController : Controller
success = true,
previewToken = newToken,
message = "Preview gerado com sucesso!",
expiresAt = DateTime.UtcNow.AddHours(4).ToString("yyyy-MM-dd HH:mm:ss")
expiresAt = DateTime.UtcNow.AddMinutes(5).ToString("yyyy-MM-dd HH:mm:ss")
});
}
catch (Exception ex)

View File

@ -374,52 +374,6 @@
}
});
// Sistema de auto-refresh para tokens de preview
let refreshInterval;
let activePreviewPages = new Map(); // pageId -> {category, slug, windowRef}
// Iniciar auto-refresh a cada 4 minutos
function startAutoRefresh() {
if (refreshInterval) clearInterval(refreshInterval);
refreshInterval = setInterval(async () => {
if (activePreviewPages.size > 0) {
console.log(`Auto-refreshing ${activePreviewPages.size} active preview tokens...`);
for (const [pageId, pageData] of activePreviewPages) {
if (!pageData.windowRef.closed) {
await refreshPageToken(pageId, pageData);
} else {
// Aba fechada, remover do tracking
activePreviewPages.delete(pageId);
}
}
}
}, 4 * 60 * 1000); // 4 minutos
}
async function refreshPageToken(pageId, pageData) {
try {
// Usar o endpoint específico para refresh ao invés de generate
const response = await fetch(`/Admin/RefreshPreviewToken/${pageId}`, {
method: 'POST',
headers: { 'RequestVerificationToken': document.querySelector('input[name="__RequestVerificationToken"]').value }
});
const result = await response.json();
if (result.success) {
// Atualizar URL da aba existente
const newUrl = `${window.location.origin}/page/${pageData.category}/${pageData.slug}?preview=${result.previewToken}`;
pageData.windowRef.location.href = newUrl;
console.log(`Token refreshed for page ${pageId}: ${result.previewToken}`);
} else {
console.warn(`Failed to refresh token for page ${pageId}: ${result.message}`);
}
} catch (error) {
console.error(`Failed to refresh token for page ${pageId}:`, error);
}
}
// Iniciar auto-refresh quando a página carrega
startAutoRefresh();
// Funções existentes (submitForModeration, openPreview, etc.)
async function openPreview(pageId) {
const button = event.target.closest('button');
@ -437,20 +391,11 @@
// Delay de 500ms para garantir commit no MongoDB
await new Promise(resolve => setTimeout(resolve, 500));
// Abrir nova aba e adicionar ao tracking
const previewWindow = window.open(
// Abrir nova aba
window.open(
`${window.location.origin}/page/${category}/${slug}?preview=${result.previewToken}`,
`preview_${pageId}` // Nome único para a aba
);
// Adicionar ao tracking para auto-refresh
activePreviewPages.set(pageId, {
category: category,
slug: slug,
windowRef: previewWindow
});
console.log(`Page ${pageId} added to active preview tracking`);
} else {
showToast(result.message || 'Erro ao gerar preview', 'error');
}