Added setting and config pages and libs.

master
Blog Manager Robot 3 years ago
parent fc90a21d16
commit 87f91fc49e
  1. 18
      Web/lib/MJB/Web.pm
  2. 97
      Web/lib/MJB/Web/Controller/Dashboard.pm
  3. 56
      Web/templates/dashboard/blog_config.html.ep
  4. 71
      Web/templates/dashboard/blog_settings.html.ep
  5. 39
      libs/MJB-Backend-Jekyll/lib/MJB/Backend/Jekyll.pm
  6. 63
      libs/MJB-Backend-Jekyll/lib/MJB/Backend/Jekyll/ConfigFile.pm

@ -114,13 +114,17 @@ sub startup ($self) {
$auth->post( '/password' )->to('UserSettings#do_change_password' )->name('do_change_password' ); $auth->post( '/password' )->to('UserSettings#do_change_password' )->name('do_change_password' );
# Dashboard # Dashboard
$auth->get ( '/dashboard' )->to('Dashboard#index' )->name('show_dashboard' ); $auth->get ( '/dashboard' )->to('Dashboard#index' )->name('show_dashboard' );
$auth->get ( '/dashboard/blog/:id' )->to('Dashboard#blog' )->name('show_dashboard_blog' ); $auth->get ( '/dashboard/blog/:id' )->to('Dashboard#blog' )->name('show_dashboard_blog' );
$auth->get ( '/dashboard/blog/:id/posts' )->to('Dashboard#blog_posts' )->name('show_dashboard_blog_posts' ); $auth->get ( '/dashboard/blog/:id/posts' )->to('Dashboard#blog_posts' )->name('show_dashboard_blog_posts' );
$auth->get ( '/dashboard/blog/:id/post/*mdfile' )->to('Dashboard#blog_post' )->name('show_dashboard_blog_post' ); $auth->get ( '/dashboard/blog/:id/post/*mdfile' )->to('Dashboard#blog_post' )->name('show_dashboard_blog_post' );
$auth->post( '/dashboard/blog/:id/post/*mdfile' )->to('Dashboard#do_blog_post' )->name('do_dashboard_blog_post' ); $auth->post( '/dashboard/blog/:id/post/*mdfile' )->to('Dashboard#do_blog_post' )->name('do_dashboard_blog_post' );
$auth->get ( '/dashboard/blog/:id/post' )->to('Dashboard#blog_post_create' )->name('show_dashboard_blog_post_create' ); $auth->get ( '/dashboard/blog/:id/post' )->to('Dashboard#blog_post_create' )->name('show_dashboard_blog_post_create' );
$auth->post( '/dashboard/blog/:id/post' )->to('Dashboard#do_blog_post_create' )->name('do_dashboard_blog_post_create' ); $auth->post( '/dashboard/blog/:id/post' )->to('Dashboard#do_blog_post_create' )->name('do_dashboard_blog_post_create' );
$auth->get ( '/dashboard/blog/:id/settings' )->to('Dashboard#blog_settings' )->name('show_dashboard_blog_settings' );
$auth->post( '/dashboard/blog/:id/settings' )->to('Dashboard#do_blog_settings' )->name('do_dashboard_blog_settings' );
$auth->get ( '/dashboard/blog/:id/config' )->to('Dashboard#blog_config' )->name('show_dashboard_blog_config' );
$auth->post( '/dashboard/blog/:id/config' )->to('Dashboard#do_blog_config' )->name('do_dashboard_blog_config' );
# Blog Management # Blog Management
$auth->get ( '/blog/create' )->to('Blog#create' )->name('show_blog_create' ); $auth->get ( '/blog/create' )->to('Blog#create' )->name('show_blog_create' );

@ -150,4 +150,101 @@ sub do_blog_post_create ( $c ) {
$c->redirect_to( $c->url_for( 'show_dashboard_blog_posts', { id => $blog->id } ) ); $c->redirect_to( $c->url_for( 'show_dashboard_blog_posts', { id => $blog->id } ) );
} }
sub blog_settings ($c) {
my $blog = $c->stash->{blog} = $c->db->blog( $c->param('id') );
if ( $blog->person->id ne $c->stash->{person}->id ) {
$c->render(
text => "Error: This blog isn't owned by you.",
status => 404,
format => 'txt',
);
return;
}
my $data = $c->jekyll($blog->domain->name)->config->data;
my $title = $c->stash->{form_title} = $data->{title};
my $desc = $c->stash->{form_desc} = $data->{description};
my $email = $c->stash->{form_email} = $data->{email};
my $url = $c->stash->{form_url} = $data->{url};
}
sub do_blog_settings ($c) {
my $blog = $c->stash->{blog} = $c->db->blog( $c->param('id') );
if ( $blog->person->id ne $c->stash->{person}->id ) {
$c->render(
text => "Error: This blog isn't owned by you.",
status => 404,
format => 'txt',
);
return;
}
my $jekyll = $c->jekyll($blog->domain->name);
my $title = $c->stash->{form_title} = $c->param( 'configTitle' );
my $desc = $c->stash->{form_desc} = $c->param( 'configDesc' );
my $email = $c->stash->{form_email} = $c->param( 'configEmail' );
my $url = $c->stash->{form_url} = $c->param( 'configURL' );
$jekyll->config->data->{title} = $title;
$jekyll->config->data->{description} = $desc;
$jekyll->config->data->{email} = $email;
$jekyll->config->data->{url} = $url;
$jekyll->write_config;
$c->flash( confirmation => "The settings have been updated!!" );
$c->redirect_to( $c->url_for( 'show_dashboard_blog_settings', { id => $blog->id } ) );
}
sub blog_config ( $c ) {
my $blog = $c->stash->{blog} = $c->db->blog( $c->param('id') );
if ( $blog->person->id ne $c->stash->{person}->id ) {
$c->render(
text => "Error: This blog isn't owned by you.",
status => 404,
format => 'txt',
);
return;
}
my $jekyll = $c->jekyll($blog->domain->name);
my $config = $jekyll->config;
my $config_text = $c->stash->{form_config} = $config->as_text;
}
sub do_blog_config ( $c ) {
my $blog = $c->stash->{blog} = $c->db->blog( $c->param('id') );
if ( $blog->person->id ne $c->stash->{person}->id ) {
$c->render(
text => "Error: This blog isn't owned by you.",
status => 404,
format => 'txt',
);
return;
}
my $jekyll = $c->jekyll($blog->domain->name);
my $config = $jekyll->config;
my $config_text = $c->stash->{form_config} = $c->param( 'blogConfig' );
$config->set_from_text( $config_text );
$jekyll->write_config;
$c->flash( confirmation => "The config has been updated!!" );
$c->redirect_to( $c->url_for( 'show_dashboard_blog_config', { id => $blog->id } ) );
}
1; 1;

@ -0,0 +1,56 @@
% layout 'standard', title => 'Dashboard', sb_active => 'dashboard';
%= include 'dashboard/_blog_nav'
<ul class="nav nav-tabs">
<li class="nav-item">
<a class="nav-link" aria-current="page" href="<%= $c->url_for( 'show_dashboard_blog' ) %>">Info</a>
</li>
<li class="nav-item">
<a class="nav-link" href="<%= $c->url_for( 'show_dashboard_blog_posts' ) %>">Posts</a>
</li>
<li class="nav-item">
<a class="nav-link active" href="<%= $c->url_for( 'show_dashboard_blog_settings' ) %>">Settings</a>
</li>
<li class="nav-item">
<a class="nav-link" href="<%= $c->url_for( 'show_dashboard_blog_hooks' ) %>">Hooks</a>
</li>
</ul>
% if ( my $confirmation = flash 'confirmation' ) {
<div style="margin-top: 2em" class="alert alert-success" role="alert">
<%== $confirmation %>
</div>
% }
% if ( $c->stash->{success} ) {
<div style="margin-top: 2em" class="alert alert-success" role="alert">
<%= $c->stash->{success_message} %>
</div>
% }
% if ( $c->stash->{errors} ) {
<div style="margin-top: 2em" class="alert alert-danger" role="alert">
There were errors with your request that could not be resolved:
<ul>
% for my $error ( @{$c->stash->{errors}} ) {
<li><%= $error %></li>
% }
</ul>
</div>
% }
<form method="POST" action="<%= $c->url_for( 'do_dashboard_blog_config' ) %>">
<div class="mt-3 mb-3">
<label for="blogConfig" class="form-label">Blog Configuration (See <a target="_blank" href="https://jekyllrb.com/docs/configuration/">Jekyll Configuration Docs</a> to understand this file.</label>
<textarea class="form-control" id="blogConfig" name="blogConfig" rows="25"><%= $c->stash->{form_config} %></textarea>
</div>
<div class="mb-3">
<input type="submit" class="btn btn-primary btn-sm float-end" width="100%" value="Update Config">
</div>
</form>
<a href="<%= $c->url_for( 'show_dashboard_blog_settings' ) %>">Show Settings (Go Back)</a>

@ -0,0 +1,71 @@
% layout 'standard', title => 'Dashboard', sb_active => 'dashboard';
%= include 'dashboard/_blog_nav'
<ul class="nav nav-tabs">
<li class="nav-item">
<a class="nav-link" aria-current="page" href="<%= $c->url_for( 'show_dashboard_blog' ) %>">Info</a>
</li>
<li class="nav-item">
<a class="nav-link" href="<%= $c->url_for( 'show_dashboard_blog_posts' ) %>">Posts</a>
</li>
<li class="nav-item">
<a class="nav-link active" href="<%= $c->url_for( 'show_dashboard_blog_settings' ) %>">Settings</a>
</li>
<li class="nav-item">
<a class="nav-link" href="<%= $c->url_for( 'show_dashboard_blog_hooks' ) %>">Hooks</a>
</li>
</ul>
% if ( my $confirmation = flash 'confirmation' ) {
<div style="margin-top: 2em" class="alert alert-success" role="alert">
<%== $confirmation %>
</div>
% }
% if ( $c->stash->{success} ) {
<div style="margin-top: 2em" class="alert alert-success" role="alert">
<%= $c->stash->{success_message} %>
</div>
% }
% if ( $c->stash->{errors} ) {
<div style="margin-top: 2em" class="alert alert-danger" role="alert">
There were errors with your request that could not be resolved:
<ul>
% for my $error ( @{$c->stash->{errors}} ) {
<li><%= $error %></li>
% }
</ul>
</div>
% }
<form method="POST" action="<%= $c->url_for( 'do_dashboard_blog_settings' ) %>">
<div class="mt-3 mb-3">
<label for="configTitle" class="col-sm-2 col-form-label">Title</label>
<input type="text" class="form-control" id="configTitle" name="configTitle" value="<%= $c->stash->{form_title} %>">
</div>
<div class="mt-3 mb-3">
<label for="configDesc" class="col-sm-2 col-form-label">Description</label>
<input type="text" class="form-control" id="configDesc" name="configDesc" value="<%= $c->stash->{form_desc} %>">
</div>
<div class="mt-3 mb-3">
<label for="configEmail" class="col-sm-2 col-form-label">Email</label>
<input type="text" class="form-control" id="configEmail" name="configEmail" value="<%= $c->stash->{form_email} %>">
</div>
<div class="mt-3 mb-3">
<label for="configURL" class="col-sm-2 col-form-label">URL</label>
<input type="text" class="form-control" id="configURL" name="configURL" value="<%= $c->stash->{form_url} %>">
</div>
<div class="mb-3">
<input type="submit" class="btn btn-primary btn-sm float-end" width="100%" value="Update Settings">
</div>
</form>
<a href="<%= $c->url_for( 'show_dashboard_blog_config' ) %>">Show Config (Advanced)</a>

@ -6,6 +6,7 @@ use File::Path qw( make_path );
use Storable qw( dclone ); use Storable qw( dclone );
use Mojo::File; use Mojo::File;
use MJB::Backend::Jekyll::MarkdownFile; use MJB::Backend::Jekyll::MarkdownFile;
use MJB::Backend::Jekyll::ConfigFile;
# The root path for the repositories # The root path for the repositories
has root => ( has root => (
@ -29,6 +30,18 @@ has repo => (
required => 1, required => 1,
); );
has config => (
is => 'lazy',
);
sub _build_config {
my ( $self ) = @_;
return MJB::Backend::Jekyll::ConfigFile->new(
path => $self->repo_path . "/_config.yml",
)->read;
}
has repo_path => ( has repo_path => (
is => 'lazy', is => 'lazy',
); );
@ -105,6 +118,7 @@ sub get_post {
)->read; )->read;
} }
sub new_post { sub new_post {
my ( $self, $filename ) = @_; my ( $self, $filename ) = @_;
@ -144,6 +158,31 @@ sub _post_path {
return $self->repo_path . "/_posts/" . $title . ".markdown"; return $self->repo_path . "/_posts/" . $title . ".markdown";
} }
sub write_config {
my ( $self, $config ) = @_;
$config ||= $self->config;
$config->write;
# Add the file to git
$self->system_command( [ qw( git add ), $config->path ], {
chdir => $self->repo_path,
});
# Commit the file
$self->system_command( [ qw( git commit -m ), "Updated Site Config" ], {
chdir => $self->repo_path,
});
# Push the repo to the store server
$self->system_command( [ qw( git push origin master ) ], {
chdir => $self->repo_path,
});
return 1;
}
sub write_post { sub write_post {
my ( $self, $md_file ) = @_; my ( $self, $md_file ) = @_;

@ -0,0 +1,63 @@
package MJB::Backend::Jekyll::ConfigFile;
use Moo;
use YAML::XS qw( Load Dump );
# File path we are read/write from
has path => (
is => 'ro',
required => 1,
);
has data => (
is => 'rw',
default => sub { return +{} },
);
sub as_text {
my ( $self ) = @_;
return Dump($self->data);
}
sub set_from_text {
my ( $self, $config ) = @_;
$self->data( Load($config) );
return $self;
}
sub read {
my ( $self ) = @_;
$self->data( { } );
open my $lf, "<", $self->path
or die "Failed to open " . $self->path . " for reading: $!";
my $content = do { local $/; <$lf> };
close $lf;
$self->data( Load($content) );
return $self;
}
sub write {
my ( $self, $file ) = @_;
$file ||= $self->path;
open my $sf, ">", $file
or die "Failed to open $file for writing: $!";
print $sf Dump($self->data);
close $sf;
return $self;
}
1;
Loading…
Cancel
Save