The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
package Galileo::Admin;
use Mojo::Base 'Mojolicious::Controller';

sub users { shift->render }
sub pages { shift->render }
sub user  { shift->render }

sub store_user {
  my $self = shift;
  $self->on( json => sub {
    my ($self, $data) = @_;

    my $pass1 = delete $data->{pass1};
    my $pass2 = delete $data->{pass2};
    if ( $pass1 or $pass2 ) {
      unless ( $pass1 eq $pass2 ) {
        $self->send({ json => {
          message => 'Not saved! Passwords do not match',
          success => \0,
        } });
        return 0;
      }
      $data->{password} = $pass1;
    }

    my $rs = $self->schema->resultset('User');
    unless ( $rs->single({ name => $data->{name} }) or $data->{password}) {
      $self->send({ json => {
        message => 'Cannot create user without a password',
        success => \0,
      } });
      return 0;
    }

    $data->{$_} = $data->{$_} ? 1 : 0 for ( qw/is_author is_admin/ );

    $rs->update_or_create(
      $data, {key => 'users_name'},
    );
    $self->send({ json => {
      message => 'Changes saved',
      success => \1,
    } });
  });
}

sub remove_page {
  my $self = shift;

  $self->on( json => sub {
    my ($self, $data) = @_;
    my $id = $data->{id};

    if ($id == 1) {
      $self->send({ json => {
        success => \0,
        message => 'Cannot remove home page',
      } });
      return;
    }

    my $page = $self->schema->resultset('Page')->single({ page_id => $id });

    unless ( $page ) {
      $self->send({ json => {
        success => \0,
        message => "Could not access page (id $id)",
      } });
      return;
    }

    my $affected = $page->delete;
    #TODO remove page from nav menu if present

    unless ( $affected ) {
      $self->send({ json => {
        success => \0,
        message => 'Database reports failure on deleting page',
      } });
      return;
    }

    $self->send({ json => {
      success => \1,
      message => 'Page removed',
    } });
    return;

  });
}

1;