3 use Dancer
::Plugin
::Ajax
;
4 use DBIx
::Class
::Schema
::Loader
;
6 use Dancer
::Plugin
::Database
;
8 use DateTime
::Event
::Recurrence
;
11 ajax
'/info/sites' => sub {
12 my $tables_array = database
->table_info('main','main', '%','TABLE')->fetchall_arrayref;
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
};
26 if ( $driver_name eq 'mysql' ) {
28 'select SUM(count) from '
30 . ' where date < ? and date > ADDDATE(?,-31)';
32 elsif ( $driver_name eq 'SQLite' ) {
34 'select SUM(count) from '
36 . ' where date < ? and date > DATE(?,"-1 month")';
38 my ($n) = database
->selectrow_array( $str_query, {}, $date, $date );
39 my $count = $n ?
$n : 0;
43 sub get_chart_points
{
44 my ( $years, $interval, $home_wiki ) = @_; # interval in days, <=30
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 ) {
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 ...
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 );
66 [ "$y-$m-$d", num_published_month_before
( $y, $m, $d, $home_wiki ) ];
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;
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') );