Yukki

 view release on metacpan or  search on metacpan

lib/Yukki/Web/Controller/Page.pm  view on Meta::CPAN

package Yukki::Web::Controller::Page;
{
  $Yukki::Web::Controller::Page::VERSION = '0.140290';
}
use 5.12.1;
use Moose;

with 'Yukki::Web::Controller';

use Try::Tiny;
use Yukki::Error qw( http_throw );

# ABSTRACT: controller for viewing and editing pages


sub fire {
    my ($self, $ctx) = @_;

    given ($ctx->request->path_parameters->{action}) {
        when ('view')    { $self->view_page($ctx) }
        when ('edit')    { $self->edit_page($ctx) }
        when ('history') { $self->view_history($ctx) }
        when ('diff')    { $self->view_diff($ctx) }
        when ('preview') { $self->preview_page($ctx) }
        when ('attach')  { $self->upload_attachment($ctx) }
        when ('rename')  { $self->rename_page($ctx) }
        when ('remove')  { $self->remove_page($ctx) }
        default {
            http_throw('That page action does not exist.', {
                status => 'NotFound',
            });
        }
    }
}


sub repo_name_and_path {
    my ($self, $ctx) = @_;

    my $repo_name  = $ctx->request->path_parameters->{repository};
    my $path       = $ctx->request->path_parameters->{page};

    if (not defined $path) {
        my $repo_config 
            = $self->app->settings->repositories->{$repo_name};

        my $path_str = $repo_config->default_page;

        $path = [ split m{/}, $path_str ];
    }

    return ($repo_name, $path);
}


sub lookup_page {
    my ($self, $repo_name, $page) = @_;

    my $repository = $self->model('Repository', { name => $repo_name });

    my $final_part = pop @$page;
    my $filetype;
    if ($final_part =~ s/\.(?<filetype>[a-z0-9]+)$//) {
        $filetype = $+{filetype};
    }

    my $path = join '/', @$page, $final_part;
    return $repository->file({ path => $path, filetype => $filetype });
}


sub view_page {
    my ($self, $ctx) = @_;

    my ($repo_name, $path) = $self->repo_name_and_path($ctx);

    my $page    = $self->lookup_page($repo_name, $path);

    my $breadcrumb = $self->breadcrumb($page->repository, $path);

    my $body;
    if (not $page->exists) {
        my @files = $page->list_files;

        $body = $self->view('Page')->blank($ctx, { 
            title      => $page->file_name,
            breadcrumb => $breadcrumb,
            repository => $repo_name, 
            page       => $page->full_path,
            files      => \@files,
        });
    }

    else {
        $body = $self->view('Page')->view($ctx, { 
            title      => $page->title,
            breadcrumb => $breadcrumb,
            repository => $repo_name,
            page       => $page->full_path, 
            file       => $page,
        });
    }

    $ctx->response->body($body);
}


sub edit_page {
    my ($self, $ctx) = @_;

lib/Yukki/Web/Controller/Page.pm  view on Meta::CPAN

            content => $diff,
        );

        $ctx->response->body(
            $self->view('Page')->diff($ctx, {
                title      => $page->title,
                breadcrumb => $breadcrumb,
                repository => $repo_name,
                page       => $page->full_path,
                file       => $file_preview,
            })
        );
    }

    catch {
        my $ERROR = $_;
        if ("$_" =~ /usage: git diff/) {
            http_throw 'Diffs will not work with git versions before 1.7.2. Please use a newer version of git. If you are using a newer version of git, please file a support issue.';
        }
        die $ERROR;
    };
}


sub preview_page {
    my ($self, $ctx) = @_;

    my ($repo_name, $path) = $self->repo_name_and_path($ctx);

    my $page = $self->lookup_page($repo_name, $path);

    my $breadcrumb = $self->breadcrumb($page->repository, $path);

    my $content      = $ctx->request->body_parameters->{yukkitext};
    my $position     = $ctx->request->parameters->{yukkitext_position};
    my $file_preview = $page->file_preview(
        content  => $content,
        position => $position,
    );

    $ctx->response->body(
        $self->view('Page')->preview($ctx, { 
            title      => $page->title,
            breadcrumb => $breadcrumb,
            repository => $repo_name,
            page       => $page->full_path,
            file       => $file_preview,
        })
    );
}


sub upload_attachment {
    my ($self, $ctx) = @_;

    my $repo_name = $ctx->request->path_parameters->{repository};
    my $path      = delete $ctx->request->path_parameters->{page};

    my $page = $self->lookup_page($repo_name, $path);

    my @file = split m{/}, $page->path;
    push @file, $ctx->request->uploads->{file}->filename;

    $ctx->request->path_parameters->{action} = 'upload';
    $ctx->request->path_parameters->{file}   = \@file;

    $self->controller('Attachment')->fire($ctx);
}


sub breadcrumb {
    my ($self, $repository, $path_parts) = @_;

    my @breadcrumb;
    my @path_acc;

    push @breadcrumb, {
        label => $repository->title,
        href  => join('/', '/page/view/', $repository->name),
    };
    
    for my $path_part (@$path_parts) {
        push @path_acc, $path_part;
        my $file = $repository->file({
            path     => join('/', @path_acc),
            filetype => 'yukki',
        });

        push @breadcrumb, {
            label => $file->title,
            href  => join('/', '/page/view', $repository->name, $file->full_path),
        };
    }

    return \@breadcrumb;
}

1;

__END__

=pod

=head1 NAME

Yukki::Web::Controller::Page - controller for viewing and editing pages

=head1 VERSION

version 0.140290

=head1 DESCRIPTION

Controller for viewing and editing pages

=head1 METHODS

=head2 fire

On a view request routes to L</view_page>, edit request to L</edit_page>, preview request to L</preview_page>, and attach request to L</upload_attachment>.



( run in 0.575 second using v1.01-cache-2.11-cpan-71847e10f99 )