PostText/lib/PostText/Model/Moderator.pm

281 lines
7.3 KiB
Perl

package PostText::Model::Moderator;
use Mojo::Base -base, -signatures;
has [qw{pg authenticator}];
has date_format => 'Dy, FMDD Mon YYYY HH24:MI:SS TZHTZM';
sub create($self, $name, $email, $password) {
my $password_hash = $self->authenticator->hash_password($password);
$self->pg->db->query(<<~'END_SQL', $name, $email, $password_hash);
INSERT INTO moderators (
moderator_name,
email_addr,
password_hash
)
VALUES (?, ?, ?);
END_SQL
}
sub check($self, $email, $password) {
my ($moderator, $mod_id);
$moderator =
$self->pg->db->query(<<~'END_SQL', $email)->hash;
SELECT moderator_id AS id,
password_hash
FROM moderators
WHERE email_addr = ?;
END_SQL
$mod_id = $moderator->{'id'};
if ($mod_id && !$self->lock_status($mod_id)) {
return $self->authenticator
->verify_password($password, $moderator->{'password_hash'});
}
return undef;
}
sub lock_out($self, $mod_id) {
$self->pg->db->query(<<~'END_SQL', $mod_id)
UPDATE moderators
SET lock_status = TRUE
WHERE moderator_id = ?;
END_SQL
}
sub unlock($self, $mod_id) {
$self->pg->db->query(<<~'END_SQL', $mod_id)
UPDATE moderators
SET lock_status = FALSE
WHERE moderator_id = ?;
END_SQL
}
sub get_id($self, $email) {
$self->pg->db->query(<<~'END_SQL', $email)->hash->{'moderator_id'}
SELECT moderator_id
FROM moderators
WHERE email_addr = ?;
END_SQL
}
sub get_name($self, $mod_id) {
$self->pg->db->query(<<~'END_SQL', $mod_id)->hash->{'moderator_name'}
SELECT moderator_name
FROM moderators
WHERE moderator_id = ?;
END_SQL
}
sub admin_status($self, $mod_id) {
$self->pg->db->query(<<~'END_SQL', $mod_id)->hash->{'admin_status'}
SELECT admin_status
FROM moderators
WHERE moderator_id = ?;
END_SQL
}
sub lock_status($self, $mod_id) {
$self->pg->db->query(<<~'END_SQL', $mod_id)->hash->{'lock_status'}
SELECT lock_status
FROM moderators
WHERE moderator_id = ?;
END_SQL
}
sub login_timestamp($self, $mod_id) {
$self->pg->db->query(<<~'END_SQL', $mod_id);
UPDATE moderators
SET last_login_date = NOW()
WHERE moderator_id = ?;
END_SQL
}
sub unflag_thread($self, $thread_id) {
$self->pg->db->query(<<~'END_SQL', $thread_id)
UPDATE threads
SET flagged_status = FALSE
WHERE thread_id = ?;
END_SQL
}
sub hide_thread($self, $thread_id) {
$self->pg->db->query(<<~'END_SQL', $thread_id)
UPDATE threads
SET hidden_status = TRUE,
flagged_status = FALSE
WHERE thread_id = ?;
END_SQL
}
sub unhide_thread($self, $thread_id) {
$self->pg->db->query(<<~'END_SQL', $thread_id)
UPDATE threads
SET hidden_status = FALSE
WHERE thread_id = ?;
END_SQL
}
sub unflag_remark($self, $remark_id) {
$self->pg->db->query(<<~'END_SQL', $remark_id)
UPDATE remarks
SET flagged_status = FALSE
WHERE remark_id = ?;
END_SQL
}
sub hide_remark($self, $remark_id) {
$self->pg->db->query(<<~'END_SQL', $remark_id)
UPDATE remarks
SET hidden_status = TRUE,
flagged_status = FALSE
WHERE remark_id = ?;
END_SQL
}
sub unhide_remark($self, $remark_id) {
$self->pg->db->query(<<~'END_SQL', $remark_id)
UPDATE remarks
SET hidden_status = FALSE
WHERE remark_id = ?;
END_SQL
}
sub flagged($self) {
$self->pg->db->query(<<~'END_SQL')->hashes
SELECT 'thread' AS type,
thread_id AS id
FROM threads
WHERE flagged_status
UNION
SELECT 'remark',
remark_id
FROM remarks
WHERE flagged_status
ORDER BY id DESC;
END_SQL
}
sub hidden($self) {
$self->pg->db->query(<<~'END_SQL')->hashes
SELECT 'thread' AS type,
thread_id AS id
FROM threads
WHERE hidden_status
UNION
SELECT 'remark',
remark_id
FROM remarks
WHERE hidden_status
ORDER BY id DESC;
END_SQL
}
sub admin_reset($self, $email, $password) {
my $password_hash = $self->authenticator->hash_password($password);
$self->pg->db->query(<<~'END_SQL', $password_hash, $email);
UPDATE moderators
SET password_hash = ?
WHERE email_addr = ?;
END_SQL
}
sub mod_reset($self, $mod_id, $password) {
my $password_hash = $self->authenticator->hash_password($password);
$self->pg->db->query(<<~'END_SQL', $password_hash, $mod_id);
UPDATE moderators
SET password_hash = ?
WHERE moderator_id = ?;
END_SQL
}
sub lock_acct($self, $email) {
$self->pg->db->query(<<~'END_SQL', $email)
UPDATE moderators
SET lock_status = TRUE
WHERE email_addr = ?;
END_SQL
}
sub unlock_acct($self, $email) {
$self->pg->db->query(<<~'END_SQL', $email)
UPDATE moderators
SET lock_status = FALSE
WHERE email_addr = ?;
END_SQL
}
sub promote($self, $email) {
$self->pg->db->query(<<~'END_SQL', $email)
UPDATE moderators
SET admin_status = TRUE
WHERE email_addr = ?;
END_SQL
}
sub demote($self, $email) {
$self->pg->db->query(<<~'END_SQL', $email)
UPDATE moderators
SET admin_status = FALSE
WHERE email_addr = ?;
END_SQL
}
sub thread_by_id($self, $thread_id) {
my $date_format = $self->date_format;
$self->pg->db->query(<<~'END_SQL', $date_format, $thread_id)->hash;
SELECT t.thread_id AS id,
TO_CHAR(t.thread_date, ?) AS date,
t.thread_author AS author,
t.thread_title AS title,
t.thread_body AS body,
COUNT(r.*) AS remark_tally,
t.bump_tally AS bump_tally
FROM threads AS t
LEFT JOIN remarks AS r
ON t.thread_id = r.thread_id
WHERE t.thread_id = ?
GROUP BY t.thread_id;
END_SQL
}
sub remark_by_id($self, $remark_id) {
my $date_format = $self->date_format;
$self->pg->db->query(<<~'END_SQL', $date_format, $remark_id)->hash;
SELECT remark_id AS id,
TO_CHAR(remark_date, ?) AS date,
remark_author AS author,
remark_body AS body,
thread_id
FROM remarks
WHERE remark_id = ?;
END_SQL
}
sub list($self) {
my $date_format = $self->date_format;
$self->pg->db->query(<<~'END_SQL', $date_format)->hashes;
SELECT moderator_id AS id,
moderator_name AS name,
email_addr,
TO_CHAR(creation_date, $1) AS creation_date,
TO_CHAR(last_login_date, $1) AS last_login_date,
lock_status,
admin_status
FROM moderators
ORDER BY last_login_date DESC;
END_SQL
}
1;