Use a cleaner user interface — dropdowns
[wnstats.git] / lib / Wnstats.pm
blob9bab694567d01220407229ed06d7f01e3a0794cc
1 package Wnstats;
2 use Dancer ':syntax';
3 use Dancer::Plugin::Ajax;
4 use DBIx::Class::Schema::Loader;
5 use DBIx::Class;
6 use Dancer::Plugin::Database;
7 use DateTime;
8 use DateTime::Event::Recurrence;
9 use Data::Dumper;
11 ajax '/info/sites' => sub {
12 my $tables_array = database->table_info('main','main', '%','TABLE')->fetchall_arrayref;
13 my @tables = ();
14 for my $table_info (@{$tables_array}){
15 push @tables, $table_info->[2];
17 return { sites => \@tables };
20 sub num_published_month_before {
21 my ( $y0, $m0, $d0, $home_wiki ) = @_;
22 $home_wiki =~ s/\.//g;
23 my $date = sprintf( "%d-%02d-%02d", ( $y0, $m0, $d0 ) );
24 my $driver_name = database->{Driver}->{Name};
25 my $str_query;
26 if ( $driver_name eq 'mysql' ) {
27 $str_query =
28 'select SUM(count) from '
29 . $home_wiki
30 . ' where date < ? and date > ADDDATE(?,-31)';
32 elsif ( $driver_name eq 'SQLite' ) {
33 $str_query =
34 'select SUM(count) from '
35 . $home_wiki
36 . ' where date < ? and date > DATE(?,"-1 month")';
38 my ($n) = database->selectrow_array( $str_query, {}, $date, $date );
39 my $count = $n ? $n : 0;
40 return $count;
43 sub get_chart_points {
44 my ( $years, $interval, $home_wiki ) = @_; # interval in days, <=30
45 my @points;
47 # get the abscissae using start date, end date, interval
48 # using DateTime::Event::Recurrence
49 my $dt1 = DateTime->new( year => $years->[0], month => 1, day => 1 );
50 my $dt2 = DateTime->new( year => $years->[-1], month => 12, day => 31 );
52 if ( $dt2 > DateTime->now ) {
53 $dt2 = DateTime->now;
56 my $daily_set = DateTime::Event::Recurrence->daily( interval => $interval );
57 my @days = $daily_set->as_list( start => $dt1, end => $dt2 );
59 # for each abscissae, retrieve the ordinate ...
60 for my $day (@days) {
61 last if $day->truncate( to => "day" ) == DateTime->today;
63 # ... by checking the db for total last 30 days articles count
64 my ( $y, $m, $d ) = ( $day->year, $day->month, $day->day );
65 push @points,
66 [ "$y-$m-$d", num_published_month_before( $y, $m, $d, $home_wiki ) ];
68 return \@points;
71 ajax '/chart/:start_year?/:end_year?/:interval?/:home_wiki' => sub {
73 # get years range input
74 my $start_year = param('start_year') ? param('start_year') : 2005;
75 my $end_year = param('end_year') ? param('end_year') : DateTime->now->year;
77 # get interval input
78 my $interval = param('interval') ? param('interval') : 10; # days
79 # retrieve the data and return the json
80 my $result = to_json get_chart_points( [ $start_year .. $end_year ],
81 $interval, param('home_wiki') );
82 return $result;
85 get '/' => sub {
86 template 'index';
89 true;