package MyApp; use Mojolicious::Controller; use Mojo::Base 'Mojolicious'; use WWWDBI; use Tools; use Mojo::File 'path'; use Cwd 'abs_path'; use Path::Iterator::Rule; use Mojo::JSON qw(decode_json encode_json); use URI; sub startup { my $self = shift; my $config = $self->plugin('Config'); my $db = WWWDBI->new(); my $secret = $db->get_app_secret(); $self->secrets($config->{secrets} || [$secret]); $self->sessions->cookie_name('session'); $self->sessions->default_expiration(3600 * 24 * 30); $self->helper( is_logged_in => sub { my $c = shift; return $c->session('user') ? 1 : 0; } ); $self->helper( is_admin => sub { my $c = shift; return 0 unless $c->session('user'); return $db->is_admin($c->session('user')); } ); $self->helper( current_user_id => sub { my $c = shift; my $username = $c->session('user') // ''; return 0 unless $username; return $c->db->get_user_id($username); } ); $self->helper( current_resolution => sub { my $c = shift; my $res = $c->param('r') // ''; return $res =~ /^[a-zA-Z0-9_-]+$/ ? $res : 'default'; } ); $self->helper( listFiles => sub { my @locations = ('public', 'templates', 'lib'); my @all_files; my $rule = Path::Iterator::Rule->new->not_dir->name(qr/(pm|pl|js|css|ep)$/); for my $location (@locations) { push @all_files, $rule->all($location); } (my $file = __FILE__) =~ s{.*/}{}; push @all_files, $file; my @sorted = sort { fc($a) cmp fc($b) } @all_files; return \@sorted; } ); $self->helper( render_error => sub { my ($c, $message, $status) = @_; $status //= 400; $c->render('render_error', message => $message, status => $status); } ); $self->helper(db => sub { state $db = WWWDBI->new; return $db }); my $r = $self->routes; $r->get('/')->to('root#index'); $r->get('/noperm')->to('root#no_permission'); $r->get('/source')->to('root#view_source'); $r->get('/cwd')->to('root#cwd'); $r->get('/age')->to('root#age'); $r->get('/t')->to('root#t_page'); $r->get('/contacts')->to('root#contact'); $r->get('/contact')->to('root#contact'); $r->get('/c')->to('root#contact'); $r->get('/p')->to('root#p_page'); $r->get('/m')->to('root#p_page'); $r->get('/phone')->to('root#p_page'); $r->get('/mobile')->to('root#p_page'); $r->get('/this.is.totally.not.sus')->to('root#sus'); $r->get('/copy')->to('root#copy_get'); $r->post('/copy')->to('root#copy_post'); $r->post('/delete')->to('root#remove_message'); $r->get('/api/v1/dynamic_data')->to('root#api_dynamic_data'); $r->get('/login')->to('auth#login_form'); $r->post('/login')->to('auth#login'); $r->get('/logout')->to('auth#logout'); $r->get('/register')->to('auth#register_form'); $r->post('/register')->to('auth#register'); $r->get('/users')->to('admin#user_list'); $r->get('/user/:id/delete')->to('admin#delete_user'); $r->get('/user/:id/approve')->to('admin#approve_user'); $r->get('/user/:id/edit')->to('admin#edit_user_form'); $r->post('/user/:id/edit')->to('admin#edit_user'); $r->get('/restart')->to('system#restart'); } 1;