Skip to content
Snippets Groups Projects
PZ.pm 1.94 KiB
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('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;
            return $c->session->{user};
        },
        validate_user => sub {
            my $c = shift;
            return undef if ! $c->session->{user};
            return $c->session->{user}{id};
        },
    });

    # defautni globalni promenne ve stash
    $self->defaults();

    # vypnuti cache templatu pri vyvoji
    $self->renderer->cache->max_keys(0) if $cfg->{dev_mode};

    # router
    my $r = $self->routes;

    $r->get('/')->to(cb => sub { shift->render('index'); });
    $r->post('/')->to('Shortcut#create');

    $r->get('/login')->to('OIDC#callback');
    $r->get('/logout')->to('OIDC#do_logout');

    $r->get('/:shortcut')->to('Shortcut#redirect');