guestbook-ng/lib/GuestbookNg/Model/Message.pm

145 lines
3.9 KiB
Perl
Raw Normal View History

2021-12-05 04:06:05 +00:00
#!/usr/bin/env perl
package GuestbookNg::Model::Message;
use Mojo::Base -base, -signatures;
has 'pg';
2021-12-12 06:50:07 +00:00
sub new($class, $pg, $pg_object) {
bless {
$pg => $pg_object,
max_posts => 5
}, $class
2021-12-05 04:06:05 +00:00
}
2021-12-23 03:23:10 +00:00
sub get_posts($self, $this_page = undef) {
if ($this_page) {
my $row_count = $self->{'max_posts'};
2021-12-25 06:46:39 +00:00
my $offset = ($this_page - 1) * $row_count;
2021-12-23 03:23:10 +00:00
$self->pg->db->query(<<~'END_SQL', $row_count, $offset)->arrays();
2022-01-02 06:31:33 +00:00
SELECT TO_CHAR(message_date, 'Dy Mon DD HH:MI:SS AM TZ YYYY'),
2021-12-23 03:23:10 +00:00
visitor_name,
message,
homepage_url,
message_id
FROM messages
2022-01-02 06:31:33 +00:00
WHERE NOT is_spam
2021-12-23 03:23:10 +00:00
ORDER BY message_date DESC
LIMIT ? OFFSET ?;
END_SQL
}
else {
$self->pg->db->query(<<~'END_SQL')->arrays()
2022-01-02 06:31:33 +00:00
SELECT TO_CHAR(message_date, 'Dy Mon DD HH:MI:SS AM TZ YYYY'),
2021-12-23 03:23:10 +00:00
visitor_name,
message,
homepage_url,
message_id
FROM messages
2022-01-02 06:31:33 +00:00
WHERE NOT is_spam
2021-12-23 03:23:10 +00:00
ORDER BY message_date DESC;
END_SQL
}
}
2022-01-12 20:18:34 +00:00
sub get_spam($self, $this_page = undef) {
if ($this_page) {
my $row_count = $self->{'max_posts'};
my $offset = ($this_page - 1) * $row_count;
$self->pg->db->query(<<~'END_SQL', $row_count, $offset)->arrays();
2022-01-12 20:18:34 +00:00
SELECT TO_CHAR(message_date, 'Dy Mon DD HH:MI:SS AM TZ YYYY'),
visitor_name,
message,
homepage_url,
message_id
FROM messages
WHERE is_spam
ORDER BY message_date DESC
LIMIT ? OFFSET ?;
END_SQL
}
else {
$self->pg->db->query(<<~'END_SQL')->arrays()
2022-01-12 20:18:34 +00:00
SELECT TO_CHAR(message_date, 'Dy Mon DD HH:MI:SS AM TZ YYYY'),
visitor_name,
message,
homepage_url,
message_id
FROM messages
WHERE is_spam
ORDER BY message_date DESC;
END_SQL
}
}
2022-01-02 06:31:33 +00:00
sub create_post($self, $name, $message, $url = undef, $spam = 1) {
my $message_id = $self->get_last_message_id();
if ($url) {
2022-01-02 06:31:33 +00:00
$self->pg->db->query(<<~'END_SQL', $name, $message, $url, $spam)
INSERT INTO messages (visitor_name, message, homepage_url, is_spam)
VALUES (?, ?, ?, ?);
END_SQL
}
else {
2022-01-02 06:31:33 +00:00
$self->pg->db->query(<<~'END_SQL', $name, $message, $spam)
INSERT INTO messages (visitor_name, message, is_spam)
VALUES (?, ?, ?);
END_SQL
}
++$message_id;
}
2021-12-12 06:50:07 +00:00
sub max_posts($self, $value = undef) {
$self->{'max_posts'} = $value // $self->{'max_posts'}
2021-12-12 06:50:07 +00:00
}
2022-01-12 20:18:34 +00:00
sub get_last_page($self, $want_spam = undef) {
my $post_count = $want_spam ? $self->get_spam_count() : $self->get_post_count();
my $last_page = int($post_count / $self->{'max_posts'});
2021-12-23 03:23:10 +00:00
2021-12-19 04:03:53 +00:00
# Add a page if we have "remainder" posts
$post_count % $self->{'max_posts'} ? ++$last_page : $last_page;
2021-12-12 06:50:07 +00:00
}
2021-12-23 03:23:10 +00:00
sub get_post_count($self) {
$self->pg->db->query(<<~'END_SQL')->text()
SELECT COUNT(*)
FROM messages
WHERE NOT is_spam;
END_SQL
2021-12-23 03:23:10 +00:00
}
2022-01-12 20:18:34 +00:00
sub get_spam_count($self) {
$self->pg->db->query(<<~'END_SQL')->text()
SELECT COUNT(*)
FROM messages
WHERE is_spam;
END_SQL
}
sub get_post_by_id($self, $message_id) {
$self->pg->db->query(<<~'END_SQL', $message_id)->array()
SELECT TO_CHAR(message_date, 'Dy Mon DD HH:MI:SS AM TZ YYYY'),
visitor_name,
message,
homepage_url,
message_id
FROM messages
WHERE message_id = ?;
END_SQL
2022-01-12 20:18:34 +00:00
}
sub get_last_message_id($self) {
$self->pg->db->query(<<~'END_SQL')->text()
SELECT MAX(message_id)
FROM messages;
END_SQL
}
2021-12-05 04:06:05 +00:00
1;