--- /dev/null
+package Newslash::Model::Events;
+use Newslash::Model::Base -base;
+
+use Mojo::JSON qw(to_json from_json);
+use Encode qw(encode_utf8 decode_utf8);
+use Mojo::Log;
+
+use constant EVENTS_TABLE_NAME => 'ns_events';
+
+sub on_start_up {
+ my $self = shift;
+
+ # create tables
+ my $table_name = EVENTS_TABLE_NAME;
+ if (!$self->table_exists($table_name)) {
+ my $dbh = $self->connect_db;
+
+ my $sql = <<"EOSQL";
+CREATE TABLE IF NOT EXISTS $table_name (
+ event_id mediumint(8) unsigned NOT NULL AUTO_INCREMENT PRIMARY KEY,
+ event_type varchar(32) NOT NULL,
+ event_subtype varchar(32),
+ related_id mediumint(8) unsigned,
+ source_user_id mediumint(8) unsigned,
+ created_timestamp timestamp,
+ active tinyint(4) NOT NULL DEFAULT '1'
+) DEFAULT CHARSET=utf8mb4
+EOSQL
+ my $rs = $dbh->do($sql, undef);
+ $self->disconnect_db;
+ if ($rs) {
+ return 1;
+ }
+ $self->warn("cannot create table: $table_name");
+ }
+
+ return 1;
+}
+
+
+sub create {
+ my $self = shift @_;
+ my $params = {@_};
+
+ my $event_type = $params->{event_type};
+ return if !$event_type;
+
+ my $table_name = EVENTS_TABLE_NAME;
+ my $sql = <<"EOSQL";
+INSERT INTO $table_name
+ (event_type, event_subtype, related_id, source_user_id, active)
+ VALUES
+ (?, ?, ?, ?, ?)
+EOSQL
+
+ my @values = ($event_type,
+ $params->{event_subtype},
+ $params->{related_id},
+ $params->{source_user_id},
+ defined $params->{active} ? $params->{active} : 1);
+ my $dbh = $self->connect_db;
+ my $rs = $dbh->do($sql, undef, @values);
+ if (!$rs) {
+ $self->set_error("insert failed", $dbh->{mysql_errorno});
+ $self->disconnect_db;
+ return;
+ }
+ my $event_id = $dbh->last_insert_id(undef, undef, undef, undef);
+ $self->disconnect_db;
+
+ return $event_id;
+}
+
+sub delete {
+ my $self = shift @_;
+ my $params = {@_};
+ my $event_id = $params->{event_id};
+ return if !$event_id;
+
+ my $table_name = EVENTS_TABLE_NAME;
+ my $sql = <<"EOSQL";
+DELETE FROM $table_name WHERE event_id = ?
+EOSQL
+
+ my $dbh = $self->connect_db;
+ my $rs = $dbh->do($sql, undef, $event_id);
+ if (!defined $rs) {
+ $self->set_error("delete failed", $dbh->{mysql_errorno});
+ $self->disconnect_db;
+ return;
+ }
+ $self->disconnect_db;
+
+ return $rs;
+}
+
+sub select {
+ my $self = shift;
+ return $self->generic_select(EVENTS_TABLE_NAME,
+ { unique_keys => [qw(event_id)],
+ keys => [qw(source_type related_id source_user_id active create_timestamp)],
+ }, @_);
+}
+
+sub oldest {
+ my $self = shift;
+ my $rs = $self->select(order_by => "create_timestamp", limit => 1, active => 1);
+ if ($rs) {
+ return $rs->[0];
+ }
+ return;
+}
+
+1;
--- /dev/null
+# -*-Perl-*-
+# Model::Events tests
+use Mojo::Base -strict;
+
+use Test::More;
+use Test::Mojo;
+use Data::Dumper;
+
+my $t = Test::Mojo->new('Newslash::Web');
+my $events = $t->app->model('events');
+ok($events, "get Events instance");
+
+subtest 'create, select, delete' => sub {
+ plan skip_all => "mode is not 'test'" if ($t->app->mode ne 'test');
+
+ # create event
+ my $event_id1 = $events->create(event_type => "test",
+ event_subtype => "test",
+ related_id => 0,
+ source_user_id => 0);
+ ok($event_id1, "event 1 create");
+
+ my $event_id2 = $events->create(event_type => "test",
+ event_subtype => "test",
+ related_id => 0,
+ source_user_id => 0);
+ ok($event_id2, "event 2 create");
+
+ my $event = $events->select(event_id => $event_id1);
+ ok($event, "event select");
+ diag(Dumper($event));
+
+ my $oldest = $events->oldest;
+ is_deeply($oldest, $event, "get oldest event");
+
+ my $rs = $events->delete(event_id => $event_id1);
+ ok($rs, "event 1 delete");
+ my $rs = $events->delete(event_id => $event_id2);
+ ok($rs, "event 2 delete");
+};
+
+done_testing();