package PZ; use Mojo::Base 'Mojolicious'; use Mojo::Pg; use Mojo::Redis; use Mojolicious::Plugin::Authentication; use Net::OAuth2::Profile::WebServer; use PZ::Schema; sub startup { my $self = shift; # Nacteni konfigurace my $cfg = $self->plugin('Config'); $self->helper( cfg => sub { return $cfg; } ); # Podpis pro cookies $self->secrets($cfg->{session}{secrets}); # Delka session $self->sessions->default_expiration($cfg->{session}{lifetime}); $self->plugin("ForwardedFor"); $self->plugin('PZ::Helpers::Core'); $self->plugin('PZ::Helpers::OIDC'); my $redis = Mojo::Redis->new( 'redis://' . $cfg->{redis}{server} ); $self->helper( redis => sub { return $redis; } ); # migrace schematu my $pg = Mojo::Pg->new ->dsn($cfg->{database}{dsn}) ->username($cfg->{database}{user}) ->password($cfg->{database}{password}) ; $pg->migrations->from_file($self->home . '/sql/migrations.sql'); $pg->migrations->migrate(); $self->helper( pg => sub { return $pg; } ); # Spojeni s databazi my $schema = PZ::Schema->connect($cfg->{database}); $self->helper( schema => sub { return $schema; } ); $self->plugin('authentication', { autoload_user => 1, load_user => sub { my $c = shift; my $user = $c->schema->resultset('User')->find({ id => $c->session->{user}{id}, }); return $user; }, validate_user => sub { my $c = shift; return undef if ! $c->session->{user}; return $c->session->{user}{id}; }, }); $self->plugin("OpenAPI" => { url => $self->home->rel_file("openapi.yaml"), schema => 'v3', plugins => [qw(+SpecRenderer +Cors +Security)], render_specification => 1, render_specification_for_paths => 1, default_response_codes => [400, 401, 403, 404, 500, 501], security => { Token => sub { my ($c, $definition, $scopes, $cb ) = @_; my $token = $c->req->headers->header('X-Auth-Token'); return $c->$cb('Authorization header not present') if ! $token; my $user = $c->schema->resultset('User')->find( { token => $token } ); if (! $user ) { return $c->$cb('Invalid user'); } $c->stash->{user} = $user; return $c->$cb(); } } }); # defautni globalni promenne ve stash $self->defaults( openapi_cors_allowed_origins => ['*'], ); # vypnuti cache templatu pri vyvoji $self->renderer->cache->max_keys(0) if $cfg->{dev_mode}; # router my $r = $self->routes; $r->get('/login')->to('OIDC#callback'); $r->get('/logout')->to('OIDC#do_logout'); $r->get('/')->to(cb => sub { shift->render('index'); }); $r->get('/shortcut/:id')->to(cb => sub { shift->render('shortcut'); }); $r->get('/shortcut/:id/log.csv')->to('Log#csv'); $r->get('/:shortcut')->to('Shortcut#redirect'); $r->get('/:shortcut/qr.png')->to('Shortcut#qr'); } 1;