OSDN Git Service

implement user achievement listing (/~user/achievements)
authorhylom <hylom@users.sourceforge.jp>
Fri, 6 Jul 2018 11:40:49 +0000 (20:40 +0900)
committerhylom <hylom@users.sourceforge.jp>
Fri, 6 Jul 2018 11:40:49 +0000 (20:40 +0900)
src/newslash_web/lib/Newslash/Model/Users.pm
src/newslash_web/lib/Newslash/Model/Users/Achievements.pm [new file with mode: 0644]
src/newslash_web/lib/Newslash/Web.pm
src/newslash_web/lib/Newslash/Web/Controller/User.pm
src/newslash_web/t/models/users.t
src/newslash_web/templates/common/achievements.html.tt2 [new file with mode: 0644]
src/newslash_web/templates/user/base.html.tt2

index 649d31f..cd8f5e2 100644 (file)
@@ -8,6 +8,7 @@ use Newslash::Model::Users::ACL2;
 
 use Newslash::Model::Users::Prefs;
 use Newslash::Model::Users::Configs;
+use Newslash::Model::Users::Achievements;
 
 use Newslash::Util::Timezones;
 
@@ -84,6 +85,7 @@ sub freaks { return shift->_friends->freaks(@_); }
 # sub models
 sub prefs { return shift->new_instance_of('::Users::Prefs'); }
 sub configs { return shift->new_instance_of('::Users::Configs'); }
+sub achievements { return shift->new_instance_of('::Users::Achievements'); }
 
 # auth related
 sub authentification {
diff --git a/src/newslash_web/lib/Newslash/Model/Users/Achievements.pm b/src/newslash_web/lib/Newslash/Model/Users/Achievements.pm
new file mode 100644 (file)
index 0000000..a0d1636
--- /dev/null
@@ -0,0 +1,52 @@
+package Newslash::Model::Users::Achievements;
+use Newslash::Model::Base -base;
+
+sub select {
+    my $self = shift;
+    my $params = {@_};
+
+    my $uid = $params->{id} || $params->{uid} || $params->{user_id};
+    return if !$uid;
+
+    my $keys = { uid => "user_achievements.uid",
+                 aid => "user_achievements.aid",
+                 exponent => "user_achievements.exponent",
+                 id => "user_achievements.id",
+               };
+    my $datetime_keys = { create_time => "user_achievements.createtime" };
+
+    my ($where_clause, $where_values, $unique) = $self->build_where_clause(keys => $keys,
+                                                                           datetime_keys => $datetime_keys,
+                                                                           params => $params);
+    my ($limit_clause, $limit_values) = $self->build_limit_clause(params => $params);
+    my ($orderby_clause, $orderby_values) = $self->build_order_by_clause(keys => $keys,
+                                                                         datetime_keys => $datetime_keys,
+                                                                         params => $params);
+
+    my $sql = <<"EOSQL";
+SELECT * FROM user_achievements
+  LEFT JOIN achievements ON user_achievements.aid = achievements.aid
+  $where_clause
+  $orderby_clause
+  $limit_clause
+EOSQL
+
+    my $dbh = $self->connect_db;
+    my $sth = $dbh->prepare($sql);
+
+    my @attrs;
+    push @attrs, @$where_values, @$limit_values, @$orderby_values;
+
+    $sth->execute(@attrs);
+    my $rs = $sth->fetchall_arrayref({});
+    if (!defined $rs) {
+        $self->set_error($dbh->errstr, $dbh->err);
+        $self->disconnect_db;
+        return;
+    }
+    $self->disconnect_db;
+    return $rs;
+}
+
+
+1;
index 6302b46..b084214 100644 (file)
@@ -369,7 +369,7 @@ sub startup {
     $user->get('/foes'         => [nickname => qr/~.*/])->to('user#foes');
     $user->get('/fans'         => [nickname => qr/~.*/])->to('user#fans');
     $user->get('/freaks'       => [nickname => qr/~.*/])->to('user#freaks');
-    #$user->get('/achievements' => [nickname => qr/~.*/])->to('user#achievements');
+    $user->get('/achievements' => [nickname => qr/~.*/])->to('user#achievements');
     #$r->get('/:user_name/journal' => [user_name => qr/~.*/])->to('journal#user_journals');
 
 }
index 43dc1b7..96f57dd 100644 (file)
@@ -137,6 +137,13 @@ sub freaks {
 }
 
 sub achievements {
+    my $c = shift;
+    my $query_func = sub {
+        my ($c, $the_user) = @_;
+        my $items = $c->model('users')->achievements->select(uid => $the_user->{uid});
+        return $items;
+    };
+    $c->_base_render(achievements => $query_func);
 }
 
 
index 2dadb69..39e3cb7 100644 (file)
@@ -114,6 +114,11 @@ subtest 'acl2' => sub {
     ok($rs, "update_acl2_by_srcid (2)");
 };
 
+subtest 'achievements' => sub {
+    my $rs = $users->achievements->select(uid => $uid);
+    ok($rs, "select achievements");
+};
+
 subtest 'update users' => sub {
     plan skip_all => "mode is not 'test'" if ($t->app->mode ne 'test');
 
diff --git a/src/newslash_web/templates/common/achievements.html.tt2 b/src/newslash_web/templates/common/achievements.html.tt2
new file mode 100644 (file)
index 0000000..95645ef
--- /dev/null
@@ -0,0 +1,10 @@
+<article type="achievements">
+  <header>
+    <h1>[% IF item.exponent > 0 %][% item.exponent %]件の[% END %][% item.description %]</h1>
+
+    <div class="property">
+      <span class="content-type">実績</span>
+      <span class="create-time">[% dtf.mysql_to_user(item.createtime, user.config.offset_sec, user.config.time_format) %]</span>
+    </div>
+  </header>
+</article>
index 900006c..ef95373 100644 (file)
       <li[% IF user_tab == "foes" %] class="active"[% END %]><a href="/~[% the_user.nickname %]/foes">テキ</a></li>
       <li[% IF user_tab == "fans" %] class="active"[% END %]><a href="/~[% the_user.nickname %]/fans">ファン</a></li>
       <li[% IF user_tab == "freaks" %] class="active"[% END %]><a href="/~[% the_user.nickname %]/freaks">アンチ</a></li>
-      <!--
-          <li[% IF user_tab == "achievements" %] class="active"[% END %]><a href="/~[% the_user.nickname %]/achievements">功績</a></li>
-          -->
+      <li[% IF user_tab == "achievements" %] class="active"[% END %]><a href="/~[% the_user.nickname %]/achievements">実績</a></li>
     </ul>
   </div>
 
   <div class="user [%- page.content_type -%]">
     [%- SWITCH user_tab %]
-    [%- CASE ['friends', 'foes', 'fans', 'freaks' ] -%]
-    [%- FOREACH user IN items -%]
-    [% INCLUDE common/user the_user=user no_form=1 %]
-    [%- END -%]
-
-    [%- CASE DEFAULT -%]
-    [%- FOREACH item IN items -%]
-    [%- INCLUDE common/article/article hide_bodytext=1 %]
-    [%- END -%]
+    [%-   CASE ['friends', 'foes', 'fans', 'freaks'] -%]
+    [%-     FOREACH user IN items -%]
+    [%        INCLUDE common/user the_user=user no_form=1 %]
+    [%-     END -%]
+
+    [%-   CASE 'achievements' -%]
+    [%-     FOREACH item IN items -%]
+    [%        INCLUDE common/achievements %]
+    [%-     END -%]
+
+    [%-   CASE DEFAULT -%]
+    [%-     FOREACH item IN items -%]
+    [%-       INCLUDE common/article/article hide_bodytext=1 %]
+    [%-     END -%]
   </div><!-- .index -->
   [%- END -%]
 </div>