Invite codes admin and register ui and controllers.

master
Manager Bot 3 years ago
parent e8505bf6d3
commit e2da4b8220
  1. 13
      Web/lib/MJB/Web.pm
  2. 40
      Web/lib/MJB/Web/Controller/Admin.pm
  3. 10
      Web/lib/MJB/Web/Controller/Auth.pm
  4. 4
      Web/templates/admin/_nav.html.ep
  5. 57
      Web/templates/admin/invites.html.ep
  6. 8
      Web/templates/auth/register.html.ep

@ -10,6 +10,9 @@ sub startup ($self) {
: '/etc/mjb.yml' : '/etc/mjb.yml'
}); });
# Some quick configs....
$self->config->{register}->{require_invite} = 1;
# Configure the application # Configure the application
$self->secrets($config->{secrets}); $self->secrets($config->{secrets});
@ -202,13 +205,6 @@ sub startup ($self) {
$auth->get ( '/blog/initialize' )->to('Blog#do_initialize' )->name('do_blog_initialize' ); $auth->get ( '/blog/initialize' )->to('Blog#do_initialize' )->name('do_blog_initialize' );
$auth->get ( '/blog/:id/settings' )->to('Blog#settings' )->name('show_blog_settings' ); $auth->get ( '/blog/:id/settings' )->to('Blog#settings' )->name('show_blog_settings' );
$auth->post( '/blog/:id/settings' )->to('Blog#do_settings' )->name('do_blog_settings' ); $auth->post( '/blog/:id/settings' )->to('Blog#do_settings' )->name('do_blog_settings' );
#
#
#
#$auth->get ( '/blog' )->to('Blog#create' )->name('show_blog_create' );
#$auth->post( '/blog' )->to('Blog#do_create' )->name('do_blog_create' );
#$auth->get ( '/blog/:id/settings' )->to('Blog#settings' )->name('show_blog_settings' );
#$auth->post( '/blog/:id/settings' )->to('Blog#do_settings' )->name('do_blog_settings' );
# Admin Dashboard # Admin Dashboard
$admin->get ( '/admin' )->to('Admin#index' )->name('show_admin' ); $admin->get ( '/admin' )->to('Admin#index' )->name('show_admin' );
@ -223,6 +219,9 @@ sub startup ($self) {
$admin->post( '/admin/server' )->to('Admin#do_server' )->name('do_admin_server' ); $admin->post( '/admin/server' )->to('Admin#do_server' )->name('do_admin_server' );
$admin->post( '/admin/server/remove' )->to('Admin#do_server_remove' )->name('do_admin_server_remove' ); $admin->post( '/admin/server/remove' )->to('Admin#do_server_remove' )->name('do_admin_server_remove' );
$admin->get ( '/admin/settings' )->to('Admin#settings' )->name('show_admin_settings' ); $admin->get ( '/admin/settings' )->to('Admin#settings' )->name('show_admin_settings' );
$admin->get ( '/admin/invites' )->to('Admin#invites' )->name('show_admin_invites' );
$admin->post( '/admin/invite' )->to('Admin#do_invite' )->name('do_admin_invite' );
$admin->post( '/admin/invite/remove' )->to('Admin#do_invite_remove' )->name('do_admin_invite_remove' );
} }

@ -56,6 +56,46 @@ sub servers ( $c ) {
} }
sub invites ( $c ) {
my $invites = $c->stash->{invites} = [ $c->db->invites->all ];
}
sub do_invite ( $c ) {
my $code = $c->param('code');
my $is_multi_use = $c->param('is_multi_use' );
try {
$c->db->storage->schema->txn_do( sub {
$c->db->invites->create({
code => $code,
( $is_multi_use ? ( is_one_time_use => 0 ) : ( is_one_time_use => 1 ) ),
});
});
} catch {
$c->flash( error_message => "Invite Code could not be created: $_" );
};
$c->redirect_to( $c->url_for( 'show_admin_invites' ) );
return;
}
sub do_invite_remove ( $c ) {
my $invite = $c->db->invite($c->param('iid'));
if ( ! $invite ) {
$c->flash( error_message => "Invite could not be removed, because it doesn't exist?" );
$c->redirect_to( $c->url_for( 'show_admin_invites' ) );
return;
}
my $code = $invite->code;
$invite->delete;
$c->flash( confirmation => "Removed $code from invite pool." );
$c->redirect_to( $c->url_for( 'show_admin_invites' ) );
}
sub do_server ( $c ) { sub do_server ( $c ) {
my $fqdn = $c->param('server_fqdn'); my $fqdn = $c->param('server_fqdn');

@ -17,11 +17,16 @@ sub do_register ( $c ) {
my $email = $c->stash->{form_email} = $c->param('email'); my $email = $c->stash->{form_email} = $c->param('email');
my $password = $c->stash->{form_password} = $c->param('password'); my $password = $c->stash->{form_password} = $c->param('password');
my $p_confirm = $c->stash->{form_password_confirm} = $c->param('password_confirm'); my $p_confirm = $c->stash->{form_password_confirm} = $c->param('password_confirm');
my $invite = $c->stash->{form_invite_code} = $c->param('invite_code');
push @{$c->stash->{errors}}, "Name is required" unless $name; push @{$c->stash->{errors}}, "Name is required" unless $name;
push @{$c->stash->{errors}}, "Email is required" unless $email; push @{$c->stash->{errors}}, "Email is required" unless $email;
push @{$c->stash->{errors}}, "Password is required" unless $password; push @{$c->stash->{errors}}, "Password is required" unless $password;
push @{$c->stash->{errors}}, "Confirm Password is required" unless $p_confirm; push @{$c->stash->{errors}}, "Confirm Password is required" unless $p_confirm;
if ( $c->config->{register}->{require_invite} ) {
push @{$c->stash->{errors}}, "Invite code is required" unless $invite;
}
return if $c->stash->{errors}; return if $c->stash->{errors};
@ -34,6 +39,11 @@ sub do_register ( $c ) {
push @{$c->stash->{errors}}, "That email address is already registered." push @{$c->stash->{errors}}, "That email address is already registered."
if $c->db->people( { email => $email } )->count; if $c->db->people( { email => $email } )->count;
if ( $c->config->{register}->{require_invite} ) {
push @{$c->stash->{errors}}, "That invite code is not valid."
unless $c->db->invites( { code => $invite, is_active => 1 } )->count >= 1;
}
return if $c->stash->{errors}; return if $c->stash->{errors};
my $person = try { my $person = try {

@ -23,6 +23,10 @@
<li class="nav-item"> <li class="nav-item">
<a class="nav-link <%= $page eq 'blogs' ? 'active' : '' %>" href="<%= $c->url_for( 'show_admin_blogs' ) %>">Blogs</a> <a class="nav-link <%= $page eq 'blogs' ? 'active' : '' %>" href="<%= $c->url_for( 'show_admin_blogs' ) %>">Blogs</a>
</li> </li>
<li class="nav-item">
<a class="nav-link <%= $page eq 'invites' ? 'active' : '' %>" href="<%= $c->url_for( 'show_admin_invites' ) %>">Invites</a>
</li>
<div class="flex-grow-1 text-right"></div> <div class="flex-grow-1 text-right"></div>

@ -0,0 +1,57 @@
% layout 'standard', title => 'Admin Panel', sb_active => 'admin';
%= include 'admin/_nav', page => 'invites'
%= include '_base/status_window';
<form class="row mt-3 gy-2 gx-3 align-items-center" method="POST" enctype="multipart/form-data" action="<%= $c->url_for( 'do_admin_invite' ) %>">
<div class="col-auto">
<label for="upload" class="col-form-label">Invite Code</label>
</div>
<div class="col-auto">
<input type="text" class="form-control" id="code" name="code" >
</div>
<div class="col-auto">
<div class="form-check form-switch">
<input class="form-check-input" type="checkbox" id="is_multi_use" name="is_multi_use">
<label class="form-check-label" for="is_multi_use">Allow multiple use of this code</label>
</div>
</div>
<div class="col-auto">
<button type="submit" class="btn btn-sm btn-primary">Create Code</button>
</div>
</form>
<table style="border: 1px solid #ccc" class="mt-3 table">
<tbody>
<tr>
<th class="text-nowrap">ID</th>
<th class="text-nowrap">Code</th>
<th class="text-nowrap">One time use?</th>
<th class="text-nowrap">Is active?</th>
<th class="text-nowrap">Created</th>
<th class="text-nowrap">Remove</th>
</tr>
</thead>
<tbody>
% for my $invite ( @{$invites} ) {
<tr>
<td><%= $invite->id %></td>
<td><%= $invite->code %></td>
<td><%= $invite->is_one_time_use %></td>
<td><%= $invite->is_active %></td>
<td><%= $invite->created_at->strftime( "%F" ) %></td>
<td>
<form style="margin-top: 1.5em; display: inline;" method="POST" action="<%= $c->url_for( 'do_admin_invite_remove' ) %>">
<input type="hidden" name="iid" value="<%= $invite->id %>">
<button type="submit" class="btn btn-sm btn-outline-danger">Remove</button>
</form>
</td>
</tr>
% }
</tbody>
</table>

@ -29,6 +29,14 @@
help => '', help => '',
value => $c->stash->{form_password_confirm} value => $c->stash->{form_password_confirm}
%> %>
% if ( $c->config->{register}->{require_invite} ) {
<%= include '_base/form/input', type => 'text', name => 'invite_code',
title => 'Invitation Code',
help => '',
value => $c->stash->{form_invite_code}
%>
% }
<button type="submit" class="btn btn-primary float-end">Create Account</button> <button type="submit" class="btn btn-primary float-end">Create Account</button>
</form> </form>

Loading…
Cancel
Save