2 use Mojo::Base 'Mojolicious';
3 use Mojo::Util qw(dumper);
7 use constant CONFIG_FILE => '/etc/newslash/newslash.conf';
9 # This method will run once at server start
14 # first, check existence of /etc/newslash.conf
15 if ($app->mode eq 'production' && -e CONFIG_FILE) {
16 $app->plugin('Newslash::Plugin::YAMLConfig', file => CONFIG_FILE);
19 #$app->plugin('JSONConfig');
20 $app->plugin('Newslash::Plugin::YAMLConfig');
22 # TODO: load/save configs with database
25 if ($app->config->{Log} && $app->config->{Log}->{level}) {
26 my $loglv = $app->config->{Log}->{level};
27 if (grep { $loglv eq $_ } qw(debug info warn error fatal)) {
28 $app->log->level($loglv);
31 $app->log->warn('invalid log level given in config file');
35 ############################################################
39 ############################################################
41 # when "test" mode, output debug logs.
42 $app->log->level('debug') if $app->mode eq 'test';
45 $app->plugin('Newslash::Plugin::AccessLog::Debug', $app->config->{Log} || {});
46 $app->plugin('Newslash::Plugin::AccessLog::LocalFile', $app->config->{Log} || {});
48 # secret key for hasing
49 $app->secrets([$app->config->{System}->{secret_key},]);
52 $app->config->{_Plugins} = {};
55 if ($app->config->{BasicAuth} && $app->config->{BasicAuth}->{enable}) {
56 $app->plugin('Newslash::Plugin::BasicAuth');
59 # use TimeLimitedCache ($app->cache)
60 $app->plugin('Newslash::Plugin::TimeLimitedCache');
62 # use KeyValue Store ($app->kvs)
63 $app->plugin('Newslash::Plugin::KeyValueStore');
66 my $model_opts = $app->config;
67 $model_opts->{Logger} = $app->log;
68 $app->helper(model => Newslash::Model::loader($model_opts));
69 Newslash::Model::startup($model_opts, $app);
71 # use Model Cache ($app->model_cache)
72 $app->plugin('Newslash::Plugin::ModelCache');
74 # use Template::Toolkit 2 render
75 $app->plugin('Newslash::Plugin::TT2Renderer');
77 # user AntiCsrf ($app->anti_csrf)
78 $app->plugin('Newslash::Plugin::AntiCsrf');
81 #$app->plugin('Newslash::Plugin::CSSCompile');
83 # quasi-static content
84 $app->plugin('Newslash::Plugin::QuasiStaticContent');
87 $app->plugin('Newslash::Plugin::UserAuth');
90 $app->plugin('Newslash::Plugin::AccessControl');
93 $app->plugin('Newslash::Plugin::EventQue');
96 ############################################################
98 # Generate site-global used javascript file
100 ############################################################
101 my $templ_name = "common/siteconfig.js";
102 my $mod_reasons = $app->model('moderations')->reasons();
103 my $topics = $app->model('tags')->get_topics;
105 for my $topic (@$topics) {
106 my $lc_keyword = lc($topic->{keyword});
107 push @$keywords, $lc_keyword;
108 if ($lc_keyword eq lc($topic->{textname})) {
109 push @$keywords, lc($topic->{textname});
113 moderate_reasons => $mod_reasons,
116 my $siteconfig = $app->tt2renderer->render($templ_name, $vars);
117 $app->static_content->add_content("js/siteconfig.js", $siteconfig, "text/javascript; charset=utf-8");
119 ############################################################
123 ############################################################
125 my $r = $app->routes;
128 $r->get('/')->to('index#root');
129 $r->get('/recent')->to('timeline#recent');
130 $r->get('/journals')->to('index#journals');
131 $r->get('/comments')->to('index#comments');
132 $r->get('/submissions')->to('index#submissions');
135 $r->get('/story/:year/:month/:day/' => [year => qr/[0-9]{2}/,
136 month => qr/[0-9]{2}/,
137 day => qr/[0-9]{2}/])->to('index#story_archive');
141 $r->get('/login')->to('login#login');
142 $r->post('/login')->to('login#login');
143 $r->get('/logout')->to('login#logout');
146 $r->get('/my/newuser')->to('login#newuser');
147 $r->post('/my/newuser')->to('login#newuser');
150 $r->get('/story/:sid/' => [sid => qr|\d\d/\d\d/\d\d/\d+|])
154 $r->get('/journal/new')->to('journal#create', seclev => 1);
155 $r->get('/journal/:id/')->to('journal#journal');
158 $r->get('/submission/new')->to('submission#create');
159 $r->get('/submission/:id/')->to('submission#submission');
160 #$r->post('/submission')->to('submission#create');
163 $r->get('/my/settings')->to('user#settings', seclev => 1);
164 $r->get('/my/sidebar')->to('user#sidebar', seclev => 1);
165 $r->get('/my/messages')->to('my#messages', seclev => 1);
166 $r->get('/my/')->to('user#home', seclev => 1);
169 # pages under /admin needs seclev equal or greater than 10000;
170 my $admin = $r->under('/admin' => sub { my $c = shift; $c->stash(seclev => 10000); return 1; });
172 $admin->get('/submissions')->to('admin-submissions#index');
173 $admin->get('/submissions/list')->to('admin-submissions#list');
175 $admin->get('/css')->to('admin-css#edit');
176 $admin->get('/story/edit')->to('admin-story#edit');
178 $admin->get('/sidebar')->to('admin-sidebar#index');
179 $admin->post('/sidebar/update')->to('admin-sidebar#update');
180 $admin->post('/sidebar/delete')->to('admin-sidebar#delete');
181 $admin->any(['GET', 'POST'] => '/sidebar/list')->to('admin-sidebar#list');
182 $admin->post('/sidebar/get')->to('admin-sidebar#get');
185 my $api = $r->under('/api/v1');
186 $api->get('/sidebars')->to('admin-sidebar#list');
188 $api->post('/login')->to('API::Login#login');
190 $api->get('/comment')->to('API::Comment#get');
191 $api->post('/comment')->to('API::Comment#post');
193 $api->get('/user')->to('API::User#get');
194 $api->post('/user')->to('API::User#post', seclev => 1);
196 $api->get('/journal')->to('API::Journal#get');
197 $api->post('/journal')->to('API::Journal#post', seclev => 1);
199 $api->get('/submission')->to('API::Submission#get');
200 $api->post('/submission')->to('API::Submission#post');
201 $api->post('/story')->to('API::Story#post');
203 $api->post('/moderation')->to('API::Moderation#post', seclev => 1, csrf_check_id => 'moderation');
204 $api->get('/moderation')->to('API::Moderation#get',, csrf_check_id => 'moderation');
206 $api->post('/metamoderation')->to('API::Metamoderation#post', seclev => 1, csrf_check_id => 'moderation');
207 $api->get('/metamoderation')->to('API::Metamoderation#get', csrf_check_id => 'moderation');
209 $api->post('/relation')->to('API::Relation#post', seclev => 1, csrf_check_id => 'relation');
211 $api->get('/token')->to('API::Token#get');
214 # warning: these pathes uses regexp matching, so must write in tail of route definitions.
215 my $user = $r->under('/:nickname');
216 $user->get('/' => [nickname => qr/~.*/])->to('user#home');
217 $user->get('/journals' => [nickname => qr/~.*/])->to('user#journals');
218 $user->get('/comments' => [nickname => qr/~.*/])->to('user#comments');
219 $user->get('/submissions' => [nickname => qr/~.*/])->to('user#submissions');
220 $user->get('/friends' => [nickname => qr/~.*/])->to('user#friends');
221 $user->get('/foes' => [nickname => qr/~.*/])->to('user#foes');
222 $user->get('/fans' => [nickname => qr/~.*/])->to('user#fans');
223 $user->get('/freaks' => [nickname => qr/~.*/])->to('user#freaks');
224 $user->get('/achievements' => [nickname => qr/~.*/])->to('user#achievements');
225 #$r->get('/:user_name/journal' => [user_name => qr/~.*/])->to('journal#user_journals');