App-Standby

 view release on metacpan or  search on metacpan

lib/App/Standby/Frontend.pm  view on Meta::CPAN

                },
                1,
            ],
            'ucfirst'       => sub { my $str = shift; return ucfirst($str); },
            # A localization filter. Turn the english text into the localized counterpart using Locale::Maketext
            'l10n' => [
                sub {
                    my ( $context, @args ) = @_;

                    return sub {
                        my $str = shift;

                        if(@args) {
                            foreach my $i (0 .. $#args) {
                                my $n = $i+1;
                                my $r = $args[$i];
                                $str =~ s/\[_$n\]/$r/;
                            }
                        }

                        return $str;
                      }
                },
                1,
            ],
        },
    };
    my $TT = Template::->new($tpl_config);

    return $TT;
}

sub _init_finder {
    my $self = shift;

    # The finder is the class that finds our available services
    my $Finder = Module::Pluggable::Object::->new('search_path' => 'App::Standby::Service');

    return $Finder;
}

sub _init_services {
    my $self = shift;

    return [$self->finder()->plugins()];
}

sub _log_request {
    my $self = shift;
    my $request_ref = shift;

    my $remote_addr = $request_ref->{'remote_addr'};
    # turn key => value pairs into smth. like key1=value1,key2=value2,...
    my $args = join(',', map { $_.'='.$request_ref->{$_} } keys %{$request_ref});

    $self->logger()->log( message => 'New Request from '.$remote_addr.'. Args: '.$args, level => 'debug', );

    return 1;
}

sub _verify_group_key {
    my $self = shift;
    my $request = shift;

    my $sql = 'SELECT COUNT(*) FROM groups WHERE id = ? AND key = ?';
    my $sth = $self->dbh()->prepare($sql);
    if(!$sth) {
        $self->logger()->log( message => 'Failed to prepare SQL '.$sql.' w/ error: '.$self->dbh()->errstr, level => 'error', );
        return;
    }
    if(!$sth->execute($request->{'group_id'},$request->{'group_key'})) {
        $self->logger()->log( message => 'Failed to execute stmt w/ error: '.$sth->errstr, level => 'error', );
        return;
    }
    my $cnt = $sth->fetchrow_array();
    if($cnt > 0) {
        # key valid
        return 1;
    } else {
        # key invalid
        return;
    }
}

sub _filter_params {
    my $self = shift;
    my $request = shift;

    my $params = $request->parameters();

    my $request_ref = {};
    foreach my $key (qw(
            janitor group_id rm config_id name
            cellphone key value group_key gs_id desc class new_group_key
            cconfig_id contact_id
            )) {
        if (defined($params->{$key})) {
            $request_ref->{$key} = $params->{$key};
        }
    }

    # set default value for group_id
    if(!defined($request_ref->{'group_id'})) {
        $request_ref->{'group_id'} = 1;
    }

    # add the remote_addr
    $request_ref->{'remote_addr'} = $request->address();

    # add the path
    $request_ref->{'path'} = $request->path_info;

    return $request_ref;
}


sub groups {
    my $self = shift;

    # intatiate the apt class and call update
    # the method returns the new user ordering, set this to the DB

lib/App/Standby/Frontend.pm  view on Meta::CPAN

            'groups' => $self->_get_group_array(),
        },
        \$body,
    );
    return [ 200, [ 'Content-Type', 'text/html'], [$body]];
}

sub _render_add_group {
    my $self = shift;
    my $request = shift;

    my $body;
    $self->tt()->process(
        'add_group.tpl',
        {
            'groups' => $self->_get_group_array(),
        },
        \$body,
    );
    return [ 200, [ 'Content-Type', 'text/html'], [$body]];
}

sub _render_insert_group {
    my $self = shift;
    my $request = shift;

    my $sql = 'INSERT INTO groups (`name`,`key`) VALUES(?,?)';
    my $sth = $self->dbh()->prepare($sql);
    $sth->execute($request->{'name'},$request->{'key'});
    my $group_id = $self->dbh()->last_insert_id(undef, undef, undef, undef);

    return [ 301, [ 'Location', '?rm=overview&group_id='.$group_id ], [] ];
}

sub _render_edit_group {
    my $self = shift;
    my $request = shift;

    my $sql = 'SELECT `id`,`name` FROM groups WHERE id = ?';
    my $sth = $self->dbh()->prepare($sql);
    $sth->execute($request->{'group_id'});
    my ($id,$name) = $sth->fetchrow_array();

    my $body;
    $self->tt()->process(
        'edit_group.tpl',
        {
            'name'      => $name,
            'group_id'  => $request->{'group_id'},
            'groups' => $self->_get_group_array(),
        },
        \$body,
    );
    return [ 200, [ 'Content-Type', 'text/html'], [$body]];
}

sub _render_update_group {
    my $self = shift;
    my $request = shift;

    # verify group_key before any modification
    if(!$self->_verify_group_key($request)) {
        return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'}.'&msg=Invalid%20Key' ], [] ];
    }

    my $sql = 'UPDATE groups SET `name` = ?, `key` = ? WHERE id = ?';

    my $sth = $self->dbh()->prepare($sql);
    if(!$sth) {
        $self->logger()->log( message => 'Failed to prepare SQL '.$sql.' w/ error: '.$self->dbh()->errstr, level => 'error', );
        return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'} ], [] ];
    }
    if(!$sth->execute($request->{'name'},$request->{'new_group_key'},$request->{'group_id'})) {
        $self->logger()->log( message => 'Failed to execute stmt w/ error: '.$sth->errstr, level => 'error', );
    }

    return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'} ], [] ];
}

sub _render_delete_group_ask {
    my $self = shift;
    my $request = shift;

    my $body;
    $self->tt()->process(
        'delete_group_ask.tpl',
        {
            'group_id' => $request->{'group_id'},
            'groups' => $self->_get_group_array(),
        },
        \$body,
    );
    return [ 200, [ 'Content-Type', 'text/html'], [$body]];
}

sub _render_delete_group {
    my $self = shift;
    my $request = shift;

    return unless $request->{'group_id'};

    # verify group_key before any modification
    if(!$self->_verify_group_key($request)) {
        return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'}.'&msg=Invalid%20Key' ], [] ];
    }

    my $sql = 'DELETE FROM groups WHERE id = ?';
    my $sth = $self->dbh()->prepare($sql);
    if(!$sth) {
        $self->logger()->log( message => 'Failed to prepare SQL '.$sql.' w/ error: '.$self->dbh()->errstr, level => 'error', );
        return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'} ], [] ];
    }
    if(!$sth->execute($request->{'group_id'})) {
        $self->logger()->log( message => 'Failed to execute stmt w/ error: '.$sth->errstr, level => 'error', );
    }
    $sth->finish();

    return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'} ], [] ];
}

sub _render_list_services {
    my $self = shift;
    my $request = shift;

    # Group Services
    my $sql = 'SELECT id,name,desc,class FROM group_services WHERE group_id = ? ORDER BY name';
    my $sth = $self->dbh()->prepare($sql);
    $sth->execute($request->{'group_id'});
    my @gs = ();
    while(my ($id,$name,$desc,$class) = $sth->fetchrow_array()) {
        push(@gs, {
            'id'        => $id,
            'name'      => $name,
            'desc'      => $desc,
            'class'     => 'App::Standby::Service::'.$class,
        });
    }
    $sth->finish();

    my $body;
    $self->tt()->process(
        'list_services.tpl',
        {
            'group_id' => $request->{'group_id'},
            'gs' => \@gs,
            'groups' => $self->_get_group_array(),
        },
        \$body,
    );
    return [ 200, [ 'Content-Type', 'text/html'], [$body]];
}

sub _render_add_service {
    my $self = shift;
    my $request = shift;

    my $body;
    $self->tt()->process(
        'add_service.tpl',
        {
            'group_id' => $request->{'group_id'},
            'groups' => $self->_get_group_array(),
            'services' => $self->_get_service_classes(),
        },
        \$body,
    );
    return [ 200, [ 'Content-Type', 'text/html'], [$body]];
}

sub _render_insert_service {
    my $self = shift;
    my $request = shift;

    # verify group_key before any modification
    if(!$self->_verify_group_key($request)) {
        return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'}.'&msg=Invalid%20Key' ], [] ];
    }

    my $sql = 'INSERT INTO group_services (`group_id`,`name`,`desc`,`class`) VALUES(?,?,?,?)';
    my $sth = $self->dbh()->prepare($sql);
    $sth->execute($request->{'group_id'},$request->{'name'},$request->{'desc'},$request->{'class'});

    return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'} ], [] ];
}

sub _render_edit_service {
    my $self = shift;
    my $request = shift;

    my $sql = 'SELECT `id`,`name`,`desc`,`class` FROM group_services WHERE id = ?';
    my $sth = $self->dbh()->prepare($sql);
    $sth->execute($request->{'gs_id'});
    my ($id,$name,$desc,$class) = $sth->fetchrow_array();

    my $body;
    $self->tt()->process(
        'edit_service.tpl',
        {
            'gs_id'     => $request->{'gs_id'},
            'name'      => $name,
            'desc'      => $desc,
            'class'     => $class,
            'group_id'  => $request->{'group_id'},
            'groups' => $self->_get_group_array(),
            'services' => $self->_get_service_classes(),
        },
        \$body,
    );
    return [ 200, [ 'Content-Type', 'text/html'], [$body]];
}

sub _render_update_service {
    my $self = shift;
    my $request = shift;

    # verify group_key before any modification
    if(!$self->_verify_group_key($request)) {
        return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'}.'&msg=Invalid%20Key' ], [] ];
    }

    my $sql = 'UPDATE group_services SET `name` = ?, `desc` = ?, `class` = ? WHERE id = ?';

    my $sth = $self->dbh()->prepare($sql);
    if(!$sth) {
        $self->logger()->log( message => 'Failed to prepare SQL '.$sql.' w/ error: '.$self->dbh()->errstr, level => 'error', );
    }
    if(!$sth->execute($request->{'value'},$request->{'config_id'})) {
        $self->logger()->log( message => 'Failed to execute stmt w/ error: '.$sth->errstr, level => 'error', );
    }
    $sth->finish();

    return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'} ], [] ];
}

sub _render_delete_service_ask {
    my $self = shift;
    my $request = shift;

    my $body;
    $self->tt()->process(
        'delete_service_ask.tpl',
        {
            'gs_id' => $request->{'gs_id'},
            'group_id' => $request->{'group_id'},
            'groups' => $self->_get_group_array(),
        },
        \$body,
    );
    return [ 200, [ 'Content-Type', 'text/html'], [$body]];
}

sub _render_delete_service {
    my $self = shift;
    my $request = shift;

    return unless $request->{'gs_id'};

    # verify group_key before any modification
    if(!$self->_verify_group_key($request)) {
        return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'}.'&msg=Invalid%20Key' ], [] ];
    }

    my $sql = 'DELETE FROM group_services WHERE id = ?';
    my $sth = $self->dbh()->prepare($sql);
    if(!$sth) {
      $self->logger()->log( message => 'Failed to prepare SQL '.$sql.' w/ error: '.$self->dbh()->errstr, level => 'error', );
    }
    if(!$sth->execute($request->{'gs_id'})) {
      $self->logger()->log( message => 'Failed to execute stmt w/ error: '.$sth->errstr, level => 'error', );
    }
    $sth->finish();

    return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'} ], [] ];
}

#
# Config
#

sub _render_list_config {
    my $self = shift;
    my $request = shift;

    # Config
    my $sql = 'SELECT `id`,`key`,`value` FROM config WHERE `group_id` = ? ORDER BY `key`';
    my $sth = $self->dbh()->prepare($sql);
    $sth->execute($request->{'group_id'});
    my @config = ();
    while(my ( $id, $key, $value ) = $sth->fetchrow_array()) {
        push(@config,{
            'id'    => $id,
            'key'   => $key,
            'value' => $value,
        });
    }
    $sth->finish();

    my $body;
    $self->tt()->process(
        'list_config.tpl',
        {
            'group_id' => $request->{'group_id'},
            'config' => \@config,
            'groups' => $self->_get_group_array(),
        },
        \$body,
    );
    return [ 200, [ 'Content-Type', 'text/html'], [$body]];
}

sub _render_add_config {
    my $self = shift;
    my $request = shift;

    my $body;
    $self->tt()->process(
        'add_config.tpl',
        {
            'group_id' => $request->{'group_id'},
            'groups' => $self->_get_group_array(),
        },
        \$body,
    );
    return [ 200, [ 'Content-Type', 'text/html'], [$body]];
}

sub _render_insert_config {
    my $self = shift;
    my $request = shift;

    # verify group_key before any modification
    if(!$self->_verify_group_key($request)) {
        return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'}.'&msg=Invalid%20Key' ], [] ];
    }

    my $sql = 'INSERT INTO config (`key`,`value`,`group_id`) VALUES (?,?,?)';
    my $sth = $self->dbh()->prepare($sql);
    $sth->execute($request->{'key'},$request->{'value'},$request->{'group_id'});

    return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'} ], [] ];
}

sub _render_edit_config {
    my $self = shift;
    my $request = shift;

    my $sql = 'SELECT `id`,`key`,`value` FROM config WHERE id = ?';
    my $sth = $self->dbh()->prepare($sql);
    $sth->execute($request->{'config_id'});
    my ($id,$key,$value) = $sth->fetchrow_array();

    my $body;
    $self->tt()->process(
        'edit_config.tpl',
        {
            'config_id'  => $request->{'config_id'},
            'key'     => $key,
            'value' => $value,
            'group_id' => $request->{'group_id'},
            'groups' => $self->_get_group_array(),
        },
        \$body,
    );
    return [ 200, [ 'Content-Type', 'text/html'], [$body]];
}

sub _render_update_config {
    my $self = shift;
    my $request = shift;

    # verify group_key before any modification
    if(!$self->_verify_group_key($request)) {
        return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'}.'&msg=Invalid%20Key' ], [] ];
    }

    my $sql = 'UPDATE config SET `value` = ? WHERE id = ?';

    my $sth = $self->dbh()->prepare($sql);
    if(!$sth) {
        #print "Prepare failed: ".$self->dbh()->errstr()."\n";
    }
    if(!$sth->execute($request->{'value'},$request->{'config_id'})) {
        #print "Exec failed: ".$sth->errstr()."\n";
    }

    return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'} ], [] ];
}

sub _render_delete_config_ask {
    my $self = shift;
    my $request = shift;

    my $body;
    $self->tt()->process(
        'delete_config_ask.tpl',
        {
            'config_id' => $request->{'config_id'},
            'group_id' => $request->{'group_id'},
            'groups' => $self->_get_group_array(),
        },
        \$body,
    );
    return [ 200, [ 'Content-Type', 'text/html'], [$body]];
}

sub _render_delete_config {
    my $self = shift;
    my $request = shift;

    return unless $request->{'config_id'};

    # verify group_key before any modification
    if(!$self->_verify_group_key($request)) {
        return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'}.'&msg=Invalid%20Key' ], [] ];
    }

    my $sql = 'DELETE FROM config WHERE id = ?';
    my $sth = $self->dbh()->prepare($sql);
    $sth->execute($request->{'config_id'});
    $sth->finish();

    return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'} ], [] ];
}

#
# Config_contacts
#

sub _render_list_config_contacts {
    my $self = shift;
    my $request = shift;

    # Config
    my $sql = 'SELECT `id`,`key`,`value` FROM config_contacts WHERE `contact_id` = ? ORDER BY `key`';
    my $sth = $self->dbh()->prepare($sql);
    $sth->execute($request->{'contact_id'});
    my @config = ();
    while(my ( $id, $key, $value ) = $sth->fetchrow_array()) {
        push(@config,{
            'id'    => $id,
            'key'   => $key,
            'value' => $value,
        });
    }
    $sth->finish();

    my $body;
    $self->tt()->process(
        'list_config_contacts.tpl',
        {
            'contact_id' => $request->{'contact_id'},
            'config' => \@config,
            'groups' => $self->_get_group_array(),
            'group_id'  => $request->{'group_id'},
        },
        \$body,
    );
    return [ 200, [ 'Content-Type', 'text/html'], [$body]];
}

sub _render_add_config_contacts {
    my $self = shift;
    my $request = shift;

    my $body;
    $self->tt()->process(
        'add_config_contacts.tpl',
        {
            'contact_id' => $request->{'contact_id'},
            'group_id'  => $request->{'group_id'},
            'contacts'  => $self->_get_contacts_array($request->{'group_id'}),
            'groups'    => $self->_get_group_array(),
        },
        \$body,
    );
    return [ 200, [ 'Content-Type', 'text/html'], [$body]];
}

sub _render_insert_config_contacts {
    my $self = shift;
    my $request = shift;

    # verify group_key before any modification
    if(!$self->_verify_group_key($request)) {
        return [ 301, [ 'Location', '?rm=list_config_contacts&contact_id='.$request->{'contact_id'}.'&msg=Invalid%20Key' ], [] ];
    }

    my $sql = 'INSERT INTO config_contacts (`key`,`value`,`contact_id`) VALUES (?,?,?)';
    my $sth = $self->dbh()->prepare($sql);
    $sth->execute($request->{'key'},$request->{'value'},$request->{'contact_id'});

    return [ 301, [ 'Location', '?rm=list_config_contacts&contact_id='.$request->{'contact_id'} ], [] ];
}

sub _render_edit_config_contacts {
    my $self = shift;
    my $request = shift;

    my $sql = 'SELECT `id`,`key`,`value` FROM config_contacts WHERE id = ?';
    my $sth = $self->dbh()->prepare($sql);
    $sth->execute($request->{'cconfig_id'});
    my ($id,$key,$value) = $sth->fetchrow_array();

    my $body;
    $self->tt()->process(
        'edit_config_contacts.tpl',
        {
            'cconfig_id'        => $request->{'cconfig_id'},
            'key'               => $key,
            'value'             => $value,
            'group_id'          => $request->{'group_id'},
            'contact_id'        => $request->{'contact_id'},
            'contacts'          => $self->_get_contacts_array($request->{'group_id'}),
            'groups'            => $self->_get_group_array(),
        },
        \$body,
    );
    return [ 200, [ 'Content-Type', 'text/html'], [$body]];
}

sub _render_update_config_contacts {
    my $self = shift;
    my $request = shift;

    # verify group_key before any modification
    if(!$self->_verify_group_key($request)) {
        return [ 301, [ 'Location', '?rm=list_config_contacts&contact_id='.$request->{'contact_id'}.'&msg=Invalid%20Key' ], [] ];
    }

    my $sql = 'UPDATE config_contacts SET `value` = ? WHERE id = ?';

    my $sth = $self->dbh()->prepare($sql);
    if(!$sth) {
        #print "Prepare failed: ".$self->dbh()->errstr()."\n";
    }
    if(!$sth->execute($request->{'value'},$request->{'cconfig_id'})) {
        #print "Exec failed: ".$sth->errstr()."\n";
    }

    return [ 301, [ 'Location', '?rm=list_config_contacts&contact_id='.$request->{'contact_id'} ], [] ];
}

sub _render_delete_config_contacts_ask {
    my $self = shift;
    my $request = shift;

    my $body;
    $self->tt()->process(
        'delete_config_contacts_ask.tpl',
        {
            'cconfig_id'        => $request->{'cconfig_id'},
            'group_id'          => $request->{'group_id'},
            'contact_id'        => $request->{'contact_id'},
            'groups'            => $self->_get_group_array(),
        },
        \$body,
    );

    return [ 200, [ 'Content-Type', 'text/html'], [$body]];
}

sub _render_delete_config_contacts {
    my $self = shift;
    my $request = shift;

    return [ 301, [ 'Location', '?rm=list_config_contacts&contact_id='.$request->{'contact_id'}.'&msg=Missing%20Args' ], [] ] unless $request->{'cconfig_id'};

    # verify group_key before any modification
    if(!$self->_verify_group_key($request)) {
        return [ 301, [ 'Location', '?rm=list_config_contacts&contact_id='.$request->{'contact_id'}.'&msg=Invalid%20Key' ], [] ];
    }

    my $sql = 'DELETE FROM config_contacts WHERE id = ?';
    my $sth = $self->dbh()->prepare($sql);
    $sth->execute($request->{'cconfig_id'});
    $sth->finish();

    return [ 301, [ 'Location', '?rm=list_config_contacts&contact_id='.$request->{'contact_id'} ], [] ];
}

#
# Contacts
#
sub _render_list_contacts {
    my $self = shift;
    my $request = shift;

    my $body;
    $self->tt()->process(
        'list_contacts.tpl',
        {
            'group_id'  => $request->{'group_id'},
            'contacts'  => $self->_get_contacts_array($request->{'group_id'}),
            'groups'    => $self->_get_group_array(),
        },
        \$body,
    );
    return [ 200, [ 'Content-Type', 'text/html'], [$body]];
}

sub _render_add_contact {
    my $self = shift;
    my $request = shift;

    my $body;
    $self->tt()->process(
        'add_contact.tpl',
        {
            'group_id' => $request->{'group_id'},
            'groups' => $self->_get_group_array(),
        },
        \$body,
    );
    return [ 200, [ 'Content-Type', 'text/html'], [$body]];
}

sub _render_insert_contact {
    my $self = shift;
    my $request = shift;

    # verify group_key before any modification
    if(!$self->_verify_group_key($request)) {
        return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'}.'&msg=Invalid%20Key' ], [] ];
    }

    my $sql = 'INSERT INTO contacts (`name`,`cellphone`, `group_id`,`is_enabled`,`ordinal`) VALUES (?,?,?,0,0)';
    my $sth = $self->dbh()->prepare($sql);
    $sth->execute($request->{'name'},$request->{'cellphone'},$request->{'group_id'});
    my $contact_id = $self->dbh()->last_insert_id(undef, undef, undef, undef);

    return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'} ], [] ];
}

sub _render_edit_contact {
    my $self = shift;
    my $request = shift;

    my $sql = 'SELECT name,cellphone FROM contacts WHERE id = ?';
    my $sth = $self->dbh()->prepare($sql);
    $sth->execute($request->{'contact_id'});
    my ($name,$cellphone) = $sth->fetchrow_array();
    $sth->finish();

    my $body;
    $self->tt()->process(
        'edit_contact.tpl',
        {
            'contact_id' => $request->{'contact_id'},
            'name'      => $name,
            'cellphone' => $cellphone,
            'group_id'  => $request->{'group_id'},
            'groups'    => $self->_get_group_array(),
        },
        \$body,
    );
    return [ 200, [ 'Content-Type', 'text/html'], [$body]];
}

sub _render_update_contact {
    my $self = shift;
    my $request = shift;

    # verify group_key before any modification
    if(!$self->_verify_group_key($request)) {
        return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'}.'&msg=Invalid%20Key' ], [] ];
    }

    my $sql = 'UPDATE contacts SET ';
    my @args = ();

    foreach my $key (qw(name cellphone group_id)) {
        if(defined($request->{$key})) {
            $sql .= '`'.$key.'` = ?, ';
            push(@args,$request->{$key});
        }
    }

    # remove trailing comma
    $sql =~ s/,\s$//;

    $sql .= ' WHERE id = ?';
    push(@args, $request->{'contact_id'});

    my $sth = $self->dbh()->prepare($sql);
    if(!$sth) {
        $self->logger()->log( message => 'Failed to prepare statement from SQL '.$sql.' w/ error: '.$self->dbh()->errstr(), level => 'error', );
    }
    if(!$sth->execute(@args)) {
        $self->logger()->log( message => 'Failed to execute statement w/ error: '.$sth->errstr(), level => 'error', );
    }

    return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'} ], [] ];
}

sub _render_delete_contact_ask {
    my $self = shift;
    my $request = shift;

    my $body;
    $self->tt()->process(
        'delete_contact_ask.tpl',
        {
            'contact_id' => $request->{'contact_id'},
            'group_id' => $request->{'group_id'},
            'groups'    => $self->_get_group_array(),
        },
        \$body,
    );
    return [ 200, [ 'Content-Type', 'text/html'], [$body]];
}

sub _render_delete_contact {
    my $self = shift;
    my $request = shift;

    # verify group_key before any modification
    if(!$self->_verify_group_key($request)) {
        return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'}.'&msg=Invalid%20Key' ], [] ];
    }

    return unless $request->{'contact_id'};

    my $sql = 'DELETE FROM contacts WHERE id = ?';
    my $sth = $self->dbh()->prepare($sql);
    if(!$sth) {
        $self->logger()->log( message => 'Failed to prepare statement from SQL '.$sql.' w/ error: '.$self->dbh()->errstr(), level => 'error', );
    }
    if(!$sth->execute($request->{'contact_id'})) {
        $self->logger()->log( message => 'Failed to execute statement w/ error: '.$sth->errstr(), level => 'error', );
    }
    $sth->finish();

    return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'} ], [] ];
}

sub _render_update_janitor {
    my $self = shift;
    my $request = shift;

    # verify group_key before any modification
    if(!$self->_verify_group_key($request)) {
        return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'}.'&msg=Invalid%20Key' ], [] ];
    }

    my $error = '';
    my $Group = $self->groups()->{$request->{'group_id'}};
    if($Group) {
        try {
            my $users = $Group->set_janitor($request->{'janitor'});
            if(scalar(@$users)) {
                $self->logger()->log( message => "Updated janitor", level => 'debug', );
            } else {
                $error = 'Failed to set new janitor';
                $self->logger()->log( message => "Failed to set new janitor", level => 'error', );
            }
        } catch {
            $self->logger()->log( message => "Failed to set new janitor: ".$_, level => 'error', );
        };
    } else {
        $self->logger()->log( message => "Unable to set new janitor. Got no group.", level => 'error', );
    }

    return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'} ], [] ];
}

sub _render_enable_contact_ask {
    my $self = shift;
    my $request = shift;

    my $body;
    $self->tt()->process(
        'enable_contact_ask.tpl',
        {
            'contact_id' => $request->{'contact_id'},
            'group_id' => $request->{'group_id'},
            'groups'    => $self->_get_group_array(),
        },
        \$body,
    );
    return [ 200, [ 'Content-Type', 'text/html'], [$body]];
}

sub _render_enable_contact {
    my $self = shift;
    my $request = shift;

    # verify group_key before any modification
    if(!$self->_verify_group_key($request)) {
        return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'}.'&msg=Invalid%20Key' ], [] ];
    }

    my $Group = $self->groups()->{$request->{'group_id'}};
    if($Group) {
        try {
            $Group->enable_contact($request->{'contact_id'});
        } catch {
            $self->logger()->log( message => "Failed to enable user: ".$_, level => 'error', );
        };
    }

    return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'} ], [] ];
}

sub _render_disable_contact_ask {
    my $self = shift;
    my $request = shift;

    my $body;
    $self->tt()->process(
        'disable_contact_ask.tpl',
        {
            'contact_id' => $request->{'contact_id'},
            'group_id' => $request->{'group_id'},
        },
        \$body,
    );
    return [ 200, [ 'Content-Type', 'text/html'], [$body]];
}

sub _render_disable_contact {
    my $self = shift;
    my $request = shift;

    # verify group_key before any modification
    if(!$self->_verify_group_key($request)) {
        return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'}.'&msg=Invalid%20Key' ], [] ];
    }

    my $Group = $self->groups()->{$request->{'group_id'}};
    if($Group) {
        try {
            $Group->disable_contact($request->{'contact_id'});
        } catch {
            $self->logger()->log( message => "Failed to disable user: ".$_, level => 'error', );
        };
    }

    return [ 301, [ 'Location', '?rm=overview&group_id='.$request->{'group_id'} ], [] ];
}

#
# Overview
#

sub _render_overview {
    my $self = shift;
    my $request = shift;

    # Groups
    my $group_name = '';
    my $sql = 'SELECT id,name FROM groups';
    my $sth = $self->dbh()->prepare($sql);
    if(!$sth) {
        $self->logger()->log( message => 'Failed to prepare SQL '.$sql.' w/ error: '.$self->dbh()->errstr, level => 'error', );
        return [ 500, [ 'Content-Type', 'text/html'], []];
    }
    if(!$sth->execute()) {
        $self->logger()->log( message => 'Failed to execute stmt w/ error: '.$sth->errstr, level => 'error', );
        return [ 500, [ 'Content-Type', 'text/html'], []];
    }
    my @groups = ();
    while(my ($id,$name) = $sth->fetchrow_array()) {
        push(@groups,{ 'id' => $id, 'name' => $name, });
        if($id == $request->{'group_id'}) {
            $group_name = $name;
        }
    }
    $sth->finish();

    # User
    $sql = 'SELECT id,name,cellphone,is_enabled FROM contacts WHERE group_id = ? ORDER BY name';
    $sth = $self->dbh()->prepare($sql);
    $sth->execute($request->{'group_id'});
    my @users = ();
    while(my ($id,$name,$cellphone,$is_enabled) = $sth->fetchrow_array()) {
        push(@users,{
            'id' => $id,
            'name' => $name,
            'cellphone' => $cellphone,
            'is_enabled' => $is_enabled,
        });
    }
    $sth->finish();
    my @random_contacts = List::Util::shuffle(grep { $_->{'is_enabled'} } @users);



( run in 1.374 second using v1.01-cache-2.11-cpan-f56aa216473 )