Beagle

 view release on metacpan or  search on metacpan

lib/Beagle/Web/Router.pm  view on Meta::CPAN

get '/admin/entries' => sub {
    render 'admin/entries',
      entries => handle()->entries,
      title   => 'admin',
      page_limit => 20,
      prefix  => prefix() || '../';
};

get '/admin/entry/:type/new' => sub {
    my %vars  = @_;
    my $type  = lc $vars{'type'};
    my $class = entry_type_info->{ lc $type }{class};
    if ($class) {
        my $entry = $class->new( id => 'new' );

        return render 'admin/entry',
          entry => $entry,
          form  => Beagle::Web::Form->new(
            field_list => scalar Beagle::Web->field_list($entry) ),
          title  => 'create ' . A($type),
          prefix => prefix() || '../../../';
    }
};

get '/admin/entry/{id:\w{32}}' => sub {
    my %vars = @_;
    my ($id) = $vars{id};

    return redirect '/admin/entries'
      unless handle()->map->{$id};
    render 'admin/entry',
      message => $vars{'message'},
      entry   => handle()->map->{$id},
      form    => Beagle::Web::Form->new(
        field_list => scalar Beagle::Web->field_list( handle()->map->{$id} ) ),
      title  => "update $id",
      prefix => prefix() || '../../';
};

post '/admin/entry/:type/new' => sub {
    my %vars = @_;
    my $type = $vars{'type'};
    my $class = entry_type_info->{ lc $type }{class};
    if ($class) {
        my $entry = $class->new( timezone => handle()->info->timezone );
        if ( $entry->can('author') && !$entry->author ) {
            $entry->author( current_user() );
        }

        if ( $type eq 'comment' && !request()->param('format') ) {

            # make comment's format be plain by default if from web ui
            $entry->format('plain');
        }

        if ( process_fields( $entry, request()->parameters->mixed ) ) {
            my ($created) =
              handle()->create_entry( $entry, message => request()->param('message') );

            if ($created) {
                add_attachments( $entry, request()->upload('attachments') );
                if ( request()->header('Accept') =~ /json/ ) {
                    my $ret = {
                        status    => 'created',
                        parent_id => $entry->parent_id,
                        content   => render( 'entry_comment', entry => $entry ),
                    };
                    status(201);
                    content_type('application/json');
                    return to_json($ret);
                }

                if ( $type eq 'comment' ) {
                    return
                        redirect '/entry/'
                      . $entry->parent_id
                      . '?message=created' . '#'
                      . $entry->id;
                }
                else {
                    return
                        redirect '/entry/'
                      . $entry->id
                      . '?message=created';
                }
            }
            else {
                if ( request()->header('Accept') =~ /json/ ) {
                    my $ret = {
                        status  => 'error',
                        message => 'failed to create',
                    };
                    content_type('application/json');
                    return to_json($ret);
                }
            }
        }
        else {
            return render "admin/entry/$type/new",
              entry => $entry,
              form  => Beagle::Web::Form->new(
                field_list => scalar Beagle::Web->field_list($entry) ),
              message => 'invalid';
        }
    }

    if ( request()->header('Accept') =~ /json/ ) {
        my $ret = {
            status  => 'error',
            content => "invalid type: $type",
        };
        content_type('application/json');
        return to_json($ret);
    }
    else {
        redirect '/admin/entries';
    }
};

post '/admin/entry/{id:\w{32}}' => sub {
    my %vars = @_;
    my ($id) = $vars{id};

    if ( my $entry = handle()->map->{$id} ) {

        if ( process_fields( $entry, request()->parameters->mixed ) ) {

            handle()->update_entry( $entry, message => request()->param('message') );

            my $del = $vars{'delete-attachments'};
            delete_attachments( $entry, ref $del ? @$del : $del );

            add_attachments( $entry, request()->upload('attachments') );

            render 'admin/entry',
              entry => $entry,
              form  => Beagle::Web::Form->new(
                field_list => scalar Beagle::Web->field_list($entry) ),
              message => 'updated',
              prefix  => prefix() || '../../';
        }
        else {
            render 'admin/entry',
              entry => $entry,
              form  => Beagle::Web::Form->new(
                field_list => scalar Beagle::Web->field_list($entry) ),
              message => 'invalid',
              prefix  => prefix() || '../../';
        }
    }
    else {
        redirect '/admin/entries';
    }
};

post '/admin/entry/delete' => sub {
    my $id = request()->param('id');

    if ( request()->header('Accept') =~ /json/ ) {
        content_type('application/json');
    }

    if ( my $entry = handle()->map->{$id} ) {
        handle()->delete_entry($entry);
        my $ret = { status => 'deleted' };
        $ret->{redraw_menu} = 1 unless $entry->type eq 'comment';
        return to_json($ret);
    }
    else {
        return to_json {
            status  => 'error',
            message => 'not exist'
        };
    }

    redirect '/admin/entries';
};

any '/admin/info' => sub {
    my $entry = handle()->info;
    redirect '/admin/entry/' . $entry->id;
};

get '/favicon.ico' => sub {
    if (   handle()->info->avatar
        && handle()->info->avatar ne '/favicon.ico' )
    {
        redirect handle()->info->avatar;
    }
    else {
        redirect '/system/images/beagle.png';
    }
};



( run in 1.080 second using v1.01-cache-2.11-cpan-b16cb0d3907 )