diff --git a/src/BCards.Web/Controllers/AdminController.cs b/src/BCards.Web/Controllers/AdminController.cs index 67fe232..82d0930 100644 --- a/src/BCards.Web/Controllers/AdminController.cs +++ b/src/BCards.Web/Controllers/AdminController.cs @@ -56,6 +56,25 @@ public class AdminController : Controller var userPlanType = Enum.TryParse(user.CurrentPlan, true, out var planType) ? planType : PlanType.Trial; var userPages = await _userPageService.GetUserPagesAsync(user.Id); + var listCounts = new Dictionary(); + + // Atualizar status das baseado nas livepasges + foreach (var page in userPages) + { + if (page.Status == ViewModels.PageStatus.Active) + { + var livePage = await _livePageService.GetLivePageFromUserPageId(page.Id); + if (livePage != null) + { + listCounts.Add(page.Id, new { TotalViews = livePage.Analytics?.TotalViews ?? 0 , TotalClicks = livePage.Analytics?.TotalClicks ?? 0 }); + } + else + { + listCounts.Add(page.Id, new { TotalViews = (long)(page.Analytics?.TotalViews ?? 0), TotalClicks = (long)(page.Analytics?.TotalClicks ?? 0) }); + } + } + } + var dashboardModel = new DashboardViewModel { CurrentUser = user, @@ -66,8 +85,8 @@ public class AdminController : Controller Slug = p.Slug, Category = p.Category, Status = p.Status, - TotalClicks = p.Analytics?.TotalClicks ?? 0, - TotalViews = p.Analytics?.TotalViews ?? 0, + TotalClicks = listCounts[p.Id].TotalClicks ?? 0, + TotalViews = listCounts[p.Id].TotalViews ?? 0, PreviewToken = p.PreviewToken, CreatedAt = p.CreatedAt, LastModerationStatus = p.ModerationHistory == null || p.ModerationHistory.Count == 0 || p.ModerationHistory.Last().Status == "rejected" diff --git a/src/BCards.Web/Controllers/LivePageController.cs b/src/BCards.Web/Controllers/LivePageController.cs index f835a3c..7de4bfd 100644 --- a/src/BCards.Web/Controllers/LivePageController.cs +++ b/src/BCards.Web/Controllers/LivePageController.cs @@ -53,7 +53,7 @@ public class LivePageController : Controller // Configurar ViewBag para indicar que é uma live page ViewBag.IsLivePage = true; - ViewBag.PageUrl = $"https://vcart.me/page/{category}/{slug}"; + ViewBag.PageUrl = $"https://bcards.site/page/{category}/{slug}"; ViewBag.Title = $"{livePage.DisplayName} - {livePage.Category} | BCards"; _logger.LogInformation("Serving LivePage {LivePageId} for {Category}/{Slug}", livePage.Id, category, slug); diff --git a/src/BCards.Web/Controllers/UserPageController.cs b/src/BCards.Web/Controllers/UserPageController.cs index 7f5688f..fe6af62 100644 --- a/src/BCards.Web/Controllers/UserPageController.cs +++ b/src/BCards.Web/Controllers/UserPageController.cs @@ -87,12 +87,18 @@ public class UserPageController : Controller var seoSettings = _seoService.GenerateSeoSettings(userPage, categoryObj); // Record page view (async, don't wait) - only for non-preview requests + Console.WriteLine($"DEBUG VIEW COUNT - Page: {userPage.Slug}, Status: {userPage.Status}, IsPreview: {isPreview}, PreviewToken: {previewToken}"); if (!isPreview) { + Console.WriteLine($"DEBUG: Recording view for page {userPage.Slug}"); var referrer = Request.Headers["Referer"].FirstOrDefault(); var userAgent = Request.Headers["User-Agent"].FirstOrDefault(); _ = Task.Run(() => _userPageService.RecordPageViewAsync(userPage.Id, referrer, userAgent)); } + else + { + Console.WriteLine($"DEBUG: NOT recording view - isPreview = true"); + } ViewBag.SeoSettings = seoSettings; ViewBag.Category = categoryObj; diff --git a/src/BCards.Web/Repositories/ILivePageRepository.cs b/src/BCards.Web/Repositories/ILivePageRepository.cs index 2283e5b..28660f3 100644 --- a/src/BCards.Web/Repositories/ILivePageRepository.cs +++ b/src/BCards.Web/Repositories/ILivePageRepository.cs @@ -6,6 +6,7 @@ public interface ILivePageRepository { Task GetByCategoryAndSlugAsync(string category, string slug); Task GetByOriginalPageIdAsync(string originalPageId); + Task GetByIdAsync(string pageId); Task> GetAllActiveAsync(); Task CreateAsync(LivePage livePage); Task UpdateAsync(LivePage livePage); diff --git a/src/BCards.Web/Repositories/LivePageRepository.cs b/src/BCards.Web/Repositories/LivePageRepository.cs index 8b91ba4..0e6cea8 100644 --- a/src/BCards.Web/Repositories/LivePageRepository.cs +++ b/src/BCards.Web/Repositories/LivePageRepository.cs @@ -43,6 +43,11 @@ public class LivePageRepository : ILivePageRepository } } + public async Task GetByIdAsync(string pageId) + { + return await _collection.Find(x => x.Id == pageId).FirstOrDefaultAsync(); + } + public async Task GetByCategoryAndSlugAsync(string category, string slug) { return await _collection.Find(x => x.Category == category && x.Slug == slug).FirstOrDefaultAsync(); diff --git a/src/BCards.Web/Services/ILivePageService.cs b/src/BCards.Web/Services/ILivePageService.cs index b0b3a37..9d56595 100644 --- a/src/BCards.Web/Services/ILivePageService.cs +++ b/src/BCards.Web/Services/ILivePageService.cs @@ -6,6 +6,7 @@ public interface ILivePageService { Task GetByCategoryAndSlugAsync(string category, string slug); Task> GetAllActiveAsync(); + Task GetLivePageFromUserPageId(string userPageId); Task SyncFromUserPageAsync(string userPageId); Task DeleteByOriginalPageIdAsync(string originalPageId); Task IncrementViewAsync(string livePageId); diff --git a/src/BCards.Web/Services/LivePageService.cs b/src/BCards.Web/Services/LivePageService.cs index 38f4431..e82c617 100644 --- a/src/BCards.Web/Services/LivePageService.cs +++ b/src/BCards.Web/Services/LivePageService.cs @@ -30,6 +30,11 @@ public class LivePageService : ILivePageService return await _livePageRepository.GetAllActiveAsync(); } + public async Task GetLivePageFromUserPageId(string userPageId) + { + return await _livePageRepository.GetByOriginalPageIdAsync(userPageId); + } + public async Task SyncFromUserPageAsync(string userPageId) { var userPage = await _userPageRepository.GetByIdAsync(userPageId); diff --git a/src/BCards.Web/Services/UserPageService.cs b/src/BCards.Web/Services/UserPageService.cs index 33a22c0..8c5065a 100644 --- a/src/BCards.Web/Services/UserPageService.cs +++ b/src/BCards.Web/Services/UserPageService.cs @@ -12,15 +12,18 @@ public class UserPageService : IUserPageService private readonly IUserPageRepository _userPageRepository; private readonly IUserRepository _userRepository; private readonly ISubscriptionRepository _subscriptionRepository; + private readonly ILivePageRepository _livePageRepository; public UserPageService( IUserPageRepository userPageRepository, IUserRepository userRepository, - ISubscriptionRepository subscriptionRepository) + ISubscriptionRepository subscriptionRepository, + ILivePageRepository livePageRepository) { _userPageRepository = userPageRepository; _userRepository = userRepository; _subscriptionRepository = subscriptionRepository; + _livePageRepository = livePageRepository; } public async Task GetPageAsync(string category, string slug) @@ -148,14 +151,21 @@ public class UserPageService : IUserPageService public async Task RecordLinkClickAsync(string pageId, int linkIndex) { - var page = await _userPageRepository.GetByIdAsync(pageId); - if (page?.PlanLimitations.AllowAnalytics != true) return; + var livePageExists = await _livePageRepository.GetByIdAsync(pageId); + if (livePageExists == null) return; - if (linkIndex >= 0 && linkIndex < page.Links.Count) + var page = await _userPageRepository.GetByIdAsync(livePageExists.OriginalPageId); + var livepage = (LivePage)livePageExists; + + if (linkIndex >= 0 && linkIndex < livepage.Links.Count) { + livepage.Links[linkIndex].Clicks++; page.Links[linkIndex].Clicks++; } + var analyticsLive = livepage.Analytics; + analyticsLive.TotalClicks++; + var analytics = page.Analytics; analytics.TotalClicks++; @@ -166,6 +176,7 @@ public class UserPageService : IUserPageService else analytics.MonthlyClicks[monthKey] = 1; + await _livePageRepository.UpdateAsync(livepage); await _userPageRepository.UpdateAsync(page); } diff --git a/src/BCards.Web/ViewModels/ManagePageViewModel.cs b/src/BCards.Web/ViewModels/ManagePageViewModel.cs index 731f2c9..35223d3 100644 --- a/src/BCards.Web/ViewModels/ManagePageViewModel.cs +++ b/src/BCards.Web/ViewModels/ManagePageViewModel.cs @@ -97,8 +97,8 @@ public class UserPageSummary public string Slug { get; set; } = string.Empty; public string Category { get; set; } = string.Empty; public PageStatus Status { get; set; } = PageStatus.Active; - public int TotalClicks { get; set; } = 0; - public int TotalViews { get; set; } = 0; + public long TotalClicks { get; set; } = 0; + public long TotalViews { get; set; } = 0; public DateTime CreatedAt { get; set; } = DateTime.UtcNow; public string? PreviewToken { get; set; } = string.Empty; public string PublicUrl => $"/page/{Category.ToLower()}/{Slug.ToLower()}?preview={PreviewToken}";