OSDN Git Service

Model: add Events.pm
authorhylom <hylom@users.sourceforge.jp>
Thu, 23 Feb 2017 11:49:06 +0000 (20:49 +0900)
committerhylom <hylom@users.sourceforge.jp>
Thu, 23 Feb 2017 11:49:06 +0000 (20:49 +0900)
src/newslash_web/lib/Newslash/Model.pm
src/newslash_web/lib/Newslash/Model/Events.pm [new file with mode: 0644]
src/newslash_web/t/models/events.t [new file with mode: 0644]

index ed97349..16e0551 100644 (file)
@@ -14,6 +14,7 @@ load(metamoderations => "Newslash::Model::Metamoderations");
 load(globjs => "Newslash::Model::Globjs");
 load(timeline => "Newslash::Model::Timeline");
 load(relations => "Newslash::Model::Relations");
+load(events => "Newslash::Model::Events");
 
 1;
 
diff --git a/src/newslash_web/lib/Newslash/Model/Events.pm b/src/newslash_web/lib/Newslash/Model/Events.pm
new file mode 100644 (file)
index 0000000..b051dbc
--- /dev/null
@@ -0,0 +1,114 @@
+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;
diff --git a/src/newslash_web/t/models/events.t b/src/newslash_web/t/models/events.t
new file mode 100644 (file)
index 0000000..d5fd179
--- /dev/null
@@ -0,0 +1,42 @@
+# -*-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();