Diff -- /var/www/vhosts/3dshawn.com/abforge.3dshawn.com/dashboard.cgi

O Operator
Diff

/var/www/vhosts/3dshawn.com/abforge.3dshawn.com/dashboard.cgi

added on local at 2026-07-01 16:01:19

Added
+97
lines
Removed
-0
lines
Context
0
unchanged
Blobs
from
to be9a66e6a24c
Restore this content →
Unified diff
Naive LCS-based line diff. Additions in emerald, deletions in rose. Both sides decompressed live from BLOB_STORE.
1#!/usr/bin/perl
2#======================================================================
3# ABForge -- /dashboard.cgi overview page (top KPIs + recent sites).
4#======================================================================
5use strict;
6use warnings;
7use lib '/var/www/vhosts/3dshawn.com/abforge.3dshawn.com';
8use CGI;
9use MODS::Template;
10use MODS::DBConnect;
11use MODS::Login;
12use MODS::ABForge::Config;
13use MODS::ABForge::Wrapper;
14use MODS::ABForge::Sites;
15use MODS::ABForge::Stats;
16use JSON::PP;
17
18my $q = CGI->new;
19my $auth = MODS::Login->new;
20my $wrap = MODS::ABForge::Wrapper->new;
21my $tfile = MODS::Template->new;
22my $cfg = MODS::ABForge::Config->new;
23my $db = MODS::DBConnect->new;
24my $sites = MODS::ABForge::Sites->new;
25my $stats = MODS::ABForge::Stats->new;
26my $DB = $cfg->settings('database_name');
27
28my $userinfo = $auth->login_verify();
29unless ($userinfo) {
30 print "Status: 302 Found\nLocation: /login.cgi\n\n"; exit;
31}
32
33my $dbh = $db->db_connect();
34my @sites_list = $sites->list_for_user($dbh, $DB, $userinfo->{user_id});
35
36# Pick active site: ?site_id, or first site
37my $form = $q->Vars;
38my $site_id = $form->{site_id} || ($sites_list[0] ? $sites_list[0]->{id} : 0);
39my $site = $site_id ? $sites->get($dbh, $DB, $site_id, $userinfo->{user_id}) : undef;
40
41my ($kpi, $series, $countries, $devices, $sources, $pages, $live);
42my $j = JSON::PP->new->canonical(1);
43
44if ($site) {
45 $kpi = $stats->kpis ($dbh, $DB, $site->{id}, 30);
46 $series = $stats->daily_series($dbh, $DB, $site->{id}, 30);
47 $countries = [ $stats->by_country($dbh, $DB, $site->{id}, 30, 8) ];
48 $devices = [ $stats->by_device ($dbh, $DB, $site->{id}, 30) ];
49 $sources = [ $stats->by_source ($dbh, $DB, $site->{id}, 30, 8) ];
50 $pages = [ $stats->by_page ($dbh, $DB, $site->{id}, 30, 10) ];
51 $live = $stats->live_visitors($dbh, $DB, $site->{id});
52}
53$db->db_disconnect($dbh);
54
55print "Content-Type: text/html; charset=utf-8\n\n";
56
57my $tvars = {
58 has_sites => scalar(@sites_list) ? 1 : 0,
59 site_name => $site ? $site->{name} : '',
60 site_id => $site ? $site->{id} : '',
61 domain => $site ? $site->{domain} : '',
62 pv => $kpi ? _commify($kpi->{pageviews}) : 0,
63 visitors => $kpi ? _commify($kpi->{visitors}) : 0,
64 sessions => $kpi ? _commify($kpi->{sessions}) : 0,
65 bounce => $kpi ? $kpi->{bounce_rate} : 0,
66 avg_time => $kpi ? _fmt_time($kpi->{avg_seconds}) : '0s',
67 pv_per => $kpi ? $kpi->{pv_per_session} : 0,
68 live => $live || 0,
69 series_labels => $series ? $j->encode($series->{labels}) : '[]',
70 series_pv => $series ? $j->encode($series->{pageviews}) : '[]',
71 series_vs => $series ? $j->encode($series->{visitors}) : '[]',
72 countries => $countries || [],
73 devices => $devices || [],
74 sources => $sources || [],
75 pages => $pages || [],
76};
77$tvars->{has_pv_data} = ($kpi && $kpi->{pageviews}) ? 1 : 0;
78
79my $body = join('', $tfile->template('abforge_dashboard.html', $tvars, $userinfo));
80
81$wrap->render({
82 userinfo => $userinfo,
83 page_key => 'dashboard',
84 title => 'Overview',
85 body => $body,
86 sites => \@sites_list,
87 current_site_id => $site_id,
88});
89
90sub _commify { my $n = shift // 0; 1 while $n =~ s/^(-?\d+)(\d{3})/$1,$2/; return $n; }
91sub _fmt_time {
92 my $s = int(shift // 0);
93 return $s . 's' if $s < 60;
94 my $m = int($s / 60);
95 return $m . 'm ' . ($s % 60) . 's' if $m < 60;
96 return sprintf('%dh %dm', int($m / 60), $m % 60);
97}